报关单智能提取(profy-customs)
把合同、发票、提单、装箱单、核注清单这类贸易单据,转成一份字段级可追溯、可机器校验的报关单 JSON。每个字段都带value / reason / confidence / page——你能看到它从第几页的哪句话来的,而不是拿到一堆无从复核的结果。
这是垂直行业插件,不是通用 OCR。它内置了中国海关的字段定义、代码表、跨字段规则与歧义决策树;通用 OCR 只能给你文字,它给你的是可申报的字段。
启用方式
profy-customs 是 user_selectable: true 的插件——必须在对话的插件面板里手动勾选,不会自动介入。
它的 activation 只有 user_selectable 一项,没有 requires 也没有 conditions:勾选后在任何沙箱模式下都可用,不依赖 Desktop、不依赖浏览器。
快速开始
上传单据后直接说:三个工具
customs_ocr — 版面级文字识别
bbox 是这个工具存在的理由:报关单大量信息在表格里,光有文字流会丢掉「这个数字属于哪一列」。
服务地址由 CUSTOMS_OCR_URL 决定,默认 http://profy-ocr:8001,请求打到 /ocr/parse,单次超时 120 秒。
customs_code_lookup — 海关代码表查询
确定性查表,不让模型猜代码值。精确匹配会同时比对
name 与 aliases;fuzzy=True 走子串匹配,最多返回 10 条(防止工具输出撑爆上下文)。
customs_validate — 格式与跨字段校验
passed 的判定是 P0 与 P1 均为 0——P2/P3 不影响通过。
字段全集(83 个)
表头 56 个 + 表体 27 个。按组路由,处理哪组才加载哪组的规则说明:
食品组与危险品组是条件激活的:HS 编码监管条件含 A/B 才加载食品组,出现 MSDS 且第十四部分有危险品分类才加载危险品组。
校验规则全表
格式校验
日期不只看位数:年份限 1900–2099,月份 1–12,日按
calendar.monthrange 取该年该月真实天数,所以 20250230 会报「日期30超出2025年2月最大天数28」。
跨字段一致性
边界与失败态
其余边界:- 跨字段检查只跑表头。表体逐行只做格式校验,行间关系不检查。
customs_code_lookup模糊搜索最多 10 条,超出静默截断,返回的count是截断后的数量。- 未知代码表名返回
{"error": "未知代码表 'X'", "available_tables": [...]},不会抛异常。 - 大票建议拆会话。提取按 Phase 拆分:Phase A 做表头 56 字段,Phase B 做表体;表体 ≥8 行时建议开新会话,否则上下文会被单据原文吃满。
排错
结果去哪了
最终 JSON 会由 Core 在对话complete 时写入 message.metadata.declaration,映射为预览契约 {basic, fields, goods, ...}。这是插件与产品之间的持久化契约——前端报关单预览面读的就是它。
验证你的配置
- 勾选插件后,先做一次不带文件的代码查询:「一般贸易的监管方式代码是什么」。若返回
代码表 ... 为空或文件不存在,说明命中了上面的已知缺陷。 - 传一份单页发票,说「只提取表头身份信息组」。应该看到 OCR 卡片展开、字段带
page与confidence。 - 拿提取结果说「帮我校验」。应看到校验卡片给出
by_severity统计——这一步返回passed: true才算链路通。
相关页面
插件总览
28 个内置插件的定位与激活方式
技能
技能如何按需加载,为什么不一次性塞满上下文
核对日期 2026-08-11。来源:
services/agent-runtime/src/plugins/builtin/customs/plugin.json、tools/customs_ocr.py、tools/customs_code_lookup.py、tools/customs_validate.py、skills/customs-extraction/SKILL.md。
