This workflow follows the Agent → Chat Trigger recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "socbot-kci",
"nodes": [
{
"parameters": {
"model": "llama-3.1-8b-instant",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGroq",
"typeVersion": 1,
"position": [
368,
144
],
"id": "17426c65-dc9b-4261-86c2-a178a547980d",
"name": "Groq Chat Model",
"credentials": {
"groqApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"value": "1HrzNfF4I63er1Y5OZKTq1VKf3LSvAOL6P0MRElTfpkQ",
"mode": "list",
"cachedResultName": "Record KCI Lanjutan",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HrzNfF4I63er1Y5OZKTq1VKf3LSvAOL6P0MRElTfpkQ/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 861278613,
"mode": "list",
"cachedResultName": "April 2026 Stellar",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HrzNfF4I63er1Y5OZKTq1VKf3LSvAOL6P0MRElTfpkQ/edit#gid=861278613"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Alarms Name": "={{ $json.Alarms_Name }}",
"Exploit Signature": "={{ $json.Exploit_Signatre }}",
"Case ID": "={{ $json.Case_ID }}",
"Action": "={{ $json.Action }}",
"Event Date": "={{ $json.Event_Date }}",
"Event Time": "={{ $json.Event_Time }}",
"Ticket Date & Time": "={{ $json.Ticket_Date_Time }}",
"Status Ticketing": "={{ $json.Status_Ticketing }}",
"Severity": "={{ $json.Severirty }}",
"IP Source": "={{ $json.IP_Source }}",
"Country Code IP Source": "={{ $json.Country_Code_IP_Source }}",
"Source IP Reputations": "={{ $json.Source_IP_Reputations }}",
"Source Port": "={{ $json.Source_Port }}",
"Stage": "={{ $json.Stage }}",
"Tactic": "={{ $json.Tactic }}",
"Technique": "={{ $json.Technique }}",
"MAC Address": "-",
"DNS & Resolve IP": "-",
"Source Host": "={{ $json.Source_Host }}",
"Dst Host": "={{ $json.Dst_Host }}",
"IP Destination": "={{ $json.IP_Destination }}",
"Country Code IP Destination": "={{ $json.Country_Code_IP_Destination }}",
"Destination Port": "={{ $json.Destination_Port }}",
"Destination IP Reputations": "={{ $json.Destination_IP_Reputations }}",
"Threat Category": "={{ $json.Threat_Category }}"
},
"matchingColumns": [],
"schema": [
{
"id": "No.",
"displayName": "No.",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Alarms Name",
"displayName": "Alarms Name",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Exploit Signature",
"displayName": "Exploit Signature",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Created By",
"displayName": "Created By",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Case ID",
"displayName": "Case ID",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "No.tiket",
"displayName": "No.tiket",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Action",
"displayName": "Action",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Event Date",
"displayName": "Event Date",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Event Time",
"displayName": "Event Time",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Ticket Date & Time",
"displayName": "Ticket Date & Time",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "SOC Response Time",
"displayName": "SOC Response Time",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Time Resolution ",
"displayName": "Time Resolution ",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Status Ticketing",
"displayName": "Status Ticketing",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Reason",
"displayName": "Reason",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Severity",
"displayName": "Severity",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "IP Source",
"displayName": "IP Source",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Country Code IP Source",
"displayName": "Country Code IP Source",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Source IP Reputations",
"displayName": "Source IP Reputations",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Source Port",
"displayName": "Source Port",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Stage",
"displayName": "Stage",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Tactic",
"displayName": "Tactic",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Technique",
"displayName": "Technique",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "MAC Address",
"displayName": "MAC Address",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "DNS & Resolve IP",
"displayName": "DNS & Resolve IP",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Source Host",
"displayName": "Source Host",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Dst Host",
"displayName": "Dst Host",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "IP Destination",
"displayName": "IP Destination",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Country Code IP Destination",
"displayName": "Country Code IP Destination",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Destination Port",
"displayName": "Destination Port",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Destination IP Reputations",
"displayName": "Destination IP Reputations",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Threat Category",
"displayName": "Threat Category",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "Number Failed",
"displayName": "Number Failed",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Number Successfull",
"displayName": "Number Successfull",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Actual",
"displayName": "Actual",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Typical",
"displayName": "Typical",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Request Username",
"displayName": "Request Username",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Request Password",
"displayName": "Request Password",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Metadata CVE",
"displayName": "Metadata CVE",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
880,
-80
],
"id": "335a93f8-7d47-444d-a8e3-be740f319e97",
"name": "Append row in sheet",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "2ea1040b-d315-4d90-b7fc-aa049cc85d2d",
"name": "Alarms_Name",
"value": "={{ JSON.parse($json.output).Alarms_Name }}",
"type": "string"
},
{
"id": "01a18d49-1825-4620-a7a5-49c3e4e47c14",
"name": "Exploit_Signatre",
"value": "={{ JSON.parse($json.output).Exploit_Signature }}",
"type": "string"
},
{
"id": "f75ecd85-3a76-4889-a2e7-512362ef2f3d",
"name": "Case_ID",
"value": "={{ JSON.parse($json.output).Case_ID }}",
"type": "string"
},
{
"id": "0c9471a5-ad14-4200-aabc-f86ff9eb16dd",
"name": "Action",
"value": "={{ JSON.parse($json.output).Action }}",
"type": "string"
},
{
"id": "390d0bb4-d6fc-4e97-a6ef-1860c5c67667",
"name": "Event_Date",
"value": "={{ JSON.parse($json.output).Event_Date }}",
"type": "string"
},
{
"id": "fd822997-0a45-4ce2-93c0-115eb19fc281",
"name": "Event_Time",
"value": "={{ JSON.parse($json.output).Event_Time }}",
"type": "string"
},
{
"id": "f227b7a3-f355-4878-9e35-aa01198a72f4",
"name": "Ticket_Date_Time",
"value": "={{ JSON.parse($json.output).Ticket_Date_Time }}",
"type": "string"
},
{
"id": "b1dd0603-ccf3-49c6-b7d3-ef80722a3ccf",
"name": "Status_Ticketing",
"value": "={{ JSON.parse($json.output).Status_Ticketing }}",
"type": "string"
},
{
"id": "6f3251ed-1c22-4d1a-813b-88ad2382e1d6",
"name": "Severirty",
"value": "={{ JSON.parse($json.output).Severity }}",
"type": "string"
},
{
"id": "7fe5c215-c5f2-427a-9352-61c0a5026498",
"name": "IP_Source",
"value": "={{ JSON.parse($json.output).IP_Source }}",
"type": "string"
},
{
"id": "0b23c3f6-15d2-4252-8c4c-30723f7b2b6b",
"name": "Country_Code_IP_Source",
"value": "={{ JSON.parse($json.output).Country_Code_IP_Source }}",
"type": "string"
},
{
"id": "71518567-4c56-4958-8ea2-76be0882236e",
"name": "Source_IP_Reputations",
"value": "={{ JSON.parse($json.output).Source_IP_Reputations }}",
"type": "string"
},
{
"id": "f3a4ed4b-6839-4630-9f19-09a77676ba35",
"name": "Source_Port",
"value": "={{ JSON.parse($json.output).Source_Port }}",
"type": "string"
},
{
"id": "dc6e8a69-3985-4033-adcd-f05146c6c277",
"name": "Stage",
"value": "={{ JSON.parse($json.output).Stage }}",
"type": "string"
},
{
"id": "540eec6f-ff59-4791-b648-b3d627a3b5e7",
"name": "Tactic",
"value": "={{ JSON.parse($json.output).Tactic }}",
"type": "string"
},
{
"id": "d2ec7c03-6110-42d9-b53e-c6bf5984286e",
"name": "Technique",
"value": "={{ JSON.parse($json.output).Technique }}",
"type": "string"
},
{
"id": "060e3b7d-e769-465f-a137-361625fa2052",
"name": "Source_Host",
"value": "={{ JSON.parse($json.output).Source_Host }}",
"type": "string"
},
{
"id": "ece1b483-0473-486d-a1a5-0024b36a217c",
"name": "Dst_Host",
"value": "={{ JSON.parse($json.output).Dst_Host}}",
"type": "string"
},
{
"id": "32cfe74d-5532-42ba-a559-69967ee3e14f",
"name": "IP_Destination",
"value": "={{ JSON.parse($json.output).IP_Destination }}",
"type": "string"
},
{
"id": "f572cb29-a847-46ef-bdaa-89db31a17b5c",
"name": "Country_Code_IP_Destination",
"value": "={{ JSON.parse($json.output).Country_Code_IP_Destination }}",
"type": "string"
},
{
"id": "9e4b23a2-44c7-4699-bd0f-aeab03786891",
"name": "Destination_Port",
"value": "={{ JSON.parse($json.output).Destination_Port }}",
"type": "string"
},
{
"id": "6a63cfd3-feb1-443e-a8e3-9cbccf9b16e3",
"name": "Destination_IP_Reputations",
"value": "={{ JSON.parse($json.output).Destination_IP_Reputations }}",
"type": "string"
},
{
"id": "e51ebf44-0c67-4547-b036-2949d10da949",
"name": "Threat_Category",
"value": "={{ JSON.parse($json.output).Threat_Category }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
672,
-80
],
"id": "6700f336-79de-494d-a875-568649b77edd",
"name": "Edit Fields"
},
{
"parameters": {
"options": {
"systemMessage": "Anda adalah asisten SOC Expert. Tugas utama Anda adalah mengekstrak data dari Laporan Insiden Keamanan ke dalam format JSON murni.\n\nATURAN UTAMA:\n1. JANGAN memberikan teks pengantar (seperti \"Berikut datanya...\") atau penutup. \n2. OUTPUT HARUS berupa objek JSON tunggal yang valid.\n3. Jika data tidak ditemukan pada teks laporan, isi dengan nilai default \"-\".\n4. JANGAN melakukan halusinasi data; ambil hanya dari teks yang disediakan.\n\nINSTRUKSI EKSTRAKSI FIELD:\n- Alarms_Name: Ekstrak dari field 'Security Event'.\n- Exploit_Signature: Ekstrak dari 'Signature'. Jika kosong, isi \"-\".\n- Case_ID: Ekstrak dari 'Case ID'.\n- Event_Date: Konversi 'Waktu Deteksi' (YYYY-MM-DD) menjadi format \"D-MMM-YY\" (Contoh: 7-Apr-26).\n- Event_Time: Ambil HH:mm dari 'Waktu Deteksi' (Contoh: 00:15).\n- Ticket_Date_Time: Gunakan nilai yang sama dengan 'Event_Date' (D-MMM-YY).\n- Action: Ambil deskripsi tindakan dari bagian 'Action' Jika sudah di block maka isi (Block Stellar).\n- Status_Ticketing: Ambil dari 'Status Event' atau 'State'.\n- Severity: Ambil dari 'Severity'.\n- IP_Source: Ambil alamat IP saja dari 'Source IP'.\n- Country_Code_IP_Source: Ambil nama negara di dalam kurung pada field 'Source IP' namanya saja tidak perlu dengan kurungnya.\n- Source_IP_Reputations: Ambil dari 'Source Reputation'.\n- Source_Port: Ambil dari 'Source Port'.\n- Stage : Ambil dari 'Stage'.\n- Tactic : Ambil dari 'Tactic'.\n- Technique : Ambil dari 'Technique'.\n- Source_Host: Ambil dari 'Source Host'.\n- Dst_Host: Ambil dari 'Destination Host'.\n- IP_Destination: Ambil alamat IP saja dari 'Destination IP'.\n- Country_Code_IP_Destination: Ambil nama negara/label di dalam kurung pada field 'Destination IP' namanya saja tidak perlu dengan kurungnya.\n- Destination_Port: Ambil dari 'Dst port'.\n- Destination_IP_Reputations: Ambil dari 'Destination Reputation'.\n- Threat_Category: Ambil dari 'Threat Category'.\n\nSTRUKTUR OUTPUT JSON:\n{\n \"Alarms_Name\": \"\",\n \"Exploit_Signature\": \"\",\n \"Case_ID\": \"\",\n \"Action\": \"\",\n \"Event_Date\": \"\",\n \"Event_Time\": \"\",\n \"Ticket_Date_Time\": \"\",\n \"Status_Ticketing\": \"\",\n \"Severity\": \"\",\n \"IP_Source\": \"\",\n \"Country_Code_IP_Source\": \"\",\n \"Source_IP_Reputations\": \"\",\n \"Source_Port\": \"\",\n \"Stage\": \"\",\n \"Tactic\": \"\",\n \"Technique\": \"\",\n \"Source_Host\": \"\",\n \"Dst_Host\": \"\",\n \"IP_Destination\": \"\",\n \"Country_Code_IP_Destination\": \"\",\n \"Destination_Port\": \"\",\n \"Destination_IP_Reputations\": \"\",\n \"Threat_Category\": \"\"\n}"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"position": [
368,
-80
],
"id": "f197bc5c-8e9c-42c7-bc45-487adb21f6bb",
"name": "AI Agent"
},
{
"parameters": {
"public": true,
"initialMessages": "Hallo dari socbot! \ud83d\udc4b\n\nSelamat bekerja, Rekan SOC. Masukkan data terkait insiden di lingkungan KCI untuk otomatisasi record.",
"availableInChat": true,
"agentIcon": {
"type": "emoji",
"value": "\ud83d\ude80"
},
"agentName": "socbot",
"options": {
"inputPlaceholder": "Masukan bagian datanya saja...",
"subtitle": "Automated Incident Reporting System by @Nicky Fajaelani",
"title": "socbot \n Kereta Commuter Indonesia",
"customCss": ":root {\n /* Colors - Tema Commuterline KCI */\n --chat--color--primary: #E30613; /* Merah KCI */\n --chat--color--primary-shade-50: #C20510;\n --chat--color--primary--shade-100: #8C040C;\n --chat--color--secondary: #0B2F5C; /* Biru Gelap Corporate */\n --chat--color-secondary-shade-50: #144480;\n --chat--color-white: #ffffff;\n --chat--color-light: #F4F6F8;\n --chat--color-light-shade-50: #E2E8F0;\n --chat--color-light-shade-100: #CBD5E1;\n --chat--color-medium: #94A3B8;\n --chat--color-dark: #111827;\n --chat--color-disabled: #CBD5E1;\n --chat--color-typing: #F58220;\n\n /* Base Layout */\n --chat--spacing: 1rem;\n --chat--border-radius: 0.5rem;\n --chat--transition-duration: 0.15s;\n --chat--font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;\n\n /* Window Dimensions */\n --chat--window--width: 420px;\n --chat--window--height: 600px;\n --chat--window--bottom: var(--chat--spacing);\n --chat--window--right: var(--chat--spacing);\n --chat--window--z-index: 9999;\n --chat--window--border: 1px solid var(--chat--color-light-shade-100);\n --chat--window--border-radius: 0.5rem;\n --chat--window--margin-bottom: var(--chat--spacing);\n\n /* Header Styles */\n --chat--header-height: auto;\n --chat--header--padding: 1.2rem var(--chat--spacing);\n --chat--header--background: var(--chat--color-dark);\n --chat--header--color: var(--chat--color-white);\n --chat--header--border-top: none;\n --chat--header--border-bottom: none; /* Dihapus agar digantikan seutuhnya oleh garis custom di bawah */\n --chat--header--border-left: none;\n --chat--header--border-right: none;\n --chat--heading--font-size: 1.25em;\n --chat--subtitle--font-size: 0.9em;\n --chat--subtitle--line-height: 1.5;\n\n /* Message Styles */\n --chat--message--font-size: 0.95rem;\n --chat--message--padding: 0.8rem 1rem;\n --chat--message--border-radius: 0.5rem;\n --chat--message-line-height: 1.5;\n --chat--message--margin-bottom: calc(var(--chat--spacing) * 0.8);\n --chat--message--bot--background: var(--chat--color-white);\n --chat--message--bot--color: var(--chat--color-dark);\n --chat--message--bot--border: 1px solid var(--chat--color-light-shade-50);\n --chat--message--user--background: var(--chat--color--secondary);\n --chat--message--user--color: var(--chat--color-white);\n --chat--message--user--border: none;\n --chat--message--pre--background: #F8FAFC;\n --chat--messages-list--padding: var(--chat--spacing);\n\n /* Toggle Button */\n --chat--toggle--size: 64px;\n --chat--toggle--width: var(--chat--toggle--size);\n --chat--toggle--height: var(--chat--toggle--size);\n --chat--toggle--border-radius: 50%;\n --chat--toggle--background: var(--chat--color--primary);\n --chat--toggle--hover--background: var(--chat--color--primary-shade-50);\n --chat--toggle--active--background: var(--chat--color--primary--shade-100);\n --chat--toggle--color: var(--chat--color-white);\n\n /* Input Area */\n --chat--textarea--height: 50px;\n --chat--textarea--max-height: 30rem;\n --chat--input--font-size: 0.95rem;\n --chat--input--border: 1px solid var(--chat--color-light-shade-50);\n --chat--input--border-radius: 0.5rem;\n --chat--input--padding: 0.8rem;\n --chat--input--background: var(--chat--color-white);\n --chat--input--text-color: var(--chat--color-dark);\n --chat--input--line-height: 1.5;\n --chat--input--placeholder--font-size: var(--chat--input--font-size);\n --chat--input--border-active: 1px solid var(--chat--color--primary);\n --chat--input--left--panel--width: 2rem;\n\n /* Button Styles */\n --chat--button--padding: calc(var(--chat--spacing) * 5 / 8) var(--chat--spacing);\n --chat--button--border-radius: var(--chat--border-radius);\n --chat--button--font-size: 1rem;\n --chat--button--line-height: 1;\n \n --chat--button--color--primary: var(--chat--color-white);\n --chat--button--background--primary: var(--chat--color--primary);\n --chat--button--border--primary: none;\n --chat--button--color--primary--hover: var(--chat--color-white);\n --chat--button--background--primary--hover: var(--chat--color--primary-shade-50);\n --chat--button--border--primary--hover: none;\n --chat--button--color--primary--disabled: var(--chat--color-light);\n --chat--button--background--primary--disabled: var(--chat--color-light-shade-100);\n --chat--button--border--primary--disabled: none;\n \n --chat--button--color--secondary: var(--chat--color-white);\n --chat--button--background--secondary: var(--chat--color--secondary);\n --chat--button--border--secondary: none;\n --chat--button--color--secondary--hover: var(--chat--color-white);\n --chat--button--background--secondary--hover: var(--chat--color-secondary-shade-50);\n --chat--button--border--secondary--hover: none;\n --chat--button--color--secondary--disabled: var(--chat--color-white);\n --chat--button--background--secondary--disabled: var(--chat--color-light-shade-100);\n --chat--button--border--secondary--disabled: none;\n --chat--close--button--color-hover: #F58220; \n\n /* Send and File Buttons */\n --chat--input--send--button--background: var(--chat--color--primary);\n --chat--input--send--button--color: var(--chat--color-white);\n --chat--input--send--button--background-hover: var(--chat--color--primary-shade-50);\n --chat--input--send--button--color-hover: var(--chat--color-white);\n \n --chat--input--file--button--background: var(--chat--color-light);\n --chat--input--file--button--color: var(--chat--color--secondary);\n --chat--input--file--button--background-hover: var(--chat--color-light-shade-50);\n --chat--input--file--button--color-hover: var(--chat--color--secondary);\n --chat--files-spacing: 0.25rem;\n\n /* Body and Footer */\n --chat--body--background: var(--chat--color-light);\n --chat--footer--background: var(--chat--color-white);\n --chat--footer--color: var(--chat--color-dark);\n}\n\n/* =========================================\n OVERRIDES & CUSTOM KCI \"TRAIN TOUCHES\"\n ========================================= */\n\n.chat-message {\n\tmax-width: 85%;\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n}\n\n.chat-message.bot {\n border-left: 4px solid #E30613 !important;\n border-radius: 0.2rem 0.5rem 0.5rem 0.2rem; \n}\n\n/* 3. Striping Livery KRL (Merah, Oranye, Kuning) di bagian bawah Header */\n.chat-header {\n position: relative;\n border-bottom: none !important; /* Memastikan tidak ada bentrok border */\n}\n\n.chat-header::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n height: 8px; /* <<< DIPERTEBAL (sebelumnya 4px) */\n width: 100%;\n /* Merah mendominasi, diikuti Oranye, lalu Kuning cerah di ujung kanan */\n background: linear-gradient(90deg, #E30613 0%, #E30613 65%, #F58220 65%, #F58220 85%, #FFD700 85%, #FFD700 100%);\n}\n\n.chat-input textarea {\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.9rem;\n}\n\n"
}
},
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"typeVersion": 1.4,
"position": [
144,
-80
],
"id": "b2630797-008e-48e2-9844-d7d00fcbfbda",
"name": "When chat message received"
}
],
"connections": {
"Groq Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "Append row in sheet",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"binaryMode": "separate",
"availableInMCP": false
},
"versionId": "60e6411a-8736-48f3-89aa-5f9efa9cf8fb",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "SgifTd0s47dicbuX",
"tags": []
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleSheetsOAuth2ApigroqApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
socbot-kci. Uses lmChatGroq, googleSheets, agent, chatTrigger. Chat trigger; 5 nodes.
Source: https://github.com/NickyFajaelani525/socbot/blob/61e6701039f15688cf9c4c424eb2c10a05218c61/socbot-kci.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
reporting soc. Uses lmChatGroq, googleSheets, chatTrigger, agent. Chat trigger; 5 nodes.
teste. Uses chatTrigger, agent, lmChatGroq, memoryBufferWindow. Chat trigger; 24 nodes.
pix-zap. Uses chatTrigger, agent, toolCalculator, toolWikipedia. Chat trigger; 21 nodes.
📌 Overview This workflow automates end-to-end appointment scheduling for your business using an AI-powered chatbot. Clients can book, reschedule, or cancel meetings through a simple chat interface — n
Case 1. Uses chatTrigger, googleSheets, agent, lmChatGroq. Chat trigger; 9 nodes.