## 问题 / 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.
6.3 KiB
发票整理助手 · 使用说明
装之前先确认三件事
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 的 openpyxl 与 pandas;装不上时它会自动出一份带 UTF-8 BOM 的 CSV(Excel 打开中文不乱码)并明确告诉你降级了。
关于审批(无人值守要看这一段)
发票整理会频繁调用需要确认的工具(读邮箱、下附件、写文件),默认的审批模式下每次都会弹审批卡。整理几十张发票时会连着弹很多张——这是设计如此,不是故障。
如果你要的是真正的无人值守(半夜定时出台账、新邮件自动入账),需要你自己在 Agent 设置里把执行审批模式改成「允许全部」。代价是之后本 Agent 的写文件与邮件调用都不再逐条询问。注意「总是允许」按钮对这些工具当前不生效,点了也还会弹。
它不会做的事
- 不删除、不移动、不转发你的邮件。要清理邮箱请你自己在邮箱里做
- 不做记账凭证、不做纳税申报、不做进项抵扣判断
- 不做汇率换算。外币结算的票面本身仍以人民币计价,原币金额与折算汇率原样抄进备注,不换算、也不并成第二套合计
- 不自动合并疑似重复(号码只差一位、其余字段全同),标出来交你确认
- 不编造票面字段。抽不到就留空、把原件隔离并说明卡在哪一步
- 不承诺「已全部找到」,只报「在给定范围内找到 N 封候选、成功解析 M 张」
已知限制
- IMAP 账户的邮件规则只覆盖收件箱。 如果你用的是 IMAP 且把发票邮件自动归档到了别的文件夹,规则不会触发;这种情况下用对话主动让它扫那个文件夹。Gmail 与 Outlook 的增量轮询覆盖整个邮箱,不受这条限制
- 本地缓存搜索只按主题匹配关键词。 主题里不含「发票」而只在正文里提到的邮件(「您有一份新的电子凭证」这类),缓存搜索找不到。Gmail 账户它会改用 Gmail 服务端搜索来覆盖正文;Outlook 与 IMAP 只能把邮件拉回本地逐封扫,范围给大时会慢。它会在收尾里说明这次是按什么匹配的
- Outlook 与 IMAP 没有服务端搜索,只能先把邮件拉到本地再筛。范围给大时会比 Gmail 慢不少(Gmail 可以直接用原生搜索语法一次筛出来)
- 带口令的加密 PDF 打不开。 部分开票平台会发带口令的 PDF,口令通常写在邮件正文里。目前需要你自己解密后把文件放进
_inbox/,它会在下次整理时接上 - 作废判定依赖文本层。 作废戳如果是纯图形,可能识别不出来。台账里作废票单独一栏,请顺手核一眼
隐私
发票里有公司抬头、纳税人识别号、开户行账号、行程信息。这些只在你本机的工作目录和台账里流转。本 Agent 没有对外发送的通道,也不会替你回复或转发邮件;你要把台账发给别人时,它把文件交回给你,由你决定发给谁。