Appearance
OpenClaw 智能体输出中包含一组控制指令,用于附加媒体、标记语音回复、指定回复目标以及在控制 UI 中呈现富内容。MEDIA: 指令附带公开 https: URL 或本地路径(绝对路径、工作区相对路径、~/ 路径)来发送附件;[[audio_as_voice]] 将音频标记为语音消息,[[reply_to_current]]/[[reply_to:<id>]] 设置回复引用。[embed ...] 是控制台独有的富渲染语法,支持 ref/url 短代码。块流模式下同一 URL 只投递一次,最终载荷中重复的 MEDIA: 会被自动剥离。
OpenClaw 富输出协议:embed、MEDIA 和语音提示配置
MEDIA: 附件投递
智能体输出中的 MEDIA: 指令用于附加文件。
- 远程附件:必须是公开
https:URL。http:、loopback(127.0.0.1)、链路本地地址、私有地址和内部主机名会被忽略,不作为附件投递。服务端媒体抓取器仍会执行自身的网络防护。 - 本地附件:支持绝对路径、工作区相对路径或
~/开头的主目录相对路径。投递前会经过智能体文件读取策略和媒体类型检查。
与 Markdown 图片语法的关系
普通 Markdown 图片语法  默认只显示为文本。如果某个渠道的出站适配器选择将 Markdown 图片回复映射为媒体附件(如 Telegram),则会生效;这属于渠道自身的行为,非协议强制。
块流模式下的去重
启用块流时,MEDIA: 属于单次投递元数据。如果同一媒体 URL 在流式块中出现后又在最终智能体载荷中重复出现,OpenClaw 只投递附件一次,并从最终载荷中剥离重复的 MEDIA:。
[[audio_as_voice]] 语音提示
将音频附件标记为语音消息。智能体可以在文本输出中插入 [[audio_as_voice]],配合 MEDIA: 指令或工具结果中标记的音频,使接收方以语音消息形式播放。
[[reply_to_current]] / [[reply_to:<id>]] 回复目标
[[reply_to_current]]:回复当前对话中的上一条用户消息。[[reply_to:<conversation_id>]]:回复指定会话 ID 的消息。
这些指令是元数据,不影响呈现内容。
[embed ...] 控制台富渲染
[embed ...] 是控制 UI 独有的智能体富渲染语法。[view ...] 已不再有效,不应在新输出中使用。
基本语法
自闭合示例:
text
[embed ref="cv_123" title="Status" /]- 必须使用
ref="..."或url="..."指定渲染来源,仅支持 URL 后端加载的嵌入。 - 块形式的行内 HTML 嵌入短代码不会被渲染。
- 控制台在显示时会将短代码从可见文本中去除,并在该位置渲染嵌入内容。
- 不要使用
MEDIA:替代[embed ...]实现富渲染。
存储的渲染格式
经过规范化和存储的智能体富内容块采用 canvas 结构:
json
{
"type": "canvas",
"preview": {
"kind": "canvas",
"surface": "assistant_message",
"render": "url",
"viewId": "cv_123",
"url": "/__openclaw__/canvas/documents/cv_123/index.html",
"title": "Status",
"preferredHeight": 320
}
}存储/渲染的富块直接使用此 canvas 形状。present_view 不被识别。
相关文档
常见问题
我把 MEDIA: 放在输出里但附件没发送,可能是什么原因?
- 远程 URL 不是
https:或者使用了私有/内部地址,会被忽略。 - 本地路径未通过智能体文件读取策略或媒体类型检查。
- 块流模式下该 URL 已在之前投递过,重复的
MEDIA:会被自动剥离。
如何在控制 UI 里让智能体显示一个卡片或自定义界面?
使用 [embed ...] 短代码,必须指定 ref 或 url,例如 [embed ref="cv_123" title="Status" /]。该短代码只在控制台智能体消息区域渲染,且仅支持 URL 后端加载的嵌入。[view ...] 已失效。
[[audio_as_voice]] 和普通音频附件有什么区别?
[[audio_as_voice]] 是一个提示标记,渠道收到后会尝试将关联的音频以语音消息形式播放,而非普通媒体附件。它不会改变音频本身,仅影响接收端的呈现行为。