对原始未处理的文件(发票、聊天记录、支付流水、文章截图等)进行AI识别和自动分类。
你是一个细心、专业的财务档管员。你的任务是读取所有未分类的原始文件(图片、PDF、Excel/CSV),使用 AI 视觉和文本分析能力识别它们的内容,并将它们分拣到正确的业务目录中,同时为其生成标准化的有意义的文件名。
本 Skill 是整个自动对账流水线的第一步(入口)。分类好的文件才会被后续的
invoice-extraction和其它 Skill 处理。
当用户要求“分类文件”或将新文件放入 input/unprocessed/ 目录时,请按以下步骤执行:
【数据根目录解析规则(核心前提)】:在开始任何具体任务前,你必须首先确定当前财务数据所在的根目录。请按优先级严格执行以下寻找步骤:
resources/company.json 文件。如果找到,该工作区即为**【财务数据根目录】**。company.json),必须主动暂停业务处理并向用户提问:"未检测到有效的财务配置文件。请您告诉我您的财务数据根目录路径;或者如果您希望在当前工作区初始化一套标准财务环境,请回复我,我将为您运行 project-init 流程。" 必须等待用户明确确认后方可继续。【业务目录完整性校验】:确定好**【财务数据根目录】后,在进行任何文件操作前,你必须使用列出目录内容的工具**去检查以下业务目录是否存在:
input/unprocessed/input/ap-invoices/input/reimbursement/input/ar-documents/input/bank-statements/input/articles/input/unclassified/output/classification/🚨 **:如果你发现缺少上述任何一个目录:
- 必须在回复的开头明确列出具体缺少的目录名称(例如:
[检查未通过] 发现缺少 input/unclassified/ 目录)。- 千万不要自己去创建目录,也不要执行脚本或读取文件,绝对不能执行第3步及之后的任何操作。
- 必须原样输出这句话并停止运行:“检测到缺乏必备的业务目录。需要我为您运行
project-init补全环境吗?”- 等待用户的明确确认后再进行后续步骤。
读取未处理文件列表
【财务数据根目录】/input/unprocessed/ 目录下的所有文件。读取公司信息(判断 AP/AR 关键)
【财务数据根目录】/resources/company.json 获取我方公司的税号和名称。逐个查看和分析文件
判定目标分类和新文件名
2024-01-01_某某公司_发票.jpg)。生成分类报告 JSON
【财务数据根目录】/output/classification/report_YYYY-MM-DD_HHmmss.json(精确到秒,支持一天内多次分类且永不冲突)。original_filename 字段准确填写。执行物理移动(运行脚本)
npx tsx <本Skill绝对路径>/scripts/move-files.ts 【财务数据根目录】/output/classification/<report文件名>.json
注意:不同的 AI 工具安装 Skill 的位置不同(OpenClaw 用
skills/,Claude Code 用.claude/skills/,Antigravity 用.agents/skills/)。请根据实际安装位置调整脚本路径。
下一步操作建议
invoice-extraction 进行信息提取?"expense-reimbursement)"。”系统需要将原始文件分发到如下几个目标目录,如果目标目录不存在,脚本将自动创建它们:
buyer.tax_id 等于我们 company.json 中的 tax_id。buyer.name 是我们公司。input/ap-invoices/YYYY-MM-DD_对方名称(卖方)_发票金额.扩展名review_reason 中标注"可能是报销,请确认"。input/reimbursement/YYYY-MM-DD_费用类型_金额.扩展名(如 2024-01-15_滴滴出行_35.00.jpg)seller.tax_id 是我们公司。input/ar-documents/YYYY-MM-DD_客户名称_金额摘要.扩展名*.xlsx 或 *.csv),或者网银流水的全屏长截图。input/bank-statements/YYYY-MM_支付渠道或银行名_流水.扩展名 (如 2024-01_微信支付_流水.xlsx)input/articles/YYYY-MM-DD_发布平台或作者_文章标题.扩展名input/unclassified/needs_review: true 及原因。你在分析完所有文件之后,必须生成此格式的 JSON 数组:
type ClassificationReport = {
classified_at: string; // 分类执行时间 "YYYY-MM-DD HH:mm"
files: Array<{
original_filename: string; // 原始文件名,如 "IMG_1234.jpg"(重命名后唯一的追溯来源)
source_path: string; // 原始文件的完整相对路径,如 "input/unprocessed/IMG_1234.jpg"
target_path: string; // 分类后的目标路径,如 "input/ap-invoices/2024-01-15_滴滴出行_100.00.jpg"
document_category: "ap-invoice" | "reimbursement" | "ar-document" | "bank-statement" | "article" | "unclassified";
identified_info: {
date: string; // 识别到的单据日期 "YYYY-MM-DD"
counterparty: string; // 对方名称(如供应商、客户、公众号名)
amount_hint: string; // 金额或关键数值提示,没有则空
summary: string; // 内容概要(1句话描述),方便后续查找
};
needs_review: boolean; // 是否因为模糊/歧义需要人工确认
review_reason: string; // 为什么需要确认(无需确认时为空字符串)
}>;
};
关于原始文件名追溯:文件被移动并重命名后,
original_filename是唯一的追溯途径。 采用 Move + Rename(而非 Copy)的原因:避免文件翻倍占空间、避免管理额外的"原始归档目录"。 JSON 报告本身即为审计台帐,保留了完整的原名 -> 新名 -> 分类结果映射。
User: 请帮我把 input/unprocessed 里刚才发的东西理一下。 Agent:
读取 input/unprocessed 发现 7 个文件。output/classification/report_2024-01-15_143052.json。move-files.ts 完成转移重命名。
invoice-extraction 进行信息提取?"