This workflow corresponds to n8n.io template #10600 — we link there as the canonical source.
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 →
{
"id": "ohWlOUrJTpwZbKMH",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "LinkedIn Chat Bot",
"tags": [],
"nodes": [
{
"id": "2d1b209d-cd87-405f-b71d-bcc05b4eb29c",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
0,
0
],
"parameters": {
"public": true,
"options": {
"title": "Gede's LinkedIn AI Chatbot",
"subtitle": "Ask anything you want about Gede's work experience."
},
"initialMessages": "Hi there! \ud83d\udc4b\nI'm a chatbot that can answer questions about Gede's work experience."
},
"typeVersion": 1.3
},
{
"id": "022f2105-231c-4117-8da4-77d8a17398a7",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
416,
0
],
"parameters": {
"options": {
"systemMessage": "=You are acting as Gede. You are answering questions on {name}'s website, particularly questions related to Gede's career, background, skills and experience. Your responsibility is to represent Gede for interactions on the website as faithfully as possible. \nYou first call the get_documents tool to get Gede's Summary and LinkedIn Profile. Once you have retrieved these information you do not need to call it again.\nGiven a summary of Gede's background and LinkedIn profile which you can use to answer questions. Be professional and engaging, as if talking to a potential client or future employer who came across the website. If you don't know the answer to any question, use your record_unknown_question tool to record the question that you couldn't answer, even if it's about something trivial or unrelated to career. If the user is engaging in discussion, try to steer them towards getting in touch via email; ask for their email and record it using your record_user_details tool.\n"
}
},
"typeVersion": 2.2
},
{
"id": "57eb029d-2211-4678-a29c-1851dca1f858",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
224,
224
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "cb51b0cf-7663-4745-b3a1-1ec49d3e8f4d",
"name": "Call 'get_documents'",
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"position": [
512,
224
],
"parameters": {
"workflowId": {
"__rl": true,
"mode": "list",
"value": "Ugjv4DYdCAv9vN8I",
"cachedResultUrl": "/workflow/Ugjv4DYdCAv9vN8I",
"cachedResultName": "Failure automated investigation \u2014 get_documents"
},
"description": "Call this tool to get Gede's Summary and LinkedIn Profile",
"workflowInputs": {
"value": {
"name": "Gede"
},
"schema": [
{
"id": "name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"name"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"typeVersion": 2.2
},
{
"id": "d0a5c867-ab52-4c6b-9c6e-67e03f371685",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
352,
304
],
"parameters": {},
"typeVersion": 1.3
},
{
"id": "1c53c382-da47-499e-8605-6f0e59419cd2",
"name": "Call 'record_unknown_question'",
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"position": [
656,
288
],
"parameters": {
"workflowId": {
"__rl": true,
"mode": "list",
"value": "qtyMIARATIgcPUEI",
"cachedResultUrl": "/workflow/qtyMIARATIgcPUEI",
"cachedResultName": "Failure automated investigation \u2014 record_unknown_question"
},
"description": "Call this tool to record any question that the ai agent cannot answer confidently.",
"workflowInputs": {
"value": {
"question": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('question', `The question that could not be answered confidently.`, 'string') }}"
},
"schema": [
{
"id": "question",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "question",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"question"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"typeVersion": 2.2
},
{
"id": "4ced5a1a-d417-4058-96c9-c3153b14ee16",
"name": "Call 'record_user_details'",
"type": "@n8n/n8n-nodes-langchain.toolWorkflow",
"position": [
832,
160
],
"parameters": {
"workflowId": {
"__rl": true,
"mode": "list",
"value": "N66oMFziWYd4r04b",
"cachedResultUrl": "/workflow/N66oMFziWYd4r04b",
"cachedResultName": "Failure automated investigation \u2014 record_user_details"
},
"description": "Call this tool if the user want's to get in touch. The only mandatory piece of information is their email address.",
"workflowInputs": {
"value": {
"name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('name', `Name of the person asking to get in touch.`, 'string') }}",
"email": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('email', `Email address of the person wanting to get in touch.`, 'string') }}",
"notes": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('notes', `Any other notes that the person wants to talk about. `, 'string') }}"
},
"schema": [
{
"id": "name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "notes",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "notes",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
},
"typeVersion": 2.2
},
{
"id": "ef445ebd-0cdd-4a23-aece-5929d9fc2ba3",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
-112
],
"parameters": {
"color": 2,
"height": 272,
"content": "## Public Chat\nGo to the n8n hosted [chatbot](https://gsuparsa.app.n8n.cloud/webhook/c8198125-f143-42ce-89e0-2f23effaf13d/chat) to interact with on the web."
},
"typeVersion": 1
},
{
"id": "f7ddc7ad-a5f8-4d01-8cbc-48c669befba7",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
-624
],
"parameters": {
"width": 1168,
"height": 480,
"content": "# Chatbot for you CV with Telegram connected follow-up\nThis is an example of Project 1: Career Digital Twin in Ed Donner's udemy course [AI Engineer Agentic Track: The Complete Agent & MCP Course](https://www.udemy.com/course/the-complete-agentic-ai-engineering-course/?couponCode=MT251107G1).\nThis is an n8n version of the Career Conversation app in [1_foundations](https://github.com/ed-donner/agents/tree/50d1a6f7bb7e490af624f789958c7d07ad5b08fb/1_foundations).\n\n## How it works\n\n1. The N8N Chat node is configured as a public chat client that is shared on the internet and will provide an answer-response based on the AI agent it is connected to.\n2. Th AI Agent is able to respond to questions about your CV and an overview. This is provided as a tool subworkflow called `get_documents`. This workflow will retrieve a PDV and text file from Microsoft OneDrive.\n3. If the person chatting asks a question that cannot be answered by the AI Agent, it will call the tool subworkflow `record_unknown_question` and send you a telegram message.\n4. If the person leaves their email address, the AI Agent will call the tool subworkflow `record_user_details` and send you a telegram message with the capture information.\n\n\n## Setup Setups\n\n1. Copy this workflow and create the subworkflows `get_documents`, `record_unknown_question`, `record_user_details`.\n2. Setup Authentication accounts for OpenAI, Microsoft OneDrive (for `get_documents`) and a Telegram Bot for `record_unknown_question` and `record_user_details`."
},
"typeVersion": 1
},
{
"id": "49f3a21d-f5b0-461f-a62c-f548d45b1bbe",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
176,
448
],
"parameters": {
"color": 6,
"width": 576,
"height": 304,
"content": "## Tools Subworkflows\nThe AI Agent makes use of 3 subworkflows it uses as tools:\n\n1. `get_documents` will download an extract 2 files from Microsoft One Drive. The first being a PDF export of your LinkedIn profile and the second being a text document that provides a little summary about you.\n2. `record_user_details` will capture at least the email address of the person chatting with the chatbot and send a telegram message to the owner with supplied information.\n3. `record_unknown_question` - if the chatbot cannot reliably answer a question, then call this workflow to capture that question and send it via telegram to the owner. "
},
"typeVersion": 1
},
{
"id": "9cf49415-7953-4eb3-a9b7-4fe2a730cabb",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1136,
-288
],
"parameters": {
"color": 7,
"width": 1680,
"height": 848,
"content": "## Sub-workflow: get_documents\n\n"
},
"typeVersion": 1
},
{
"id": "ec563983-0f2d-42d4-8fd7-63fe1e4f7773",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1136,
656
],
"parameters": {
"color": 7,
"width": 1680,
"height": 672,
"content": "## Sub-workflow: record_user_details\n\n"
},
"typeVersion": 1
},
{
"id": "ee88f426-c664-4fa5-91a9-a1b9ffebaf17",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1136,
1440
],
"parameters": {
"color": 7,
"width": 1696,
"height": 688,
"content": "## Sub-workflow: record_unknown_question\n\n"
},
"typeVersion": 1
},
{
"id": "d6b3e3ae-574a-4d18-a936-d50938741be0",
"name": "ExtractFromPDF",
"type": "n8n-nodes-base.extractFromFile",
"position": [
2048,
-48
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "c240bc2b-3a64-4f40-8073-274c04cacddd",
"name": "ExtractFromTXT",
"type": "n8n-nodes-base.extractFromFile",
"position": [
2048,
144
],
"parameters": {
"options": {},
"operation": "text",
"destinationKey": "text"
},
"typeVersion": 1
},
{
"id": "8ac2ecd4-f0c9-405e-861f-d16674010d2e",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
2272,
48
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "1075d7c1-1763-435e-b0f4-69b4f1033a04",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
2496,
48
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "text"
}
]
}
},
"typeVersion": 1
},
{
"id": "c012e1ec-73d3-42a3-a264-69553d52fdf2",
"name": "When Executed by Another Workflow",
"type": "n8n-nodes-base.executeWorkflowTrigger",
"position": [
1600,
48
],
"parameters": {
"workflowInputs": {
"values": [
{
"name": "name"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "96cf5596-5b07-4d66-8e54-c899fd2ef870",
"name": "Download PDF CV",
"type": "n8n-nodes-base.microsoftOneDrive",
"position": [
1824,
-48
],
"parameters": {
"fileId": "REPLACE_PDF_FILE_ID",
"operation": "download"
},
"credentials": {
"microsoftOneDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "689d726b-5f98-4e6a-ac94-c76383f4a220",
"name": "Download Summary text file",
"type": "n8n-nodes-base.microsoftOneDrive",
"position": [
1824,
144
],
"parameters": {
"fileId": "REPLACE_TXT_FILE_ID",
"operation": "download"
},
"credentials": {
"microsoftOneDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "4808646f-e09b-44ce-a775-80a0b7be4305",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1232,
-192
],
"parameters": {
"color": 2,
"width": 320,
"content": "## get_documents\n\nThis workflow will download and extract the contents of a PDF (exported LinkedIn profile) and a text file from Microsoft OneDrive."
},
"typeVersion": 1
},
{
"id": "1dad24a0-38a5-453e-b226-bc8098afc470",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1712,
-192
],
"parameters": {
"color": 4,
"width": 320,
"height": 288,
"content": "### \ud83d\udc46 Change document ID & credential\n\n1. Link your OneDrive credential.\n2. Upload and get the ID of your CV in PDF format in OneDrive."
},
"typeVersion": 1
},
{
"id": "3dee7c0f-6999-4029-92d4-cf3de674390b",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
1728,
320
],
"parameters": {
"color": 4,
"width": 304,
"content": "### \ud83d\udc46 Change document ID \n\n1. Upload and get the ID of your summary in text format in OneDrive."
},
"typeVersion": 1
},
{
"id": "b52cea0b-6aa2-4e0f-865d-20aed8ff4b1d",
"name": "Send a text message",
"type": "n8n-nodes-base.telegram",
"position": [
2160,
880
],
"parameters": {
"text": "=Recording interest from {{ $json.name || \"Name not provided\" }} with email {{ $json.email }} and notes {{ $json.email || \"not provided\" }}",
"chatId": "REPLACE_TELEGRAM_CHAT_ID",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "5379bc42-ac6e-4072-91ad-353bab23e9bc",
"name": "Edit Fields",
"type": "n8n-nodes-base.set",
"position": [
2384,
880
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a23972bf-e2db-4405-8435-1ca62e80c70c",
"name": "Result",
"type": "string",
"value": "Message successfully sent."
}
]
}
},
"typeVersion": 3.4
},
{
"id": "7bbdbaf8-2425-4dd0-9ec4-058a09dec1ec",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
1248,
752
],
"parameters": {
"color": 2,
"width": 640,
"height": 384,
"content": "## record_user_details\n\nA subworkflow that will take at a minimum an email address but optionally a name and some other information to be sent to the owner of the workflow via a telegram message.\n\n### Parameters\n\n* `email` - (required) email address to capture\n* `name` - (optional) name of the person storing information\n* `notes` - (optional) any other additional information that's provided.\n\n### Response\nWill send a text message via Telegram with all provided information."
},
"typeVersion": 1
},
{
"id": "426189b8-4239-43db-be43-e96adec0e7e6",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
2128,
1056
],
"parameters": {
"color": 4,
"width": 592,
"height": 192,
"content": "### \ud83d\udc46 Setup Telegram credential and bot\n\n1. In Telegram message the `BotFather` to create a new bot and to get the bot **Access Token** to supply to the Telegram credential.\n2. Send a message to your new bot by searching for it (eg. `@mylinkedin_bot`) and then forward that message to `@UserInfoToBot` so you can get the **Chat ID** "
},
"typeVersion": 1
},
{
"id": "d8ea74c8-a1f7-4b2e-b815-08fa92fc2f94",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
1920,
704
],
"parameters": {
"color": 4,
"width": 384,
"height": 192,
"content": "### \ud83d\udc46 Add missing When Executed by Another Workflow\n\nDon't forget to add the **When Executed by Another Workflow** trigger to the **Send a text message** action. It needs the 3 inputs as described in the description box. "
},
"typeVersion": 1
},
{
"id": "d389ccf5-cf9e-413f-b297-668da6840131",
"name": "Send a text message1",
"type": "n8n-nodes-base.telegram",
"position": [
2208,
1680
],
"parameters": {
"text": "=Recording {{ $json.question }} asked that I couldn't answer.",
"chatId": "REPLACE_TELEGRAM_CHAT_ID",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "b05d7584-4ff0-482c-9fa6-baa0c4d226b0",
"name": "Edit Fields1",
"type": "n8n-nodes-base.set",
"position": [
2416,
1680
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "57d9d824-caac-4d11-b5d8-0e169bee93fb",
"name": "result",
"type": "string",
"value": "Message successfully sent."
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e3e3b39f-b9b8-455b-83cf-e5bde323202f",
"name": "Sticky Note12",
"type": "n8n-nodes-base.stickyNote",
"position": [
1264,
1568
],
"parameters": {
"color": 2,
"width": 672,
"height": 352,
"content": "## record_unknown_question\n\nThis workflow should get triggered if a question is asked that cannot be reliably responded to by the chatbot.\n\n### Inputs\n\n* `question` (required) the question that was asked\n\n### Response\n\nA Telegram message is sent to the the owner with the body of the question."
},
"typeVersion": 1
},
{
"id": "df0b0f59-3d16-4343-be29-2a16475f33b1",
"name": "Sticky Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
1984,
1472
],
"parameters": {
"color": 4,
"width": 384,
"height": 192,
"content": "### \ud83d\udc46 Add missing When Executed by Another Workflow\n\nDon't forget to add the **When Executed by Another Workflow** trigger to the **Send a text message** action. It needs the 3 inputs as described in the description box. "
},
"typeVersion": 1
}
],
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "cd99c34d-4812-4ab5-823f-e3959c456417",
"connections": {
"Merge": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"ExtractFromPDF": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"ExtractFromTXT": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Download PDF CV": {
"main": [
[
{
"node": "ExtractFromPDF",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Send a text message": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Call 'get_documents'": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Send a text message1": {
"main": [
[
{
"node": "Edit Fields1",
"type": "main",
"index": 0
}
]
]
},
"Call 'record_user_details'": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Download Summary text file": {
"main": [
[
{
"node": "ExtractFromTXT",
"type": "main",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Call 'record_unknown_question'": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"When Executed by Another Workflow": {
"main": [
[
{
"node": "Download PDF CV",
"type": "main",
"index": 0
},
{
"node": "Download Summary text file",
"type": "main",
"index": 0
}
]
]
}
}
}
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.
microsoftOneDriveOAuth2ApiopenAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Use case: link on your profile to not only show off you AI workflow skills but also to provide an interactive chatbot about your work history for prospective employers.
Source: https://n8n.io/workflows/10600/ — 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.
by Varritech Technologies
Airtable AI Agent. Uses lmChatOpenAi, agent, toolWorkflow, toolCode. Chat trigger; 42 nodes.
Ai Agent To Chat With Airtable And Analyze Data. Uses lmChatOpenAi, agent, stickyNote, memoryBufferWindow. Chat trigger; 41 nodes.
I prepared a detailed guide that shows the entire process of building an AI agent that integrates with Airtable data in n8n. This template covers everything from data preparation to advanced configura
Categories: AI Agents, Design Automation, Business Tools