前言¶
在 DeepSeek Harness(DSH)里让模型「读一张发票」,常见结果是:号码、金额、税额看起来合理,却没有经过恒等式校验。发票能否入账,往往取决于一条简单关系:金额 + 税额 = 价税合计。若模型只是抄写 OCR 文本里的数字,差一分、标签错位、大写与小写不一致,都很难在对话里被系统性发现。
社区插件 yuehancn/dsh-tool-invoice(SkillHub 分类:模型推理)面向上述场景:在 Harness 里注册三个工具,从发票文本或文件中抽取字段,并附带验算与台账汇总,把「读发票」从猜数字变成可审计步骤。维护者为 yuehancn;README 标明在 dsh 0.2.0-rc.2(preview)上构建与测试,apply(ctx) 插件规范稳定,其它 dsh 版本需自行核对。许可证为 MIT,当前 package 版本为 1.0.0。
这是什么¶
一句话:DSH 自建工具插件,把增值税发票、英文收据等文本里的关键字段抽成结构化数据,同时检查金额关系、大小写金额一致性与税率档位是否合理。
与「让模型直接读图/读 PDF」相比,本插件强调三条普通正则难以兼顾的能力(README 原文归纳):
- 验算而非抄写 —— 每条检查同时给出「应有值」与「读到的值」及差额。
- 字段带证据 —— 每个值附带匹配到的标签(如「销售方名称」)与原句,便于人工复核。
- 有标签才取值 —— 孤立出现的
¥1130.00不猜测是金额、税额还是合计;无标签则报「未识别」。
不配 PDF/图片转文本命令时,只要已有文本(例如配合 OCR 插件或邮件正文),invoice_extract 仍可直接使用。
三个工具¶
invoice_status¶
探测本插件能否自行读文件(是否配置了文本提取命令),并列出可识别的全部字段名。适合在对话开始前确认环境与能力边界。
invoice_extract(path | text)¶
从一份发票提取字段并验算。参数可以是文件路径,也可以是已有文本。
可识别字段包括(节选,完整列表见 README 表格):
| 字段 | 含义 |
|---|---|
code / number |
发票代码 / 发票号码 |
date |
开票日期 |
seller / buyer |
销售方 / 购买方 |
sellerTaxId / buyerTaxId |
纳税人识别号 |
amount / tax / total |
不含税金额 / 税额 / 价税合计(小写) |
totalInWords |
价税合计(大写) |
checkCode / remark |
校验码 / 备注 |
返回中的三类检查:
| 检查 | 含义 |
|---|---|
amount + tax == total |
基本恒等式(容差可配,默认 ±2 分或 ±0.5%) |
| 小写数字与大写金额 | 扫描件篡改或 OCR 错误时易在此报警 |
| 反推税率 | 是否落在 0/1/3/5/6/9/13% 等常见档位 |
另有 faithful 布尔值:全部检查通过且号码、日期、合计均存在时为 true;多数场景只需关注该字段。
invoice_ledger(paths, groupBy, outputName)¶
多张发票汇总为台账:总计、按字段分组小计,并标记未验算行、无法读取行、重复发票号码。指定 outputName 可将台账写入 JSON。
安装与启用¶
一行安装(README 原文,支持 desktop 与 web profile):
dsh plugin --profile desktop add github:yuehancn/dsh-tool-invoice
Web 版将 --profile desktop 换成 --profile web。安装完成后重启 dsh 即可在 Harness 中调用上述工具。
可选配置写在 ~/.dsh/profiles/<profile>/cordis.patch.yml,示例:
- id: tool-invoice
config:
outputDir: C:/Users/you/Documents/invoice-output
textCommand: C:/poppler/Library/bin/pdftotext.exe
textArgs: ["-layout", "{input}", "{output}"]
toleranceCents: 2
| 配置项 | 默认 | 说明 |
|---|---|---|
outputDir |
invoice-output |
中间文本、台账 JSON 等产物目录 |
timeoutMs |
600000 | 单次调用超时(10 分钟) |
textCommand |
空 | 留空则仅接受文本;不配也可使用 invoice_extract(text=...) |
textArgs |
["-layout","{input}","{output}"] |
{input} / {output} 占位符 |
tolerancePercent |
0.5 | 恒等式百分比容差 |
toleranceCents |
2 | 恒等式分位容差 |
status / extract / ledger |
true |
可按需关闭单个工具 |
README 说明:可将 textCommand 指向 dsh-tool-ocr 等插件的 CLI,形成「扫描件 → 文本 → 结构化发票」链路;文本提取命令由用户自行配置,插件不下载、不安装第三方二进制。
典型用法思路¶
- 调用
invoice_status,确认是否已配置textCommand以及当前可识别字段。 - 若已有 OCR 或 PDF 提取后的纯文本,调用
invoice_extract传入text;若有本地文件且已配置转文本命令,传入path。 - 查看返回中的
faithful与三条验算结果;不通过时根据差额与字段证据人工复核原票。 - 报销或月结前,对多份路径调用
invoice_ledger,检查重复号码与未验算行;需要落盘时设置outputName。
解析器对脏文本做了刻意宽松处理(全角数字与标点折叠、数字串内 OCR 混淆修复、多种日期格式、两栏排版标签与值分行、红字负数、中文大写金额、英文 Stripe 类收据等)。标签须出现在行首,以避免把「Amount Excluding Tax」里的片段误读为税额——README 称此为实测踩坑后的设计,并有回归用例。
适用场景与注意¶
适合:在 DSH 对话或工作流中,需要把发票/收据文本变成可对账、可汇总的数据;希望恒等式与大小写金额有一致性检查;批量台账并发现重复票号。
运行与安全(README 安全说明):
- 文本提取通过
spawn(command, argsArray)调用,不拼接 shell 字符串。 - 仅读写你指定的输入与
outputDir,不上传、不联网。 - 插件以当前 dsh 进程权限运行;安装前请自行查看 GitHub 源码 与 MIT 许可证,确认
textCommand指向的可执行文件可信。
README 提到测试套件共 288 条断言,对着真实 @deepseek-ai/dsh-tools 与子进程运行(非 mock);本地跑测试需按 README 复制 dsh 的 node_modules 后执行 node _test/run-all.mjs,e2e 使用自带替身提取器,无需 poppler 与联网。
SkillHub 目录页与 GitHub 仓库为社区生态信息,与 DeepSeek / 幻方无官方从属关系;星标等元数据以各站点当时展示为准。
结尾¶
dsh-tool-invoice 把发票读取从「模型猜数字」收敛为「抽字段 + 验算 + 台账」:多数调用只看 faithful,复杂报销场景可依赖 ledger 抓重复与异常行。若你已在 Harness 里处理 OCR 或邮件正文,可先不配 textCommand 验证提取与验算,再按需接上 PDF/OCR 流水线。