LinkedIn - ADB Controller
This workflow helps you control an android device via ADB and n8n.
You'd need the code for the custom FastAPI server to be able to send request to ADB. DM me for the full setup.
This workflow expects a LinkedIn profile to be open on the screen. Goes to the latest post. Reads the post and then makes a relevant comment.
Ideally, have another workflow running that opens up the Linkedin page on android.
Shared 10/6/2025
413 views
Visual Workflow
JSON Code
{
"meta": {
"instanceId": "784633b34b946c52696f8bcee5aa5878daa3acd944446e0b6ac2ec35a27f3ec1",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "dea34020-5317-4a10-a98c-505c0050df0c",
"name": "Type",
"type": "n8n-nodes-base.httpRequest",
"position": [
3504,
10688
],
"parameters": {
"url": "http://adb-api:8000/type",
"method": "POST",
"options": {},
"jsonBody": "={ \n\"text\":{{ $('Code in JavaScript').item.json.comment.toJsonString() }}\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "6e9b6d55-8bac-407a-8ff0-4b1dcea05bf2",
"name": "Anthropic Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-3120,
11216
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "Claude Haiku 3.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1.3
},
{
"id": "48774d23-1d29-42ab-8662-62ff327a18a9",
"name": "tap",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1536,
10736
],
"parameters": {
"url": "http://adb-api:8000/tap",
"method": "POST",
"options": {},
"jsonBody": "={\n\"x\":{{ $json.parameters.x }},\n\"y\":{{ $json.parameters.y }}\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "600a8425-f173-4e6c-bfed-599566bceb6f",
"name": "swipe",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1536,
10928
],
"parameters": {
"url": "http://adb-api:8000/swipe",
"method": "POST",
"options": {},
"jsonBody": "={\n\"x1\":{{ $json.parameters.x1 }},\n\"y1\":{{ $json.parameters.y1 }},\n\"x2\":{{ $json.parameters.x2 }},\n\"y2\":{{ $json.parameters.y2 }}\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "47ec0e0d-5369-456f-95dd-e03f1ec51288",
"name": "UIAutomator Dump2",
"type": "n8n-nodes-base.httpRequest",
"position": [
-4016,
10992
],
"parameters": {
"url": "http://adb-api:8000/uiautomator_dump",
"method": "POST",
"options": {},
"jsonBody": "{}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "2d949549-023f-444d-9731-0532e10df567",
"name": "Pull UI2",
"type": "n8n-nodes-base.httpRequest",
"position": [
-3808,
10992
],
"parameters": {
"url": "http://adb-api:8000/pull_ui",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "9377c98a-8626-422d-bebd-cdb47efbdd90",
"name": "Cat UI2",
"type": "n8n-nodes-base.httpRequest",
"position": [
-3584,
10992
],
"parameters": {
"url": "http://adb-api:8000/cat_file",
"method": "POST",
"options": {},
"jsonBody": "{\n \"filename\":\"latestui.xml\"\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "8b5dbb1d-2c5a-4125-9750-06a97d9a5dda",
"name": "linkedin_post_finder",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-3136,
10992
],
"parameters": {
"text": "=UI Dump: \n{{ $('ui_shallow_parse').item.json.uidump.shallow_parse.toJsonString() }}\nScreenshot analysis:\n{{ $json.UIscreenshot_analysis }}\n",
"options": {
"systemMessage": "You are an assistant that helps a LinkedIn consultant open the latest post on a profile. Ensure that the post is opened and that if the user decides to scroll down, they’ll see the rest of the post.
\nAvailable actions:\n* tap\n* scroll_down\n* scroll_up\n* screenshot\n* rest_now\n\nProcess:
You receive a UI dump and then you suggest an action based on that info. After each action you suggest, you receive an updated UI dump or a screenshot analysis or both. For every UI dump, suggest the next action that moves toward FULLY OPENING the latest post.
\nObjective:
Make the latest post opened. When it is, the final action must be rest_now.\n\nAlways remember that just finding the latest post is not enough. The post must be opened by tapping it for the goal to be considered as reached.\n\n
Rules:
\n* Always include:\n * action: - The action that should be taken to move forward\n * reason — where you are and why this action helps\n * optional comments\n\nIf you are stuck in a loop or stuck on the same user interface after repeated actions, you can suggest a screenshot action. That’ll get you a screenshot analysis.
\n\n\nGuidelines:\n\nScroll logically following the profile layout (top → posts).\nrest_now is only used when the post is fully visible (stop navigation).\n\nIf you are in a comment section of a post -> the post will almost always be above it.
Here’s a LinkedIn Profile Page Structure from the top to bottom (for reference as to what comes below what):\n* Profile Name\n* Profile Tagline\n* People You May Know\n* About Section (may have \"See More\" button)\n* Top Skills (arrow navigates to another page)\n* Services Offered (with \"Request Services\" button)\n* Show All Services button\n* Activity\n* Posts (LATEST POST WILL BE HERE)\n* Latest Reposted or Interacted Post\n* Experiences\n* Education\n* Licenses and Certifications\n* Skills\n* Recommendations (Received & Given)\n* Languages\n* Interests\n* Causes\n* More Profiles for You\n* People You May Know\n* You Might Like\n"
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "e4a15703-19bc-40ac-9d6d-bf8c6fc382b8",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-4640,
10688
],
"parameters": {
"width": 1936,
"height": 752,
"content": "## LinkedIn Post Finder \n** Goes through a linkedin profile and finds their recent posts**"
},
"typeVersion": 1
},
{
"id": "e759fb9d-c5bd-4073-95eb-2e35d448f1d8",
"name": "Anthropic Chat Model3",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
1104,
10592
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "Claude Haiku 3.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1.3
},
{
"id": "115687ea-9a3a-405d-b2d8-437dd6f0785a",
"name": "UIAutomator Dump4",
"type": "n8n-nodes-base.httpRequest",
"position": [
208,
10368
],
"parameters": {
"url": "http://adb-api:8000/uiautomator_dump",
"method": "POST",
"options": {},
"jsonBody": "{}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "9c1bda34-bd34-4982-a6d9-f3751eca4c52",
"name": "Pull UI4",
"type": "n8n-nodes-base.httpRequest",
"position": [
432,
10368
],
"parameters": {
"url": "http://adb-api:8000/pull_ui",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "1e6b62c8-5e8e-4b14-829e-0152c506d3ae",
"name": "Cat UI4",
"type": "n8n-nodes-base.httpRequest",
"position": [
656,
10368
],
"parameters": {
"url": "http://adb-api:8000/cat_file",
"method": "POST",
"options": {},
"jsonBody": "{\n \"filename\":\"latestui.xml\"\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "1c72f606-e149-42b6-9540-ea77d1b9c4f1",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
10304
],
"parameters": {
"color": 3,
"width": 1744,
"height": 672,
"content": "## LinkedIn Single Post Scrapper"
},
"typeVersion": 1
},
{
"id": "7ab604e0-89d2-4f17-ac3a-ae8d4e6146c5",
"name": "text_extractor",
"type": "n8n-nodes-base.code",
"position": [
880,
10368
],
"parameters": {
"jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\n\nconst dump = $input.first().json.uidump.shallow_parse\n\nconst textViewNodes = dump.filter(node => node.class === \"android.widget.TextView\");\n\n// // Return filtered nodes as new items for n8n\n// return textViewNodes.map(node => ({ json: node }));\n\nreturn {\"text_content\":{textViewNodes}}"
},
"typeVersion": 2
},
{
"id": "f633c605-8562-4b0c-8c16-5bba28e772cc",
"name": "Postgres Chat Memory3",
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"position": [
1232,
10592
],
"parameters": {
"sessionKey": "{{ $('crypto').item.json.conversationID }}",
"sessionIdType": "customKey"
},
"credentials": {
"postgres": {
"id": "aiA2Xdr2KBHEFVKK",
"name": "Postgres account"
}
},
"typeVersion": 1.3
},
{
"id": "a1e68b85-d46e-46e1-8930-e03bdd509d01",
"name": "Anthropic Chat Model4",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
2160,
11072
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "Claude Haiku 3.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1.3
},
{
"id": "31661c20-d324-465e-8498-1f463674c651",
"name": "linkedin_post_finder3",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2176,
10704
],
"parameters": {
"text": "=Here's the post text: \n{{ $('linked_post_json').item.json.output }}\n\n\n\nHere's a summary of it:\n{{ $json.content[0].text }}",
"options": {
"systemMessage": "=You are an assistant helping a user write thoughtful LinkedIn comments that feel organic, natural, and human, while helping build professional connections.\n\nYou will receive:\n\nThe text of a LinkedIn post (and optionally, details about the author or company).\n\nYour task is to craft one comment under 250 characters that is engaging, insightful, and human-sounding.\n\n🎯 Goal\n\nShow understanding, curiosity, or appreciation for the post.\n\nIf the post shares a resource (article, video, or guide), acknowledge its value naturally.\n\nAvoid generic praise (“Great post!”) or robotic phrasing.\n\nDo not use emojis or special symbols.\n\nImportant: Count all characters, including spaces and punctuation, and do not exceed 250 characters. The comment should read naturally as if typed by a real person.\n\n🧭 Available Comment Categories\n\nChoose one that best fits the post:\n\nInsightful Reflection – Add a short observation or personal insight.\n\nAppreciative Acknowledgment – Recognize the effort or value behind the post.\n\nCurious Connector – Ask a brief, thoughtful question to invite discussion.\n\nHuman & Empathetic – Respond warmly to personal or reflective posts.\n\nAligned Perspective – Express shared values or alignment naturally.\n\n🧠 Instructions\n\nAnalyze the post’s tone and content.\n\nPick the most suitable category.
If it is a post highlighting a personal or professional achievement, the comment should congratulate them. It doesn’t necessarily have to have anything additional. \n\nWrite one concise, human-sounding comment under 250 characters.\n\nKeep it organic, natural, and conversational.\n\nAvoid over-formal, stiff, or robotic phrasing.\n\nEnsure it encourages connection or discussion.\n\nDo not include emojis.\n\nTruncate or rephrase ideas if needed to stay under 250 characters while preserving meaning.\n\n📝 Input Example\n\nPost:\n\"Excited to share our team’s latest report on AI trends in enterprise adoption. It took months of collaboration, and I’m proud of the insights we uncovered.\"\n
\n✅ Output Example (≤250 chars, human & organic, no emojis)\n\n(Chosen category: Appreciative Acknowledgment)\n“Love seeing your team’s work on this! The insights are clear and practical — appreciate all the effort that went into putting it together.”"
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "9e04691f-9185-4aaa-8714-dd1d1a8e6139",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
160,
11056
],
"parameters": {
"color": 7,
"width": 880,
"height": 672,
"content": "## LinkedIn Post Commenter\n\n**Pending System PRompt"
},
"typeVersion": 1
},
{
"id": "aa23fd39-a217-46b2-aeb3-0237a596fb00",
"name": "Anthropic Chat Model8",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-2256,
11152
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "Claude Haiku 3.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1.3
},
{
"id": "b3191308-a639-4d81-bd50-b1c0a939e5c3",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2512,
10688
],
"parameters": {
"color": 3,
"width": 528,
"height": 752,
"content": "## ADB CONTROLLER COMMAND CENTER"
},
"typeVersion": 1
},
{
"id": "8ddb3f01-8a0d-4401-87fe-0f7b51fa3384",
"name": "control_panel",
"type": "n8n-nodes-base.switch",
"position": [
-1760,
10976
],
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "04a57c9b-88e3-4a87-a6f1-b82a556adb96",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.action }}",
"rightValue": "tap"
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "77b8499a-afb2-4e00-a8e3-9217e24cae50",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.action }}",
"rightValue": "scroll"
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "f80eb9f8-ca33-4eb1-8397-bb7e7d31474d",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.action }}",
"rightValue": "screenshot"
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2337a134-98e1-4443-b5c9-fafb008f673f",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.action }}",
"rightValue": "rest_now"
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b475f5bb-d0da-4662-a5a1-3e8d83a8daed",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.action }}",
"rightValue": "undefined"
}
]
}
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "eece90cf-7b74-4c80-8e50-f1751e86e986",
"name": "Analyze image",
"type": "@n8n/n8n-nodes-langchain.anthropic",
"position": [
-1312,
11312
],
"parameters": {
"text": "=You are an AI assistant that analyzes screenshots of mobile apps to provide actionable UI information to another agent.\n\nInput:\n\nA screenshot of a mobile app.\n\n\nTask:\n\nAnalyze the screenshot in the context that you are trying to get to the latest LinkedIn post on a profile. Your goal is to produce a detailed, structured description of all visible UI elements that the requesting agent can use to take the next action. Focus especially on elements relevant to the context\n\nHelp the requesting agent understand the following things:
Is the users latest post visible on screen right now?
If the latest post isn’t visible, Do you suggest scrolling up or scrolling down to see the latest post?\nIf the post is visible, where do you suggest the request agent should tap?
",
"modelId": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "claude-3-5-haiku-20241022"
},
"options": {
"maxTokens": 300
},
"resource": "image",
"inputType": "binary",
"binaryPropertyName": "=data"
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1
},
{
"id": "dd0856ae-e641-4c56-8570-784b6fc0a8db",
"name": "screengrab",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1536,
11312
],
"parameters": {
"url": "http://adb-api:8000/screenshot_base64",
"method": "POST",
"options": {},
"jsonBody": "{\n \"binary\":true\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "2250b2c1-606a-4f87-8225-736abc0d74bb",
"name": "controller",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-2288,
10928
],
"parameters": {
"text": "=Here's the action and reasoning: \n{{$('linkedin_post_finder').item.json.output.toJsonString()}}\n\nHere's the UI Dump: \n{{ $('ui_shallow_parse').item.json.uidump.toJsonString() }}\n\nMake sure to take the following message/error/guidline into account:\n\n{{ $json.message }}\n\nUse chat context to ensure that you don't repeat the same errors in the output.\n\n\nMAKE SURE THAT THE OUTPUT IS JSON WITH NO ADDITIONAL TEXT OUTSIDE THE JSON FORMAT",
"options": {
"systemMessage": "You are an assistant that converts high-level UI actions into JSON commands. Always output ONLY a single valid JSON object — no text, no markdown, no extra commentary. Output format: { \"action\": \"tap\" | \"scroll\" | \"screenshot\" | \"rest_now\", \"parameters\": { \"x\": number, \"y\": number, \"x1\": number, \"y1\": number, \"x2\": number, \"y2\": number }, \"comment\": \"Optional explanation inside this field only\" } Rules: - Every opening { or [ must have a matching closing } or ]. - No trailing commas anywhere. - If you can’t infer coordinates, output: { \"action\": \"screenshot\", \"parameters\": {}, \"comment\": \"Not enough data\" }"
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "c1f3eb5d-2161-481b-8dbc-d32856969b76",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
-560,
11488
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "bc8f2173-a88b-452e-82bb-03b7a003d997",
"name": "Postgres Chat Memory1",
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"position": [
-3024,
11216
],
"parameters": {
"tableName": "n8n_linkedin_post_finder",
"sessionKey": "={{$('crypto').item.json.conversationID}}",
"sessionIdType": "customKey"
},
"credentials": {
"postgres": {
"id": "aiA2Xdr2KBHEFVKK",
"name": "Postgres account"
}
},
"typeVersion": 1.3
},
{
"id": "b72cbcae-fe6a-436e-99dc-0f9b275ec176",
"name": "crypto",
"type": "n8n-nodes-base.crypto",
"position": [
-4256,
10992
],
"parameters": {
"value": "={{$now.toString()}}",
"dataPropertyName": "conversationID"
},
"typeVersion": 1
},
{
"id": "b53254ca-f47a-48d7-b268-cc1ccd6a508f",
"name": "control_parser",
"type": "n8n-nodes-base.code",
"onError": "continueErrorOutput",
"position": [
-2000,
10928
],
"parameters": {
"jsCode": "try {\n const raw = $input.all()[0].json.output || ''; // your model's response text\n const cleaned = raw.trim();\n\n // Optionally strip markdown fences if model adds them\n const jsonText = cleaned.replace(/^```(?:json)?|```$/g, '').trim();\n\n const parsed = JSON.parse(jsonText);\n\n return [{ json: parsed }];\n} catch{\n return {\n \"message\":\"There was an error\"\n }\n}"
},
"retryOnFail": true,
"typeVersion": 2
},
{
"id": "225de9bc-5bcb-451d-8e8b-fd5dc5f1f170",
"name": "linked_post_scrapper",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1104,
10368
],
"parameters": {
"text": "={{ $('text_extractor').item.json.toJsonString() }}",
"options": {
"systemMessage": "=You are an assistant to a LinkedIn consultant.\n\nYour task is to compile the **exact visible text** of a LinkedIn post from multiple UI dumps.\n\n---\n\n### Process\n\n- You will receive one or more UI dumps showing parts of a LinkedIn post.\n- Your job is to **collect and concatenate** all visible text from these dumps **exactly as it appears**.\n- Do **not** summarize, paraphrase, translate, infer meaning, or correct grammar.\n- Do **not** add or remove punctuation.\n- Preserve **line breaks and spacing** between sections.\n\n---\n\n### Rules\n\n1. Only capture **visible post text**, including:\n - The poster’s name and title\n - The post content (body text)\n - Any hashtags or mentions\n - Any text in attached images if visible\n2. Ignore likes, reactions, comment counts, buttons, or unrelated UI text.\n3. If a UI dump repeats previous content, **do not duplicate** it.\n4. You are **not performing actions** (no taps, scrolls, or clicks) — only reading.\n5. Keep a cumulative record of all unique text segments across dumps.\n\n---\n\n### Completion Criteria\n\nOnce you believe you’ve seen the **entire post (top to bottom)**, respond in this exact format:\n\nyep, I've fully seen the post.\nHere’s the post text:\nName of the poster: <exact name from UI>\nAny additional info (title, company, etc. if visible):\n<verbatim full post text here, exactly as seen>\n\nyaml\nCopy code\n\n---\n\n### Output Format Rules\n\n- Your final output must be **plain text**, not JSON.\n- Do **not** add inferred structure (no arrays, objects, or summaries).\n- Do **not** generate extra analysis, summaries, or lists of commenters.\n- The only acceptable text before the post content is:\n `yep, I've fully seen the post.`"
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "d8dc21ea-1d0f-4a59-a621-b759b2061675",
"name": "linked_post_json",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
1440,
10304
],
"parameters": {
"text": "={{ $json.output }}",
"options": {
"systemMessage": "=You’ll get a response from a user with either an action to keep reading the post or to stop if they’ve read the post. Your job is to change that response into a JSON format and output that. Strictly keep it json. No bad characters, no empty spaces that could break json. Strict flat json. \n\n\nYour output can be:
\n{\nstatus: yep, I've fully seen the post,\nposttext: the text of the post,\nName: name of the poster,\nComments: any additional info\n}\n\n\nOr \n\n{\nstatus: Help me continue reading the post,\nposttext: can’t give content yet, keep reading,\nComments: any additional comments\n}\n\nResponse Guidelines\n\nEnsure that the response is valid JSON. No markup. No tags.
Ensure that there are no Bad control character in string literal in JSON\nEnsure that there are no white spaces that could break the JSON\n\nResponse Format (JSON)\n{\n \"status\": \"<'Okay, I'm ready for the next UI dump.' or 'yep, I've fully seen the post.’\n “Posttext”:text of the post
“name”: Name of the poster,
“additional”: additional information about the poster\n}\n\nIn the SUMMARY ensure to include the entire text of the post\n\n\n"
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "d01ebaa8-400e-4fe5-a99a-eb03f16380ec",
"name": "Anthropic Chat Model11",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
1648,
10720
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "Claude Haiku 3.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1.3
},
{
"id": "436744cd-dda3-49ed-bb29-4cb6a9246939",
"name": "error_help",
"type": "n8n-nodes-base.code",
"position": [
-2496,
10928
],
"parameters": {
"jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nif($input.first().json.error){\nreturn {\n \"message\":$input.first().json.error\n}\n}else {\n return {\n \"message\":\"Make sure that the output is valid json\"\n }\n}"
},
"typeVersion": 2
},
{
"id": "5e6bb083-aa5f-4522-a7af-a05c5f3b044d",
"name": "Postgres Chat Memory4",
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"position": [
-2192,
11280
],
"parameters": {
"sessionKey": "={{ $('crypto').item.json.conversationID }}",
"sessionIdType": "customKey"
},
"credentials": {
"postgres": {
"id": "aiA2Xdr2KBHEFVKK",
"name": "Postgres account"
}
},
"typeVersion": 1.3
},
{
"id": "978a5bdb-52b5-4f5e-a5bb-e4b5c9a06dcf",
"name": "Analyze image2",
"type": "@n8n/n8n-nodes-langchain.anthropic",
"position": [
2016,
10336
],
"parameters": {
"text": "=You are an agent that helps blind people read linkedin posts. You are given a screenshot of a linkedin post. Summarize the contents of it so that the blind person's screenreader can read it for her. ",
"modelId": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "claude-3-5-haiku-20241022"
},
"options": {
"maxTokens": 300
},
"resource": "image",
"inputType": "binary",
"binaryPropertyName": "=data"
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1
},
{
"id": "d3da940b-0428-465b-8009-2e9523453948",
"name": "screengrab2",
"type": "n8n-nodes-base.httpRequest",
"position": [
1808,
10288
],
"parameters": {
"url": "http://adb-api:8000/screenshot_base64",
"method": "POST",
"options": {},
"jsonBody": "{\n \"binary\":true\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "e426711d-b7a4-4269-bee2-a28ff28cfff7",
"name": "UIAutomator Dump5",
"type": "n8n-nodes-base.httpRequest",
"position": [
-240,
10640
],
"parameters": {
"url": "http://adb-api:8000/uiautomator_dump",
"method": "POST",
"options": {},
"jsonBody": "{}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "d5ef263e-6ba4-41b4-a565-c20eb4990687",
"name": "linkedin_post_finder6",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2544,
10640
],
"parameters": {
"text": "={{ $json.output.toJsonString() }}",
"options": {
"systemMessage": "=You will receive a JSON input like this:\n\n[\n {\n \"output\": \"Based on the post's content and tone, I'll craft a comment using the \\\"Curious Connector\\\" category...\\n\\nComment:\\n\\\"Fascinating perspective on the EA acquisition...\\\"\\n\\nRationale:\\n- ...\"\n }\n]\n\n\nYour task:\n\nExtract only the comment text that appears after the word \"Comment:\" and within the quotation marks.\n\nReturn it in the following JSON format (no extra text, no explanations):\n\n{\"comment\": \"Fascinating perspective on the EA acquisition...\"}\n\n\nIf no comment is found, return:\n\n{\"comment\": \"\"}"
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "29838d73-4928-4c66-9a0a-efa8786551fc",
"name": "Anthropic Chat Model12",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
2640,
11040
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "Claude Haiku 3.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1.3
},
{
"id": "164fc04a-083e-456c-84a4-2ecec23e50be",
"name": "Code in JavaScript",
"type": "n8n-nodes-base.code",
"position": [
2896,
10672
],
"parameters": {
"jsCode": "return JSON.parse($input.all()[0].json.output);"
},
"typeVersion": 2
},
{
"id": "79e44c14-acee-493b-8901-3119fc281228",
"name": "tap_comment_box",
"type": "n8n-nodes-base.httpRequest",
"position": [
3184,
10672
],
"parameters": {
"url": "http://adb-api:8000/tap",
"method": "POST",
"options": {},
"jsonBody": "={\n\"x\":500,\n\"y\":2100\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "d02025e6-a22f-4625-969b-e1994290be58",
"name": "Wait2",
"type": "n8n-nodes-base.wait",
"position": [
3696,
10672
],
"webhookId": "f1da91c6-0808-4d56-9d2c-2be603ad17e5",
"parameters": {},
"typeVersion": 1.1
},
{
"id": "f737ec76-9b4e-48d6-85d7-5e09e55e94ce",
"name": "tap_comment",
"type": "n8n-nodes-base.httpRequest",
"position": [
4080,
10640
],
"parameters": {
"url": "http://adb-api:8000/tap",
"method": "POST",
"options": {},
"jsonBody": "={\n\"x\":500,\n\"y\":2100\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "7e86c1fd-04ca-4ee1-9bcd-b621879ebdc4",
"name": "Anthropic Chat Model13",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
6048,
11104
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "Claude Haiku 3.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1.3
},
{
"id": "e7343443-afbe-430f-8e95-973addb1b014",
"name": "tap1",
"type": "n8n-nodes-base.httpRequest",
"position": [
7696,
10848
],
"parameters": {
"url": "http://adb-api:8000/tap",
"method": "POST",
"options": {},
"jsonBody": "=\n{\n\"x\": \n905,\n\"y\": \n1296}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "93e69ed4-c350-4034-8bd4-4fbb321fc311",
"name": "ui_deep_parse6",
"type": "n8n-nodes-base.set",
"position": [
5776,
10880
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "afc98835-8ae6-467a-9d2f-b07228245994",
"name": "uidump.deep_parse",
"type": "array",
"value": "={{ $json.uidump.deep_parse }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "adee4329-3535-4199-8045-c84eebeabbb0",
"name": "UIAutomator Dump9",
"type": "n8n-nodes-base.httpRequest",
"position": [
5152,
10880
],
"parameters": {
"url": "http://adb-api:8000/uiautomator_dump",
"method": "POST",
"options": {},
"jsonBody": "{}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "2c961794-20ed-4856-a22f-328fefa6db71",
"name": "Pull UI5",
"type": "n8n-nodes-base.httpRequest",
"position": [
5360,
10880
],
"parameters": {
"url": "http://adb-api:8000/pull_ui",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "f779f3f1-82fb-45b5-83e5-3291a52ae48d",
"name": "Cat UI5",
"type": "n8n-nodes-base.httpRequest",
"position": [
5584,
10880
],
"parameters": {
"url": "http://adb-api:8000/cat_file",
"method": "POST",
"options": {},
"jsonBody": "{\n \"filename\":\"latestui.xml\"\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "a4fdd2f2-a348-4c7b-92e5-b6e4768ff73c",
"name": "linkedin_post_finder1",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
6032,
10880
],
"parameters": {
"text": "={{ $('ui_deep_parse6').item.json.uidump.deep_parse.toJsonString() }}\n\n{{ $json.UIscreenshot_analysis }}\n",
"options": {
"systemMessage": "Given a UI dump and sometimes even a screenshot. Your job is to identify where the \"Comment\" button is on the screen and tap it so that a comment is made. "
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "7726be44-660b-4f47-8fc7-f23d1ee64205",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
4528,
10576
],
"parameters": {
"width": 1936,
"height": 752,
"content": "## LinkedIn comment button clicker\n** Goes through a linkedin profile and finds their recent posts**"
},
"typeVersion": 1
},
{
"id": "28256013-2f18-441e-8227-7e95f8e73cf0",
"name": "Anthropic Chat Model14",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
6912,
11040
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "Claude Haiku 3.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1.3
},
{
"id": "dc97d4c8-d1e3-4f75-a01a-46b02d207fe6",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
6656,
10576
],
"parameters": {
"color": 3,
"width": 528,
"height": 752,
"content": "## ADB CONTROLLER COMMAND CENTER"
},
"typeVersion": 1
},
{
"id": "cb75a42f-d231-4417-86f3-7a1ccbf6e521",
"name": "control_panel2",
"type": "n8n-nodes-base.switch",
"position": [
7408,
10864
],
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "04a57c9b-88e3-4a87-a6f1-b82a556adb96",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.action }}",
"rightValue": "tap"
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "f80eb9f8-ca33-4eb1-8397-bb7e7d31474d",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.action }}",
"rightValue": "screenshot"
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2337a134-98e1-4443-b5c9-fafb008f673f",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.action }}",
"rightValue": "rest_now"
}
]
}
},
{
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b475f5bb-d0da-4662-a5a1-3e8d83a8daed",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.action }}",
"rightValue": "undefined"
}
]
}
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "8a5ce01b-92b9-41d8-a700-93b7681c615e",
"name": "Analyze image3",
"type": "@n8n/n8n-nodes-langchain.anthropic",
"position": [
7856,
11200
],
"parameters": {
"text": "=You are an AI assistant that analyzes screenshots of mobile apps to provide actionable UI information to another agent.\n\nInput:\n\nA screenshot of a mobile app.\n\n\nTask:\n\nAnalyze the screenshot in the context that you are trying to get to the latest LinkedIn post on a profile. Your goal is to produce a detailed, structured description of all visible UI elements that the requesting agent can use to take the next action. Focus especially on elements relevant to the context\n\n",
"modelId": {
"__rl": true,
"mode": "list",
"value": "claude-3-5-haiku-20241022",
"cachedResultName": "claude-3-5-haiku-20241022"
},
"options": {
"maxTokens": 300
},
"resource": "image",
"inputType": "binary",
"binaryPropertyName": "=data"
},
"credentials": {
"anthropicApi": {
"id": "2NtYzRM4PMhpSUE1",
"name": "Anthropic account"
}
},
"typeVersion": 1
},
{
"id": "adf6859a-400b-4949-84e5-466ed16c6887",
"name": "screengrab3",
"type": "n8n-nodes-base.httpRequest",
"position": [
7632,
11200
],
"parameters": {
"url": "http://adb-api:8000/screenshot_base64",
"method": "POST",
"options": {},
"jsonBody": "{\n \"binary\":true\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "dc211ba1-59ec-4260-8ab4-ef5bfd5de724",
"name": "controller2",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
6880,
10816
],
"parameters": {
"text": "=Here's the action and reasoning: \n{{$('linkedin_post_finder1').item.json.output.toJsonString()}}\n\nHere's the UI Dump: \n{{ $('ui_deep_parse6').item.json.uidump.toJsonString() }}\n\nMake sure to take the following message/error/guidline into account:\n\n{{ $json.message }}\n\nUse chat context to ensure that you don't repeat the same errors in the output.\n\n\nMAKE SURE THAT THE OUTPUT IS JSON WITH NO ADDITIONAL TEXT OUTSIDE THE JSON FORMAT",
"options": {
"systemMessage": "You are an assistant that converts high-level UI actions into JSON commands.\n\nAlways output ONLY a single valid JSON object — no text, no markdown, no extra commentary.\n\nOutput format:\n{\n \"action\": \"tap\" | \"screenshot\" | \"rest_now\",\n \"parameters\": {\n \"x\": number,\n \"y\": number,\n },\n \"comment\": \"Optional explanation inside this field only\"\n}\n\nRules:\n- Every opening { or [ must have a matching closing } or ].\n- No trailing commas anywhere.\n- If you can’t infer coordinates, output:\n { \"action\": \"screenshot\", \"parameters\": {}, \"comment\": \"Not enough data\" }\n"
},
"promptType": "define"
},
"typeVersion": 2.2
},
{
"id": "16fb374a-72b2-4e0b-962e-36d7a0ec5421",
"name": "Postgres Chat Memory8",
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"position": [
6144,
11104
],
"parameters": {
"tableName": "n8n_linkedin_post_finder",
"sessionKey": "={{ $('crypto').item.json.conversationID }}",
"sessionIdType": "customKey"
},
"credentials": {
"postgres": {
"id": "aiA2Xdr2KBHEFVKK",
"name": "Postgres account"
}
},
"typeVersion": 1.3
},
{
"id": "90c5f02f-ac2b-457c-8f16-1e56be419cbf",
"name": "control_parser2",
"type": "n8n-nodes-base.code",
"onError": "continueErrorOutput",
"position": [
7168,
10816
],
"parameters": {
"jsCode": "try {\n const raw = $input.all()[0].json.output || ''; // your model's response text\n const cleaned = raw.trim();\n\n // Optionally strip markdown fences if model adds them\n const jsonText = cleaned.replace(/^```(?:json)?|```$/g, '').trim();\n\n const parsed = JSON.parse(jsonText);\n\n return [{ json: parsed }];\n} catch{\n return {\n \"message\":\"There was an error\"\n }\n}"
},
"retryOnFail": true,
"typeVersion": 2
},
{
"id": "14a03073-de82-4d3b-8c75-73b240490ce7",
"name": "screenshot_analysis1",
"type": "n8n-nodes-base.code",
"position": [
5904,
10720
],
"parameters": {
"jsCode": "if($runIndex>0){\n return {UIscreenshot_analysis:\"\"}\n} else {\n return {UIscreenshot_analysis:\"Let's use the UI dump first\"}\n}"
},
"typeVersion": 2
},
{
"id": "050986ba-0bcb-414c-a3df-3a8eceea585f",
"name": "error_help1",
"type": "n8n-nodes-base.code",
"position": [
6672,
10816
],
"parameters": {
"jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nif($input.first().json.error){\nreturn {\n \"message\":$input.first().json.error\n}\n}else {\n return {\n \"message\":\"Make sure that the output is valid json\"\n }\n}"
},
"typeVersion": 2
},
{
"id": "f19c0d85-6700-427e-9931-1df940c7422d",
"name": "Postgres Chat Memory9",
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"position": [
6976,
11168
],
"parameters": {
"sessionKey": "={{ $('crypto').item.json.conversationID }}",
"sessionIdType": "customKey"
},
"credentials": {
"postgres": {
"id": "aiA2Xdr2KBHEFVKK",
"name": "Postgres account"
}
},
"typeVersion": 1.3
},
{
"id": "3bdd8dcb-54b8-4067-88e4-d702af4f832b",
"name": "When clicking ‘Execute workflow’",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-4464,
11008
],
"parameters": {},
"typeVersion": 1
},
{
"id": "17170e80-1419-4686-a459-d7c8bbe6f6e6",
"name": "screenshot_analysis",
"type": "n8n-nodes-base.code",
"position": [
-3312,
11136
],
"parameters": {
"jsCode": "if($runIndex>0){\n return {UIscreenshot_analysis:\"\"}\n} else {\n return {UIscreenshot_analysis:\"Let's use the UI dump first\"}\n}"
},
"typeVersion": 2
},
{
"id": "b7de9efc-7f27-4495-9c80-569a45f22016",
"name": "ui_shallow_parse",
"type": "n8n-nodes-base.set",
"position": [
-3424,
10880
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "afc98835-8ae6-467a-9d2f-b07228245994",
"name": "uidump.shallow_parse",
"type": "array",
"value": "={{ $json.uidump.shallow_parse }}"
}
]
}
},
"typeVersion": 3.4
}
],
"pinData": {
"control_parser2": [
{
"action": "tap",
"comment": "Post the comment on Areeba Sohail's post about professional recognition",
"parameters": {
"x": 905,
"y": 1296,
"x1": 772,
"x2": 1038,
"y1": 1233,
"y2": 1359
}
}
]
},
"connections": {
"tap": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Type": {
"main": [
[
{
"node": "Wait2",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "UIAutomator Dump2",
"type": "main",
"index": 0
}
]
]
},
"Wait2": {
"main": [
[
{
"node": "tap_comment",
"type": "main",
"index": 0
}
]
]
},
"swipe": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"crypto": {
"main": [
[
{
"node": "UIAutomator Dump2",
"type": "main",
"index": 0
}
]
]
},
"Cat UI2": {
"main": [
[
{
"node": "ui_shallow_parse",
"type": "main",
"index": 0
}
]
]
},
"Cat UI4": {
"main": [
[
{
"node": "text_extractor",
"type": "main",
"index": 0
}
]
]
},
"Cat UI5": {
"main": [
[
{
"node": "ui_deep_parse6",
"type": "main",
"index": 0
}
]
]
},
"Pull UI2": {
"main": [
[
{
"node": "Cat UI2",
"type": "main",
"index": 0
}
]
]
},
"Pull UI4": {
"main": [
[
{
"node": "Cat UI4",
"type": "main",
"index": 0
}
]
]
},
"Pull UI5": {
"main": [
[
{
"node": "Cat UI5",
"type": "main",
"index": 0
}
]
]
},
"controller": {
"main": [
[
{
"node": "control_parser",
"type": "main",
"index": 0
}
]
]
},
"error_help": {
"main": [
[
{
"node": "controller",
"type": "main",
"index": 0
}
]
]
},
"screengrab": {
"main": [
[
{
"node": "Analyze image",
"type": "main",
"index": 0
}
]
]
},
"controller2": {
"main": [
[
{
"node": "control_parser2",
"type": "main",
"index": 0
}
]
]
},
"error_help1": {
"main": [
[
{
"node": "controller2",
"type": "main",
"index": 0
}
]
]
},
"screengrab2": {
"main": [
[
{
"node": "Analyze image2",
"type": "main",
"index": 0
}
]
]
},
"screengrab3": {
"main": [
[
{
"node": "Analyze image3",
"type": "main",
"index": 0
}
]
]
},
"tap_comment": {
"main": [
[
{
"node": "UIAutomator Dump9",
"type": "main",
"index": 0
}
]
]
},
"Analyze image": {
"main": [
[
{
"node": "screenshot_analysis",
"type": "main",
"index": 0
}
]
]
},
"control_panel": {
"main": [
[
{
"node": "tap",
"type": "main",
"index": 0
}
],
[
{
"node": "swipe",
"type": "main",
"index": 0
}
],
[
{
"node": "screengrab",
"type": "main",
"index": 0
}
],
[
{
"node": "UIAutomator Dump5",
"type": "main",
"index": 0
}
],
[
{
"node": "screengrab",
"type": "main",
"index": 0
}
]
]
},
"Analyze image2": {
"main": [
[
{
"node": "linkedin_post_finder3",
"type": "main",
"index": 0
}
]
]
},
"Analyze image3": {
"main": [
[
{
"node": "screenshot_analysis1",
"type": "main",
"index": 0
}
]
]
},
"control_panel2": {
"main": [
[
{
"node": "tap1",
"type": "main",
"index": 0
}
],
[
{
"node": "screengrab3",
"type": "main",
"index": 0
}
],
[],
[
{
"node": "screengrab3",
"type": "main",
"index": 0
}
]
]
},
"control_parser": {
"main": [
[
{
"node": "control_panel",
"type": "main",
"index": 0
}
],
[
{
"node": "error_help",
"type": "main",
"index": 0
}
]
]
},
"text_extractor": {
"main": [
[
{
"node": "linked_post_scrapper",
"type": "main",
"index": 0
}
]
]
},
"ui_deep_parse6": {
"main": [
[
{
"node": "screenshot_analysis1",
"type": "main",
"index": 0
}
]
]
},
"control_parser2": {
"main": [
[
{
"node": "control_panel2",
"type": "main",
"index": 0
}
],
[
{
"node": "error_help1",
"type": "main",
"index": 0
}
]
]
},
"tap_comment_box": {
"main": [
[
{
"node": "Type",
"type": "main",
"index": 0
}
]
]
},
"linked_post_json": {
"main": [
[
{
"node": "screengrab2",
"type": "main",
"index": 0
}
]
]
},
"ui_shallow_parse": {
"main": [
[
{
"node": "screenshot_analysis",
"type": "main",
"index": 0
}
]
]
},
"UIAutomator Dump2": {
"main": [
[
{
"node": "Pull UI2",
"type": "main",
"index": 0
}
]
]
},
"UIAutomator Dump4": {
"main": [
[
{
"node": "Pull UI4",
"type": "main",
"index": 0
}
]
]
},
"UIAutomator Dump5": {
"main": [
[
{
"node": "UIAutomator Dump4",
"type": "main",
"index": 0
}
]
]
},
"UIAutomator Dump9": {
"main": [
[
{
"node": "Pull UI5",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "tap_comment_box",
"type": "main",
"index": 0
}
]
]
},
"screenshot_analysis": {
"main": [
[
{
"node": "linkedin_post_finder",
"type": "main",
"index": 0
}
]
]
},
"linked_post_scrapper": {
"main": [
[
{
"node": "linked_post_json",
"type": "main",
"index": 0
}
]
]
},
"linkedin_post_finder": {
"main": [
[
{
"node": "error_help",
"type": "main",
"index": 0
}
]
]
},
"screenshot_analysis1": {
"main": [
[
{
"node": "linkedin_post_finder1",
"type": "main",
"index": 0
}
]
]
},
"Anthropic Chat Model1": {
"ai_languageModel": [
[
{
"node": "linkedin_post_finder",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Chat Model3": {
"ai_languageModel": [
[
{
"node": "linked_post_scrapper",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Chat Model4": {
"ai_languageModel": [
[
{
"node": "linkedin_post_finder3",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Chat Model8": {
"ai_languageModel": [
[
{
"node": "controller",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Postgres Chat Memory1": {
"ai_memory": [
[
{
"node": "linkedin_post_finder",
"type": "ai_memory",
"index": 0
}
]
]
},
"Postgres Chat Memory3": {
"ai_memory": [
[
{
"node": "linked_post_scrapper",
"type": "ai_memory",
"index": 0
}
]
]
},
"Postgres Chat Memory4": {
"ai_memory": [
[
{
"node": "controller",
"type": "ai_memory",
"index": 0
}
]
]
},
"Postgres Chat Memory8": {
"ai_memory": [
[
{
"node": "linkedin_post_finder1",
"type": "ai_memory",
"index": 0
}
]
]
},
"Postgres Chat Memory9": {
"ai_memory": [
[
{
"node": "controller2",
"type": "ai_memory",
"index": 0
}
]
]
},
"linkedin_post_finder1": {
"main": [
[
{
"node": "error_help1",
"type": "main",
"index": 0
}
]
]
},
"linkedin_post_finder3": {
"main": [
[
{
"node": "linkedin_post_finder6",
"type": "main",
"index": 0
}
]
]
},
"linkedin_post_finder6": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Anthropic Chat Model11": {
"ai_languageModel": [
[
{
"node": "linked_post_json",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Chat Model12": {
"ai_languageModel": [
[
{
"node": "linkedin_post_finder6",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Chat Model13": {
"ai_languageModel": [
[
{
"node": "linkedin_post_finder1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Chat Model14": {
"ai_languageModel": [
[
{
"node": "controller2",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"When clicking ‘Execute workflow’": {
"main": [
[
{
"node": "crypto",
"type": "main",
"index": 0
}
]
]
}
}
}