动态变量
传递运行时值,个性化智能体行为。
动态变量 可将运行时值注入智能体的消息、系统提示词和工具中。无需创建多个智能体,即可通过用户专属数据个性化每次对话。
概述
动态变量可集成到智能体的多个方面:
- 使用 系统提示词 自定义行为和上下文
- 使用 首条消息 个性化问候语
- 使用 工具参数和标头 传递用户专属数据
以下是动态变量的一些常见用途:
- 使用用户名 个性化问候语
- 在回复中 包含账户详情
- 向工具调用 传递数据
- 根据订阅等级 自定义行为
- 访问对话 ID 或通话时长等 系统信息
动态变量支持 3 种值类型:
系统动态变量
每次对话中,智能体无需运行时配置即可访问内置的 system__* 变量。这些变量带有保留的 system__ 命名空间前缀,并会随对话进展自动更新。自定义动态变量不能使用 system__ 前缀,也不能覆盖系统变量。
标有 † 的变量会在轮次间变化。将其放入提示词文本可能会导致提示词无法缓存;替代方案请参阅最佳实践。
智能体和对话标识
时间和时区
电话和消息
以下变量会在适用时为电话和消息渠道填充:
每轮对话状态
对话历史记录格式
system__conversation_history 变量包含一个具有以下结构的 JSON 对象:
每个条目都包含 role("user"、"agent" 或 "tool")以及以下其中一项:
message:该轮的文本内容tool_requests:智能体发起的工具调用数组,包含已解析的参数值tool_results:工具响应数组
如果工具结果或参数包含嵌套的对话历史记录,则会替换为占位符(例如 [conversation_history (5 turns)]),以避免无限递归展开。
此变量适用于向工具(如 webhook 或自定义 LLM)传递对话上下文,或在交接时将对话历史记录纳入子智能体提示词。
机密动态变量
机密动态变量的填充方式与普通动态变量相同,但会告知 ElevenAgents,它们只能用于动态变量标头,绝不能作为智能体系统提示词或首条消息的一部分发送给 LLM 提供商。
对于不应发送给 LLM 的身份验证令牌或私有 ID,请使用机密动态变量。要创建机密动态变量,请为动态变量添加 secret__ 前缀。
机密值会以脱敏形式存储,因此 conversations API 会将其返回为 <REDACTED>。
通话后的转录 webhook 会传递原始值,因此请确保 webhook 端点
将其视为机密处理。不要对需要从
conversations API 读取的值使用 secret__ 前缀。请将这些值作为普通动态变量传递,或传递非敏感标识符,
然后在自己的系统中查找敏感值。
从工具更新动态变量
如果工具调用返回有效的 JSON 对象,即可创建或更新动态变量。要指定需提取的内容,请使用点表示法设置对象路径。如果字段或路径不存在,则不会更新任何内容。
响应对象和点表示法示例:
- 状态对应路径:
response.status - users 数组中第一个用户的邮箱对应路径:
response.users.0.email
要将动态变量更新为第一个用户的邮箱,请按如下方式设置赋值。

赋值在每个 webhook 工具中配置;请参阅 API 参考文档中的工具赋值。
指南
前提条件:
- 一个 ElevenLabs 账户
- 已配置的 ElevenAgents 智能体(按照快速入门创建)
公开 talk-to 页面集成
公开 talk-to 页面通过 URL 参数支持动态变量,因此在分享智能体链接时可个性化对话。这尤其适合在网站、邮件或营销活动中嵌入个性化智能体。
URL 参数方法
可通过两种方法向公开 talk-to 页面传递动态变量:
方法 1:Base64 编码的 JSON
使用 vars 参数将变量作为 Base64 编码的 JSON 对象传递:
vars 参数包含 Base64 编码的 JSON:
方法 2:单独的查询参数
使用带 var_ 前缀的查询参数传递变量:
参数优先级
同时使用两种方法时,单独的 var_ 参数优先于 Base64 编码变量,以避免冲突:
在此示例中,user_name 将为 "John"(来自 var_user_name),而非 "Jane"(来自 Base64 编码的 vars)。
实现示例
JavaScript URL 生成
Python URL 生成
手动构建 URL
最佳实践
设置时区,而非在提示词中加入当前时间
系统提示词、workflow 节点和程序中的变量会在每轮解析。如果值在轮次间变化,提示词便无法缓存,从而增加成本和延迟。{{system__time_utc}} 和 {{system__time_second}} 每轮都会变化;{{system__time}} 和 {{system__time_minute}} 每分钟变化一次。
若要让智能体获取当前日期和时间,请在系统提示词编辑器中使用时区按钮设置时区(conversation_config.agent.prompt.timezone),而不要在提示词文本中加入 {{system__time}} 或 {{system__time_utc}}。设置时区后,平台会在缓存提示词前缀之外添加当前日期和时间,因此系统提示词可跨轮次保持缓存。未设置时区时,智能体不会获得当前日期和时间。
如果提示词需要内嵌日期或小时,可结合使用 {{system__time_date}}、{{system__time_hour}} 和 {{system__timezone}}(例如 Today is {{system__time_date}}, hour {{system__time_hour}} ({{system__timezone}}))。这些变量最多每小时变化一次。
将实时状态变量绑定到工具参数和标头
如果工具需要带 † 标记的值,请将其绑定到工具参数或标头,而不要放入提示词。工具参数仅在调用工具时解析,因此不会影响提示词缓存。LLM 已可看到对话,因此提示词中很少需要 {{system__conversation_history}}。
考虑替代提示词中轮次计数器的方案
如果提示词会检查 {{system__agent_turns}} 等轮次计数器,可考虑以下替代方案。对于静态开场问候或披露信息,请使用 first_message。
对于首次回复行为,可围绕对话历史记录编写指令(例如,“On your first reply, when you have not yet greeted the caller…”)。这依赖 LLM 遵循指令,因此请使用所选模型进行测试;若结果可靠性较低,请保留轮次计数器。
如果计数器仅用于决定何时分支或升级处理,可在提示词外使用 workflow 边缘表达式条件或结构化程序的 If 步骤表达式(例如 system__agent_turns >= 5)处理。这不适用于 LLM 本身需要该值的情况。
仅将 secret__ 用于保留在工具标头中的值
为身份验证令牌和 API 密钥添加 secret__ 前缀,使其只能绑定到工具标头,且绝不会发送给 LLM。由于 secret__ 值会在 conversations API 中以 <REDACTED> 脱敏显示(通话后的转录 webhook 仍会收到原始值),需要从 conversations API 读取的值应作为普通动态变量传递,或传递非敏感标识符,然后在自己的系统中查找敏感值。
不要依赖 system__user_id 进行身份验证
system__user_id 由客户端提供,用于跟踪和分析,未经 ElevenAgents 验证。公开账户数据前,应通过对话发起 webhook、secret__ 标头变量中的签名令牌,或验证工具调用来验证呼叫者身份。
配置用于测试和预览的占位符
为提示词、首条消息和工具中使用的每个自定义变量,在 dynamic_variable_placeholders 中设置默认值。控制台中的对话预览和模拟测试不会运行对话发起 webhook,因此未设置的变量在测试期间会保留为字面量 {{variable_name}} 占位符。
故障排除
变量未替换
请确认:
- 变量名称完全一致(区分大小写)
- 变量使用双花括号:
{{variable_name}} - 变量已包含在
dynamic_variables对象中
类型错误
请确认:
- 变量值与预期类型一致
- 值只能是字符串、数字或布尔值




