The Recap AI - 牙科语音助手
中级
这是一个Support Chatbot, AI Chatbot领域的自动化工作流,包含 11 个节点。主要使用 Webhook, Agent, GoogleSheetsTool, RespondToWebhook, GoogleCalendarTool 等节点。 使用 Gemini AI、Google Calendar 和 Sheets 自动化牙科预约
前置要求
- •HTTP Webhook 端点(n8n 会自动生成)
- •Google Sheets API 凭证
- •Google Gemini API Key
使用的节点 (11)
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
"id": "r2cQWoLPpK7BNtlA",
"meta": {
"instanceId": "06e5009344f682419c20ccd4ecdcb5223bbb91761882af93ac6d468dbc2cbf8d",
"templateCredsSetupCompleted": true
},
"name": "The Recap AI - 牙科语音助手",
"tags": [],
"nodes": [
{
"id": "a352b87c-e6b9-45b2-bdf8-78d892543168",
"name": "webhook_trigger",
"type": "n8n-nodes-base.webhook",
"position": [
48,
-32
],
"webhookId": "4fe15a31-6365-4b96-a3d5-3b02bbe3d31a",
"parameters": {
"path": "4fe15a31-6365-4b96-a3d5-3b02bbe3d31a",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "5b2a46d3-2444-4dce-b2de-1f6526b761b3",
"name": "get_availability",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
544,
256
],
"parameters": {
"options": {
"timezone": {
"__rl": true,
"mode": "list",
"value": "America/Chicago",
"cachedResultName": "America/Chicago"
}
},
"timeMax": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End_Time', `The end time will always be the Start Time plus 1 hour.`, 'string') }}",
"timeMin": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start_Time', `The start timestamp for the dental appointment.`, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "emailPlaceholder",
"cachedResultName": "emailPlaceholder"
},
"resource": "calendar"
},
"credentials": {
"googleCalendarOAuth2Api": {
"id": "TG3WC49qzJvApajF",
"name": "Lucas Google Calendar"
}
},
"typeVersion": 1.3
},
{
"id": "82d08e14-44d7-45b0-be6b-b4736cf5f8be",
"name": "think",
"type": "@n8n/n8n-nodes-langchain.toolThink",
"position": [
384,
256
],
"parameters": {},
"typeVersion": 1
},
{
"id": "05ece507-6dea-4f3a-9a3b-aed813319118",
"name": "create_appointment",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
704,
256
],
"parameters": {
"end": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End', `End time for the dental appointment. This should be 1 hour AFTER the start time. This will be in the Central Time Zone (CST).`, 'string') }}",
"start": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start', `Start time for the dental appointment. You should assume this is a central timezone timestamp (CST).`, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": "emailPlaceholder",
"cachedResultName": "emailPlaceholder"
},
"additionalFields": {
"summary": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Summary', 'The title/summary of this event should be in the format of \"Dental Appointment | {patient_name}\" where `patient_name` is the provided name of the patient.', 'string') }}"
}
},
"credentials": {
"googleCalendarOAuth2Api": {
"id": "TG3WC49qzJvApajF",
"name": "Lucas Google Calendar"
}
},
"typeVersion": 1.3
},
{
"id": "cb872431-a32d-4098-b112-776cab3b4a2b",
"name": "respond_to_webhook",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
864,
-32
],
"parameters": {
"options": {}
},
"typeVersion": 1.4
},
{
"id": "a9f97d50-49d0-4b5e-a35f-3d16a205ad17",
"name": "gemini-2.5-flash",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
48,
256
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"id": "qp1NlMiIctmGD0Uu",
"name": "Google Gemini (PaLM)"
}
},
"typeVersion": 1
},
{
"id": "2ecea651-1cca-4eef-8772-3ecfe9ef3a5f",
"name": "dental_agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
352,
-32
],
"parameters": {
"text": "=## Request Data\n\n{{ JSON.stringify($json.body, null, 2)}}\n",
"options": {
"systemMessage": "=## Role\n\nYou are an AI agent responsible for handling back office operations at the dental office \"Pearly Whites Dental\". You must make a decision about the data you receive and make a call into the appropriate tool in order to process this request and return the appropriate data necessary.\n\nYou should look at the provided `tool` value in the request body to help decided which tool to use.\n\nPay close attention to the constraints for number of times a tool is able to be used.\n\nYou have secure access to the following internal tools:\n - `think` → you MUST use this to think carefully about how to handle the provided request data. This tool must be used on every turn and tool call interaction.\n - `get_availability` → returns true/false availability on the Dental Office Calendar for the given start timestamp in CST (Central Time). **For availability requests, you MUST call this tool multiple times to find AT LEAST 2 available timeslots if they exist.** Matches the `get_availability` tool value included in the request.\n - `create_appointment` → creates a 1-hour appointment event for the provided start time. This tool may only be called ONCE (1 time) in a given request. Do NOT use this tool multiple times. Matches the `create_appointment` tool value included in the request. If you use this tool more than once, your task will be considered a FAILURE.\n - `log_patient_details` → logs the provided call details and patient details to a Google Sheet. This should ONLY be called and used once for a provided request since we are logging details ONCE per call/patient. In order to use this tool, you need to be given the patient name / insurance provider / optional questions and concerns - if you don't have this information, you should NOT use this tool. This will be used only at the very end of the call when all details are provided. Matches the `log_patient_details` tool value included in the request. If you use this tool more than once, your task will be considered a FAILURE.\n\n\n## Special Instructions for get_availability Tool\n\nWhen handling availability requests:\n\n1. **Always aim to return 2 available timeslots** when possible\n2. **Call get_availability multiple times** to check different time slots on the requested date\n3. **Search strategy:**\n - Start with the requested time (if provided)\n - If that's not available, check nearby times in 30-minute or 1-hour increments\n - Check both earlier and later times on the same day\n - Continue checking until you find 2 available slots OR exhaust reasonable options\n\n4. **Response format:** Return an array of available timeslots in ISO format (Central Time Zone CST):\n ```json\n {\n \"availableSlots\": [\n \"2024-01-15T14:00:00Z\",\n \"2024-01-15T16:00:00Z\"\n ]\n }\n ```\n\n5. **If fewer than 2 slots are found:**\n - Return whatever available slots you found (even if just 1)\n - It's better to return 1 slot than none\n\n6. **Time checking sequence example:**\n - If user requests \"2:00 PM on Tuesday\"\n - Check: 2:00 PM, 1:30 PM, 2:30 PM, 1:00 PM, 3:00 PM, 12:30 PM, 3:30 PM, etc.\n - Stop when you have 2 available slots or have checked reasonable business hours\n\n7. **Business hours assumption:** \n - Check times between 8:00 AM and 5:00 PM unless specified otherwise\n - Skip lunch hour (12:00-1:00 PM) if applicable\n\nRemember: The get_availability tool can be called multiple times for availability requests, but create_appointment and log_patient_details must only be called ONCE per request.\n\nRemember: All times are in CST (Central Time Zone)"
},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "17d6dacb-b331-4def-8469-f11f0f59234c",
"name": "log_patient_details",
"type": "n8n-nodes-base.googleSheetsTool",
"position": [
864,
256
],
"parameters": {
"columns": {
"value": {
"Patient Name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Patient_Name', `Name of the patient booking their appointment.`, 'string') }}",
"Call Timestamp": "={{ $now.toString() }}",
"Insurance Provider": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Insurance_Provider', `Name of the insurance provider.`, 'string') }}",
"Questions & Concerns": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Questions___Concerns', `Optional questions or concerns raised by the patient booking the appointment.`, 'string') }}",
"Appointment Timestamp": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Appointment_Timestamp', `Timestamp the appointment is booked for.`, 'string') }}"
},
"schema": [
{
"id": "Call Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Call Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Patient Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Patient Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Insurance Provider",
"type": "string",
"display": true,
"required": false,
"displayName": "Insurance Provider",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Questions & Concerns",
"type": "string",
"display": true,
"required": false,
"displayName": "Questions & Concerns",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Appointment Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Appointment Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Patient Name"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "url",
"cachedResultName": "Appointments"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1D9WO3JbzZ472pDvR0GGKDm5Jz8KkTpg_EtSgK9yVZtg",
"cachedResultUrl": "url",
"cachedResultName": "Pearly Whites Dental Appointments"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "C8jshnaDinQz6p7c",
"name": "Google Sheets"
}
},
"typeVersion": 4.6
},
{
"id": "fc64c0e2-838c-43a8-91f3-dcf1c062c13d",
"name": "simple-memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
224,
256
],
"parameters": {
"sessionKey": "={{ $('webhook_trigger').item.json.headers['cf-ray'] }}",
"sessionIdType": "customKey",
"contextWindowLength": 10
},
"typeVersion": 1.3
},
{
"id": "d8048dc8-78cd-4b5b-a9d1-6c85447c862d",
"name": "便签",
"type": "n8n-nodes-base.stickyNote",
"position": [
-640,
-608
],
"parameters": {
"color": 5,
"width": 624,
"height": 1008,
"content": "## 使用 Google Calendar 和 Sheets 的 AI 牙科预约预订"
},
"typeVersion": 1
},
{
"id": "32a1a022-707a-467f-bc19-c20229805d8b",
"name": "便签1",
"type": "n8n-nodes-base.stickyNote",
"position": [
16,
-608
],
"parameters": {
"color": 6,
"width": 624,
"height": 528,
"content": "### 如何设置"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "e38ef05e-3ff0-4878-806b-1ba327cdfca4",
"connections": {
"think": {
"ai_tool": [
[
{
"node": "dental_agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"dental_agent": {
"main": [
[
{
"node": "respond_to_webhook",
"type": "main",
"index": 0
}
]
]
},
"simple-memory": {
"ai_memory": [
[
{
"node": "dental_agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"webhook_trigger": {
"main": [
[
{
"node": "dental_agent",
"type": "main",
"index": 0
}
]
]
},
"gemini-2.5-flash": {
"ai_languageModel": [
[
{
"node": "dental_agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"get_availability": {
"ai_tool": [
[
{
"node": "dental_agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"create_appointment": {
"ai_tool": [
[
{
"node": "dental_agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"log_patient_details": {
"ai_tool": [
[
{
"node": "dental_agent",
"type": "ai_tool",
"index": 0
}
]
]
}
}
}常见问题
如何使用这个工作流?
复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。
这个工作流适合什么场景?
中级 - 客服机器人, AI 聊天机器人
需要付费吗?
本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。
相关工作流推荐
具备多步骤工具执行的AI驱动HVAC排程代理
通过AI代理、Google日历和Gmail自动化HVAC服务排程
Wait
Gmail
Webhook
+11
30 节点Bhuvanesh R
客服机器人
使用WhatsApp AI助手和Google文档及Gemini自动处理客户支持
使用WhatsApp AI助手和Google文档及Gemini自动处理客户支持
If
Code
Webhook
+9
14 节点Jamot
客服机器人
通用AI助手
创建支持Webhook的对话助手(Google Gemini和会话记忆)
Webhook
Agent
Respond To Webhook
+3
10 节点David Olusola
客服机器人
AI驱动的Facebook页面支持聊天机器人:自动回复与智能客户处理
使用GPT-4.1的Facebook Messenger聊天机器人,支持人工升级
If
Set
Wait
+11
32 节点SpaGreen Creative
客服机器人
聊天机器人Webhook
基于AI的Gmail和日历助手,集成Gemini聊天界面
Set
Webhook
Gmail Tool
+7
19 节点Praneel S
杂项
构建带记忆、Google套件和多AI研究成像的WhatsApp助手
构建带记忆、Google套件和多AI研究成像的WhatsApp助手
If
Set
Code
+27
71 节点Iniyavan JC
AI 聊天机器人
工作流信息
难度等级
中级
节点数量11
分类2
节点类型9
作者
Lucas Walter
@lucaswalterChief Automation Officer at The Recap AI. I build the AI systems and agents that power our business and teach others how to use n8n. Check out our YouTube channel linked below!
外部链接
在 n8n.io 查看 →
分享此工作流