动态上下文
将实时上下文注入角色的理解中——游戏状态、用户偏好、场景变化——无需重新连接。
连接时的动态上下文
通过连接时传入初始上下文 dynamicInfo:
client.connect({
apiKey: '...',
characterId: '...',
dynamicInfo: '玩家:Aria,等级:5,当前位置:Eldenmere 森林',
});默认情况下,此上下文是可变的,并且可以在会话期间被替换。若要将其锁定为静态系统提示:
{
dynamicInfo: '游戏规则:已禁用 PvP。经济:通胀模式。',
keepInContext: true, // 在整个会话中作为固定提示保留
}updateContext
会话中途更新上下文的主要方法。支持追加、替换和重置模式。
client.updateContext(options: ContextUpdateOptions)选项
text
string
—
要注入的上下文文本。除非 mode 为 "reset"
mode
"append" | "replace" | "reset"
"append"
如何应用上下文
run_llm
"true" | "false" | "auto"
"auto"
是否触发机器人回复
current_attention_object
string
—
机器人应聚焦的对象(必须匹配 actionConfig.objects[].name)
模式
append — 追加到现有的临时上下文:
replace — 替换整个临时上下文:
reset — 完全清除临时上下文:
触发机器人回复
通过以下方式监控令牌使用情况 serverResponse
服务器会在每次 context-update:
updateDynamicInfo
更简单的 updateContext —— 总是追加,并且永远不会触发机器人回复。
等同于:
用于 updateContext 完全控制; updateDynamicInfo 用于快速静默更新。
叙事设计模板键
模板键可为每个会话定制叙事设计图。章节目标和说话标签可以包含占位符,例如 {player_name} 或 {quest_item} (单花括号);当章节被评估时,Convai 会用你的值替换它们,因此一个叙事图可以服务于多个个性化会话。
控制台设置(前提条件)
在角色的叙事设计图引用这些键之前,模板键不会生效。在控制台中:
在角色上 启用叙事设计
创建一个章节 其 目标 (并且可选地 说话标签)包含你的占位符:
向客人问好。请说出这句完整的欢迎语:"{StartMessage}"。角色扮演上下文:{Situation}。
占位符只会解析 在 章节目标和说话标签中——
{placeholder}写入角色基础提示、问候语或触发消息中的内容会按字面原样播出。创建一个命名触发器 指向该章节,并带有一个 触发消息 (必填字段——例如“有位客人走进旅馆大门。现在向他们问好。”)。客户端通过以下方式触发它
sendTriggerMessage('<trigger name>')—— 名称必须完全匹配(区分大小写)。触发消息才会使机器人在触发时回复;带有目标但触发消息为空的触发器(仅可通过 REST API 实现)会静默更改章节 静默地 并且服务器会确认 “触发已处理,但未生成上下文”.还可以设置图的 起始章节 —— 它会在会话开始时自动进入,因此在连接时,配置中传入的键会在任何触发器触发之前应用到它。
为了获得确定性的测试输出,请将占位符放在章节的说话标签中——说话标签内容会经过相同的替换,并按原文播出。
有 一张键映射 ,可通过两种方式设置:
在会话开始时预设: narrativeTemplateKeys config
作为 narrative_template_keys 发送于 /connect 请求中。
如果章节目标是 向 {player_name} 问好。请他们修理 {quest_item}。,则机器人会收到 向 Alex 问好。请他们修理氧气发生器。
会话中更新: updateTemplateKeys()
在活动会话中替换相同的键映射。在触发进入使用新值的章节之前调用它:
这是完全替换,而不是合并 —— 传入图仍然需要的每个键,或者被省略的键将解析为空字符串。
规则
需要一个已启用 叙事设计的角色。没有它,
narrativeTemplateKeys会被忽略,并且updateTemplateKeys()会以status: "error"—"Narrative design service not available"(监听serverResponse用于update-template-keysack)。占位符语法是在一个单词外包裹单花括号:
{player_name}。键区分大小写,且必须与图中的占位符名称完全匹配。替换发生在章节目标/说话标签被 评估时,而不是在键发送时——键只需要在触发器触发前准备好即可。
没有匹配键的占位符会解析为 空字符串 (不会保留为字面文本)。如果角色 说出 一个字面
{placeholder},说明文本根本没有经过叙事设计——请检查它是否位于章节目标或说话标签中,而不是基础提示或问候语中。trigger_name和trigger_message是保留字段。 在每个命名触发器中,服务器都会把它们注入键映射(覆盖你的键),因此不要把这些名称用于你自己的键——但你 可以 在目标中{trigger_name}/{trigger_message}自由引用。
故障排除
确认: "Narrative design service not available"
角色未启用叙事设计
确认: “触发已处理,但未生成上下文”
角色上不存在该触发器名称,或者该触发器的触发消息为空,且其目标章节没有说话标签(静默章节更改)
机器人说出字面 {placeholder}
占位符位于叙事设计之外(基础提示、问候语、触发消息)——请把它移到章节目标或说话标签中
机器人说出空值
键映射中缺少该键——请记住 updateTemplateKeys() 会替换整个映射,并且键区分大小写
文件上传
在活动会话中使用 uploadFile直接向角色发送文件。角色会将文件作为对话上下文的一部分接收,并可以对其内容作出回应。
React
原生 JS
选项
主题
string
"file-upload"
上传通道的路由标识符
onProgress
(pct: number) => void
—
在上传进度中调用,参数为 0–100 的整数
支持的格式
JPEG
image/jpeg
PNG
image/png
GIF
image/gif
WebP
image/webp
最大文件大小: 10 MB。文件以原始二进制形式发送——不是 base64 编码。
错误处理
uploadFile 是异步的,失败时会抛出异常——务必将其包裹在 try/catch 中:
在调用前先验证类型和大小,这样可以给用户一个快速的本地错误,而不是等待传输失败:
注意
仅在使用 WebRTC 传输(
transport: "livekit",默认值)连接时可用。WebSocket 传输不支持。在未连接时调用该方法会抛出异常。请先检查
client.state.isConnected。
场景元数据
用于 updateSceneMetadata 用于描述环境变化。这 不会 添加新的动作目标——它只给机器人提供叙事上下文。
如果机器人需要 作用于 场景中的对象,它们必须在 actionConfig.objects 中于连接时声明。参见 Actions。
会话管理
重置对话
resetSession() 会清除消息历史并开启一个新的对话线程。角色会忘记当前交流,但会保留任何长期记忆(如果 endUserId 已设置)。
空闲超时
服务器会在可配置的超时时间后断开空闲会话。使用 resetIdleTimer() 在任何用户交互时保持会话存活。
长期记忆
当 endUserId 提供时,角色会跨会话构建持久记忆。通过以下方式访问它们 client.memoryManager.
完整参考请参阅 Memory API。
最后更新于
这有帮助吗?