Files
market/agents/invoice-organizer/USAGE.zh-CN.md
Yige 7560a58642 fix(invoice-organizer): 统一报告文件名约定 / unify report file naming (#120)
## 问题 / Problem

真机三轮整理实测:Agent 全部写出 `报告/整理报告-<运行日期>.md`,而技能里只定义了 `报告/<YYYY-MM>.md`。

**原因不是模型不听话。** 测试范围跨了 2020-08 到 2024-09 共十几个月,`<YYYY-MM>`
在多月场景下无从填写——技能没给出这种情况的文件名,Agent 只能自己发明一个。

**后果不是难看,而是会攒垃圾。** `invoice-automation` 的定时任务每月重建的是 `报告/<上月
YYYY-MM>.md`;与按运行日期命名的手工报告永远不会互相覆盖,用户目录里会留下一堆内容重叠、无从分辨新旧的报告。

Three real-machine runs all produced `报告/整理报告-<run date>.md`, while the
skills only define `报告/<YYYY-MM>.md`. The runs spanned 2020-08 through
2024-09, so `<YYYY-MM>` was unfillable and the agent improvised. Because
the scheduled monthly job rebuilds `报告/<last month YYYY-MM>.md`, the two
naming schemes never overwrite each other and the user's directory
accumulates overlapping reports with no way to tell which is current.

## 改动 / Changes

- `invoice-workflow` 第 7 步补一张表,把两种文件名钉死:

  | 本次覆盖 | 文件名 | 例 |
  | --- | --- | --- |
  | 恰好一个自然月 | `报告/<YYYY-MM>.md` | `报告/2024-08.md` |
  | 跨多个月 | `报告/<起始 YYYY-MM>_<结束 YYYY-MM>.md` | `报告/2020-08_2024-09.md` |

并写明月份按**开票日期**归属(与台账同口径)、同名直接覆盖(报告是从 `.index/ledger.json`
全量重建的派生产物,不像台账需要先备份)、以及**为什么不许用运行日期命名**
- `invoice-ledger` 与 `references/月度报告模板.md` 同步该约定
- 目录布局示例与中英 USAGE 一并标注跨月形态

## 为什么不在本 PR 里 bump 版本 / Why no version bump here

`contentSource` 的 `ref` 必须 pin 到**已合并的 commit**,本 PR 合并前拿不到那个 SHA。先 bump
版本会让目录声称 1.0.1、却仍按指向 1.0.0 内容的 pin 去取文件——比不 bump 更糟。版本号、pin 与 changelog
留到后续 PR 一起改。

The `contentSource` ref must pin to an already-merged commit, which does
not exist until this PR lands. Bumping the version now would advertise
1.0.1 while still serving 1.0.0 content. Version, pin and changelog
follow in a second PR.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---

## 追加:台账四张表必须全建 / Also: all four ledger sheets must always exist

真机压测(只有 1 张发票)产出的 `台账.xlsx` **只有三张表**——Agent 判定「按销售方汇总」在单一销售方下冗余而略过:

```
发票测试(23 张) → ['明细', '月度汇总', '按销售方汇总', '异常']
发票压测(1 张)  → ['明细', '月度汇总', '异常']          ← 少一张
```


技能写的是「四张表,顺序固定」,但没说「即使为空也必须存在」。台账是要被重复重建、被用户自己写公式引用、被下一次整理覆盖的产物;表的位置一旦随数据量浮动,「第
3 张是按销售方汇总」这类引用就会在下个月悄悄指错。已在 `invoice-ledger` 里把这条钉死。

A stress run with a single invoice produced only three sheets — the
agent judged the per-seller summary redundant. The skill said "four
sheets, fixed order" but never said "even when empty". Sheet positions
that float with row count silently break user formulas and rebuilds; now
pinned.
2026-09-04 11:56:48 -04:00

6.3 KiB
Raw Permalink Blame History

发票整理助手 · 使用说明

装之前先确认三件事

1. 邮箱已接入。 这是唯一需要你亲自完成的一步:在 DesireCore 的邮箱界面授权一个账户Gmail / Outlook / IMAP 都可以)。没有邮箱的话本 Agent 只能处理你手工放进工作目录的文件,收集那一步用不了。

2. 有一个你找得到的工作目录。 装好后 Agent 会自动拿到一个默认工作区,但那个路径在文件管理器里很难找。第一次对话时它会建议你登记一个可见目录(比如 ~/Documents/发票)并设为首选——同意即可,产物会落在那里,并出现在 DesireCore 的「文件工作台」里。

3. 它不做发票真伪查验。 没有官方查验通道。它只做形式校验(字段齐全、金额勾稽、票面自洽),并把国家税务总局全国增值税发票查验平台的入口给你,让你用发票号码自行核验。如果你需要的是验真,这个 Agent 不是答案。

怎么用

装好之后直接说人话:

  • 「帮我整理一下 8 月的发票」——跑完整流程:收集 → 解析 → 去重 → 归档 → 台账 → 报告
  • 「这个月报销多少钱」——只汇总,不重新扫邮箱
  • 「这张发票记过了吗」——查索引,秒回
  • 「把 8 月的发票导成 Excel」——从索引重建台账不重新解析
  • 「以后新发票自动入账」——配邮件规则与定时任务(会先跟你说清楚会发生什么)

「上个月」这类相对时间它会先换算成明确的起止日期说给你听,你确认了再开工——跨年时这一步能省掉不少麻烦。

你会拿到什么

工作目录下多出一个 发票/ 目录:

发票/
├── 台账.xlsx依赖不可用时为 台账.csv
├── 报告/2024-08.md票都开在同一月跨月时是 报告/2020-08_2024-09.md
├── 归档/2024/08/20240815_某某酒店管理有限公司_1959.98_24312000000000020002.pdf
├── _inbox/          刚下载、尚未处理
├── _quarantine/     解析失败或判定为非发票(每份都附一个 .reason.txt 说明原因)
└── .index/          去重索引,别手工改

台账有四张表:明细、月度汇总、按销售方汇总、异常。金额按人民币口径(保留两位小数,零金额显示为 ¥0.00 而不是隐藏),发票号码和税号按文本存放,不会被 Excel 变成 2.4312E+19

月度报告开头永远是一句话结论,后面才是明细;「需要你处理的」那一节里每条都带具体动作,不只是描述现象。

支持的票据

  • PDF数电票2023 年后的全国统一电子发票,普票与专票)、旧版增值税电子普通发票、铁路电子客票报销凭证(新旧两种版式)、航空运输电子客票行程单、出租车与网约车票
  • OFD读取包内的结构化发票数据。2020 年式样的票在包里附了一份完整的国标发票 XML字段由开票系统直接写出、不是版面猜测这条路径置信度给满分2024 数电票式样只带发票标引,拿不到发票代码和逐行明细,那部分会回到版面文本补齐,置信度相应下调。两者都没有时回落到版面文本
  • 扫描件与图片JPG / PNG / WebP以及没有文字层的扫描版 PDF交给视觉模型识别置信度相应下调

解析这些不需要你安装任何东西。只有生成 .xlsx 台账可能需要 Python 的 openpyxlpandas;装不上时它会自动出一份带 UTF-8 BOM 的 CSVExcel 打开中文不乱码)并明确告诉你降级了。

关于审批(无人值守要看这一段)

发票整理会频繁调用需要确认的工具(读邮箱、下附件、写文件),默认的审批模式下每次都会弹审批卡。整理几十张发票时会连着弹很多张——这是设计如此,不是故障。

如果你要的是真正的无人值守(半夜定时出台账、新邮件自动入账),需要你自己在 Agent 设置里把执行审批模式改成「允许全部」。代价是之后本 Agent 的写文件与邮件调用都不再逐条询问。注意「总是允许」按钮对这些工具当前不生效,点了也还会弹。

它不会做的事

  • 不删除、不移动、不转发你的邮件。要清理邮箱请你自己在邮箱里做
  • 不做记账凭证、不做纳税申报、不做进项抵扣判断
  • 不做汇率换算。外币结算的票面本身仍以人民币计价,原币金额与折算汇率原样抄进备注,不换算、也不并成第二套合计
  • 不自动合并疑似重复(号码只差一位、其余字段全同),标出来交你确认
  • 不编造票面字段。抽不到就留空、把原件隔离并说明卡在哪一步
  • 不承诺「已全部找到」,只报「在给定范围内找到 N 封候选、成功解析 M 张」

已知限制

  • IMAP 账户的邮件规则只覆盖收件箱。 如果你用的是 IMAP 且把发票邮件自动归档到了别的文件夹规则不会触发这种情况下用对话主动让它扫那个文件夹。Gmail 与 Outlook 的增量轮询覆盖整个邮箱,不受这条限制
  • 本地缓存搜索只按主题匹配关键词。 主题里不含「发票」而只在正文里提到的邮件「您有一份新的电子凭证」这类缓存搜索找不到。Gmail 账户它会改用 Gmail 服务端搜索来覆盖正文Outlook 与 IMAP 只能把邮件拉回本地逐封扫,范围给大时会慢。它会在收尾里说明这次是按什么匹配的
  • Outlook 与 IMAP 没有服务端搜索,只能先把邮件拉到本地再筛。范围给大时会比 Gmail 慢不少Gmail 可以直接用原生搜索语法一次筛出来)
  • 带口令的加密 PDF 打不开。 部分开票平台会发带口令的 PDF口令通常写在邮件正文里。目前需要你自己解密后把文件放进 _inbox/,它会在下次整理时接上
  • 作废判定依赖文本层。 作废戳如果是纯图形,可能识别不出来。台账里作废票单独一栏,请顺手核一眼

隐私

发票里有公司抬头、纳税人识别号、开户行账号、行程信息。这些只在你本机的工作目录和台账里流转。本 Agent 没有对外发送的通道,也不会替你回复或转发邮件;你要把台账发给别人时,它把文件交回给你,由你决定发给谁。