8
n8n 中文网amn8n.com

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
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 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)可能需要您自行付费。

工作流信息
难度等级
中级
节点数量11
分类2
节点类型9
难度说明

适合有一定经验的用户,包含 6-15 个节点的中等复杂度工作流

作者
Lucas Walter

Lucas Walter

@lucaswalter

Chief 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 查看

分享此工作流