AI PLAY玩法更新持续收录
← 回到更新流

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字段,未核对前不声称已实测

具体怎么做

  1. 建状态表与白名单

    在n8n Data Table新建Finance Bot Conversation State,列设为stateKey,userId,channel,chatId,lastIntent,lastResponse,pendingSlackConfirmation;在配置Set节点放allowedUsers示例值+8613800000000与telegram:123456,先只放行这两个测试身份。

  2. 接收入口并归一化

    用Webhook测试URL代替WAHA/Telegram,POST合成JSON;在Function/Code节点输出统一字段channel,chatId,userId,text,receivedAt。若userId不在allowedUsers,直接返回“未授权”,不进入财务查询。

  3. 分类意图并给出帮助

    把归一化文本送给OpenAI,限定输出JSON:intent只能是ar,cash,bills_week,unknown,confidence为0到1。unknown或confidence<0.6时回复帮助文本:请改问应收账款、现金状况或本周到期账单。

  4. 先用合成Xero摘要跑通

    在未取得Xero测试租户前,用本站模拟canonical_summary代替API:包含currency,asOf,arTotal,cashBalance,billsDue7d。真正接入时再按原模板核对List organisations、选tenant和对应Xero端点,不凭空改API路径。

  5. 改写并校验数字

    第二段模型只能基于canonical_summary写中文短答,随后用Code节点正则抽取回答中的金额,与canonical_summary逐字段比对;不一致就标记needs_manual并回“数字待财务复核”,不得把不一致内容发出。

  6. 回发与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