Install
openclaw skills install @yottameta/yotta-present元呈 —— AI 输出的默认呈现层:智能体先把输出内容判为「内容类型」,再选「呈现形态」(结论卡/表格/正文/指标板/问答卡/报告/图表…),用 yotta_present CLI 或 present_result MCP 统一渲染成可复制的 Markdown / 纯文本(按需附本地 SVG)。平台自适应(--platform / platform):webchat 完整 Markdown、discord/whatsapp 表格转列表+标题转加粗、plain 去符号;渲染通道(--channel / channel):auto 按 platform 映射 plain→r0 去 emoji、其余→r1 emoji 徽章+引用条(r0 保底无色 / r1 增强,r2/r3 高级美化未开放);命名场景模板(vuln_report/faq/status,references/templates.json 可热更新)一次定义多处复用;codeblock + bold_keys 加粗 + max_len 长度熔断。触发:默认——凡交付给用户的 AI 输出都经元呈(判型 → 选形态 → 渲染)呈现;例外见正文白名单。边界:不做交互式图表编辑器 / BI / 数据分析工具;图表只是呈现形态之一;不做内容改写 / 判断本身。AI 首次使用自动接入 yotta-present MCP(写 mcpServers + 永久记忆护栏,均需用户明确同意),输出默认统一呈现、未加载时降级 CLI。
openclaw skills install @yottameta/yotta-present跨智能体的通用结果呈现层:AI 输出五花八门、有的难读难复用;元呈在「内容类型 → 呈现形态」之间做判断, 再套元阁统一设计语言,输出可复制的 Markdown / 纯文本(按需附本地 SVG 图)。
本技能按需触发(always-load: false,不常驻);通过它配置的 yotta-present MCP 常驻(写入客户端 mcpServers 后常驻、新会话工具可用,present_result / present_forms / present_templates 按需调用)。
明确同意门(必须先征得用户同意再做,勿静默执行):AI 首次使用本技能时,在写入任何客户端配置(mcpServers)或永久记忆(AGENTS.md / 等效全局记忆)之前,先向用户说明将写入什么、为什么,并获得用户明确同意;用户拒绝 → 不写入,直接降级 CLI(yotta_present.py),功能不受影响;用户同意 → 写入后回读核对。已有配置 / 记忆 → 跳过,不重复堆。本技能所需的持久变更仅此两项:① 写入客户端 mcpServers 的 yotta-present server 条目;② 写入下方「永久记忆护栏」。其余全部为本地纯渲染,不改系统、不联网。
# 元呈 yotta-present 输出默认呈现(来源:yotta-present · 元呈)
所有输出一律先用元呈 yotta-present 渲染(present_result / CLI)后再交给用户,不管什么内容形态;prose 正文形态先经元呈转可复制文本。元呈自带 yotta-present MCP(stdio,零依赖,唯一公开 MCP):AI 首次使用自动把 server 写入客户端 mcpServers(本地 python <技能目录>/scripts/yotta_present_mcp.py),配置后常驻、新会话自动注入;未加载时自动降级 CLI(yotta_present.py),输出一致。
写入步骤(先征得用户同意):说明将写入的内容与目的 → 获得用户明确同意 → 打开永久记忆文件 → 检查是否已存在 → 没有则原样写入并保存 → 回读核对 → 已有则跳过。若客户端永久记忆不可写 → 显式报告「永久记忆护栏未写入」,不要省略。
skill-manifest.json 声明 before_send / present_result 要求。宿主支持动作前拦截时可作为强制门禁;
宿主不支持时按 fallback: explicit-unverified 降级,输出中明确标记,不宣称已验证或已强制。
一句话:把「一坨 AI 输出」变成「看着舒服、能直接复制」的结果。
| 输入 | 元呈做什么 | 输出 |
|---|---|---|
| 一个结论 + 几个指标 | 判为「结论 / 评价」→ 结论卡 | 徽章 + 指标表 + 要点 |
| 行列分明的数据 | 判为「对比 / 选择」→ 表格 | 可复制表格 |
| 一段叙述 | 判为「解释 / 教学」→ 正文 | 标题 + 头条 + 段落 |
| 数值分布 / 趋势 | 判为「图表该上场」→ 图表 | 本地 SVG(内嵌 Markdown) |
| 多节长内容 | 判为「报告」→ 报告 | 卡片 + 表 + 文 + 目录 |
| 纯文字(兜底) | 至少套「正文」美化 | 不让任何输出裸奔 |
默认:凡交付给用户(AI 对外的最终结果),先经元呈「判型 → 选形态 → 渲染」为可复制 Markdown / 纯文本,再输出。
判型(第一步,必做):把内容归入 8 种形态之一,规则见 references/schema.md;拿不准用 --explain 看理由,或 --form 显式指定。
白名单例外(明确退回原样,不用元呈):
--out 落盘,不在对话内整体渲染渲染通道与平台(channel × platform):--channel(默认 auto)定「载体族」、--platform 定「族内降级」:plain → r0(保底无色、无 emoji 徽章),webchat/discord/whatsapp → r1(🟢🟡🔴⚪ emoji 徽章 + 引用条 + 分隔线);r2/r3(富文本 HTML / SVG 整卡)属高级美化引擎,后续版本开放。想强制无色基础 Markdown(如 GitHub 等 sanitize 宿主)→ --channel r0;颜色永不当唯一信息载体(r0 去掉 emoji 后文字徽章仍在)。
主题(图表 SVG,S7-M2 色板 token 化):--theme(默认 light)→ dark 深底浅字暗色渲染;其余形态不受主题影响(Markdown 颜色由 emoji / 文字承载,不做真假色切换)。主题 token 一处定义在 references/theme.json(light/dark + 语义色 + 形态主色 + 图表色板,声明式可热更新、社区可贡献);本地 python scripts/yotta_chart.py --check-contrast 可自查 WCAG 对比度(正文/背景 ≥ 4.5:1)。
形态选择要点:
conclusiontablechecklist(保留 [x] / [ ])prose(规整为可复制文本)metrics;问答 → qa(rows 须为 问题/回答 两列,否则判 table);多节长内容 → report;数值分布 / 趋势 / 占比 → chart智能体按 ① 内容类型 → ② 呈现形态 → ③ 内容保真门禁 三步选择,再交给元呈渲染:
| # | 内容类型 | 常见子类 | 首选形态 |
|---|---|---|---|
| 1 | 结论 / 评价 | 结论 / 评分 / 推荐 / 裁决 / 对比结论 | 结论卡 |
| 2 | 事实 / 信息 | 状态 / 指标 / 汇总 / 定义 | 指标板 / 表格 |
| 3 | 对比 / 选择 | 对比表 / 利弊 / 取舍 / 排名 / 选型 | 表格 |
| 4 | 解释 / 教学 | 概念 / 原理 / 因果 / 拆解 / 教程 / 答疑 | 正文 / 问答卡 |
| 5 | 规划 / 方案 | 方案 / 排期 / 步骤 / 要点 / 风险 / 补救 | 清单卡 / 报告 |
| 6 | 交付物 | 代码 / 文档 / 邮件 / 纪要 / 翻译 / 数据 | 正文 / 表格 / 代码块 |
| 7 | 结构 / 关系 | 流程 / 时序 / 时间线 / 层级 / 矩阵 / 关联 | 报告 / 图表 |
| 8 | 元 / 交互 | 澄清 / 确认 / 进度 / 警告 / 免责 / 下一步 | 结论卡 / 清单卡 |
conclusion)table)checklist,支持 [x] / [ ])prose)metrics)qa,rows 须为 问题/回答 两列)report,含目录)chart,本地 SVG)兜底:纯文字 → 至少套「正文」美化(层级 + 重点 + 可复制),不让任何输出裸奔。
form / template 渲染后必须覆盖全部源内容块;覆盖不足自动降级 report-safe,禁止 title-only 静默失败。blocks)还会校验块顺序:候选形态顺序不符时按不兼容处理,自动降级 report-safe,避免静默重排。fallback(来源 / 目标 / 原因)与 fidelity(源块 / 保留块 / 丢弃块 / 压缩块 / 顺序保真 order_preserved / 建议形态)。--explain 必须说明保留了什么、压缩了什么、丢弃了什么、是否降级、为什么选择该形态。max_len 是显式取舍:被截断块进入 fidelity.dropped / fidelity.compressed,不假报全量保留。rows 双兼容;显式指定“更具体”不等于允许丢内容。yotta_present 按输入 JSON 形状自动猜形态(可解释,--explain 返回原因):
chart_data → chartrows 为「问题 / 回答」两列 → qatitle + rows + 其他内容段 → reportrows → tablemetrics + 结论 → conclusion;仅 metrics → metricsbullets 成对「问 / 答」→ qa;bullets + 结论 → conclusion;仅 bullets → checklistverdict / grade → conclusionprose接了智能体:智能体主动按上面的判断层判型选形态(默认全走);没接智能体:yotta_present 兜底 + --form 显式指定。
Windows 用 python,Linux/macOS 用 python3。
# 标准内容对象(JSON 文件 / 字符串)→ 可复制 Markdown(默认)
python3 scripts/yotta_present.py --content '{"title": "结论", "grade": "success", "verdict": "通过", "bullets": ["a", "b"]}'
# 纯文本 / Markdown 输入(自动解析 + 兜底美化)
python3 scripts/yotta_present.py --file result.txt
# 混合 Markdown + 显式形态:内容保真校验;--json 查看 fallback / fidelity
python3 scripts/yotta_present.py --file result.txt --form checklist --json
# 纯文本输出(复制到 Word / 邮件)
python3 scripts/yotta_present.py --content '<同上>' --text
# 显式指定形态 + 附判断说明
python3 scripts/yotta_present.py --content '<同上>' --form report --explain
# 图表形态:默认 Markdown 内嵌 data URI(自包含可复制);--svg 时写本地 SVG + 路径引用
python3 scripts/yotta_present.py --content '{"chart_data": {"chart": "pie", "labels": ["A", "B"], "data": [3, 1]}}' --svg out/pie.svg
# 完整 JSON 结果(程序消费)/ 写文件
python3 scripts/yotta_present.py --content '<同上>' --json
python3 scripts/yotta_present.py --content '<同上>' --out result.md --both
# 平台自适应:Discord/WhatsApp(表格转列表、标题转加粗)/ 纯文本命令行
python3 scripts/yotta_present.py --content '<同上>' --platform discord
python3 scripts/yotta_present.py --content '<同上>' --platform plain
# 渲染通道(默认 auto:plain→r0 去 emoji、其余→r1 emoji 增强);强制无色基础 Markdown
python3 scripts/yotta_present.py --content '<同上>' --channel r0
# 主题(图表暗色渲染):--theme dark(默认 light)
python3 scripts/yotta_present.py --content '{"chart_data": {"chart": "bar", "labels": ["A", "B"], "data": [3, 5]}}' --form chart --theme dark --svg out/bar-dark.svg
# 命名场景模板:漏洞报告 / 问答 / 状态一句话(一次定义多处复用)
python3 scripts/yotta_present.py --content '{"title": "漏洞", "grade": "danger", "verdict": "高危", "rows": [["注入点", "POST /demo.php"]], "steps": ["复现步骤"], "code": "POST /demo.php HTTP/1.1", "fixes": ["参数化查询"]}' --template vuln_report
# 长度熔断(省 token):先压缩列表、再降标题、最后截断,保留结论
python3 scripts/yotta_present.py --content '<同上>' --max-len 800
# 形态 / 模板清单 / 版本
python3 scripts/yotta_present.py --list-forms
python3 scripts/yotta_present.py --list-templates
python3 scripts/yotta_present.py --version
退出码:0 = 成功;1 = 无输入 / 读取错误;2 = 内容校验或渲染错误(含 --svg 用在非图表形态)。
本技能只提供一个公开 MCP server:yotta-present(scripts/yotta_present_mcp.py,零依赖、数据不出本机)。
基于 MCP 最新协议 2026-07-28(无状态时代;向后兼容 2025-11-25 及更早握手客户端)。
纯图表不需要单独配置另一个 MCP server——present_result 的 chart 形态(chart_data)
直接复用 12 图内核。
AI 首次使用本技能时负责自动完成配置,用户无需手动改 mcpServers:
mcpServers 是否已有 yotta-present 条目;已有 → 直接使用。{
"mcpServers": {
"yotta-present": {
"command": "python",
"args": ["<技能目录>/scripts/yotta_present_mcp.py"]
}
}
}
<技能目录>= 本技能实际安装目录,不要写死盘符路径;Windows 用python,Linux/macOS 用python3。
mcpServers 后多数客户端需重启 / 重载一次 MCP server 才生效;加载后应看到 present_result / present_forms / present_templates 三个工具。python <技能目录>/scripts/yotta_present.py ...。永久记忆护栏:见顶部「## 使用须知」节;首次使用照顶部执行写入。
MCP 工具:
present_result:content(JSON / Markdown / 纯文本)+ 可选 form / template / platform / max_len / bold_keys / title / output(md|text|both|json) / svg / explain → 可复制结果;JSON 输出包含内容保真元数据 fallback / fidelity(含 order_preserved);form=chart + chart_data 复用 12 图内核(bar / line / pie / radar / scatter / histogram / funnel / waterfall / word_cloud / sankey / spreadsheet / treemap),本地 SVG 或 data URI;template 套命名场景模板(vuln_report/faq/status);platform 平台自适应(discord/whatsapp 表格转列表+标题转加粗,plain 去符号);channel 渲染通道(auto 按 platform 映射:plain→r0 去 emoji、其余→r1 emoji 增强;r2/r3 未开放);theme 主题(默认 light;dark 出暗色图表 SVG);max_len 长度熔断。present_forms:列出开源基线 8 种形态(只读)。present_templates:列出命名场景模板骨架(vuln_report/faq/status,只读)。元呈本身零依赖。当 prose 正文读起来「AI 腔」、读着不自然时,可配装 yotta-humanize 让文本更自然。
它不是必需依赖;未装时直接用元呈的可复制结果即可。
AI 使用流程(自己检测,不假定已装):
yotta-humanize 技能(即存在 yotta-humanize/SKILL.md 与 scripts/yotta_humanize.py)。npx -y @yottameta/yotta-humanize --agent <agent-name>(或见其 README 的 git clone / ZIP / install.sh);不要替用户强制安装,不要默认它已存在;用户装好后 AI 再使用。常见报错与避坑见 references/faq.md:
{title, grade, verdict, bullets}),纯文本无法提取徽章;rows 对象列表键或二维数组 + headers(columns 不支持);chart_data({chart, labels, data});--svg 仅图表形态有效;--form 指定,或 --explain 看判断理由;fallback / fidelity 说明取舍;rows(结构化推荐);max_len 截断 → fidelity.dropped / fidelity.compressed 明确列出被截断块;--channel r0(plain 平台自动即 r0);R2/R3 高级美化通道后续版本开放。