{"workflow":{"id":14065,"name":"Generate job descriptions from briefing notes with OpenAI and Google Docs","views":4,"recentViews":0,"totalViews":4,"createdAt":"2026-03-15T14:16:16.852Z","description":"# Auto-generate job descriptions from briefing notes with OpenAI and Google Docs\n\n## Who is this for\n\nRecruiters, HR teams, and hiring managers who conduct role briefing conversations and want to convert their meeting notes into polished, structured job descriptions automatically -- without manual copywriting.\n\n## What this workflow does\n\nThis workflow watches a Google Drive folder for new briefing documents, extracts structured job data using AI, generates a professional HTML job description, sends it to Microsoft Teams for approval, and exports the final version as a PDF to Google Drive.\n\n## How it works\n\n1. **Trigger** -- A Google Drive Trigger detects when a new Google Doc (e.g. a briefing transcript) is created in a watched folder.\n2. **File organization** -- A timestamped subfolder is created and the document is moved into it for clean project structure.\n3. **Document reading** -- The Google Doc content is fetched via the Google Docs API.\n4. **AI data extraction** -- An OpenAI AI Agent analyzes the transcript (supports German input) and extracts structured job data: title, department, responsibilities, skills, benefits, tech stack, and more -- output as JSON.\n5. **Data logging** -- The extracted fields are appended to a Google Sheets tracker for reference and audit.\n6. **Prompt assembly** -- A Code node builds a detailed prompt from the structured data, choosing between \"create\" mode (first draft) or \"revise\" mode (feedback loop).\n7. **JD generation** -- A second AI Agent (JD-Writer) generates a complete, styled HTML job description following a professional template with sections like responsibilities, profile, benefits, and diversity statement.\n8. **Human review** -- The draft is sent to a Microsoft Teams chat with an approve/reject form and an optional feedback field.\n9. **Approval path** -- If approved, the HTML is converted to PDF and uploaded to the Google Drive subfolder alongside the original briefing.\n10. **Revision loop** -- If rejected, the feedback is routed back to the JD-Writer for targeted revisions, and the updated draft is re-sent for approval.\n\n## Setup steps\n\n1. **Google Drive & Docs** -- Create OAuth2 credentials. Set the folder ID in the Google Drive Trigger node to the folder where briefing documents are saved.\n2. **Google Sheets** -- Create a spreadsheet with columns for all job data fields (job_title, department, responsibilities, hard_skills, soft_skills, etc.). Update the Sheet ID in the Google Sheets node.\n3. **OpenAI** -- Add your API key as an OpenAI credential. Used for both the data extraction agent (reads the transcript) and the JD-Writer agent (generates the job description).\n4. **Microsoft Teams** -- Create OAuth2 credentials. Set the Teams chat ID in the approval node to the chat or channel where drafts should be reviewed.\n5. **HTML-to-PDF** -- Install the community node `n8n-nodes-htmlcsstopdf` (self-hosted only). Add the API credential.\n\n## Requirements\n\n- **Community node:** [`n8n-nodes-htmlcsstopdf`](https://www.npmjs.com/package/n8n-nodes-htmlcsstopdf) -- **self-hosted n8n only**\n- OpenAI API key (GPT-4 or newer recommended)\n- Google Drive, Docs & Sheets OAuth2 credentials\n- Microsoft Teams OAuth2 credentials\n\n## How to customize\n\n- **AI extraction prompt** -- Edit the system message in the \"Extract job data from transcript\" node to adjust which fields are extracted or to support different transcript languages.\n- **JD template style** -- Modify the prompt in the \"Build JD-Writer prompt\" Code node to change tone, section order, or formatting style of the generated job description.\n- **Approval channel** -- Change the Teams chat ID to route drafts to a different team or channel.\n- **Output format** -- Swap the HTML-to-PDF node for a different converter, or skip PDF and use the raw HTML output directly.\n- **Tracker columns** -- Add or remove columns in Google Sheets to match your internal job data schema.\n- **Revision depth** -- The approval loop supports unlimited revision cycles. The JD-Writer applies feedback minimally without rewriting from scratch.\n","workflow":{"id":"KkVSte6Jl5Ss0cNR","meta":{"instanceId":"c000a2799023e596f7ce282858563b91e619d5adf24129f1308c87834a19b2c2"},"name":"Auto-generate job descriptions from briefing notes with OpenAI and Google Docs","tags":[],"nodes":[{"id":"5dcfac82-9cca-4401-bc98-986fa571d049","name":"Google Drive Trigger","type":"n8n-nodes-base.googleDriveTrigger","position":[496,368],"parameters":{"event":"fileCreated","options":{"fileType":"application/vnd.google-apps.document"},"pollTimes":{"item":[{"mode":"everyMinute"}]},"triggerOn":"specificFolder","folderToWatch":{"__rl":true,"mode":"list","value":"YOUR_GOOGLE_DRIVE_FOLDER_ID","cachedResultUrl":"https://drive.google.com/drive/folders/YOUR_GOOGLE_DRIVE_FOLDER_ID","cachedResultName":"Your_Folder"}},"typeVersion":1},{"id":"334206ef-b5b5-4258-a5ff-68af37a4212f","name":"Create timestamped subfolder","type":"n8n-nodes-base.googleDrive","position":[720,368],"parameters":{"name":"={{ $json.name }}_{{ $json.createdTime }}","driveId":{"__rl":true,"mode":"list","value":"My Drive"},"options":{},"folderId":{"__rl":true,"mode":"list","value":"YOUR_GOOGLE_DRIVE_FOLDER_ID","cachedResultUrl":"https://drive.google.com/drive/folders/YOUR_GOOGLE_DRIVE_FOLDER_ID","cachedResultName":"Your_Folder"},"resource":"folder"},"typeVersion":3},{"id":"c4468b02-0860-4320-bcc2-5778312368c5","name":"Move briefing doc to subfolder","type":"n8n-nodes-base.googleDrive","position":[944,368],"parameters":{"fileId":{"__rl":true,"mode":"id","value":"={{ $('Google Drive Trigger').item.json.id }}"},"driveId":{"__rl":true,"mode":"list","value":"My Drive"},"folderId":{"__rl":true,"mode":"id","value":"={{ $json.id }}"},"operation":"move"},"typeVersion":3},{"id":"5f15c82a-42d7-4292-92e3-b8378c064717","name":"Read Google Doc content","type":"n8n-nodes-base.googleDocs","position":[1168,368],"parameters":{"operation":"get","documentURL":"={{ $json.id }}"},"typeVersion":2},{"id":"0ba80b55-ae17-4009-ad7c-b5acce3c7e63","name":"Extract job data from transcript","type":"@n8n/n8n-nodes-langchain.agent","position":[1392,368],"parameters":{"text":"=ROLE & OBJECTIVE\nYou are an extraction assistant. Analyze a German transcript between a Hiring Manager and a Recruiter and produce a structured Job Description in professional Business English. Rephrase only what is present in the transcript; do not add new facts.\n\nINPUT\nYou will receive raw German transcript text.\n\nSTRICT RULES\n- Extract ONLY from the transcript. Do not invent information.\n- Do NOT copy examples, instructions, or schema descriptions into any field.\n- Translate to professional Business English and elevate phrasing, but stay faithful to the source facts.\n- If an item is missing or not clearly stated:\n  - Strings => null\n  - Arrays => []\n  - Booleans => null if unclear\n- Responsibilities vs. Requirements:\n  - Responsibilities = action-oriented tasks the role performs.\n  - Requirements = skills/experience needed to qualify.\n- Seniority inference:\n  - Only infer if years of experience or responsibility scope clearly justify it (e.g., ownership of strategy, leadership). Otherwise set null.\n- Tech stack:\n  - Extract exact tool names from the transcript. Correct obvious transcription errors (e.g., \"Uipath\" -> \"UiPath\") only if certain; if unsure, omit.\n- Remote policy:\n  - Set is_remote_friendly = true/false only if clearly stated; else null.\n- Output format:\n  - Return ONLY a single JSON object conforming to the structure below.\n  - No Markdown, no code fences, no comments.\n  - Deduplicate array items. Do not include placeholder text like \"TBD\".\n\nOUTPUT JSON STRUCTURE\n{\n  \"type\": \"object\",\n  \"properties\": {\n    \"meta_data\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"job_title\": {\n          \"type\": \"string\",\n          \"description\": \"The official title of the position.\"\n        },\n        \"job_subtitle\": {\n          \"type\": \"string\",\n          \"description\": \"Any specific focus mentioned, e.g., 'Focus on HR Processes'.\"\n        },\n        \"department\": {\n          \"type\": \"string\",\n          \"description\": \"The department or team name.\"\n        },\n        \"employment_type\": {\n          \"type\": \"string\",\n          \"description\": \"Full-time, Part-time, etc.\"\n        },\n        \"seniority_level\": {\n          \"type\": \"string\",\n          \"description\": \"Inferred level, e.g., 'Professional', 'Senior', 'Lead'.\"\n        }\n      },\n      \"required\": [\"job_title\", \"department\"]\n    },\n    \"location_details\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"locations\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"List of physical cities or office locations mentioned.\"\n        },\n        \"is_remote_friendly\": {\n          \"type\": \"boolean\",\n          \"description\": \"True if home office, remote work, or 'work from anywhere' is mentioned.\"\n        },\n        \"location_policy_text\": {\n          \"type\": \"string\",\n          \"description\": \"A short sentence describing the policy, e.g., 'Remote working across Germany possible'.\"\n        }\n      },\n      \"required\": [\"locations\", \"is_remote_friendly\"]\n    },\n    \"content_core\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"mission_statement\": {\n          \"type\": \"string\",\n          \"description\": \"A compelling 2-3 sentence pitch explaining why this role exists and its impact.\"\n        },\n        \"responsibilities\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"List of 4-6 key tasks. Use active verbs (e.g., 'Develop', 'Manage', 'Implement').\"\n        },\n        \"tech_stack\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"Specific tools, languages, or platforms mentioned (e.g., n8n, UiPath, Python, Workday).\"\n        }\n      },\n      \"required\": [\"mission_statement\", \"responsibilities\"]\n    },\n    \"requirements_profile\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"hard_skills\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"Professional experience and technical skills required.\"\n        },\n        \"soft_skills\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"Personality traits, mindset, or social skills mentioned.\"\n        },\n        \"languages\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"Spoken languages required including proficiency level if mentioned.\"\n        }\n      },\n      \"required\": [\"hard_skills\"]\n    },\n    \"benefits_and_culture\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"benefits_list\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"Perks offered (e.g., holidays, learning budget, mobility).\"\n        },\n        \"culture_statement\": {\n          \"type\": \"string\",\n          \"description\": \"Statements regarding DE&I, company values, or working atmosphere.\"\n        }\n      }\n    },\n    \"contact_info\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"recruiter_name\": {\n          \"type\": \"string\"\n        },\n        \"recruiter_role\": {\n          \"type\": \"string\"\n        },\n        \"call_to_action\": {\n          \"type\": \"string\",\n          \"description\": \"Closing sentence encouraging application.\"\n        }\n      }\n    }\n  },\n  \"required\": [\n    \"meta_data\",\n    \"location_details\",\n    \"content_core\",\n    \"requirements_profile\"\n  ]\n}\n\nTRANSCRIPT\n{{ $json.content }}\n","options":{},"promptType":"define","hasOutputParser":true},"typeVersion":3.1},{"id":"d09466f2-74e4-406e-af64-007f135e822a","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[1472,592],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-5.1","cachedResultName":"gpt-5.1"},"options":{"textFormat":{"textOptions":{"type":"json_schema","schema":"{\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"properties\": {\n    \"meta_data\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"job_title\": {\n          \"type\": [\"string\", \"null\"],\n          \"description\": \"The official title of the position.\"\n        },\n        \"job_subtitle\": {\n          \"type\": [\"string\", \"null\"],\n          \"description\": \"Any specific focus mentioned, e.g., 'Focus on HR Processes'.\"\n        },\n        \"department\": {\n          \"type\": [\"string\", \"null\"],\n          \"description\": \"The department or team name.\"\n        },\n        \"employment_type\": {\n          \"type\": [\"string\", \"null\"],\n          \"description\": \"Full-time, Part-time, etc.\"\n        },\n        \"seniority_level\": {\n          \"type\": [\"string\", \"null\"],\n          \"description\": \"Inferred level, e.g., 'Professional', 'Senior', 'Lead'.\"\n        }\n      },\n      \"required\": [\"job_title\", \"job_subtitle\", \"department\", \"employment_type\", \"seniority_level\"]\n    },\n    \"location_details\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"locations\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"List of physical cities or office locations mentioned.\"\n        },\n        \"is_remote_friendly\": {\n          \"type\": [\"boolean\", \"null\"],\n          \"description\": \"True if home office, remote work, or 'work from anywhere' is mentioned.\"\n        },\n        \"location_policy_text\": {\n          \"type\": [\"string\", \"null\"],\n          \"description\": \"A short sentence describing the policy, e.g., 'Remote working across Germany possible'.\"\n        }\n      },\n      \"required\": [\"locations\", \"is_remote_friendly\", \"location_policy_text\"]\n    },\n    \"content_core\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"mission_statement\": {\n          \"type\": [\"string\", \"null\"],\n          \"description\": \"A compelling 2-3 sentence pitch explaining why this role exists and its impact.\"\n        },\n        \"responsibilities\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"List of 4-6 key tasks. Use active verbs (e.g., 'Develop', 'Manage', 'Implement').\"\n        },\n        \"tech_stack\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"Specific tools, languages, or platforms mentioned (e.g., n8n, UiPath, Python, Workday).\"\n        }\n      },\n      \"required\": [\"mission_statement\", \"responsibilities\", \"tech_stack\"]\n    },\n    \"requirements_profile\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"hard_skills\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"Professional experience and technical skills required.\"\n        },\n        \"soft_skills\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"Personality traits, mindset, or social skills mentioned.\"\n        },\n        \"languages\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"Spoken languages required including proficiency level if mentioned.\"\n        }\n      },\n      \"required\": [\"hard_skills\", \"soft_skills\", \"languages\"]\n    },\n    \"benefits_and_culture\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"benefits_list\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          },\n          \"description\": \"Perks offered (e.g., holidays, learning budget, mobility).\"\n        },\n        \"culture_statement\": {\n          \"type\": [\"string\", \"null\"],\n          \"description\": \"Statements regarding DE&I, company values, or working atmosphere.\"\n        }\n      },\n      \"required\": [\"benefits_list\", \"culture_statement\"]\n    },\n    \"contact_info\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"properties\": {\n        \"recruiter_name\": {\n          \"type\": [\"string\", \"null\"]\n        },\n        \"recruiter_role\": {\n          \"type\": [\"string\", \"null\"]\n        },\n        \"call_to_action\": {\n          \"type\": [\"string\", \"null\"],\n          \"description\": \"Closing sentence encouraging application.\"\n        }\n      },\n      \"required\": [\"recruiter_name\", \"recruiter_role\", \"call_to_action\"]\n    }\n  },\n  \"required\": [\n    \"meta_data\",\n    \"location_details\",\n    \"content_core\",\n    \"requirements_profile\",\n    \"benefits_and_culture\",\n    \"contact_info\"\n  ]\n}"}}},"builtInTools":{}},"typeVersion":1.3},{"id":"7ca4d113-efb5-4152-bd49-9dd87366fb1c","name":"Parse AI JSON output","type":"n8n-nodes-base.code","position":[1744,368],"parameters":{"jsCode":"const aiOutput = $input.all().map((item) => item.json);\n\nconst parsedOutput = aiOutput\n  .map((output) => {\n    try {\n      return JSON.parse(output.output);\n    } catch (error) {\n      console.log(`Failed to parse output: ${output.output}`);\n      return null;\n    }\n  })\n  .filter(Boolean); // filter out null values\n\nreturn parsedOutput;\n"},"typeVersion":2},{"id":"355dc4d1-26e5-4c10-aa92-e4a044c16247","name":"Log job data in Google Sheets","type":"n8n-nodes-base.googleSheets","position":[1968,368],"parameters":{"columns":{"value":{"job_title":"={{ $json.meta_data.job_title }}","languages":"={{ $json.requirements_profile.languages }}","locations":"={{ $json.location_details.locations }}","department":"={{ $json.meta_data.department }}","tech_stack":"={{ $json.content_core.tech_stack }}","hard_skills":"={{ $json.requirements_profile.hard_skills }}","soft_skills":"={{ $json.requirements_profile.soft_skills }}","contact_info":"={{ $json.contact_info }}","job_subtitle":"={{ $json.meta_data.job_subtitle }}","benefits_list":"={{ $json.benefits_and_culture.benefits_list }}","employment_type":"={{ $json.meta_data.employment_type }}","seniority_level":"={{ $json.meta_data.seniority_level }}","responsibilities":"={{ $json.content_core.responsibilities }}","culture_statement":"={{ $json.benefits_and_culture.culture_statement }}","mission_statement":"={{ $json.content_core.mission_statement }}","is_remote_friendly":"={{ $json.location_details.is_remote_friendly }}","location_policy_text":"={{ $json.location_details.location_policy_text }}"},"schema":[{"id":"job_title","type":"string","display":true,"required":false,"displayName":"job_title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"job_subtitle","type":"string","display":true,"required":false,"displayName":"job_subtitle","defaultMatch":false,"canBeUsedToMatch":true},{"id":"department","type":"string","display":true,"required":false,"displayName":"department","defaultMatch":false,"canBeUsedToMatch":true},{"id":"employment_type","type":"string","display":true,"required":false,"displayName":"employment_type","defaultMatch":false,"canBeUsedToMatch":true},{"id":"seniority_level","type":"string","display":true,"required":false,"displayName":"seniority_level","defaultMatch":false,"canBeUsedToMatch":true},{"id":"locations","type":"string","display":true,"required":false,"displayName":"locations","defaultMatch":false,"canBeUsedToMatch":true},{"id":"is_remote_friendly","type":"string","display":true,"required":false,"displayName":"is_remote_friendly","defaultMatch":false,"canBeUsedToMatch":true},{"id":"location_policy_text","type":"string","display":true,"required":false,"displayName":"location_policy_text","defaultMatch":false,"canBeUsedToMatch":true},{"id":"mission_statement","type":"string","display":true,"required":false,"displayName":"mission_statement","defaultMatch":false,"canBeUsedToMatch":true},{"id":"responsibilities","type":"string","display":true,"required":false,"displayName":"responsibilities","defaultMatch":false,"canBeUsedToMatch":true},{"id":"tech_stack","type":"string","display":true,"required":false,"displayName":"tech_stack","defaultMatch":false,"canBeUsedToMatch":true},{"id":"hard_skills","type":"string","display":true,"required":false,"displayName":"hard_skills","defaultMatch":false,"canBeUsedToMatch":true},{"id":"soft_skills","type":"string","display":true,"required":false,"displayName":"soft_skills","defaultMatch":false,"canBeUsedToMatch":true},{"id":"languages","type":"string","display":true,"required":false,"displayName":"languages","defaultMatch":false,"canBeUsedToMatch":true},{"id":"benefits_list","type":"string","display":true,"required":false,"displayName":"benefits_list","defaultMatch":false,"canBeUsedToMatch":true},{"id":"culture_statement","type":"string","display":true,"required":false,"displayName":"culture_statement","defaultMatch":false,"canBeUsedToMatch":true},{"id":"contact_info","type":"string","display":true,"required":false,"displayName":"contact_info","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_ID/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"YOUR_GOOGLE_SHEETS_ID","cachedResultUrl":"https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_ID/edit?usp=drivesdk","cachedResultName":"Your_Spreadsheet"}},"typeVersion":4.7},{"id":"808116d1-46f7-44b6-abd7-8e08f9700992","name":"OpenAI Chat Model (JD-Writer)","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[2416,480],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-5.1","cachedResultName":"gpt-5.1"},"options":{},"builtInTools":{}},"typeVersion":1.3},{"id":"36d479a6-8dd4-49ee-bd3a-e3f9ebc5067b","name":"Check if JD is approved","type":"n8n-nodes-base.if","position":[2992,368],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"239cd203-6076-4865-9ce7-f27019b33fbb","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.data['Approved?'] }}","rightValue":"yes"}]}},"typeVersion":2.3},{"id":"040f33ce-bb7c-420b-a086-62c22c84201e","name":"Build JD-Writer prompt","type":"n8n-nodes-base.code","position":[2192,368],"parameters":{"jsCode":"// Build the full prompt for JD-Writer depending on path (create vs. revise)\n\nconst AGENT_NODE_NAME  = 'JD-Writer';                         \nconst IF_NODE_NAME     = 'Check if JD is approved';                                \nconst TEAMS_NODE_NAME  = 'Send JD to Teams for approval';\n\n\nconst S = v => (v === undefined || v === null ? \"\" : String(v));\nconst getByPath = (obj, path) => {\n  try {\n    let cur = obj;\n    for (const seg of path.split('.')) {\n      const m = seg.match(/^([^\\[]+)(?:\\[(\\d+)\\])?$/); // supports \"choices[0]\"\n      if (!m) return undefined;\n      const key = m[1];\n      const idx = m[2];\n      cur = cur?.[key];\n      if (cur === undefined || cur === null) return undefined;\n      if (idx !== undefined) {\n        if (!Array.isArray(cur)) return undefined;\n        cur = cur[Number(idx)];\n      }\n    }\n    return cur;\n  } catch { return undefined; }\n};\nconst getLastItemFromNode = (nodeName) => {\n  let items = [];\n  try { items = items.concat($items(nodeName, 0) || []); } catch {}\n  try { items = items.concat($items(nodeName, 1) || []); } catch {}\n  if (!items.length) {\n    try { items = $items(nodeName) || []; } catch {}\n  }\n  return items.length ? items[items.length - 1] : null;\n};\n// Deep scan: find the first string that looks like HTML\nconst findHtmlString = (obj) => {\n  const seen = new Set();\n  const looksLikeHtml = (str) => {\n    const s = S(str);\n    return /<\\s*html[\\s>]/i.test(s) || /<\\s*body[\\s>]/i.test(s) || /<\\/(p|div|ul|li|h[1-6])>/i.test(s);\n  };\n  const dfs = (val) => {\n    if (val === null || val === undefined) return null;\n    if (typeof val === 'string') return looksLikeHtml(val) ? val : null;\n    if (typeof val !== 'object') return null;\n    if (seen.has(val)) return null;\n    seen.add(val);\n    if (Array.isArray(val)) {\n      for (const v of val) {\n        const hit = dfs(v);\n        if (hit) return hit;\n      }\n    } else {\n      for (const k of Object.keys(val)) {\n        const hit = dfs(val[k]);\n        if (hit) return hit;\n      }\n    }\n    return null;\n  };\n  return dfs(obj) || \"\";\n};\n\n// ---------- 1) Collect sheet/input data ----------\nconst firstItem = $input.first();\nconst inputData = firstItem?.json ?? {};\nconst data = inputData.data ?? {};\n\nconst FIELDS = [\n  'job_title','job_subtitle','department','employment_type','locations',\n  'is_remote_friendly','location_policy_text','mission_statement','responsibilities',\n  'tech_stack','hard_skills','soft_skills','languages','benefits_list',\n  'culture_statement','contact_info'\n];\n\nconst base = {};\nfor (const f of FIELDS) base[f] = S(getByPath(inputData, f) ?? getByPath(data, f) ?? \"\");\n\n// ---------- 2) Detect feedback / IF path ----------\nconst teamsItem = getLastItemFromNode(TEAMS_NODE_NAME);\n// IF outputs\nlet ifTrueItems = [], ifFalseItems = [];\ntry { ifTrueItems  = $items(IF_NODE_NAME, 0) || []; } catch {}\ntry { ifFalseItems = $items(IF_NODE_NAME, 1) || []; } catch {}\nconst cameFromIfTrue  = Boolean(ifTrueItems.length);\nconst cameFromIfFalse = Boolean(ifFalseItems.length);\n\nconst feedback = S(\n  getByPath(teamsItem?.json, 'feedback') ??\n  getByPath(inputData, 'feedback') ??\n  getByPath(data, 'feedback') ??\n  \"\"\n).trim();\n\n// ---------- 3) Get previous agent output (HTML) ----------\nlet previous_html = \"\";\nconst agentItem = getLastItemFromNode(AGENT_NODE_NAME);\nif (agentItem?.json) {\n  const j = agentItem.json;\n  // Try typical paths first (including array indices)\n  const candidates = [\n    'output.html',\n    'output.job_description_html',\n    'output.response',\n    'output.text',\n    'response',\n    'text',\n    'data.response',\n    'data.choices[0].message.content',\n    'choices[0].message.content',\n    'message.content'\n  ];\n  for (const p of candidates) {\n    const v = getByPath(j, p);\n    if (typeof v === 'string' && /<\\s*html|<\\s*body|<\\/(p|div|ul|li|h[1-6])>/i.test(v)) {\n      previous_html = v;\n      break;\n    }\n  }\n  // Fallback: deep scan\n  if (!previous_html) previous_html = findHtmlString(j);\n}\n\n// ---------- 4) Determine mode ----------\nlet mode = cameFromIfFalse ? 'revise' : 'create';\n// Safety: if revise requested but no previous_html available (e.g. first run), fall back to create\nif (mode === 'revise' && !previous_html) mode = 'create';\n\n// ---------- 5) Prompt builder ----------\n// Original prompt template for CREATE mode.\n// Placeholders like {{ $json.job_title }} are substituted.\nconst CREATE_PROMPT_TEMPLATE = `\nYour task:  \nUsing the structured input below, write a **complete, polished job description in English** in the style of a modern, mission-driven employer (similar to innovative EdTech / tech-forward companies).\n\n### Overall style and tone\n\n- Professional, clear, and confident.\n- Positive and mission-driven (without becoming cheesy or overhyped).\n- Inclusive and welcoming; avoid jargon where not needed.\n- Use active voice, strong verbs, and concise sentences.\n- Write for experienced professionals (mid to senior), but keep it approachable.\n- No emojis, no hashtags.\n\n### Structure & content\n\nFollow this structure (using headings in ALL CAPS):\n\n1. **Mission hook & role introduction (1–2 short paragraphs)**  \n   - Start with a short, inspiring mission statement using or adapting:\n     - {{ $json.mission_statement }}\n   - Immediately introduce the role with job title, department, employment type, and location context, similar to:  \n     - “Strengthen our {{ $json.department }} Team {{ $json.employment_type }} as a {{ $json.job_title }} {{ $json.job_subtitle }} at our locations in {{ $json.locations }}{{ $json.is_remote_friendly }}.”\n   - If available, briefly mention the location/remote policy in a natural way:\n     - Use {{ $json.location_policy_text }} appropriately.\n   - Keep this section crisp and inviting.\n\n2. **Short role overview (1 paragraph)**  \n   - Summarize what the role focuses on, in 2–4 sentences:\n     - Use the themes from {{ $json.responsibilities }}, {{ $json.tech_stack }}, {{ $json.department }}.\n   - Emphasize impact, cross-functional collaboration, and key topics (e.g., digital transformation, AI, automation, etc. if relevant from input).\n   - Do not list responsibilities here; this is a narrative overview.\n\n3. **YOUR RESPONSIBILITIES (bullet list)**  \n   - Add the heading: \\`YOUR RESPONSIBILITIES\\`\n   - Convert {{ $json.responsibilities }} into **clear, action-oriented bullet points**.\n   - Each bullet:\n     - Starts with a strong verb in present tense (e.g., “Lead…”, “Design…”, “Implement…”, “Collaborate…”).\n     - Focuses on one main idea; avoid overly long multi-clause bullets.\n   - If {{ $json.tech_stack }} is relevant, integrate tools/technologies naturally into the bullets (e.g., “using tools such as …”).\n   - Aim for ~5–8 bullets where possible (depending on input length/quality).\n\n4. **YOUR PROFILE (bullet list)**  \n   - Add the heading: \\`YOUR PROFILE\\`\n   - Combine and rephrase:\n     - {{ $json.hard_skills }}\n     - {{ $json.soft_skills }}\n     - {{ $json.languages }}\n   - Turn them into candidate-focused bullet points (e.g., “Several years of experience in…”, “Hands-on expertise with…”, “You enjoy…”, “You communicate fluently in…”).\n   - Group related items logically (e.g., experience, tools, mindset, languages).\n   - Keep it realistic and not excessively long (again ~5–8 bullets when possible).\n\n5. **WE OFFER (bullet list)**  \n   - Add the heading: \\`WE OFFER\\`\n   - Use {{ $json.benefits_list }} and turn it into attractive but concrete bullet points.\n   - Mix:\n     - Work model & flexibility (remote, hybrid, working hours)\n     - Learning & development opportunities\n     - Culture/values-related benefits\n     - Financial/transport/perks (e.g. commute support, bonuses, etc.)\n   - Avoid duplicating the culture section; keep this benefits-focused.\n\n6. **Company & culture paragraph**  \n   - Using {{ $json.culture_statement }} and {{ $json.mission_statement }}, write 1–2 short paragraphs that:\n     - Briefly describe what the organization does (industry, size or positioning if given).\n     - Highlight being tech-forward / data-driven / innovative **only if** implied by the inputs.\n     - Emphasize inclusive culture and collaboration.\n   - Keep it factual and not overly long.\n\n7. **Call to action & application information**  \n   - Encourage candidates to apply in a friendly, straightforward sentence or two.\n   - If {{ $json.contact_info }} is provided:\n     - Mention how to apply or who to contact using this information in a natural way (no raw JSON or labels).\n   - If no contact info is available, use a generic call to apply via the careers page.\n\n8. **Diversity & inclusion statement (short, clear)**  \n   - End with a concise, inclusive statement in line with modern standards, inspired by but not copying typical texts.\n   - Emphasize that all qualified applicants are welcome regardless of background, and that the company values diversity and an inclusive culture.\n   - Keep it to 2–4 sentences, not a long legal block.\n\n### Formatting rules\n\n- **Output must be valid HTML.**\n- Wrap the entire job description in semantic HTML tags (e.g. use <html>, <body>, and appropriate sections or <div> containers).\n- Use headings in ALL CAPS as text inside heading tags (e.g. <h2>YOUR RESPONSIBILITIES</h2>).\n- Use <p> tags for paragraphs and <ul><li>...</li></ul> for bullet lists.\n- Do **not** use Markdown.\n- Do **not** mention the JSON fields, variables, or any technical prompt details in the output.\n- Do **not** quote the input verbatim if it’s awkward; you may lightly edit/standardize for style and grammar.\n- If certain inputs are missing or empty, **gracefully omit** the related parts and still produce a coherent, polished job description.\n- Do **not** add any explanations, intros, or meta-comments before or after the HTML. The output must be the HTML job description only.\n\nInput data to use\n\n- Job title: {{ $json.job_title }}\n- Job subtitle: {{ $json.job_subtitle }}\n- Department / team: {{ $json.department }}\n- Employment type: {{ $json.employment_type }}\n- Locations: {{ $json.locations }}\n- Remote-friendliness: {{ $json.is_remote_friendly }}\n- Location policy text: {{ $json.location_policy_text }}\n- Mission statement: {{ $json.mission_statement }}\n- Responsibilities: {{ $json.responsibilities }}\n- Tech stack: {{ $json.tech_stack }}\n- Hard skills: {{ $json.hard_skills }}\n- Soft skills: {{ $json.soft_skills }}\n- Languages: {{ $json.languages }}\n- Benefits list: {{ $json.benefits_list }}\n- Culture statement: {{ $json.culture_statement }}\n- Contact info / application details: {{ $json.contact_info }}\n`.trim();\n\n// Placeholder substitution: {{ $json.field }} -> actual value from sheet\nconst fillCreateTemplate = (tpl, ctx) =>\n  tpl.replace(/\\{\\{\\s*\\$json\\.([a-zA-Z0-9_]+)\\s*\\}\\}/g, (_, key) => S(ctx[key]).trim());\n\n// Revise prompts\nconst REVISE_SYSTEM = `\nYou are an expert HR copywriter. You will revise an existing  job description based on feedback.\nRules:\n- Apply the feedback precisely and minimally; do not rewrite from scratch.\n- Preserve structure, section order, headings, and any content not mentioned in the feedback.\n- Keep the tone professional, clear, modern, and inclusive.\n- Output must be valid HTML only (no explanations).\n`.trim();\n\nconst makeReviseUser = (prevHtml, fb) => `\nFeedback:\n${fb || '(no additional feedback provided)'}\n\nPrevious draft HTML:\n${prevHtml}\n\nInstructions:\n- Update only the necessary parts to address the feedback.\n- Keep HTML valid; keep headings in ALL CAPS as they are.\n- Do not insert new sections unless explicitly requested by the feedback.\n`.trim();\n\n// ---------- 6) Assemble system/user messages ----------\nlet system, user;\nif (mode === 'create') {\n  system = `You are an expert HR copywriter specialized in creating clear, engaging, and modern job descriptions for tech- and transformation-focused roles.`;\n  user   = fillCreateTemplate(CREATE_PROMPT_TEMPLATE, base);\n} else {\n  system = REVISE_SYSTEM;\n  user   = makeReviseUser(previous_html, feedback);\n}\n\n// ---------- 7) Return ----------\nreturn [{\n  json: {\n    mode,\n    system,\n    user,\n    feedback,\n    previous_html,\n    // Useful for debugging in the n8n UI:\n    _debug: {\n      cameFromIfTrue,\n      cameFromIfFalse,\n      agentItemKeys: agentItem?.json ? Object.keys(agentItem.json) : [],\n      foundHtml: Boolean(previous_html)\n    },\n    // Pass sheet data downstream if needed\n    ...base\n  }\n}];\n"},"typeVersion":2},{"id":"177ea090-e232-479f-bb8b-00e692970807","name":"JD-Writer","type":"@n8n/n8n-nodes-langchain.agent","position":[2416,240],"parameters":{"text":"={{ $json.user }}\n\n","options":{"systemMessage":"={{ $json.system }}"},"promptType":"define","hasOutputParser":true},"typeVersion":3.1},{"id":"eac6fe8f-0c99-434a-942c-e10ffacb3868","name":"Send JD to Teams for approval","type":"n8n-nodes-base.microsoftTeams","position":[2768,240],"webhookId":"00000000-0000-0000-0000-000000000000","parameters":{"chatId":{"__rl":true,"mode":"list","value":"YOUR_MS_TEAMS_CHAT_ID","cachedResultUrl":"https://teams.microsoft.com/l/chat/YOUR_CHAT_URL","cachedResultName":"Your_Teams_Chat"},"message":"={{ $json.output }}","options":{},"resource":"chatMessage","operation":"sendAndWait","formFields":{"values":[{"fieldType":"dropdown","fieldLabel":"Approved?","defaultValue":"yes","fieldOptions":{"values":[{"option":"yes"},{"option":"no"}]},"requiredField":true},{"fieldLabel":"feedback","placeholder":"what should i change or improve?"}]},"responseType":"customForm"},"typeVersion":2},{"id":"fb85dea3-ae4a-42e6-9c55-ad89c0af4fa8","name":"Convert approved JD to PDF","type":"n8n-nodes-htmlcsstopdf.htmlcsstopdf","position":[3200,272],"parameters":{"html_content":"={{ $('JD-Writer').item.json.output }}","output_format":"file"},"typeVersion":1},{"id":"4177edba-cb3e-485d-89c2-9a5a2b29e08e","name":"Upload PDF to Google Drive","type":"n8n-nodes-base.googleDrive","position":[3408,272],"parameters":{"name":"={{ $('Append row in sheet').item.json.job_title }}","driveId":{"__rl":true,"mode":"list","value":"My Drive"},"options":{},"folderId":{"__rl":true,"mode":"id","value":"={{ $('Create folder').item.json.id }}"}},"typeVersion":3},{"id":"830be834-6ba7-4170-ae21-2bd2462078fd","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-64,0],"parameters":{"width":520,"height":900,"content":"## Auto-generate job descriptions from briefing notes\n\nTurn a **Google Docs role briefing transcript** (e.g. from a Hiring Manager / Recruiter conversation) into a polished, structured **job description** in HTML and PDF -- fully automated with AI and a human-in-the-loop approval via Microsoft Teams.\n\n## How it works\n\n1. A new Google Doc appears in a watched Drive folder (the briefing transcript).\n2. The doc is moved into a timestamped subfolder for organization.\n3. An AI Agent (OpenAI) reads the transcript and extracts structured job data (title, responsibilities, skills, benefits, etc.) into JSON.\n4. The extracted data is logged in a Google Sheets tracker.\n5. A second AI Agent (JD-Writer) generates a full HTML job description from the structured data.\n6. The draft is sent to **Microsoft Teams** for review with an approve/reject form.\n7. If approved: the HTML is converted to PDF and uploaded to Google Drive.\n8. If rejected: feedback is looped back and the JD is revised automatically.\n\n## Setup steps\n\n1. **Google Drive & Docs** -- Create OAuth2 credentials. Set the watched folder ID in the Google Drive Trigger node.\n2. **Google Sheets** -- Create a spreadsheet with columns matching the job data schema (job_title, department, responsibilities, etc.). Update the Sheet ID.\n3. **OpenAI** -- Add your API key. Used for both the data extraction agent and the JD-Writer agent.\n4. **Microsoft Teams** -- Create OAuth2 credentials. Set the Teams chat ID in the approval node.\n5. **HTML-to-PDF** -- Install the community node `n8n-nodes-htmlcsstopdf` (self-hosted only). Add the API credential.\n\n> **Community node required:** `n8n-nodes-htmlcsstopdf` -- this template works on **self-hosted n8n only**."},"typeVersion":1},{"id":"9a6d4027-7942-4a83-849e-266549729aef","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[512,192],"parameters":{"color":7,"width":360,"height":130,"content":"### Step 1: Trigger & File Organization\nGoogle Drive Trigger watches a folder for new Google Docs. When detected, a timestamped subfolder is created and the document is moved into it."},"typeVersion":1},{"id":"bec98195-060c-4ec7-92a5-4a3fadaa4c9a","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[1264,176],"parameters":{"color":7,"width":380,"height":140,"content":"### Step 2: AI Data Extraction\nThe Google Doc content is read and passed to an OpenAI AI Agent that extracts structured job data (title, department, responsibilities, skills, benefits, etc.) from the German transcript into a JSON schema."},"typeVersion":1},{"id":"3dab8a4e-6d68-4e62-aa13-65d05ffdda56","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[2352,16],"parameters":{"color":7,"width":400,"content":"### Step 3: JD Generation & Approval Loop\nExtracted data is logged in Google Sheets, then an Input Builder prepares a prompt for the JD-Writer AI Agent. The generated HTML job description is sent to Microsoft Teams for review. If rejected, feedback is looped back for revision."},"typeVersion":1},{"id":"563eb0c3-c67d-49af-ba03-32d7bb1e8902","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[3184,80],"parameters":{"color":7,"width":360,"height":130,"content":"### Step 4: PDF Export & Upload\nOnce approved, the HTML job description is converted to PDF via HTML-to-PDF API and uploaded to the Google Drive subfolder alongside the original briefing document."},"typeVersion":1}],"active":false,"pinData":{"JD-Writer":[{"json":{"output":"<html>\n  <body>\n    <section>\n      <h1>SENIOR DATA AUTOMATION LEAD</h1>\n      <p>The Senior Data Automation Lead role is being created to scale self-service analytics and automation initiatives, significantly reduce manual reporting effort across business functions, and ensure quality and governance along the entire data value chain. This role is central to building a production-grade automation framework that improves the reliability, speed, and cost-efficiency of data provisioning across domains.</p>\n      <p>Strengthen our Data &amp; Analytics team full-time as a Senior Data Automation Lead based in Berlin. This is a hybrid role with three days per week on site, offering high ownership, technical freedom, and direct business impact.</p>\n    </section>\n\n    <section>\n      <h2>ROLE OVERVIEW</h2>\n      <p>As Senior Data Automation Lead, you design and scale our data and workflow automations end to end, from orchestration and scheduling to testing, monitoring, and deployment in production. You partner with Finance, Sales, Operations, and Engineering to standardize data contracts, build robust pipelines, and enable true self-service analytics. Working with a modern data stack including tools such as Airflow or Prefect, dbt, Python, and cloud data warehouses like BigQuery or Snowflake, you make our data flows faster, more reliable, and more cost-effective. Over time, you will grow into leading a small team and shaping the next generation of data automation across the company.</p>\n    </section>\n\n    <section>\n      <h2>YOUR RESPONSIBILITIES</h2>\n      <ul>\n        <li>Design, build, and optimize data and workflow automations, including orchestration and scheduling of pipelines using tools such as Airflow, Prefect, or Dagster.</li>\n        <li>Implement and evolve CI/CD practices for data products, including automated testing, deployment, and monitoring in production environments with Git-based workflows.</li>\n        <li>Own and drive cross-functional automation use cases across Finance, Sales, and Operations, from discovery and scoping through implementation and rollout.</li>\n        <li>Standardize data contracts and interfaces in close collaboration with Engineering, supporting event-driven and API-based data flows where relevant.</li>\n        <li>Enable business stakeholders through clear playbooks, training sessions, and guidelines that support self-service analytics and automation.</li>\n        <li>Continuously improve automation performance using metrics such as latency, reliability, and costs, and establish DORA-like indicators for data workflows.</li>\n        <li>Collaborate with Data &amp; Analytics, Engineering, and business teams to ensure that data automation adheres to governance, quality, and security standards.</li>\n      </ul>\n    </section>\n\n    <section>\n      <h2>YOUR PROFILE</h2>\n      <ul>\n        <li>6–10 years of relevant experience in data automation, orchestration, or closely related data engineering roles, with a proven track record of delivering production-grade automation and orchestration projects.</li>\n        <li>Hands-on expertise with orchestration tools such as Airflow, Prefect, or Dagster, and strong proficiency in SQL, dbt, and Python for building and maintaining robust data pipelines.</li>\n        <li>Practical experience with modern cloud data warehouses such as BigQuery, Snowflake, or Redshift, and familiarity with Git-based workflows and CI/CD for data products, including branching, testing, and deployment.</li>\n        <li>Basic knowledge of Infrastructure as Code (preferably Terraform) and experience with containerization using Docker for consistent, reproducible environments.</li>\n        <li>Familiarity with data monitoring and observability solutions such as Datafold, Great Expectations, Monte Carlo, or comparable tools, ideally in B2B SaaS or e-commerce environments.</li>\n        <li>Exposure to data contracts and event-driven architectures is a plus; experience with Kafka and cost optimization or FinOps in a data context is an advantage.</li>\n        <li>You work in a highly structured way, communicate clearly, and can translate complex technical topics for non-technical stakeholders.</li>\n        <li>You bring strong stakeholder management and prioritization skills, navigate cross-functional priorities with ease, and live a “you build it, you run it” ownership mindset for data products and automations.</li>\n        <li>You communicate fluently in English at C1 level and in German at least at B2 level.</li>\n      </ul>\n    </section>\n\n    <section>\n      <h2>WE OFFER</h2>\n      <ul>\n        <li>A hybrid work model based in Berlin with three days per week on site, combining focused remote work with high-impact in-person collaboration.</li>\n        <li>High ownership and technical freedom in shaping our data automation framework, with direct visibility and impact across core business functions.</li>\n        <li>A confirmed growth path toward leading a small team of 2–4 FTE within 12–18 months, including support for your leadership and people-development skills.</li>\n        <li>Access to a modern data stack and the opportunity to work hands-on with state-of-the-art tools in orchestration, data warehousing, observability, and automation.</li>\n        <li>A collaborative, cross-functional environment where Data &amp; Analytics, Engineering, and business teams work closely together on impactful use cases.</li>\n        <li>Room for continuous learning through challenging projects, knowledge-sharing sessions, and support for staying on top of best practices in data and AI-driven automation.</li>\n      </ul>\n    </section>\n\n    <section>\n      <h2>COMPANY &amp; CULTURE</h2>\n      <p>We are a data-driven organization with a modern data stack at the core of how we operate and grow. Our Data &amp; Analytics team partners closely with Finance, Sales, Operations, and Engineering to enable self-service insights and scalable automation across the business.</p>\n      <p>The Senior Data Automation Lead role offers high ownership, technical freedom, and direct business impact, in a hybrid setup built around cross-functional collaboration. You will help shape how data is provisioned, governed, and automated, while growing into a leadership role and contributing to an open, inclusive, and supportive team culture.</p>\n    </section>\n\n    <section>\n      <h2>HOW TO APPLY</h2>\n      <p>If this role sounds like a good fit, we would be happy to receive your application. Please apply via our careers page with your CV and a short note on why you are interested in the Senior Data Automation Lead position.</p>\n    </section>\n\n    <section>\n      <h2>DIVERSITY &amp; INCLUSION</h2>\n      <p>We are committed to building a diverse team and an inclusive workplace where everyone can thrive. We welcome applications from all qualified candidates, regardless of gender, ethnicity, disability, age, sexual orientation, religion, or background. If you need adjustments in the recruitment process, we are happy to accommodate your needs.</p>\n    </section>\n  </body>\n</html>"},"pairedItem":{"item":0}}],"Send JD to Teams for approval":[{"json":{"data":{"feedback":"","Approved?":"yes"}},"pairedItem":{"item":0}}],"Extract job data from transcript":[{"json":{"output":"{\"meta_data\":{\"job_title\":\"Senior Data Automation Lead\",\"job_subtitle\":null,\"department\":\"Data & Analytics\",\"employment_type\":\"Full-time\",\"seniority_level\":\"Senior\"},\"location_details\":{\"locations\":[\"Berlin\"],\"is_remote_friendly\":true,\"location_policy_text\":\"Hybrid role based in Berlin with three days per week on site.\"},\"content_core\":{\"mission_statement\":\"The Senior Data Automation Lead role is being created to scale self-service analytics and automation initiatives, significantly reduce manual reporting effort across business functions, and ensure quality and governance along the entire data value chain. The position holds high ownership and technical freedom with direct business impact and a clear path toward leading a small team. The role is central to building a production-grade automation framework that improves reliability, speed, and cost-efficiency of data provisioning across domains.\",\"responsibilities\":[\"Build and optimize data and workflow automations, including orchestration and scheduling of pipelines.\",\"Implement CI/CD practices for data products, including testing and monitoring in production environments.\",\"Own and drive cross-functional automation use cases across Finance, Sales, and Operations.\",\"Standardize data contracts and interfaces in close collaboration with Engineering.\",\"Enable business stakeholders through playbooks, training sessions, and guidelines for self-service analytics and automation.\",\"Continuously improve automation performance using metrics such as latency, reliability, and costs, and establish DORA-like indicators for data workflows.\"],\"tech_stack\":[\"Airflow\",\"Prefect\",\"Dagster\",\"SQL\",\"dbt\",\"Python\",\"BigQuery\",\"Snowflake\",\"Redshift\",\"Git\",\"CI/CD\",\"Terraform\",\"Docker\",\"Datafold\",\"Great Expectations\",\"Monte Carlo\",\"Kafka\"]},\"requirements_profile\":{\"hard_skills\":[\"6–10 years of relevant experience in data automation, orchestration, or closely related data engineering roles.\",\"Proven track record of delivering production-grade data automation and orchestration projects.\",\"Hands-on experience with orchestration tools such as Airflow, Prefect, or Dagster.\",\"Strong proficiency in SQL and experience with dbt and Python for building and maintaining data pipelines.\",\"Practical experience with modern cloud data warehouses such as BigQuery, Snowflake, or Redshift.\",\"Experience with Git-based workflows and CI/CD for data products, including branching, testing, and deployment practices.\",\"Basic knowledge of Infrastructure as Code, preferably with Terraform.\",\"Experience with containerization using Docker.\",\"Familiarity with data monitoring and observability tools such as Datafold, Great Expectations, or Monte Carlo, or comparable solutions.\",\"Experience with cross-functional data flows in B2B SaaS or e-commerce environments.\",\"Exposure to data contracts and event-driven architectures is a plus.\",\"Experience with Kafka is a plus.\",\"Experience with cost optimization or FinOps in a data context is a plus.\"],\"soft_skills\":[\"Highly structured working style and strong communication skills.\",\"Pragmatic, solution-oriented mindset with focus on business impact.\",\"Ability to translate complex technical topics for non-technical stakeholders.\",\"Strong stakeholder management capabilities and the ability to manage cross-functional priorities.\",\"Clear prioritization skills in a multi-stakeholder environment.\",\"\\\"You build it, you run it\\\" ownership mindset for data products and automations.\"],\"languages\":[\"German at least B2 level.\",\"English at C1 level.\"]},\"benefits_and_culture\":{\"benefits_list\":[],\"culture_statement\":\"The role offers high ownership, technical freedom, and direct business impact, with a confirmed growth path toward leading a small team of 2–4 FTE within 12–18 months, in a hybrid setup aligned with a modern data stack and cross-functional collaboration.\"},\"contact_info\":{\"recruiter_name\":\"Your Name\",\"recruiter_role\":\"Senior Recruiter\",\"call_to_action\":null}}"},"pairedItem":{"item":0}}]},"settings":{"binaryMode":"separate","availableInMCP":false,"executionOrder":"v1"},"versionId":"cd128e71-7267-4241-8e79-babf37fa4df6","connections":{"JD-Writer":{"main":[[{"node":"Send JD to Teams for approval","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"Extract job data from transcript","type":"ai_languageModel","index":0}]]},"Google Drive Trigger":{"main":[[{"node":"Create timestamped subfolder","type":"main","index":0}]]},"Parse AI JSON output":{"main":[[{"node":"Log job data in Google Sheets","type":"main","index":0}]]},"Build JD-Writer prompt":{"main":[[{"node":"JD-Writer","type":"main","index":0}]]},"Check if JD is approved":{"main":[[{"node":"Convert approved JD to PDF","type":"main","index":0}],[{"node":"Build JD-Writer prompt","type":"main","index":0}]]},"Read Google Doc content":{"main":[[{"node":"Extract job data from transcript","type":"main","index":0}]]},"Convert approved JD to PDF":{"main":[[{"node":"Upload PDF to Google Drive","type":"main","index":0}]]},"Create timestamped subfolder":{"main":[[{"node":"Move briefing doc to subfolder","type":"main","index":0}]]},"Log job data in Google Sheets":{"main":[[{"node":"Build JD-Writer prompt","type":"main","index":0}]]},"OpenAI Chat Model (JD-Writer)":{"ai_languageModel":[[{"node":"JD-Writer","type":"ai_languageModel","index":0}]]},"Send JD to Teams for approval":{"main":[[{"node":"Check if JD is approved","type":"main","index":0}]]},"Move briefing doc to subfolder":{"main":[[{"node":"Read Google Doc content","type":"main","index":0}]]},"Extract job data from transcript":{"main":[[{"node":"Parse AI JSON output","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":20,"nodeTypes":{"n8n-nodes-base.if":{"count":1},"n8n-nodes-base.code":{"count":2},"n8n-nodes-base.googleDocs":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.googleDrive":{"count":3},"n8n-nodes-base.googleSheets":{"count":1},"n8n-nodes-base.microsoftTeams":{"count":1},"@n8n/n8n-nodes-langchain.agent":{"count":2},"n8n-nodes-base.googleDriveTrigger":{"count":1},"n8n-nodes-htmlcsstopdf.htmlcsstopdf":{"count":1},"@n8n/n8n-nodes-langchain.lmChatOpenAi":{"count":2}}},"status":"published","readyToDemo":null,"user":{"name":"Feras Dabour","username":"ferasdabour","bio":"","verified":true,"links":["https://www.linkedin.com/in/ferasdabour/"],"avatar":"https://gravatar.com/avatar/315bf48ed72eaa70cb84b9c47a1cd9ec3249a9761420e236272c4e53dabd8629?r=pg&d=retro&size=200"},"nodes":[{"id":18,"icon":"file:googleSheets.svg","name":"n8n-nodes-base.googleSheets","codex":{"data":{"alias":["CSV","Sheet","Spreadsheet","GS"],"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/","icon":"⏲","label":"Creating triggers for n8n workflows using polling"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\",\"output\"]","defaults":{"name":"Google Sheets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="},"displayName":"Google Sheets","typeVersion":5,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":58,"icon":"file:googleDrive.svg","name":"n8n-nodes-base.googleDrive","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googledrive/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Google Drive"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgNzMiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwNjZkYSIgZD0ibTYuMDQ4IDYxLjI2IDMuNTI4IDYuMDk0Yy43MzMgMS4yODMgMS43ODcgMi4yOTEgMy4wMjQgMy4wMjRsMTIuNi0yMS44MUgwYTguMyA4LjMgMCAwIDAgMS4xIDQuMTI0eiIvPjxwYXRoIGZpbGw9IiMwMGFjNDciIGQ9Ik00MCAyMi45MSAyNy40IDEuMWMtMS4yMzcuNzMzLTIuMjkxIDEuNzQxLTMuMDI0IDMuMDI0TDEuMSA0NC40NDVBOC4zIDguMyAwIDAgMCAwIDQ4LjU2OGgyNS4yeiIvPjxwYXRoIGZpbGw9IiNlYTQzMzUiIGQ9Ik02Ny40IDcwLjM3OGMxLjIzNy0uNzMzIDIuMjkxLTEuNzQxIDMuMDI0LTMuMDI0bDEuNDY2LTIuNTIgNy4wMS0xMi4xNDJhOC4zIDguMyAwIDAgMCAxLjEtNC4xMjRINTQuNzk4bDUuMzYzIDEwLjUzOHoiLz48cGF0aCBmaWxsPSIjMDA4MzJkIiBkPSJNNDAgMjIuOTEgNTIuNiAxLjFDNTEuMzYzLjM2NyA0OS45NDMgMCA0OC40NzcgMEgzMS41MjRjLTEuNDY2IDAtMi44ODcuNDEyLTQuMTI0IDEuMXoiLz48cGF0aCBmaWxsPSIjMjY4NGZjIiBkPSJNNTQuNzk5IDQ4LjU2OEgyNS4ybC0xMi42IDIxLjgxYzEuMjM3LjczMyAyLjY1NyAxLjEgNC4xMjQgMS4xaDQ2LjU1MmMxLjQ2NiAwIDIuODg3LS40MTIgNC4xMjQtMS4xeiIvPjxwYXRoIGZpbGw9IiNmZmJhMDAiIGQ9Ik02Ny4yNjIgMjQuMjg0IDU1LjYyNCA0LjEyNEM1NC44OTEgMi44NDEgNTMuODM3IDEuODMzIDUyLjYgMS4xTDQwIDIyLjkxbDE0LjggMjUuNjU5aDI1LjE1NWE4LjMgOC4zIDAgMCAwLTEuMS00LjEyNHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Google Drive","typeVersion":3,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"id":368,"icon":"file:teams.svg","name":"n8n-nodes-base.microsoftTeams","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.microsoftteams/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/microsoft/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"input\"]","defaults":{"name":"Microsoft Teams"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMzgxLjQgMjM1NC41Ij48cGF0aCBmaWxsPSIjNTU1OGFmIiBkPSJNMjAxNS42IDg5OS4yYzE5LjUgMTkuNSA0Mi41IDM1IDY3LjkgNDUuOCA1MyAyMi4yIDExMi43IDIyLjIgMTY1LjggMCA1MS4yLTIxLjggOTItNjIuNSAxMTMuNy0xMTMuNyAyMi4yLTUzIDIyLjItMTEyLjcgMC0xNjUuOC0yMS44LTUxLjItNjIuNS05Mi0xMTMuNy0xMTMuNy01My0yMi4yLTExMi43LTIyLjItMTY1LjggMC01MS4yIDIxLjgtOTIgNjIuNS0xMTMuNyAxMTMuNy0yMi4yIDUzLTIyLjIgMTEyLjcgMCAxNjUuOCAxMC44IDI1LjMgMjYuNCA0OC40IDQ1LjggNjcuOW0tNjIuNCAxOTcuOHY2NDIuMWgxMDdjMzYuOC0uMiA3My40LTMuNiAxMDkuNS0xMC40IDM2LjMtNi40IDcxLjMtMTguNiAxMDMuNy0zNi4yIDMwLjYtMTYuNiA1Ny00MCA3Ny4zLTY4LjIgMjEuMy0zMS4zIDMyLTY4LjYgMzAuNS0xMDYuNVYxMDk3em0tMzQ2LjgtMjY5LjJjMjguNC4yIDU2LjYtNS41IDgyLjgtMTYuNyA1MS4yLTIxLjggOTEuOS02Mi41IDExMy42LTExMy43IDIyLjItNTMgMjIuMi0xMTIuNy0uMS0xNjUuOC0yMS44LTUxLjItNjIuNS05Mi0xMTMuNy0xMTMuNy0yNi4yLTExLjItNTQuNC0xNi45LTgyLjktMTYuNy0yOC4zLS4yLTU2LjMgNS41LTgyLjMgMTYuNy0xOS40IDguMy0yNS41IDE5LjEtNTIuMiAzMi4xdjMyOWMyNi44IDEzLjEgMzIuOCAyMy44IDUyLjIgMzIuMSAyNi4xIDExLjMgNTQuMiAxNi45IDgyLjYgMTYuN20tMTM0LjggMTA4MS4xYzI2LjggNS44IDM2LjQgMTAuMyA1NS40IDEyLjkgMjAuOCAzIDQxLjggNC41IDYyLjggNC42IDMyLjQtLjIgNjQuOC0zLjYgOTYuNS0xMC40IDMyLjMtNi41IDYzLjMtMTguNiA5MS41LTM1LjcgMjcuNy0xNyA1MS00MC4yIDY4LjItNjcuNyAxOS0zMi4xIDI4LjMtNjkuMSAyNi45LTEwNi40di03NDNoLTQwMS4zek0wIDIxMTMuN2wxMzkxLjMgMjQwLjhWMEwwIDI0MC44eiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Im0xMDE2LjcgNzIyLjQtNjQyLjEgMzkuMXYxNDguMWwyNDAuOC05Ljd2Njg2LjdsMTYwLjUgOS40Vjg5My42bDI0MC44LTEwLjd6Ii8+PC9zdmc+"},"displayName":"Microsoft Teams","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":495,"icon":"file:googleDocs.svg","name":"n8n-nodes-base.googleDocs","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googledocs/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Miscellaneous"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Google Docs"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSItMTggMCA5MCA4MCI+PHVzZSB4bGluazpocmVmPSIjYSIgeD0iLjUiIHk9Ii41Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzU0OGRmNiIgZD0ibTM2IDAgMjIgMjJ2NTNhNC45OSA0Ljk5IDAgMCAxLTUgNUg1YTQuOTkgNC45OSAwIDAgMS01LTVWNWE0Ljk5IDQuOTkgMCAwIDEgNS01eiIvPjxwYXRoIGQ9Ik0xNCA0MGgzMHYzSDE0em0wIDdoMzB2M0gxNHptMCA4aDMwdjNIMTR6bTAgN2gyMXYzSDE0eiIvPjxwYXRoIGZpbGw9IiNhYmQwZmIiIGQ9Im0zNiAwIDIyIDIySDQxYy0yLjc3IDAtNS0yLjQ4LTUtNS4yNXoiLz48cGF0aCBmaWxsPSIjM2U1YmI5IiBkPSJNNDAuNzUgMjIgNTggMjkuMTI1VjIyeiIvPjwvZz48L3N5bWJvbD48L3N2Zz4="},"displayName":"Google Docs","typeVersion":2,"nodeCategories":[{"id":11,"name":"Miscellaneous"}]},{"id":531,"icon":"file:googleDrive.svg","name":"n8n-nodes-base.googleDriveTrigger","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/trigger-nodes/n8n-nodes-base.googledrivetrigger/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"Google Drive Trigger"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgNzMiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwNjZkYSIgZD0ibTYuMDQ4IDYxLjI2IDMuNTI4IDYuMDk0Yy43MzMgMS4yODMgMS43ODcgMi4yOTEgMy4wMjQgMy4wMjRsMTIuNi0yMS44MUgwYTguMyA4LjMgMCAwIDAgMS4xIDQuMTI0eiIvPjxwYXRoIGZpbGw9IiMwMGFjNDciIGQ9Ik00MCAyMi45MSAyNy40IDEuMWMtMS4yMzcuNzMzLTIuMjkxIDEuNzQxLTMuMDI0IDMuMDI0TDEuMSA0NC40NDVBOC4zIDguMyAwIDAgMCAwIDQ4LjU2OGgyNS4yeiIvPjxwYXRoIGZpbGw9IiNlYTQzMzUiIGQ9Ik02Ny40IDcwLjM3OGMxLjIzNy0uNzMzIDIuMjkxLTEuNzQxIDMuMDI0LTMuMDI0bDEuNDY2LTIuNTIgNy4wMS0xMi4xNDJhOC4zIDguMyAwIDAgMCAxLjEtNC4xMjRINTQuNzk4bDUuMzYzIDEwLjUzOHoiLz48cGF0aCBmaWxsPSIjMDA4MzJkIiBkPSJNNDAgMjIuOTEgNTIuNiAxLjFDNTEuMzYzLjM2NyA0OS45NDMgMCA0OC40NzcgMEgzMS41MjRjLTEuNDY2IDAtMi44ODcuNDEyLTQuMTI0IDEuMXoiLz48cGF0aCBmaWxsPSIjMjY4NGZjIiBkPSJNNTQuNzk5IDQ4LjU2OEgyNS4ybC0xMi42IDIxLjgxYzEuMjM3LjczMyAyLjY1NyAxLjEgNC4xMjQgMS4xaDQ2LjU1MmMxLjQ2NiAwIDIuODg3LS40MTIgNC4xMjQtMS4xeiIvPjxwYXRoIGZpbGw9IiNmZmJhMDAiIGQ9Ik02Ny4yNjIgMjQuMjg0IDU1LjYyNCA0LjEyNEM1NC44OTEgMi44NDEgNTMuODM3IDEuODMzIDUyLjYgMS4xTDQwIDIyLjkxbDE0LjggMjUuNjU5aDI1LjE1NWE4LjMgOC4zIDAgMCAwLTEuMS00LjEyNHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Google Drive Trigger","typeVersion":1,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":1119,"icon":"fa:robot","name":"@n8n/n8n-nodes-langchain.agent","codex":{"data":{"alias":["LangChain","Chat","Conversational","Plan and Execute","ReAct","Tools"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"AI Agent","color":"#404040"},"iconData":{"icon":"robot","type":"icon"},"displayName":"AI Agent","typeVersion":3,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1153,"icon":"file:openAiLight.svg","name":"@n8n/n8n-nodes-langchain.lmChatOpenAi","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatopenai/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Language Models","Root Nodes"],"Language Models":["Chat Models (Recommended)"]}}},"group":"[\"transform\"]","defaults":{"name":"OpenAI Chat Model"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg0IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NyAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MiA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSIjN0Q3RDg3Ii8+Cjwvc3ZnPgo="},"displayName":"OpenAI Chat Model","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":17,"name":"HR"},{"id":51,"name":"Multimodal AI"}],"image":[]}}