{ "name": "Real Estate AI Agent with Bright Data", "nodes": [ { "parameters": { "public": true, "initialMessages": "Hi there! 👋\n\nMy name is Miquel and I am your personal Real Estate agent. I help you to find your new home.\n\nWhat are you looking for?", "options": { "showWelcomeScreen": true } }, "type": "@n8n/n8n-nodes-langchain.chatTrigger", "typeVersion": 1.1, "position": [ -900, -40 ], "id": "d9e07286-a8be-4c28-8519-acf7cd35ad86", "name": "When chat message received", "webhookId": "57251efe-e57c-43e2-ac58-bf27f1ec639d" }, { "parameters": { "contextWindowLength": 30 }, "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow", "typeVersion": 1.3, "position": [ -420, 140 ], "id": "7ca48714-3c65-4f32-9491-7b7b621aaa00", "name": "Simple Memory1" }, { "parameters": { "model": { "__rl": true, "mode": "list", "value": "gpt-4o-mini" }, "options": {} }, "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "typeVersion": 1.2, "position": [ -580, 140 ], "id": "79bea812-5a33-40a1-aa74-fe202d39dded", "name": "OpenAI Chat Model", "credentials": { "openAiApi": { "id": "oKzfvOwieOm4upQ2", "name": "OpenAi account" } } }, { "parameters": { "descriptionType": "manual", "toolDescription": "Create a dataset snapshot based on a provided filter in BrightData. use always filter homeStatus = FOR_SALE. We have the next operators: =, >, >=, in, <, <=, not_array_includes, !=, not_in, not_includes\n\nFilter must follow the next format:\n{\n \"operator\": \"and\",\n \"filters\": [\n {\n \"name\": \"homeStatus\",\n \"operator\": \"=\",\n \"value\": \"FOR_SALE\"\n },\n {\n \"name\": \"price\",\n \"operator\": \"=\",\n \"value\": 1000000\n },\n {\n \"name\": \"city\",\n \"operator\": \"=\",\n \"value\": \"new york\"\n },\n {\n \"name\": \"bathrooms\",\n \"operator\": \"=\",\n \"value\": 2\n },\n {\n \"name\": \"bedrooms\",\n \"operator\": \"=\",\n \"value\": 4\n }\n ]\n}", "resource": "marketplaceDataset", "operation": "filterDataset", "dataset_id": { "__rl": true, "mode": "list", "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Dataset', ``, 'string') }}" }, "records_limit": "=3", "filter_type": "filters_group", "filters_group": "={{ $fromAI('Filters_Group') }}" }, "type": "n8n-nodes-brightdata.brightDataTool", "typeVersion": 1, "position": [ -260, 140 ], "id": "30ef3cfc-56db-4092-af0d-304afdad94f0", "name": "Filter Dataset", "credentials": { "brightdataApi": { "id": "jk945kIuAFAo9bcg", "name": "BrightData account" } } }, { "parameters": { "inputSource": "passthrough" }, "type": "n8n-nodes-base.executeWorkflowTrigger", "typeVersion": 1.1, "position": [ -660, -340 ], "id": "6c4c4338-e4d2-40ee-89c0-89e1dd1dc330", "name": "When Executed by Another Workflow" }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "3e99082f-412a-4e33-ab77-c99ddd4d7ff5", "leftValue": "={{ $json.items[0].abbreviatedAddress }}", "rightValue": "NodeApiError", "operator": { "type": "string", "operation": "exists", "singleValue": true } } ], "combinator": "or" }, "options": {} }, "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ -120, -340 ], "id": "9db2680e-8bad-4b91-9cd6-8240f53081a0", "name": "Snapshot is ready?" }, { "parameters": {}, "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ 100, -260 ], "id": "75f66a3a-7738-4a1c-af8a-29385ad41749", "name": "Wait", "webhookId": "7d5607bb-7cbd-439e-a95e-dfe326486b74" }, { "parameters": { "promptType": "define", "text": "={{ $json.chatInput }}", "options": { "systemMessage": "=You are an expert AI Real Estate Agent.\n\nFollow the next guidelines always:\n\n1) If you have no memory, recover the metadata from the next databases:\n- Zillow properties listing information gd_lfqkr8wm13ixtbd8f5\nWe have the next filters:\n- city: City name where entity is located. Contains valid US city names as text strings.\n- bedrooms: Column stores the number of bedrooms in properties. Values are positive integers ranging from 1 to 7, with most properties having 2-4 bedrooms and no null values.\n- bathrooms: Number of bathrooms in residential properties. Values are positive integers ranging from 1 to 7, with most properties having 2-3 bathrooms and no null values.\n- price: Property price in US dollars. Format sample: 180,000\n\nInform user that only 3 houses will be reported.\nOnly call filterDataset if user completes city, bedrooms, bathrooms and price filters.\n\n2) Use filterDataset to generate a snapshot of the requested houses by mapping filter of the user.\nOnly allow one call to tool \"Filter Dataset\", \n\n3) After calling \"filter Dataset\" tool, use tool \"Get Snapshot Content\". Pass snapshot_id parameter.\n\n4) Use output from tool \"Get Snapshot Content\" to convert json to a list of properties with ul > li\nuse returned images to present home briefing", "maxIterations": 10 } }, "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 1.9, "position": [ -460, -40 ], "id": "19beba9e-6089-443f-a384-4be3ec821423", "name": "Real Estate AI Agent" }, { "parameters": { "content": "# Real Estate AI Agent with Bright Data\n\n## TODO\n- After pasting this workflow, update node \"Get Snapshot Content\" tool and add current Workflow ID (for instance, if your workflow in n8n has the next url https://n8n-ai.cr.vps2.clients.killia.com/workflow/fjEIEQ1L6n2IKqlx your workflow Id is fjEIEQ1L6n2IKqlx).\n- Add your Bright Data api key to \"Filter Dataset\" tool and \"Recover Snapshot Content\" node.", "height": 880, "width": 1260 }, "type": "n8n-nodes-base.stickyNote", "position": [ -960, -600 ], "typeVersion": 1, "id": "679e5b92-7b52-4230-a395-f3840d167756", "name": "Sticky Note1" }, { "parameters": { "resource": "marketplaceDataset", "operation": "getSnapshotContent", "snapshot_id": "={{ $('When Executed by Another Workflow').item.json.query }}" }, "type": "n8n-nodes-brightdata.brightData", "typeVersion": 1, "position": [ -340, -340 ], "id": "118c60c3-3a46-4ca2-be84-997218949bde", "name": "Recover Snapshot Content", "credentials": { "brightdataApi": { "id": "jk945kIuAFAo9bcg", "name": "BrightData account" } } }, { "parameters": { "workflowId": { "__rl": true, "value": "Ky9jD15PJgT7PIgP", "mode": "id" }, "workflowInputs": { "mappingMode": "defineBelow", "value": {}, "matchingColumns": [], "schema": [], "attemptToConvertTypes": false, "convertFieldsToString": false } }, "type": "@n8n/n8n-nodes-langchain.toolWorkflow", "typeVersion": 2.2, "position": [ -100, 140 ], "id": "5cc00806-6995-4d82-a832-f3159a66e31a", "name": "Get Snapshot Content" } ], "pinData": {}, "connections": { "When chat message received": { "main": [ [ { "node": "Real Estate AI Agent", "type": "main", "index": 0 } ] ] }, "Simple Memory1": { "ai_memory": [ [ { "node": "Real Estate AI Agent", "type": "ai_memory", "index": 0 } ] ] }, "OpenAI Chat Model": { "ai_languageModel": [ [ { "node": "Real Estate AI Agent", "type": "ai_languageModel", "index": 0 } ] ] }, "Filter Dataset": { "ai_tool": [ [ { "node": "Real Estate AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "When Executed by Another Workflow": { "main": [ [ { "node": "Recover Snapshot Content", "type": "main", "index": 0 } ] ] }, "Snapshot is ready?": { "main": [ [], [ { "node": "Wait", "type": "main", "index": 0 } ] ] }, "Wait": { "main": [ [ { "node": "Recover Snapshot Content", "type": "main", "index": 0 } ] ] }, "Recover Snapshot Content": { "main": [ [ { "node": "Snapshot is ready?", "type": "main", "index": 0 } ] ] }, "Get Snapshot Content": { "ai_tool": [ [ { "node": "Real Estate AI Agent", "type": "ai_tool", "index": 0 } ] ] } }, "active": true, "settings": { "executionOrder": "v1" }, "versionId": "d1f0818b-8548-4828-88a6-31daaf83b64e", "meta": { "templateCredsSetupCompleted": true, "instanceId": "b1f85eae352fde76d801a1a612661df6824cc2e68bfd6741e31305160a737e6e" }, "id": "Ky9jD15PJgT7PIgP", "tags": [] }