文档格式化技能
字段说明见 @references/api.md。命令模板见 templates/workflow.sh。可执行入口仍是技能根目录的 main.py,scripts/format_document.py 只转发到同一个入口。
> ⚠️ 最高优先级规则:脚本只执行一次,执行完后立刻展示结果并结束。严禁二次执行、轮询或追加任何额外文字。
> ⚠️ 执行方式强约束:必须前台同步阻塞执行(foreground blocking)。严禁后台异步执行(async/background)、严禁将任务挂起后再回收结果。
能力说明
- 上传 .docx 文档,通过 JSON 配置一键应用格式化(页边距、页眉页脚、页码、h1–h6、正文、目录、表格)
- 同步接口:一次请求直接返回格式化后的 .docx 文件,无需异步轮询
- 除文件路径外,样式参数都有默认值,都不是必填。用户没提到的项直接用默认值,不要追问
- 默认只保存到本地(原文件同目录的
formatted_*.docx)。不要探测网盘,不要提示用户开通网盘 - 只有用户明确说要保存到网盘、同步网盘、上传网盘时,才追加
--save-to-cloud
面向终端用户的表达(默认)
> 默认不要把命令行写给用户。 只引导用户:提供待美化的 Word(.docx)路径或上传文件、确认字体/字号/目录等选项(可用上文询问模板);不要列出 python main.py、--file-path 等命令,除非用户明确索要命令行。
与「仅输出脚本结果」的关系: 格式化完成后的 脚本 stdout 须原样展示;衔接话术不必夹命令。
微信登录认证
- 没有可用 Token 时,运行本技能目录里的
python wx_login.py。几秒内命令结束,浏览器在后台继续等扫码,最长 5 分钟。二维码和这个后台浏览器绑在一起,浏览器一关码就失效。 - 只让用户扫二维码,不要提供浏览器登录链接。有的客户端打不开技能目录里的图片时,按下面顺序给图,不要只发文件路径:
1. 把脚本输出里WECHAT_QR_MARKDOWN:后面的整行原样放进回复。这是内嵌二维码,不依赖用户能不能访问脚本所在磁盘。
2. 本地 PNG 只作为补充。工作目录存在时,脚本还会导出/workspace/微信登录二维码.png。文件卡片如果没有真正预览出来,就不要再靠路径。 - 不要只用读取工具打开这张 PNG。那样只有助手自己看得到,用户看不到。
- 用户用微信扫码后,必须在手机上点「确认登录」。只扫不点等于没登录。用户表示已经扫码后,再执行原来的业务命令。
- Token 写入
~/.taitoubiao/token.json,五个技能共用。5 分钟内不要重复启动登录,否则旧码作废。 - 接口返回登录失效时,会清掉缓存并重新出一张码。自动化请设置
TAITOUBIAO_SKIP_AUTO_LOGIN=1。
使用限制
- 仅支持
.docx格式(不支持旧版.doc),文件大小上限 300MB - 同一请求 10 秒内不可重复提交(防重复)
🔴 执行流程(必须遵守)
第 1 步:确认文档路径
从用户消息中提取待格式化的 .docx 文件绝对路径。若用户未提供,主动询问。
第 2 步:只使用用户明确提到的样式
除文件路径外,全部样式都有默认值,都不是必填。
- 用户说「默认」「都默认」「直接格式化」,或只给了文件、没提样式 → 不询问,直接按默认值执行
- 用户只改了某一项(例如「上边距 2.5」「一级标题用三号」)→ 只覆盖该项,其余保持默认,不要把没提到的项再问一遍
- 页码开关和页眉开关是两件事。用户没提页眉时保持关闭;用户没提页码时保持开启
第 3 步:调用脚本(仅执行一次)
根据用户确认的参数拼装命令并执行一次。脚本是同步的,执行完即完成,不需要轮询、不需要等待、不需要重复执行。
并且必须使用前台同步阻塞方式运行,等待该命令在当前回合直接返回 stdout;禁止任何 async/background 运行方式。
执行时必须显式保证不会被系统自动转后台:
- Shell 调用必须设置足够长的阻塞等待时间(建议
block_until_ms >= 600000) - 禁止
block_until_ms: 0,禁止任何会触发 "An async command you ran earlier has completed" 的调用方式 - 若命令被意外转后台并出现 system completion 消息,视为执行策略错误;下次必须改为长阻塞前台执行,避免用户看到重复回显
第 4 步:展示结果(立即结束)
将脚本 stdout 输出原样展示给用户(见上文「面向终端用户的表达(默认)」:衔接话术可自然语言,报告/结果正文须为脚本原文)。展示完毕后立即结束,不得做任何后续操作,不得再次执行脚本。
调用方式
python skills/document-format/main.py \
--file-path "/absolute/path/to/document.docx" \
--body-font "宋体" \
--body-font-size "小四" \
--title-font "黑体" \
--title-font-size "四号" \
--reset-toc true
> 所有参数都有默认值,仅 --file-path 为必填。其余参数可省略以使用默认值。
脚本参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--file-path |
String | 必填 | 待格式化的 .docx 文件绝对路径 |
--body-font |
String | 宋体 |
正文字体 |
--body-font-size |
String | 小四 |
正文字号(仅支持:五号/小四/四号/小三/三号/二号) |
--title-font |
String | 黑体 |
标题共用字体。某一级未单独指定时使用 |
--title-font-size |
String | 四号 |
标题共用字号。某一级未单独指定时使用 |
--reset-toc |
Bool | true |
是否重新生成目录。不控制页码开关 |
--top-margin / --bottom-margin |
Float | 2.2 |
上、下边距,单位厘米 |
--left-margin / --right-margin |
Float | 2.3 |
左、右边距,单位厘米 |
--header-mode |
String | none |
页眉页脚:none 关闭,text 纯文字,image 图片 |
--header-text |
String | 空 | 纯文字页眉内容,仅 text 时写入 |
--header-image |
Int | 1 |
图片页眉序号,从 1 开始,仅 image 时生效 |
--header-top-margin |
Float | 0 |
页眉上边距,厘米。图片页眉时不使用 |
--footer-bottom-margin |
Float | 0 |
页脚下边距,厘米。图片页眉时不使用 |
--page-number |
Bool | true |
是否设置页码,与页眉开关无关 |
--page-num-font |
String | 宋体 |
页码字体 |
--page-num-font-size |
String | 小四 |
页码字号 |
--page-num-color |
String | #000000 |
页码颜色 |
--contents-font |
String | 宋体 |
目录字体,不跟随正文 |
--contents-font-size |
String | 小四 |
目录字号 |
--contents-bold |
Int | 0 |
目录是否加粗 |
--contents-line-spacing |
Float | 1.5 |
目录行距倍数 |
--table-header-font |
String | 黑体 |
表头字体,不跟随标题 |
--table-header-font-size |
String | 四号 |
表头字号 |
--table-header-bold |
Int | 1 |
表头是否加粗 |
--table-body-font |
String | 宋体 |
表体字体,不跟随正文 |
--table-body-font-size |
String | 小四 |
表体字号 |
--table-body-bold |
Int | 0 |
表体是否加粗 |
--h1-font … --h6-font |
String | 跟随标题字体 | 该级标题字体 |
--h1-font-size … --h6-font-size |
String | 跟随标题字号 | 该级标题字号 |
--h1-numbering … --h6-numbering |
String | h1 一、 / h2 1. / h3 (一) / h4 (1) / h5 1) / h6 无 | 该级编号 |
--output-path |
String | formatted_<原文件名>.docx |
输出文件路径 |
--save-to-cloud |
Flag | 关闭 | 保存到个人网盘。默认不传;仅用户明确要求网盘时加上 |
--cloud-drive-dir |
String | 不使用 | 个人网盘挂载路径。仅在用户要求网盘且已知路径时传入;不要自动探测 |
--output-format |
String | markdown |
输出格式:markdown 或 json |
--token |
String | 微信登录缓存 Token | JWT 认证 Token;默认读取 /root/.taitoubiao/token.json |
--base-url |
String | https://taitoubiao.com/creator-api |
API 根地址 |
默认值(都已填好,都不是必填)
用户没指定时脚本使用下表。不要为了这些项停下来询问。
| 设置项 | 默认值 |
|---|---|
| 页边距 | 上 2.2cm,下 2.2cm,左 2.3cm,右 2.3cm |
| 页眉页脚 | 关闭。文字用 --header-mode text,图片用 --header-mode image |
| 页眉上边距 / 页脚下边距 | 0cm,仅纯文字页眉页脚使用 |
| 页码 | 开启,宋体小四,黑色。与页眉开关无关 |
| 标题对齐 / 首行缩进 / 行距 / 加粗 | 左对齐,0 字符,1.5 倍,加粗 |
| 标题编号 | h1=一、 h2=1. h3=(一) h4=(1) h5=1) h6=无编号 |
| 正文 | 宋体小四,左对齐,首行缩进 2 字符,1.5 倍,不加粗 |
| 目录 | 宋体小四,不加粗,1.5 倍。不跟随正文 |
| 表头 | 黑体四号,加粗。不跟随标题 |
| 表体 | 宋体小四,不加粗。不跟随正文 |
| 删除分页符 | 否 |
字号对照(--body-font-size / --title-font-size 可用中文名)
| 中文名 | 磅值 |
|---|---|
| 二号 | 22 |
| 三号 | 16 |
| 小三 | 15 |
| 四号 | 14 |
| 小四 | 12 |
| 五号 | 10.5 |
也支持一号、小一、小二。脚本按前端同一套编码提交,五号传 1050。
完整示例
示例 1:全部默认
用户输入:「帮我把 /home/user/投标文件.docx 格式化一下」
不询问样式,直接执行:
python skills/document-format/main.py \
--file-path "/home/user/投标文件.docx"
示例 2:用户指定部分参数
用户输入:「格式化 /data/报告.docx,正文用仿宋,一级标题用三号,上边距 2.5 厘米,页眉写公司名称」
只覆盖提到的项,其余默认,不追问:
python skills/document-format/main.py \
--file-path "/data/报告.docx" \
--body-font "仿宋" \
--h1-font-size "三号" \
--top-margin 2.5 \
--header-mode text \
--header-text "公司名称"
示例 3:用户一次性提供所有参数
用户输入:「格式化 /docs/方案.docx,正文用微软雅黑 小四,标题用黑体 四号,不重建目录」
无需询问,直接执行:
python skills/document-format/main.py \
--file-path "/docs/方案.docx" \
--body-font "微软雅黑" \
--body-font-size "小四" \
--title-font "黑体" \
--title-font-size "四号" \
--reset-toc false
🚫 输出规范
> ⚠️ 核心原则:模型必须只输出脚本返回的原始结果,严禁自行生成中间状态或进度摘要。
✅ 正确:默认只保存本地(用户没有提到网盘)
# 文档格式化结果
- **原始文件**:`投标文件.docx`
- **输出文件**:`formatted_投标文件.docx`
- **工具区路径**:`/workspace/formatted_投标文件.docx`
- **文件大小**:1,234,567 字节
✅ 格式化完成,文档已保存到本地。
完整版功能欢迎访问taitoubiao.com免费体验
> 默认成功文案必须固定为:✅ 格式化完成,文档已保存到本地。
> 用户没有要求网盘时,禁止输出开通网盘、同步网盘、文件空间下载等提示。
✅ 正确:用户明确要求保存到网盘且保存成功
✅ 格式化完成,文档已保存到本地,并已同步到个人网盘。
> 禁止追加任何目录说明或括号补充(例如:(arkdrive_user_uploads目录))。
✅ 正确:用户明确要求网盘,但本机没有可用网盘
✅ 格式化完成,文档已保存到本地。
> ⚠️ **未检测到个人网盘**:文件已保存到本地,未能同步至个人网盘。
> 如需使用网盘,请单击聊天框上方的"网盘"按钮 → "立即授权并创建"开通个人网盘后,再说明要保存到网盘。
🚫 禁止:自行生成中间状态或添加额外文字
- ❌ 不得在脚本输出前后添加任何解释、总结、路径说明或下载指引
- ❌ 不得输出"正在格式化中..."、"格式化已完成,请查看文件"、"你可以直接从该路径下载使用"
- ❌ 不得添加 JSON 配置、摘要或额外说明
- ❌ 不得把 system completion / exec completed 这类系统消息再整理成第二遍结果返回
- ❌ 用户未要求网盘时,不得输出开通网盘、同步网盘或“未检测到个人网盘”
- ❌ 网盘保存成功时,不得把成功文案改写为“已自动保存到个人网盘(xxx目录)”或任何带目录括注的变体
- ❌ 不得在展示完脚本结果后输出 "NO"、"完成"、"有什么需要修改的吗" 等任何后续文字
- ❌ 展示完脚本 stdout 后立即停止,不做任何追加
异常处理
| 脚本输出 | 原因 | 处理 |
|---|---|---|
❌ 文件不存在 |
路径无效 | 确认文件路径 |
❌ 仅支持 .docx 格式 |
非 docx 文件 | 转换为 .docx 后重试 |
❌ 文件大小超过 300MB |
文件超限 | 压缩或拆分 |
❌ 格式化失败 (HTTP 400) |
formatConfig 格式错误 | 检查参数值 |
❌ 格式化失败 (HTTP 429) |
10 秒内重复提交 | 等待后重试 |
❌ 请求失败 |
网络/连接异常 | 检查网络和服务状态 |