概述
OpenClaw 通过将 Markdown 转换为共享中间表示(IR)再渲染为各 channel 特定格式,实现出站消息的一致格式化。IR 保留原始文本,同时携带样式/链接 span,使 chunking 和渲染在各 channel 间保持一致。
核心要点
设计目标:
- 一次解析,多个渲染器
- 安全 chunking:在渲染前对 IR 文本分块,行内格式不会跨 chunk 断裂
- Channel 适配:将同一 IR 映射到 Slack mrkdwn、Telegram HTML、Signal style ranges
处理流水线:
- 解析 Markdown → IR:纯文本 + 样式 span(bold/italic/strike/code/spoiler)+ 链接 span,偏移量使用 UTF-16 code units
- 对 IR 分块:在渲染前分块,行内格式不跨 chunk 断裂
- 按 channel 渲染:
- Slack:mrkdwn tokens,链接为
<url|label> - Telegram:HTML tags(
<b>、<i>、<s>、<code>、<a href>) - Signal:纯文本 +
text-styleranges
- Slack:mrkdwn tokens,链接为
表格处理(markdown.tables):
code:渲染为代码块(大多数 channel 默认)bullets:每行转为 bullet points(Matrix、Signal、WhatsApp 默认)off:禁用表格解析,原始文本直接传递
Chunking 规则:
- 代码围栏保留为单块(带尾部换行)
- 列表前缀和引用前缀是 IR 文本的一部分,不会在前缀中间分割
- 行内样式(bold/italic/strike/inline-code/spoiler)不跨 chunk 分割
常见陷阱:
- Slack angle-bracket tokens(
<@U123>、<#C123>)必须保留 - Telegram HTML 需要转义标签外的文本
- Signal style ranges 依赖 UTF-16 偏移量,不能用 code point 偏移
配置/使用
channels:
discord:
markdown:
tables: code
accounts:
work:
markdown:
tables: off相关页面
- streaming - 出站流式传输与 chunking 行为
- messages - 消息处理流水线
- system-prompt - 系统提示词与工作区文件注入