2026-10-05 · 原文发布日
在聊天软件里直接问Xero财务数据的机器人
这个n8n模板把WhatsApp(经WAHA)或Telegram变成公司财务问答入口:收到消息后先校验发送者白名单,再用OpenAI判断意图是应收账款、现金状况还是本周到期账单,然后从Xero拉取对应数据生成标准摘要,交给OpenAI改写成简洁回复并核对数字一致性,最后回发到原渠道,还可确认后同步到Slack。对话状态存在n8n Data Table里,支持多轮追问。
原文要点
来源说明该n8n模板以WAHA WhatsApp webhook(带HMAC校验)或Telegram触发,统一消息格式并按白名单拦截;状态存于n8n Data Table。新请求由OpenAI分类为应收、现金状况或本周到期账单;随后列Xero组织、选tenant、查对应端点生成规范摘要,再由OpenAI改写并核对数字,最后回原渠道,确认后可发Slack。需配置Xero OAuth2、OpenAI、Slack、Telegram、WAHA Header Auth与Data Table列。
这次做成什么
在隔离测试n8n里搭一条“聊天问财务”的最小可行流:用合成消息进入测试webhook,先不连真实Xero,改用一份模拟Xero摘要验证意图分类、数字一致性回写和白名单;通过后再按原模板核对真实节点名、字段和凭据。
准备什么
- 一个可开测试webhook的n8n实例,能建Data Table和测试执行
- OpenAI或兼容结构化输出的模型凭据,仅用于测试
- Xero测试组织或先用合成摘要替代,Slack/Telegram/WAHA先用沙箱或禁用发送
- 原模板页面用于核对真实节点名称、WAHA HMAC和tenant字段,未核对前不声称已实测
具体怎么做
建状态表与白名单
在n8n Data Table新建Finance Bot Conversation State,列设为stateKey,userId,channel,chatId,lastIntent,lastResponse,pendingSlackConfirmation;在配置Set节点放allowedUsers示例值+8613800000000与telegram:123456,先只放行这两个测试身份。
接收入口并归一化
用Webhook测试URL代替WAHA/Telegram,POST合成JSON;在Function/Code节点输出统一字段channel,chatId,userId,text,receivedAt。若userId不在allowedUsers,直接返回“未授权”,不进入财务查询。
分类意图并给出帮助
把归一化文本送给OpenAI,限定输出JSON:intent只能是ar,cash,bills_week,unknown,confidence为0到1。unknown或confidence<0.6时回复帮助文本:请改问应收账款、现金状况或本周到期账单。
先用合成Xero摘要跑通
在未取得Xero测试租户前,用本站模拟canonical_summary代替API:包含currency,asOf,arTotal,cashBalance,billsDue7d。真正接入时再按原模板核对List organisations、选tenant和对应Xero端点,不凭空改API路径。
改写并校验数字
第二段模型只能基于canonical_summary写中文短答,随后用Code节点正则抽取回答中的金额,与canonical_summary逐字段比对;不一致就标记needs_manual并回“数字待财务复核”,不得把不一致内容发出。
回发与Slack确认
测试期把发送节点替换为Respond to Webhook,返回reply与debug;用户回复“发”才把上一答复制到Slack测试频道,回复“不发”清空pendingSlackConfirmation。全程保存lastIntent与lastResponse。
可直接复制的材料
意图分类系统提示词
本站独立编写示例;接入原模板时把{{$json.text}}改成实际表达式。
你是公司财务聊天入口的分类器。只输出一个JSON对象,不要解释。字段:intent必须是ar、cash、bills_week、unknown之一;confidence是0到1的小数;reason用不超过30个汉字说明。映射规则:应收、回款、欠款、逾期发票=>ar;现金、余额、银行账户、流动性=>cash;本周到期、应付、账单、付款截止=>bills_week;其他或信息不足=>unknown。用户消息:{{$json.text}}回复改写作业提示词
本站示例;真实运行需由后续代码校验金额一致,校验失败不发送。
只能使用给定CANONICAL中的数字和日期,不得新增金额、不得四舍五入到不同精度、不得承诺付款。输出不超过120个汉字,末尾加“如需同步Slack请回复:发”。CANONICAL={{JSON.stringify($json.canonical_summary)}}模拟Xero规范摘要JSON
本站合成数据,仅代替Xero返回做流程练习;字段名需按原模板核对。
{"currency":"CNY","asOf":"2026-10-09","arTotal":128400.50,"arOverdue":36600.00,"cashBalance":542300.75,"billsDue7d":{ "count":4, "total":91200.20, "vendors":["示例办公供应商","云端服务测试商"] }}WAHA/Telegram测试入站载荷
本站虚构载荷;hmac仅为占位,测试环境可关闭验签,生产必须按原模板HMAC SHA-512核对。
{"channel":"whatsapp-test","chatId":"chat-demo-01","userId":"+8613800000000","text":"本周有哪些账单到期,总额多少?","receivedAt":"2026-10-09T09:30:00+08:00","hmac":"replace_with_test_signature"}输入与输出示例
本站虚构演示,非作者运行结果;发送节点在练习中以Respond to Webhook替代。
输入
白名单用户+8613800000000在测试webhook发送:本周有哪些账单到期,总额多少?附带chat-demo-01与2026-10-09 09:30收到时间。对应输出
分类JSON:{"intent":"bills_week","confidence":0.91,"reason":"提到本周到期与总额"};回复:截至2026-10-09,本周到期账单4笔,合计91,200.20元,涉及示例办公供应商、云端服务测试商。如需同步Slack请回复:发。用户回“发”后pendingSlackConfirmation清空并写入Slack测试频道。做完检查这些
- 未授权userId必须在分类前被拦截,且Data Table不产生新状态
- unknown或低置信消息只收到帮助文本,不触发任何Xero或合成摘要查询
- 回复中每个金额都能与canonical_summary对应字段完全一致,否则输出数字待财务复核
- 只有用户明确回复“发”才写Slack测试频道,回复“不发”只更新状态不外发
容易卡住的地方
- WAHA生产入口必须核对HMAC SHA-512与base URL,测试关闭验签不能带到生产
- 多Xero组织时必须按原模板核对tenant选择逻辑,不能默认第一个组织
- OpenAI改写可能编造金额,所以正则或结构化字段校验失败要阻断发送
- 模板不是付费下载,但没有提供可导入JSON时不要在指南中编造工作流文件
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Answer finance questions from Xero via WhatsApp, Telegram, Slack, and OpenAI
- 原作者
- Intuz
- 原始发布日期
- 2026-10-05T06:10:46.181Z
- 来源
- https://n8n.io/workflows/20422