基于自有记账服务 API 的 OpenClaw 技能,负责记账的核心逻辑。
本技能支持以下输入方式:
无论用户输入是文字还是经过预处理的内容,都必须先检测是否包含记账相关信息。
记账相关信息检测规则:
检测逻辑:
# 必填:记账 API Token
export ACCOUNTING_API_TOKEN="agent_4...25"
{baseDir}/scripts/accounting.pypython {baseDir}/scripts/accounting.py add '{
"ledgerName": "日常开销",
"amount": 35.5,
"transactionType": "支出",
"categoryName": "餐饮",
"description": "午餐"
}'
transactionType 取值:收入、支出、应收、应付。
完整参数示例:
python {baseDir}/scripts/accounting.py add '{
"ledgerName": "公司账本",
"accountName": "招商银行",
"amount": 10000,
"transactionType": "收入",
"categoryName": "服务收入",
"handlerName": "张三",
"companyName": "XX科技有限公司",
"description": "3月咨询服务费",
"transactionDate": "2025-03-20",
"needInvoice": true,
"fee": 6.5
}'
应收/应付时 dueDate 必填:
python {baseDir}/scripts/accounting.py add '{
"ledgerName": "公司账本",
"amount": 5000,
"transactionType": "应收",
"companyName": "客户A",
"description": "待收货款",
"dueDate": "2025-04-30"
}'
python {baseDir}/scripts/accounting.py query '{
"ledgerName": "日常开销",
"startTime": "2025-03-01",
"endTime": "2025-03-31",
"transactionType": "支出",
"pageNum": 1,
"pageSize": 10
}'
python {baseDir}/scripts/accounting.py ledgers
python {baseDir}/scripts/accounting.py accounts '{"ledgerName": "日常开销"}'
python {baseDir}/scripts/accounting.py categories '{"type": "支出"}'
type 取值:收入/支出/应收/应付。
python {baseDir}/scripts/accounting.py handlers
python {baseDir}/scripts/accounting.py companies
步骤 1:记账相关信息检测
检测用户输入的文字是否包含记账相关信息(金额、收支类型、记账关键词)。
如果未检测到记账相关信息,回复用户「该内容未发现记账相关信息,无法进行记账」,结束流程。
步骤 2:提取记账关键字
从文字中抽取:
步骤 3:查询记账元数据
并行调用以下命令,获取当前系统中已有的账本、收支分类、经手人、企业等信息:
python {baseDir}/scripts/accounting.py ledgers
python {baseDir}/scripts/accounting.py categories '{"type": "支出"}'
python {baseDir}/scripts/accounting.py categories '{"type": "收入"}'
python {baseDir}/scripts/accounting.py handlers
python {baseDir}/scripts/accounting.py companies
步骤 4:AI 对齐记账信息
根据提取的文字内容,结合步骤 3 查到的元数据列表,对齐以下字段:
| 字段 | 对齐规则 |
|---|---|
| ------ | ---------- |
| ledgerName | 最近匹配已有账本名称,未匹配使用默认账本 |
| amount | 从文字中提取,必须 > 0 |
| transactionType | 根据文字判断(收入/支出/应收/应付) |
| categoryName | 根据文字最近匹配已有收支分类 |
| handlerName | 匹配已有经手人列表 |
| companyName | 匹配已有企业列表 |
| description | 用文字摘要生成 |
| transactionDate | 从文字提取,格式 yyyy-MM-dd,默认今天 |
| needInvoice | 如果识别出是发票,设为 true |
步骤 5:记账
python {baseDir}/scripts/accounting.py add '<json>'
字段按最近匹配,未匹配的使用默认值,直接完成记账,不用向用户确认。
当用户发送图片、语音、文件并要求记账时,按以下流程处理:
根据用户发送的内容类型,调用对应的其他技能进行预处理:
| 内容类型 | 调用技能 | 获取内容 |
|---|---|---|
| ---------- | ----------- | ---------- |
| 图片 | ocr 技能 | 调用 ocr 或类似技能获取图片识别的文本内容 |
| 语音 | stt 技能 | 调用 stt 或类似技能获取语音转写的文本内容 |
| PDF/Excel/Docx | parse_file 技能 | 调用 parse_file 技能获取文件提取的文本内容 |
注意:如果调用其他技能失败或返回结果为空,提示用户「抱歉,目前无法处理此格式的内容」,结束流程。
基于预处理获得的文本内容,检测是否包含记账相关信息:
检测到记账相关信息后,进入标准的记账流程:
步骤 1:查询记账元数据
python {baseDir}/scripts/accounting.py ledgers
python {baseDir}/scripts/accounting.py categories '{"type": "支出"}'
python {baseDir}/scripts/accounting.py categories '{"type": "收入"}'
python {baseDir}/scripts/accounting.py handlers
python {baseDir}/scripts/accounting.py companies
步骤 2:AI 对齐记账信息
根据预处理获得的文本内容,结合元数据列表,对齐记账字段:
| 字段 | 对齐规则 |
|---|---|
| ------ | ---------- |
| ledgerName | 最近匹配已有账本名称 |
| amount | 从文本中提取,必须 > 0 |
| transactionType | 根据文本判断(如发票通常是支出) |
| categoryName | 根据文本最近匹配已有收支分类 |
| handlerName | 如果文本有经手人信息,匹配已有列表 |
| companyName | 从文本的销售方/购买方等提取,匹配已有列表 |
| description | 用文本摘要生成(如"XX公司开具的增值税发票") |
| transactionDate | 从文本提取,格式 yyyy-MM-dd,默认今天 |
| needInvoice | 如果识别出是发票,设为 true |
步骤 3:记账
python {baseDir}/scripts/accounting.py add '<json>'
字段按最近匹配,未匹配的使用默认值,直接完成记账,不用向用户确认。
场景 1:用户发送增值税发票图片要求记账
ocr 或类似技能获取识别文本场景 2:用户发送语音要求记账
STT 或类似技能获取转写文本场景 3:用户发送 Excel 报销单要求记账
parse_file 或类似技能获取文件内容| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ------ | ------ | ------ | ------ |
| ledgerName | String | 是 | 账本名称(不确定时先调用 ledgers 查询) |
| accountName | String | 否 | 结算账户名称 |
| amount | Number | 是 | 交易金额(>0) |
| transactionType | String | 是 | 收入/支出/应收/应付 |
| categoryName | String | 否 | 收支分类名称(可先调用 categories 查询) |
| handlerName | String | 否 | 经手人名称 |
| companyName | String | 否 | 关联企业名称 |
| description | String | 否 | 描述 |
| transactionDate | String | 否 | 交易时间(yyyy-MM-dd,默认今天) |
| needInvoice | Boolean | 否 | 是否需要发票 |
| dueDate | String | 条件必填 | 到期时间(应收/应付时必填) |
| fee | Number | 否 | 手续费 |
ocr 或类似技能,依赖该技能的处理能力stt 或类似技能,依赖该技能的处理能力parse_file 或类似技能,依赖该技能的处理能力以下情况应直接提示用户,结束流程:
共 1 个版本