2026-09-29 · 原文发布日
Vapi语音 agent 的通话中工具调用与通话记录归档
这套n8n模板用一个webhook接住Vapi语音 agent 的两类请求:通话中按函数名分流到查Google Calendar空档、在Google Sheets查客户或追加留言,并按Vapi要求的格式立刻回包;通话结束后把记录写进Sheets的Calls页,扫描转写和摘要里的跟进关键词,命中才用Gmail发提醒。配置项集中在日历ID、提醒邮箱、时段长和关键词表。
原文要点
这是Thomas Abraham发布的免费n8n模板:一个webhook同时接Vapi的通话中工具调用与通话结束报告。工具调用按函数名分流到查Google Calendar空档、在Google Sheets查客户、追加留言,未知函数返回安全回包,并按Vapi要求的{results:[{toolCallId,result}]}格式立即响应;结束报告则写入Sheets的Calls页,扫描转写与摘要里的跟进关键词,命中才用Gmail发提醒。配置集中在CalendarId、AlertEmail、SlotLengthMinutes、TransferMessage、FollowUpKeywords。
这次做成什么
给Vapi语音agent搭一个n8n后端:通话中支持check_availability、lookup_customer、log_request三个工具,通话结束后自动归档到Sheets并按关键词发Gmail跟进提醒。
准备什么
- 一个n8n实例和Vapi账号,能创建assistant并设置Server URL
- Google Calendar、Google Sheets、Gmail三份n8n凭据
- 一个已建好Customers、Requests、Calls三个标签页(含匹配表头)的Google Sheets
- 在Vapi中定义check_availability、lookup_customer、log_request工具(可选transfer_call)
具体怎么做
建表与凭据
在Google Sheets建一个表格,含Customers(如name、phone、email、notes列)、Requests(如timestamp、caller、message列)、Calls(如callId、callerNumber、summary、transcript、flagged列)三个标签页。在n8n分别创建Google Calendar、Google Sheets、Gmail凭据,并把模板里所有Google Sheets步骤中的YOUR_SPREADSHEET_ID替换成你的表格ID。
填Agent Config
打开Agent Config节点:CalendarId填用于查空档的日历ID,AlertEmail填跟进提醒收件邮箱,SlotLengthMinutes填预约时段长度(如30),TransferMessage填转人工提示语,FollowUpKeywords填触发提醒的关键词表(如["报价","投诉","回电"])。
激活并接入Vapi
激活工作流,复制生产webhook URL,粘贴到Vapi assistant的Server URL。在Vapi侧按名称逐个定义check_availability、lookup_customer、log_request三个工具(需要自定义转接话术再加transfer_call),工具参数与模板分流逻辑保持一致。
端到端自测
先用curl模拟一次工具调用(用下面artifact的测试负载),确认响应是{results:[{toolCallId,result}]}结构;再模拟一次end-of-call报告,确认Calls页新增一行,且摘要含关键词时AlertEmail收到Gmail提醒、不含时只归档不发信。
可直接复制的材料
Vapi工具调用测试负载(JSON)
本站独立编写的合成测试数据,号码为虚构;用curl POST到你的生产webhook URL即可验证check_availability分支;toolCallList/arguments字段名以你导入的模板Normalize步骤实际解析为准。
{
"message": {
"type": "tool-calls",
"call": { "id": "call_test_001", "customer": { "number": "+8613800000000" } },
"toolCallList": [
{
"id": "toolcall_9f1a",
"function": {
"name": "check_availability",
"arguments": { "date": "2026-10-12", "timeRange": "14:00-17:00" }
}
}
]
}
}结束报告关键词扫描规则示例
本站设计的扫描策略说明,用于配置Agent Config的FollowUpKeywords;命中任意关键词才发Gmail,否则只在Calls页归档;大小写选项以模板实际实现为准。
{
"followUpKeywords": ["报价", "投诉", "回电", "退款", "签合同"],
"scanFields": ["transcript", "summary"],
"matchMode": "contains-any",
"caseSensitive": false,
"onMatch": "send-gmail-alert",
"onNoMatch": "archive-only"
}输入与输出示例
本站虚构演示,时段结果来自假设的日历空档,并非真实Google Calendar查询结果。
输入
curl POST上面artifact的测试负载:toolCallList中函数名为check_availability,参数date=2026-10-12、timeRange=14:00-17:00,来电号码+8613800000000。对应输出
webhook立即返回示意:{"results":[{"toolCallId":"toolcall_9f1a","result":"2026-10-12 14:30、15:30、16:00 三个时段可约,每段30分钟。"}]};同时本次调用不写入Calls页,因为只有end-of-call报告才归档。做完检查这些
- 工具调用响应严格为{results:[{toolCallId,result}]}结构,且toolCallId与请求中的id一一对应,否则Vapi无法把结果交回给语音agent
- 发送一个未知函数名(如delete_everything)的工具调用,流程返回安全回包而不是报错或执行任何动作
- 模拟摘要含『报价』的end-of-call报告:Calls页新增一行且AlertEmail收到提醒;不含关键词时只归档、收件箱无新邮件
- CalendarId指向错误日历时不崩溃,并在结果或执行日志中可见失败原因
容易卡住的地方
- 必须在n8n激活后用生产webhook URL配置Vapi的Server URL,测试URL在Vapi真实呼入时不生效
- Customers/Requests/Calls三个标签页和列名要与模板一致,任何一处YOUR_SPREADSHEET_ID没替换都会让对应分支失败
- 关键词是子串匹配,像『回电』会命中『回电话』,配置时要考虑误命中导致的提醒泛滥
- 模板只负责查空档并发提醒,不会替你在日历里真正创建预约事件
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Handle Vapi voice agent tool calls and call logging with Google Sheets and Gmail
- 原作者
- Thomas Abraham
- 原始发布日期
- 2026-09-28T19:25:37.276Z
- 来源
- https://n8n.io/workflows/20085