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