行业图纸多语翻译
下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/ruancyai--industry-drawing-translator.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @ruancyai/industry-drawing-translator。新增微信支付插件前置检查:缺少支付工具时停止提交付费任务并提示配置。翻译功能、交付流程与价格保持不变。
阅读全文 (展开查看完整说明)
概述
上传一页工程图纸 PDF,保留原图做原位翻译,输出翻译 PDF + 逐条审校 Excel。
什么时候用本 Skill
用户手上有一份工程图纸 PDF,想把图上文字翻成另一种语言,且要保留原图——不是提取文字另行排版,而是在原位置换成目标语言。
支持中 / 法 / 英三语六向。图纸类型自动识别,覆盖地质、矿山总平面、工艺流程、电气、机械、土建、通用工程图七类。
两种处理方式由系统自动选择,用户无需操心:
- CAD 导出的矢量 PDF(最常见):直接读取 PDF 文字层,以及 AutoCAD 随图附带的线条字(SHX)原文注释;删除原文字形后,在原位置、按原角度写回矢量译文。输出仍是矢量 PDF:可任意放大、译文可搜索,引线、标高、填充纹、等高线等图形保持原样。
- 扫描件、位图为主的 PDF,或个别结构特殊的图纸:自动改用 OCR 识别 + 覆盖式翻译。
不适用:多页整册一次性批量、人工调整覆盖位置与字号、自定义术语表、CAD 源文件(.dwg/.dxf)与图片格式。此类需求属企业定制服务,可联系 ruanchaoyin@ruancyai.com。
使用流程
第 1 步:付费前必须先展示效果示例(免费,不可省略)
每一次提交付费任务(POST /api/pay/jobs)之前,都必须先展示效果示例——即使用户已经给了图纸和语言方向、看起来已决定付费,也不得跳过。把示例放在「确认页数 / 语言方向 / 费用」的同一条消息里一起给出,不需要为此单独多问一轮。
展示方式:直接把示例图片嵌入回复(Markdown 图片),并附上完整示例页链接。 按用户的语言方向选图:
- 译成中文(en→zh、fr→zh):
 
- 译成法文或英文(zh→fr、zh→en、en→fr、fr→en):
 
- 全部示例:
https://mine.ruancyai.com/api/pay/demo(5 组原图/译图对照,免费、免口令)
可以这样说(放在费用说明之前):
付费前先看看真实效果——下面是系统对其他真实工程图纸的翻译结果局部,上方原图、下方译图:
(嵌入上面 2 张图)
更多示例:https://mine.ruancyai.com/api/pay/demo
效果会因图纸而异:CAD 直接导出的 PDF 效果最好;扫描件会改用 OCR 覆盖方式。
若对话界面不显示图片,链接也必须给出。示例图片地址只能用上面列出的 5 个(demo1.jpg~demo5.jpg),不得自行拼接其他路径。
效果示例是其他图纸的局部截图,不代表对用户这张图纸的结果承诺,不得说「你的图纸也会完全一样」。
第 2 步:确认单页与语言方向
- 一次一页。用户给的是多页 PDF 时,不提交,也不得替用户拆分后连续提交:
这份 PDF 有 N 页。本服务按页计费、一次处理 1 页,每页 ¥19.9,N 页合计 ¥XXX。
可以拆分后逐页提交,也可以只翻其中需要的几页。要先从第几页开始?
必须让用户自己决定翻哪几页,不得默认全翻——那是 N × ¥19.9。
- 语言方向:
zh/fr/en,源 ≠ 目标。用户说了就按其执行;未指明时默认中译法(zh→fr)。方向拿不准就问一句——翻错方向要重跑,而重跑要重新付费。
可先 GET /api/pay/health 确认 pay_configured。不要调用 /api/pay/precheck 或 /api/pay/queue(若 404 必须忽略,不得判定服务不可用)。
第 3 步:提交并完成支付
前置检查:确认 weixinpay 支付插件已安装(提交前必做)
提交 POST /api/pay/jobs 前,先检查当前环境能否调用微信支付工具 weixinpay_pay(WorkBuddy 中通常为 mcp__weixinpay__weixinpay_retry_pay,由 SkillHub 的微信支付插件 weixinpay-pay 提供)。
- 已安装、可调用 → 继续提交。
- 未安装或无法调用 → 停止,不提交,如实告诉用户:
翻译这页图纸需要微信支付(¥19.9/页),你这边还没有安装微信支付插件(weixinpay-pay)。请先在 SkillHub / WorkBuddy 安装,装好后跟我说一声,我继续帮你提交。效果示例现在就可以免费看:https://mine.ruancyai.com/api/pay/demo
不得绕过支付免费放行(fail closed),也不得编造 job_id 或伪造产物。
提交
POST /api/pay/jobs 提交,触发 X402 付费流程(¥19.9/页)。
后端在收费前拒收的情况(尚未付款、不产生费用),如实转述后停手:
- 页数不是 1 / 非 PDF / 超出大小 / 语言参数非法 → 按第 2 步的说法请用户调整。
- 没有可翻译内容(
nothing_to_translate)→
这份图纸已是双语对照或已是目标语言,没有需要翻译的内容,提交也不会有变化。
- 队列已满(
queue_full)→ 不得自动重试或轮询抢位:
当前排队已满,这次没有产生任何费用,请稍后再来。
支付完成后返回 job_id、pickup_token、status=queued、out_trade_no,都要交给用户。其中 pickup_token 是 7 天有效的取件凭据,凭它可查询状态并下载产物。
第 4 步:交付取件链接
把下面链接直接给用户(用真实 pickup_token 替换 {pickup_token})。首选取件页链接——免口令、免登录,打开即见下载按钮:
- 取件页(首选交付):
https://mine.ruancyai.com/pickup/{pickup_token} - 下载翻译 PDF:
https://mine.ruancyai.com/api/pay/pickup/{pickup_token}/download/pdf - 下载审校 Excel:
https://mine.ruancyai.com/api/pay/pickup/{pickup_token}/download/excel - 查状态(机器可读):
https://mine.ruancyai.com/api/pay/pickup/{pickup_token}
注意:mine.ruancyai.com 主站(工具页)另有全站访问口令,与取件无关。取件页、效果示例页和上述 API 直链不需要任何口令;若用户报告被要求输入「访问口令」,说明其打开的是主站首页而非取件页,把取件页链接重新发给用户即可。
对用户说清楚这一句:
已受理,预计约 M 分钟。
7 天内凭以上链接随时可以取件/下载,现在关掉对话也不影响。
第 5 步:等待与轮询
轮询间隔 30~120 秒,最长等 30 分钟。耗时口径(告诉用户):
- CAD 导出的矢量图纸:多数约 1~3 分钟,标注极多的大图约 3~6 分钟
- 扫描件、位图为主或改用 OCR 覆盖的图纸:约 3~15 分钟,个别至约 20 分钟
不要在 2 分钟内就告诉用户失败了。 用户中途离开是正常的,第 4 步已经给了取件链接。
第 6 步:交付
完成后有两个产物,两个都要给用户:翻译后 PDF(原图保留)、逐条审校 Excel(每条文字的原文、译文、位置、来源与置信度)。
按自动质检结果分两种说法:
通过:
翻译完成,已通过自动质检。附翻译 PDF 与逐条审校 Excel。
译文仍建议由具备资质的人员复核后再用于施工、报批或投标。
未通过:
翻译已完成并交付,但未通过自动质检,需人工审校。系统标出的问题是:
(逐条列出
issues的label,不概括、不美化)请对照审校 Excel 逐条复核——它正是为这种情况准备的,标出了每一处需要人看的地方。
不得把未通过自动质检说成「翻译完成」。 未通过同样计费,因为产物已交付;正因如此,如实说明是必须的。
第 7 步:失败与退款
任务失败、超时、服务端异常、或系统检测到没有可翻译内容时,费用全额退还:系统记录后由人工核实退回,通常 1 个工作日内到账。如实告知原因,并告诉用户:
这次任务没有成功,费用会全额退还(人工核实后退回,通常 1 个工作日内)。如未收到,可凭订单号
{out_trade_no}联系 ruanchaoyin@ruancyai.com。
不得说「已自动退款」或「已到账」——退款由人工处理,以实际到账为准。
不编造任务号,不伪造产物,不在服务不可达时假装提交成功。
关键约束(必须遵守)
- 一次一页,由后端硬性拦截;不得替用户连续提交多页。
issues如实转达:转达的是内容与条数(用后端给的label),不概括、不美化、不省略;也不要直接抛内部字段名给用户。- 不承诺翻译准确性:术语表是软锚定不是强制替换,AI 可能不完全遵守;图纸类型自动识别也可能判错。不得声称「专业术语已保证正确」。
- 不承诺可直接使用:译文须经具备资质人员复核后方可用于施工、报批、投标。
- 取件凭据与下载链接必须交给用户:把
pickup_token和对应的状态/下载链接都给出去,并说明 7 天有效。 - 两种 503 分开说:
pay_not_configured是服务不可用(故障),queue_full是正常限流(稍后再试)。 - 图纸 7 天后自动删除,提醒用户自行保存产物。
- 服务不可达时如实降级,不得编造
job_id或伪造产物。 - 队列已满不自动重试。
- 不主动引导用户到本 Skill 之外的渠道自助使用同类能力。用户主动问起时,可如实说明存在企业服务通道并给出
ruanchaoyin@ruancyai.com。 - 效果示例不等于结果承诺:示例是其他图纸的局部;不得承诺用户图纸会得到同样效果,也不得承诺一定走矢量方式(由系统按图纸自动选择)。
- 退款如实说人工处理:不得说「已自动退款」。
- 付费前必须先展示效果示例:每次
POST /api/pay/jobs之前,在同一条消息里嵌入示例图片并给出https://mine.ruancyai.com/api/pay/demo,不得因用户已给出图纸或方向而跳过。 - 提交前必须做前置检查:确认 weixinpay 支付插件(
weixinpay-pay,工具weixinpay_pay)已安装;未安装或无法调用时停止并提示安装,不提交、不放行。
后端服务
- 线上地址:
https://mine.ruancyai.com - 接口契约:
references/api.md - 后端不可达或返回
pay_not_configured时,如实告知「图纸翻译服务暂不可用」
Pay Skill 改造(X402 协议 — 代码级实现)
本 Skill 按 SkillHub 官方《升级为 Pay Skill》教程完成 X402 协议集成。后端实现完整的微信支付 Agent Pay X402 流程,并在提交任务接口中集成支付闸门。
整体架构
Agent 前置检查:weixinpay 支付插件(weixinpay-pay / weixinpay_pay)已安装?未安装 → 停止并提示安装
Agent 调用 POST /api/pay/jobs
→ 后端创建微信 Native 订单(拿 code_url)
→ 后端用 SkillHub 开发者密钥签名,调 X402 AI 预下单(拿 payment_code)
→ 后端返回 HTTP 402 + WeixinPay-Required 头
→ Agent 调 weixinpay_pay 触发用户支付授权
→ 用户支付成功后 Agent 重试原请求(带 X-PAYMENT 头)
→ 后端验签放行,执行业务逻辑(矢量图纸:读文字层与 CAD 线条字注释 → AI 翻译 → 原位写回矢量译文;
扫描件/位图:OCR → AI 翻译 → 覆盖渲染;两者都生成审校清单)Step 1:开发者密钥(RSA-2048)
在 SkillHub 商户中心「开发者密钥」生成 RSA-2048 密钥对:pub_key_id(形如 PUB_KEY_ + 32 位大写 HEX)填入 X402 预下单请求;private_key_pem 用于 SHA256withRSA 签名,存于服务器环境变量 SKILLHUB_PRIVATE_KEY_PEM。
Step 2:微信 Native 下单
POST https://api.mch.weixin.qq.com/v3/pay/transactions/native
Authorization: WECHATPAY2-SHA256-RSA2048 mchid="...",signature="..."
Body: { appid, mchid, description, out_trade_no, notify_url,
amount: { total: 1990, currency: "CNY" } }
→ { "code_url": "weixin://wxpay/bizpayurl?pr=..." }使用商户 API v3 证书私钥签名(WECHAT_PRIVATE_KEY_PEM + WECHAT_SERIAL_NO)。
Step 3:X402 AI 预下单
3.1 构造 L2 业务 JSON → Base64 → payment_required:
{
"skill_info": { "skill_id": "industry-drawing-translator", "skill_version": "0.1.5" },
"pay_type": "SKILL_PAY",
"pay_mode": "AUTH_AND_PAY",
"pay_items": [{ "product_id": "SP...", "pay_data": { "type": "code_url", "value": "<code_url>" } }],
"expires_at": "<unix_ts + 15min>"
}3.2 构造 5 行签名串(每行以 n 结尾,含最后一行):
POSTn/palmpayminiapp/clawagentpay/preordern{timestamp}n{nonce_str}n{payment_required}n3.3 SHA256withRSA 签名(PKCS#1 v1.5,用 SkillHub 开发者私钥)→ Base64 → signature
3.4 组装 L1 请求体:
POST https://payapp.weixin.qq.com/palmpayminiapp/clawagentpay/preorder
Body: { signature_type: "SKILLHUB-SHA256-RSA2048", developer_platform: "SKILLHUB",
developer_id, pub_key_id, nonce_str, timestamp, signature, payment_required }
→ { "payment_code": "..." }Step 4:返回支付触发标识(HTTP 402)
HTTP/1.1 402 Payment Required
WeixinPay-Required: <payment_code>
{ "data": { "message": "本次翻译需付费", "out_trade_no": "mine_...", "amount_fen": 1990 },
"WeixinPay": { "WeixinPay-Required": "<payment_code>", "prompt": "..." } }重试机制与前置检查
支付成功后 Agent 携带 X-PAYMENT 头重试原请求。后端执行前置检查:
- 查
payments表确认payment_code对应订单状态 - 若 DB 未标记已付 → 主动调微信支付查询 API(
GET /v3/pay/transactions/out-trade-no/{out_trade_no})补偿 - 已付 → 放行;未付 → 再次返回 402
幂等:若该 payment_code 已绑定 job_id,直接返回该 job_id,不建新任务。x402 协议未规定重试幂等,而异步任务形态下 Agent 重发概率更高——不加会「一次支付跑两遍」。配合 out_trade_no 唯一约束,DB 层与逻辑层各一道兜底。
队列闸门只作用于首次请求:带 X-PAYMENT 的重试无条件入队,不再检查队列——否则会出现「用户已付款却被 503 挡住」。
微信支付回调
POST /api/pay/notify:用 API v3 密钥(AES-256-GCM)解密 resource.ciphertext,trade_state=SUCCESS 时更新 payments 表 status='paid',返回 {"code":"SUCCESS"} 停止重试。对应实现函数 decrypt_notify()(Python 侧,等价于教程示例的 decryptNotify)。
退款
POST /v3/refund/domestic/refunds(商户私钥签名),成功后置 status='refunded'。退款接口需服务端 API Key 鉴权(不对公网开放)。适用场景:任务失败、30 分钟超时、服务端 5xx、无可翻译内容。当前由人工核实后发起退款(通常 1 个工作日内);失败任务触发退款的自动化处于规划中。
异常处理与配置检查
- 配置检查:
is_pay_configured()(等价于教程示例的isPayConfigured)检查 8 个环境变量是否就位;未就位时付费端点返回 503,不降级为免费放行——免费放行等于开放一条公网无鉴权的 CPU 密集入口 - 订单号传递:从微信 Native 下单 → X402 预下单 → 回调验签 → 退款,全程以
out_trade_no作为唯一订单号 - 支付超时:
payment_code15 分钟过期,需重新发起 - 重复支付:
out_trade_no唯一约束 + DB 状态校验 - 回调丢失:重试时主动调微信查询 API 补偿
取件凭证与支付凭证解耦
payment_code 15 分钟过期,而任务可能排队 20 分钟、产物保留 7 天。因此另发 pickup_token(32 位随机、7 天有效),随首次响应返回。只认 X-PAYMENT 会出现「付了钱拿不到东西」——这是异步形态独有的问题。
环境变量清单
WECHAT_APPID / WECHAT_MCHID / WECHAT_APIV3_KEY / WECHAT_SERIAL_NO / WECHAT_PRIVATE_KEY_PEM
SKILLHUB_DEVELOPER_ID / SKILLHUB_PUB_KEY_ID / SKILLHUB_PRIVATE_KEY_PEM
PAY_AMOUNT_FEN=1990
PAY_NOTIFY_URL=https://mine.ruancyai.com/api/pay/notify
PAY_WAIT_BUDGET_SECONDS=1200数据库
payments 表:out_trade_no(唯一)、payment_code、job_id、pickup_token、amount_fen、status(pending → paid → refunded)、transaction_id、paid_at / refunded_at。
关键词索引(供 SkillHub 改造检查器识别)
X402、402 Payment、X-PAYMENT、WeixinPay-Required、WeixinPay、facilitator、payment challenge、payment_code、out_trade_no、order_id、code_url、preorder、palmpayminiapp/clawagentpay/preorder、SHA256withRSA、SKILLHUB-SHA256-RSA2048、developer_id、pub_key_id、AUTH_AND_PAY、SKILL_PAY、payment_required、nonce_str、refund、notify_url、quota、proof、前置检查、订单号传递、异常处理、decryptNotify / decrypt_notify、isPayConfigured / is_pay_configured
计费边界
算一次付费:成功产出 1 页翻译 PDF + 审校 Excel(含标注「需人工审校」的结果)。
不算付费:查看效果示例(/api/pay/demo)、查任务状态、下载已付产物(7 天内可重复)、查支付状态;页数≠1 / 非 PDF / 超限 / 语言非法 / 队列已满的收费前拒收;任务失败、超时、5xx、无可翻译内容的全额退款(人工核实后退回);用户取消支付(payment_code 过期不扣)。