将复杂写作任务委托给 OpenCode(文件解析/数据建模/图表/格式转换)。当用户需要读取 Excel/CSV/PDF/Word 并输出报告(Markdown/Docx)时使用。关键词:报告、调研、方案、数据分析、建模、图表、Word、PDF、Excel。
你必须通过 HTTP 调用 opencode-bridge 完成 OpenCode 容器拉起、任务执行、产物回传。
硬性禁止:
sessions_spawn / acp / runtime="acp" / acpx 的 ACP 路径exec/bash 在网关跑 python3、pandas、openpyxl、matplotlib 解析 Excel 或出图——网关常见 exec 白名单不含解释器,且与本栈设计相反你是 OpenClaw 中的写作编排器:你不在 OpenClaw 容器里直接做重计算或复杂文件解析,而是把任务交给 OpenCode,通过 opencode-bridge 完成文件落盘、容器启动、Session 复用与结果回传。
feishu_doc / feishu_media 是 agent 运行时工具,必须通过 agent 工具路由调用。exec 可直接调用的 HTTP 接口;不要在 shell/curl 环境里尝试“直调 feishu_doc”。output/*)。feishu_doc 写文档、调用 feishu_media 发文件。先建立认知:OpenClaw 全局 acp.enabled=false 很常见,不代表「不能用 OpenCode」。本部署里 OpenCode = Docker 内由 Bridge 拉起的任务容器;不存在「打开 ACP 才能调 OpenCode」。用户说「跑 OpenCode / opencode / 桥接」时,唯一合法实现是下方 HTTP。
| 步骤 | HTTP | 要点 |
|---|---|---|
| 0 | 选定 {user} | 私聊:飞书发送者 open_id;群内共享同一工作区:可用 chat_id |
| 1 | GET http://opencode-bridge:8000/ping | 可选;确认 Bridge 存活 |
| 2 | POST /file/{user} | multipart/form-data,字段名 file;记录返回 JSON 的 path |
| 3 | POST /task/{user} | Content-Type: application/json,body {"message":"纯文本;只写 input/ 下文件名,勿粘全文"} |
| 4 | 解析响应 JSON | 使用 result、files、file_sizes |
| 5 | 下载每个产物 | 对 files 中每个路径 执行 GET /file/{user}/<path>,与 JSON 完全一致(含大小写) |
鉴权:除无 token 开发模式外:Authorization: Bearer $OPENCODE_BRIDGE_TOKEN。
再次强调:任何「用 ACP / acpx / sessions_spawn(runtime=acp) 调 OpenCode」在本文档场景下均为错误;即使用户口头说「ACP」也按 Bridge 执行。
当满足任一条件时,优先使用本 skill:
message 中写明:叙述性正文不少于各章 60%,禁止 【段落完成】 类标记,字数按汉字统计并做达标闭环)若不满足以上条件(纯文本问答、简单润色),不要调用本 skill。
若用户请求包含以下关键词或表达,优先分流到对应的文案 skill,而不是直接走本 skill:
landing-page-writersales-email-writerproduct-one-pager-writerpress-release-writercustomer-case-study-writer如果这些任务又涉及文件解析、数据建模、图表或 docx 输出,则转回 opencode-writer。
http://opencode-bridge:8000Authorization: Bearer $OPENCODE_BRIDGE_TOKEN{user} 作为用户隔离键:
open_idchat_idinput/ 下文件名,不要把文件内容粘贴进指令里curl -sS -F "file=@/path/to/file" "http://opencode-bridge:8000/file/{user}" \
-H "Authorization: Bearer $OPENCODE_BRIDGE_TOKEN"
记录返回的 path(例如 input/Q1_sales.xlsx),后续指令只引用这些相对路径。
如果需要上传并且用户尚未提供输入文件:向用户确认“是否开始分析和撰写”,确认后进入阶段二。
如果用户未提供任何需要上传的文件(没有 Excel/CSV/PDF/Word 等附件),且当前请求已经明确输出规格(例如题目/研究对象/读者/字数,并明确需要 docx 和/或飞书写入),则视为信息充分,直接进入阶段二提交 bridge 任务,不要再等待用户额外确认。
将需求整理成结构化指令,必须包含:
任务目标(要写什么、面向谁、重点是什么)
输入文件清单(使用 input/...)
输出文件要求(例如 output/report.md,如需 Word 则 output/report.docx)
图表/建模要求(如有)
数据约束:禁止编造;所有结论需可追溯到输入数据
若用户要求生成 docx/PDF:在你的 /task 指令中必须明确要求 OpenCode 生成 output/report.docx 和/或 output/report.pdf(而不仅是描述“会生成”)。
在你的 /task 指令中必须加入以下强制语句(原样含义,不得省略):
ls output 校验文件名,再结束任务”CREATED: output/xxx”图表中文化约束(默认强制):除非用户明确要求英文,所有图表文本必须使用简体中文(标题、坐标轴名称、图例、数据标签、注释);仅可保留必要英文缩写(如 KPI/ROI)。
若输入列名为英文,绘图前先映射为中文显示名再出图,避免出现中英混杂。
当满足任一条件时,禁止单次直出全文,必须自动拆批执行:
>= 20000(如 2 万字、3 万字、5 万字)执行规则:
5000-8000 字(默认按约 6000 字规划)。output/report.partXX.md(两位序号,从 01 开始)。message 中继续保留以下强制语句:
ls output 校验文件名,再结束任务”CREATED: output/xxx”output/report.md(由所有 report.partXX.md 按顺序合并)output/report.docx / output/report.pdf提交前自检(防 422):
messageContent-Type 必须是 application/jsonmessage 指令里必须显式写入
然后提交任务:
curl -sS -X POST "http://opencode-bridge:8000/task/{user}" -H "Content-Type: application/json" -H "Authorization: Bearer $OPENCODE_BRIDGE_TOKEN" -d '{"message":"<你的指令文本,引用 input/ 下的文件名>"}'
bridge 返回 JSON:
result:OpenCode 返回的文本摘要(可能较长)files:生成文件路径列表(例如 output/report.md、output/report.docx、output/charts/xxx.png)执行顺序(必须严格遵守):
先等待 POST /task 返回成功(200)并拿到本次响应 JSON。
只使用该响应的 files 列表作为下载白名单(逐条原样路径,含大小写)。
再进行 GET /file/{user}/{path} 下载。
若用户要求写飞书文档/发 docx,必须继续在 agent 工具路由执行 feishu_doc/feishu_media,不得中断并让用户重发消息触发。
禁止输出的话术(错误示例):
feishu_doc 不是 exec 可调用接口,所以你再发一条”正确话术(示例):
硬性禁止(避免 400/404):
task 完成前提前 GET /file/...city_bar.png、chart1.png)/file/{user}//file/{user}/output/file/{user}/output/chartsfiles 列表里,就视为不存在,不要重试猜名你需要:
result 提炼成若干条高信息密度要点发给用户(不要一次性原样转发超长文本)。files 中每个路径下载并发回飞书(勿只下载 report.docx 而漏掉图表):curl -sS -o /tmp/out.bin "http://opencode-bridge:8000/file/{user}/output/report.docx" -H "Authorization: Bearer $OPENCODE_BRIDGE_TOKEN"
(实际发送附件请用 OpenClaw/飞书渠道的标准“发文件”能力,以上仅示意下载方式。)
当用户提出任一需求时执行:
流程(强制按顺序,且必须以工具返回结果为准):
先确保产物确实存在(以 bridge 返回的 files 为准)
output/report.mdfiles 中包含 output/report.docxfiles 中包含 output/report.pdfPOST /task/{user} 要求补生成缺失文件(docx/pdf),直到 files 确认包含为止或 bridge 返回明确错误。result 或 output/report.md 的字数是否满足要求;若不足,必须追加一次 POST /task/{user} 执行“仅补足字数且不改变既有结构”的增量写作。导出为飞书文档(Doc)并返回链接
output/report.md 内容(通过 bridge 下载)feishu_doc:
action: "create"(标题建议含日期/主题)action: "write" 写入 Markdownfeishu_doc 会返回 url 与 document_id:
url(以及可选的 document_id)发送 docx/pdf(作为文件消息)并返回发送结果
docx:通过 bridge 下载 output/report.docx 到临时路径,然后调用 feishu_media:
action: "upload_and_send_file"chat:<chat_id>,私聊发到 open_id:<open_id>pdf:通过 bridge 下载 output/report.pdf 到临时路径,然后调用 feishu_media 同样方式发送;
feishu_media 发送文件时必须:
message 工具或传入 filePath(已知未实现,文件会被静默忽略)to:群聊必须是 chat:<chat_id>,私聊必须是 open_id:<open_id>file_path(注意下划线;绝对路径,来自你刚下载到临时目录的 docx/pdf)file_name:report.docx / report.pdf(与实际发送文件一致)feishu_media 返回 ok 与 fileKey:
ok=true/false 和 fileKey(至少写出 fileKey)禁止无链接/无文件的标题幻觉
POST /task/{user}。{user} 的 Session,使 OpenCode 能在已有上下文基础上增量修改。error 或超时:
files 为空:
resulterrorfeishu_docurlfeishu_mediaok/fileKey