Install
openclaw skills install @chenqg618/invoice-consistency-check-free把票据里能被算出来、指出来证明是错的地方找出来,每条都带原文证据,不需要付款,也不需要注册。 本免费版执行 行内算术、分项加总、税额计算、价税合计、大小写金额一致、抬头主体一致、日期逻辑、重复票检测、占位符与空白残留。触发词包括 票据一致性AI核对、发票核对、报销自查、金额对不上、重复报销、价税合计不对。
openclaw skills install @chenqg618/invoice-consistency-check-free一句话:把票据里能被算出来、指出来证明是错的地方找出来,每一条都带原文证据,不需要付款,也不需要注册。
不需要付款:不需要注册、不需要配置任何 API Key,直接调用即可。
不想安装也能用:同一个检查有网页版,免注册、免付款 —— https://www.tokendidi.cn/check
和「让模型读一遍发票再发表意见」的做法不同,这个工具只做AI核对: 每一条结论都是可复算的算术或文本证据(原文、数字、行号),第三方拿同一份输入能得出同样的结果。 不联网、不外发材料、不调用任何模型,因此不会出现「看起来很有道理但票面上根本没有」的结论。
XXX、TBD、待补充、__ 这类占位符和空白必填字段| # | 检查项 | 判定依据 |
|---|---|---|
| 1 | 行内算术 | 明细行「数量 × 单价」与同行「金额」不符,报出差额 |
| 2 | 分项加总 | 各明细行金额之和与单据写明的「合计金额 / 小计 / Subtotal」不符 |
| 3 | 税额计算 | 不含税金额 × 税率(13% / 6% / 0.13 都认)与「税额」不符 |
| 4 | 价税合计 | 不含税金额 + 税额 与「价税合计 / Total incl. tax」不符 |
| 5 | 大小写金额一致 | 中文大写(壹佰万元整)/ 英文数字词 与阿拉伯数字不符;同一处写了大小写两个数时直接互校 |
| 6 | 抬头/主体一致 | 发票「购方名称 / 抬头」与报销单「报销单位 / 报销主体 / Company」不是同一个主体 |
| 7 | 日期逻辑 | 非法日历日期(2026-02-30);开票日期晚于报销日期;开票日期早于业务发生日期;同一字段写成两个不同日期 |
| 8 | 重复票检测 | 两张票的发票号码相同;或「金额 + 开票日期 + 销方」三项完全相同 |
| 9 | 占位符/空白残留 | XXX、TBD、【…】、__、____、{{var}}、[ ]、N/A、待填、待补充、to be filled;以及金额 / 日期 / 号码等必填字段写成空白 |
中英文票据都支持。每条 finding 都会引用出问题的原文、数字或行号,不会只说「这里可能有问题」。
以下检查项不在本版本范围内,调用时也不会执行(会在 checks_withheld 里如实列出):
node scripts/run.mjs --sample
node scripts/run.mjs --input my-invoice.json
node scripts/run.mjs --input my-invoice.json --json
--input 也接受直接粘贴的纯文本票据(不是合法 JSON 时按纯文本处理)。
脚本本身不做判断,真正的检查在同目录的 scripts/engine/invoice-consistency.js(纯 Node 标准库,CommonJS),可以直接引用:
const engine = require('./scripts/engine/invoice-consistency.js');
const outcome = engine.run({ text: invoiceText });
// outcome.status === 'success' → outcome.result 就是结果
// outcome.status === 'insufficient_input' → outcome.missing 列出缺什么(此时不出结论)
所有检查都在本机完成:不联网、不外发材料、不需要任何凭证。
把票据全文放进 text(也接受 content,或直接把纯文本文件交给 --input):
{
"text": "增值税电子普通发票\n发票号码:12345678\n开票日期:2026-03-15\n购方名称:北京星河科技有限公司\n…"
}
字段按「标签 + 冒号 + 值」书写最容易识别,例如 开票日期:2026-03-15、Tax Amount: 780.00。
数量 / 单价 / 金额也可以写成带表头的表格(项目名称 数量 单价 金额 + 明细行)。
一批票据放在同一段文本里即可:用 --- 一行分隔,或每张票从「发票号码 / Invoice No」那一行重新开始。
返回 ok: true 与 result:findings 里每一条都带 level(P0/P1/P2)、category、line、
message(写明具体是什么原文对不上、差多少)、advice 与 evidence;
summary.verdict 为 CLEAN / ISSUES_FOUND / CONTRADICTION_FOUND,summary.by_category 给出每个检查项命中的条数。
checks_given 原样列出本次实际执行了哪些检查项,checks_withheld 列出本版本不包含的检查项。
不会用默认值编造结论。
材料不足时(入参为空、只有空白、只有一个字符、类型不对、没有识别出任何票据要素)
不出结论:会说明缺什么,并以退出码 3 结束;正常执行退出码为 0。
退出码:0 已执行检查 / 1 缺少入参 / 3 材料不足 / 4 入参文件读不到或无法解析 / 9 未预期错误。
null、裸数组、{"text": 123} 都属于这一类。03/04/2026 这种两边都 ≤12 的斜杠写法口径不明,工具不会拿它做先后比较(会计入 scope.counts.ambiguous_dates),只做「同一字段两个值」的冲突提示。--input 超过 4M 字符会以退出码 4 拒绝,不做静默截断。这是免费版的自我限定,写在这里以免误用:
CLEAN 当作「这张票没问题」 —— 它只说明这九项AI核对没查出矛盾,真伪与合规不在本版本范围内。只做AI一致性核对,不做发票真伪查验、不做合法性认定、不构成税务或审计意见。
本技能的所有结论都可由第三方用同一份输入复算出来。