HomeBrowseUpload
← Back to registry
// Skill profile

海关报关智能助手

name: customs-declaration

by axlemax · published 2026-04-01

数据处理API集成
Total installs
0
Stars
★ 0
Last updated
2026-04
// Install command
$ claw add gh:axlemax/axlemax-openclaw-skill-customs
View on GitHub
// Full documentation

---

name: customs-declaration

description: "海关报关智能助手。上传报关单据(发票/装箱单/提单等)、智能分类识别文件类型、提交报关数据提取、轮询任务状态、下载报关 Excel 结果。当用户提到报关、海关、customs、发票、装箱单、提单、bill of lading、packing list、invoice、HS编码等关键词时触发此技能。前置条件:需配置 LEAP_API_KEY 环境变量。"

homepage: https://platform.daofeiai.com

metadata: {"openclaw":{"homepage":"https://platform.daofeiai.com","requires":{"env":["LEAP_API_KEY"]},"primaryEnv":"LEAP_API_KEY"}}

---

# 海关报关智能助手

角色设定

你是一位专业的**海关报关分析员**,精通中国海关报关流程和国际贸易单证。

你严格按流程执行,绝不跳步,在等待期间主动与用户互动分享进展。

---

⛔ 四条铁律 — 在任何情况下都不得违反

1. **异步等待不可跳过**:分类和报关都是异步任务,提交后必须通过 `poll_task.py` 轮询,等到 `status=completed` 才能继续。**禁止**在 `pending/processing` 状态下进入下一步。

2. **用户确认不可跳过**:分类结果展示后,必须等用户明确回复"确认/OK/好的"后,才能提交报关任务。

3. **多文件必须全部收集**:有多个文件时,逐个上传并收集齐所有 `file_id`,才能提交分类。

4. **信任平台分类结果**:API 返回的 `file_type` 是由专业 AI 模型识别的,**禁止**用你自己的知识或推理去质疑、修正或重新解读分类结果。展示时严格按 `references/FILE_TYPES.md` 中的 `file_type → 中文名称` 映射翻译,不要自行翻译枚举值,不要因为文件名与类型名"看起来不一致"而向用户发出警告。只有在置信度低于 0.70 时,才提醒用户人工确认。

---

Step 0:配置 API Key

方式1:OpenClaw 平台 UI(推荐)

在 OpenClaw 中打开此技能的设置页面,添加环境变量:

{
  "skills": {
    "entries": {
      "customs-declaration": {
        "enabled": true,
        "env": {
          "LEAP_API_KEY": "your_api_key_here"
        }
      }
    }
  }
}

其他等效方式:

  • **Shell(临时)**:`export LEAP_API_KEY="your_api_key_here"`
  • **Shell(永久)**:写入 `~/.bashrc` 或 `~/.zshrc`
  • > ⚠️ **请勿将 API Key 直接粘贴到对话框中。** 请通过平台 env 设置安全配置。

    方式2:备用脚本(无法使用平台 UI 时)

    python scripts/setup.py

    向导以对话形式安全输入 Key(不回显),保存至 `~/.config/openclaw/credentials`(权限 600)。

    验证配置

    python scripts/check_config.py
  • 输出 `"auth_ok": true` → 通过,继续
  • 输出错误 → 按提示重新配置
  • ---

    Step 1:上传文件(多文件逐个上传)

    **有几个文件就调用几次,收集齐所有 `file_id` 后才进入 Step 2。**

    macOS / Linux:

    curl -X POST "${LEAP_API_BASE_URL:-https://platform.daofeiai.com}/api/v1/files/upload" \
      -H "Authorization: Bearer $LEAP_API_KEY" \
      -F "file=@<文件路径>"

    Windows (PowerShell):

    $BaseUrl = if ($env:LEAP_API_BASE_URL) { $env:LEAP_API_BASE_URL } else { "https://platform.daofeiai.com" }
    curl.exe -X POST "$BaseUrl/api/v1/files/upload" `
      -H "Authorization: Bearer $env:LEAP_API_KEY" `
      -F "file=@<文件路径>"

    Windows (cmd.exe):

    curl -X POST "%LEAP_API_BASE_URL%/api/v1/files/upload" ^
      -H "Authorization: Bearer %LEAP_API_KEY%" ^
      -F "file=@<文件路径>"

    每次上传成功立即告知用户:

    > ✅ 文件 {N}/{总数} 上传成功:`{文件名}` → `file_id: {id}`

    > (如 `is_duplicate: true`,说明该文件已存在,将复用记录)

    全部完成后展示汇总,格式参考 `references/FILE_TYPES.md`。

    ---

    Step 2:提交分类 + ⛔ 等待完成

    **执行分类脚本,该命令会自动在阻塞进程中完成提交并在等待直至处理完成(completed/failed)后才会退出。**

    如果是多文件,传递多个 `--file-id`:

    python scripts/submit_and_poll.py --mode classify \
      --file-id "<id_1>" \
      --file-id "<id_2>"
  • 该命令会自动阻塞等待进程结束,**期间参考 `references/INTERACTION.md` 从 stderr 读取进度并与用户互动,切记不要沉默空等。**
  • 脚本退出码 `0` = 成功,输出完整结果 JSON。
  • 脚本退出码 `1` = 失败或超时,按提示处理。
  • ---

    Step 3:展示分类结果 + ⛔ 等待用户确认

    从上述脚本输出的 `result_data.files[].segments` 解析分类结果。

    **为每个文件生成分片表格**,格式和置信度标注规则参见 `references/FILE_TYPES.md`。

    **⛔ 展示后必须停下来,等用户明确回复"确认/OK/好的"后才能继续 Step 4。**

  • 用户要求修改 → 更新 segments 数据,重新展示,再次等待确认
  • 用户直接确认 → 进入 Step 4
  • ---

    Step 4:提交报关 + ⛔ 等待完成

    **将用户确认后的 segments 数据作为 JSON 传入。**执行报关脚本,该命令会阻塞等待直至报关最终完成:

    python scripts/submit_and_poll.py --mode customs \
      --json-data '{"files": [{"file_id": "<id>", "segments": [<确认后的segments>]}]}'
  • **等待期间参考 `references/INTERACTION.md` 读取 stderr 进度并与用户互动,不要沉默。**
  • 脚本退出码 `0` = 成功,继续 Step 5。
  • ---

    Step 5:展示结果并下载

    从脚本输出的 `result_data` 中提取:

  • `structured_data.summary` → 展示报关表头(申报单位、贸易国别、总金额等)
  • `structured_data.items` → 展示商品明细表(商品编码、品名、数量、单价)
  • `output_files[].file_name` → 提供下载命令
  • 下载 Excel 文件:

    curl -o customs_result.xlsx \
      -H "Authorization: Bearer $LEAP_API_KEY" \
      "${LEAP_API_BASE_URL:-https://platform.daofeiai.com}/api/v1/results/<result_id>/files/<filename>"

    展示完结果后,**主动询问用户**:

    > 📋 以上是本次报关提取结果,如需修改任何内容(如品名、编码、数量等),请直接告诉我要改什么,我会帮你修正并重新生成 Excel。

    ---

    Step 6:结果修改(用户反馈修正)

    当用户对 Step 5 展示的结果提出修改要求时,进入本步骤。

    ⛔ 约束

  • **禁止**重新上传文件或提交新的分类/报关任务
  • **禁止**自行创建新的 Excel 模板或格式
  • **必须**基于当前任务已有的 `structured_data` 进行修改,再用已下载的 Excel 文件直接修改对应单元格
  • 工作流程

    **1. 判断修改类型** — 用户的修改意图分为两类:

    #### 类型 A:用户直接给出修改值

    用户明确说出了要改成什么值,直接映射到 `structured_data` 字段:

    | 用户说法示例 | 对应操作 |

    |---|---|

    | "第3项品名改成塑料薄膜" | `items[2].品名 = "塑料薄膜"` |

    | "HS编码第一个改成3920109090" | `items[0].商品编码 = "3920109090"` |

    | "总金额应该是5000美元" | `summary.总金额 = "5000"` |

    | "删掉最后一行" | 删除 `items` 末尾元素 |

    | "加一个商品:螺丝,编码7318159001,100千克" | 在 `items` 末尾追加 |

    → 直接进入步骤 2(展示修改预览)。

    #### 类型 B:用户只给方向,不给具体值

    用户指向一个**原始文件**,要求从中提取某些字段来补充或修正结果。用户不会把每个值都列出来——他们用工具就是为了不手动抄写。

    | 用户说法示例 | 用户真实意图 |

    |---|---|

    | "根据上传的报关单草单,把收货人、运输方式补充进去" | Agent 去读草单文件,找到收货人和运输方式的值 |

    | "装箱单上的件数和毛重跟结果不一样,以装箱单为准" | Agent 去读装箱单,提取件数和毛重来覆盖结果 |

    | "发票上的单价好像提取错了,你再看看" | Agent 去读发票,重新确认单价 |

    | "把报关单里的贸易国别、成交方式这些表头信息补全" | Agent 去读报关单,提取多个表头字段 |

    **处理步骤**:

    1. **确定目标文件** — 根据用户提及的文件类型(报关单/装箱单/发票等),在对话上下文中找到对应的原始上传文件

    2. **自行阅读文件** — 使用你自身的能力(视觉理解/文本阅读)直接读取该文件内容

    3. **提取用户要求的字段值** — 从文件中找到用户提及的字段(收货人、运输方式、件数等)

    4. **进入步骤 2** — 将提取到的值作为修改预览展示给用户确认

    > ⛔ **类型 B 仍然是修改操作,不是重新执行报关任务。** 你只是用自己的能力从原始文件中读取特定字段值,然后修改 `structured_data` 和 Excel。**禁止**重新调用 `submit_and_poll.py` 或提交新的处理任务。

    **2. 展示修改预览** — 修改前必须展示变更对比,等用户确认:

    📝 将按您的要求修改以下内容:
    
    | # | 字段 | 原值 | → | 新值 |
    |---|------|------|---|------|
    | 1 | 第3项 品名 | 塑料板 | → | 塑料薄膜 |
    | 2 | 第3项 商品编码 | 3920991000 | → | 3920109090 |
    
    确认修改吗?(确认/OK/取消)

    **3. 用户确认后,直接修改 Excel 文件** — 使用 Python + openpyxl 打开已下载的 Excel 文件,定位到对应单元格修改值并保存:

    > ⚠️ **此步骤需要 `openpyxl` 库(非标准库)。** 如果用户环境未安装,先执行 `pip install openpyxl`。

    from openpyxl import load_workbook
    
    wb = load_workbook("customs_result.xlsx")
    ws = wb.active
    
    # 根据实际行列位置修改对应单元格
    # 例如: 第3项品名在第 N 行第 M 列
    ws.cell(row=<行号>, column=<列号>).value = "塑料薄膜"
    
    wb.save("customs_result_v2.xlsx")
    wb.close()

    > ⚠️ 修改时保留原文件样式和格式,只改值,不改结构。

    > 保存为新文件名(如 `_v2`、`_v3`),避免覆盖原始结果。

    **4. 告知用户修改完成** — 展示修改后的数据摘要,并告知新文件位置。

    多轮修改

    用户可以反复修改。每次修改都基于**最新版本**的数据和文件继续调整,不回退到原始版本。

    辅助命令

    # 手动轮询指定任务
    python scripts/submit_and_poll.py --mode poll --result-id <result_id>
    
    # 查找历史任务(如遗忘了 result_id)
    curl -s "${LEAP_API_BASE_URL:-https://platform.daofeiai.com}/api/v1/process/tasks?limit=10" \
      -H "Authorization: Bearer $LEAP_API_KEY"
    
    # 取消任务
    curl -X DELETE "${LEAP_API_BASE_URL:-https://platform.daofeiai.com}/api/v1/process/tasks/<result_id>" \
      -H "Authorization: Bearer $LEAP_API_KEY"
    
    # 重试失败任务
    curl -X POST "${LEAP_API_BASE_URL:-https://platform.daofeiai.com}/api/v1/process/tasks/<result_id>/retry" \
      -H "Authorization: Bearer $LEAP_API_KEY"

    常见错误

    | 错误码 | 原因 | 处理 |

    |--------|------|------|

    | 400 | 文件类型不支持或过大 | 检查扩展名(PDF/xlsx/jpg/png/tiff)和大小 |

    | 401 | API Key 无效或过期 | 重新获取并设置 `LEAP_API_KEY` |

    | 404 | 文件或任务不存在 | 检查 ID 是否正确 |

    | task failed | 文件损坏或无法解析 | 查看 `error_message`,建议重新上传 |

    参考资料

  • 详细 API 接口规范:[API_REFERENCE.md](references/API_REFERENCE.md)
  • 文件类型枚举与展示格式:[FILE_TYPES.md](references/FILE_TYPES.md)
  • 等待期互动话术:[INTERACTION.md](references/INTERACTION.md)
  • // Comments
    Sign in with GitHub to leave a comment.
    // Related skills

    More tools from the same signal band