[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-n8n-n8n-agents-official":3,"mdc-98dsnx-key":32,"related-repo-n8n-n8n-agents-official":3197,"related-org-n8n-n8n-agents-official":3294},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":30,"mdContent":31},"n8n-agents-official","build AI agents in n8n","Use when building or editing any AI feature in n8n: AI Agents, Text Classifier, Information Extractor, Sentiment Analysis, Summarization Chain, Basic LLM Chain, embeddings, vector stores, single one-shot LLM calls, or AI media generation (image \u002F audio \u002F video) via the native LangChain provider nodes. Triggers on any `@n8n\u002Fn8n-nodes-langchain.*` node, \"agent\", \"chat assistant\", \"LLM with tools\", \"tool calling\", \"fromAi\", \"system prompt\", \"memory window\", \"structured output\", \"outputParser\", \"function calling\", \"RAG\", \"vector store\", \"embeddings\", \"classify with AI\", \"extract fields with LLM\", \"sentiment analysis\", \"summarize with LLM\", \"single LLM call\", chat triggers with files, AI image \u002F video \u002F audio generation, or any multi-turn or one-shot LLM behavior.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},"n8n","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fn8n.png","n8n-io",[12,16,19],{"name":13,"slug":14,"type":15},"LLM","llm","tag",{"name":17,"slug":18,"type":15},"Agents","agents",{"name":20,"slug":21,"type":15},"Workflow Automation","workflow-automation",319,"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fskills","2026-07-08T05:44:47.938896",null,30,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":25},[],"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fn8n-agents-official","---\nname: n8n-agents-official\ndescription: 'Use when building or editing any AI feature in n8n: AI Agents, Text Classifier, Information Extractor, Sentiment Analysis, Summarization Chain, Basic LLM Chain, embeddings, vector stores, single one-shot LLM calls, or AI media generation (image \u002F audio \u002F video) via the native LangChain provider nodes. Triggers on any `@n8n\u002Fn8n-nodes-langchain.*` node, \"agent\", \"chat assistant\", \"LLM with tools\", \"tool calling\", \"fromAi\", \"system prompt\", \"memory window\", \"structured output\", \"outputParser\", \"function calling\", \"RAG\", \"vector store\", \"embeddings\", \"classify with AI\", \"extract fields with LLM\", \"sentiment analysis\", \"summarize with LLM\", \"single LLM call\", chat triggers with files, AI image \u002F video \u002F audio generation, or any multi-turn or one-shot LLM behavior.'\n---\n\n# n8n Agents\n\nThe n8n Agent node (`@n8n\u002Fn8n-nodes-langchain.agent`) is a multi-turn LLM driver with sub-nodes for the model, memory, tools, and optional output parser.\n\n## When to use the Agent node vs raw chat completion\n\nDecision:\n\n- **Need tool calls, multi-turn reasoning, or memory?** Agent. Also a fine default when you don't want to think about it: standardizing on Agent across the workflow is reasonable and makes the path to upgrade simpler.\n- **Want the lightest possible single-shot text-out call?** Basic LLM Chain (`@n8n\u002Fn8n-nodes-langchain.chainLlm`) with a chat-model sub-node (`OpenRouter Chat Model`, `OpenAI Chat Model`, `Anthropic Chat Model`, etc.). No agent loop, no tool\u002Fmemory\u002Fparser slots, easier to debug. Note: chat-model nodes are sub-nodes, and they don't run standalone. They wire into a chain or agent. Agent works here too if you'd rather standardize.\n- **Routing to one of N output branches based on natural-language input (the AI's job is to pick the branch)?** Use the Text Classifier node (`@n8n\u002Fn8n-nodes-langchain.textClassifier`). N output handles, one per category, and downstream paths wire directly into each. Every category needs both a name AND a description (the description is what the model picks against, names alone aren't enough). Set `options.enableAutoFixing: true` for robustness on edge inputs. Pair with a chat-model sub-node (`OpenRouter Chat Model`, `OpenAI Chat Model`, etc.). Don't reach for Agent + Switch for this. Text Classifier is one node and purpose-built.\n- **Structured output but no tools?** Agent is the easier default with future expansion in mind. Basic LLM Chain also accepts an `outputParserStructured` sub-node and works fine where you want the lighter node.\n- **Image \u002F audio \u002F video generation?** The native single-call node for that provider when calling them directly (OpenAI Image, Gemini Image, ElevenLabs, etc.). HTTP Request when routing through an aggregator (OpenRouter, Together, etc.), because no native aggregator node exists and the native nodes hardcode their provider's base URL on the media operation. **Don't wrap media generation in an Agent**, see \"Binary and the agent boundary\" below.\n\nThere are other LangChain \"chain\" \u002F utility nodes for narrow tasks: Information Extractor (pull structured fields from text), Sentiment Analysis (3-way branch), Summarization Chain, Basic LLM Chain.\n\nAgent is a reasonable default for most LLM steps. Reach for Basic LLM Chain when you specifically want the leaner node for a one-shot text call with no tools, memory, or iteration. Reach for Information Extractor \u002F Sentiment Analysis \u002F Summarization Chain \u002F Text Classifier when one of those purpose-built nodes matches the task exactly.\n\n## Non-negotiables\n\n1. **Tool names and descriptions are part of the prompt.** The model picks tools by name and description. Vague tool node names like (`doStuff`) or weak descriptions (\"does things with the data\") cause silent failure: the model skips your tool, mis-selects it, or hallucinates parameters. Treat both like API design. See `references\u002FTOOLS.md`.\n2. **Structured output: parse AND autoFix.** `outputParserStructured` with `autoFix: true` and a coding-capable fixer model (e.g., Claude Sonnet 4.6) is the production pattern.\n\n## Strong defaults\n\n- **Tool descriptions are modular prompt fragments.** Anything specific to *how to call this tool* belongs in the tool's description, not the system prompt. Keeps the system prompt focused, and tools become reusable across agents. See `references\u002FSYSTEM_PROMPT.md`.\n- **Sub-workflow tools (`toolWorkflow`) for anything multi-step.** Any workflow becomes a tool with typed `fromAi()` inputs, and composes with branching, error handling, sub-workflows. See `references\u002FSUBWORKFLOW_AS_TOOL.md`.\n- **Wrap tools with user-visible side effects in human review.** Sends, payments, refunds, account changes. Gate them behind a Slack \u002F Chat \u002F Discord \u002F Telegram approval node so a human signs off before the tool runs. See `references\u002FHUMAN_REVIEW.md`.\n\n## The sub-node pattern\n\nThe Agent node has a main input (the prompt or user message) and sub-node inputs:\n\n```ts\nconst aiAgent = node({\n    type: '@n8n\u002Fn8n-nodes-langchain.agent',\n    config: {\n        name: 'Customer Support Agent',\n        parameters: {\n            promptType: 'define',\n            text: '={{ $json.userMessage }}',\n            options: {\n                systemMessage: '...',\n                passthroughBinaryImages: true,    \u002F\u002F for vision \u002F multimodal\n            },\n        },\n        subnodes: {\n            model: openRouterModel,\n            memory: simpleMemory,\n            tools: [generateImage, editImage, searchKnowledgeBase],\n            outputParser: structuredParser,    \u002F\u002F optional\n        },\n    },\n})\n```\n\nThe four sub-node slots:\n\n- **`model`** (required): the language model. OpenAI, Anthropic, OpenRouter, etc. Use chat-model variants, not completion variants.\n- **`memory`** (optional): conversation memory. Without it, every call is stateless. See `references\u002FMEMORY.md`.\n- **`tools`** (optional, but the point of using an agent): tools the agent can call. See `references\u002FTOOLS.md`.\n- **`outputParser`** (optional): forces structured JSON output. See `references\u002FSTRUCTURED_OUTPUT.md`.\n\n## Triggers\n\nDifferent triggers shape the input differently:\n\n- **Chat Trigger (`@n8n\u002Fn8n-nodes-langchain.chatTrigger`)** with `availableInChat: true`: powers the canvas chat tester so you can poke at an agent while building it. Input is `{ chatInput, sessionId, files[] }`. `sessionId` is what memory keys on, so pass it through wherever conversation continuity is needed. Files come in via `files[]`, see binary section below. Not a production surface, use Slack \u002F Discord \u002F Teams \u002F Telegram \u002F webhook for that.\n- **Webhook**: arbitrary input shape, no session by default. Manage continuity by passing a session\u002Fconversation ID through the request body and forwarding it to the memory node.\n\u003C!-- TEMPORARY: update below this to include a link to the new agent paradigm when it is released -->\n- **External chat surface (Slack, Discord, Teams, Telegram)**: every chat-triggered workflow that posts replies MUST filter out the bot's own user ID, or it loops forever potentially crashing n8n. Prefer trigger-level filtering when the surface supports it (Slack's `options.userIds` is an exclusion list); otherwise filter in the first node after the trigger. Semantics differ per surface, see `references\u002FCHAT_AGENT_PATTERNS.md`. Beyond the anti-loop filter, a simple bot (trigger → agent → reply) is fine in one workflow. Split into a \"shell\" workflow + agent-core sub-workflow once you need loading UX, sub-agents, reuse across surfaces, or robust error handling.\n- **Manual \u002F Schedule**: ad-hoc invocations. Memory rarely useful unless explicitly continuing a previous run.\n- **Execute Workflow Trigger** (sub-workflow): when an agent is itself a tool of another agent. Treat the trigger's declared inputs as the contract.\n\n## Binary and the agent boundary\n\nThe model can *see* uploaded files (vision) via `passthroughBinaryImages: true`. But **tools cannot receive binary**, and `fromAi()` parameters are JSON only. Base64 is also not accepted by tools, even through non-AI bindings.\n\nWorkaround: pre-stage uploads to storage before the agent runs, inject the storage keys into the system prompt, tools accept the key as a string parameter and re-fetch internally. Full pattern in `n8n-binary-and-data-official` `references\u002FAGENT_TOOL_BINARY.md`.\n\nOn the output side: the Agent's output formatter is text-shaped (or structured-text when an `outputParser` is wired). When a model returns binary (image bytes, audio bytes, video), the Agent doesn't surface it at all. There's nothing to dig out downstream, and trying to recover it via a Code or Set node after the Agent does not work. **For one-shot media generation, use the provider's native single-call node directly such as `@n8n\u002Fn8n-nodes-langchain.googleGemini` or `@n8n\u002Fn8n-nodes-langchain.openAi`.**\n\nThe exception: when a media step genuinely belongs in an agent (one tool among several, picked based on conversation context, or editing a previously-generated image), the workaround is a tool sub-workflow that uploads the result to storage and returns a key or URL. Pattern in `n8n-binary-and-data-official` `references\u002FAGENT_TOOL_BINARY.md`. Don't reach for this by default. The upload + key + re-fetch path adds nodes and a storage dependency you don't otherwise need. Only when the orchestration actually requires an agent's tool selection.\n\n## What goes in the system prompt vs the tool description\n\n| Belongs in **system prompt** | Belongs in the **tool's description** |\n|---|---|\n| Persona, role, voice | What this specific tool does |\n| Output format rules (\"respond in markdown\") | When to use this tool vs others |\n| Refusal\u002Fsafety behavior | What each parameter means and its expected shape |\n| Display protocols (\"show images via `![]()` markdown\") | Examples of good vs bad invocations |\n| Universal context (current date, user role) | Tool-specific gotchas (rate limits, edge cases) |\n| Inter-tool flow (\"after generating, always show via display protocol\") | Tool-specific input transformations |\n\nBenefit: tools become reusable. A well-described tool works in any agent that drops it in. The system prompt stays focused on role and shared behavior.\n\nFor deeper guidance and worked examples, see `references\u002FSYSTEM_PROMPT.md` and `references\u002FTOOLS.md`.\n\n## Tool selection: the four types\n\nPick the lightest option that covers the job:\n\n- **Native n8n tool node exists?** (e.g., `slackTool`, `gmailTool`, `calculatorTool`) Use it. Lowest config overhead.\n    - **Native node is missing an operation or needs custom params** (e.g., a Notion endpoint the node doesn't expose, a non-standard header, a different pagination shape)? HTTP Request Tool with the service's \"Predefined Credential Type\". Reuses the existing OAuth \u002F API-key credential, gives full API access, no custom auth code.\n- **Multi-step logic, or reusing a sub-workflow already in the project?** Sub-workflow as tool (`toolWorkflow`). Anything you can build as a workflow becomes a tool with typed `fromAi()` inputs. The most powerful option in n8n, so default here when in doubt. See `references\u002FSUBWORKFLOW_AS_TOOL.md`.\n- **Calling an external HTTP API the agent should orchestrate directly?** HTTP Request Tool. Also good for slow async work via long-poll callback.\n- **Tool already exists as a published, MCP-accessible workflow?** MCP tool. Useful for cross-workflow agent capabilities. See `n8n-extending-mcp-official`.\n\nSee `references\u002FTOOLS.md` for deeper guidance on each option and how to wire `fromAi()` parameters.\n\n## Human review\n\nBefore adding or skipping human review on a tool, check with the user. Whether sign-off is needed is a product \u002F policy call (blast radius, audit requirements, how much they trust the model) that the user is better positioned to make than you. Surface the question, recommend based on the criteria below, and let them decide.\n\nWhen a tool's effects need human approval before execution (sends, payments, refunds, account changes, customer-facing actions), wrap it with a review tool node: `slackHitlTool`, `discordHitlTool`, `telegramHitlTool`, `gmailHitlTool`, etc. (n8n's node names use `Hitl` for the human-in-the-loop pattern, and \"human review\" is what it's called in the UI.) The review node sits between the wrapped tool and the agent on the `ai_tool` connection: the wrapped tool's `ai_tool` output wires into the review node, and the review node's `ai_tool` output wires into the Agent. The agent calls through, the review node pauses for approval, on approve, the wrapped tool runs.\n\nDefault to \u002F recommend human review when:\n\n- The tool sends, pays, refunds, or otherwise mutates user-visible state.\n- The approver is different from the chatter (manager-approves-customer-action, support team approves a customer-triggered refund).\n- The trigger is non-interactive (order, form, schedule) but the tool's effect needs human sign-off.\n\nApproval messages should display the **actual parameters the wrapped tool will receive**, not text the model paraphrases. Use `$tool.parameters.\u003Cname>` directly, or iterate over `$tool.parameters` to list every param. Don't fill the approval text via `fromAi()`. You'd be approving a paraphrase, not the literal call. Customize button labels with the actual values, e.g. `Approve {{ $tool.parameters.amount }} refund`.\n\nFull config patterns, per-platform setup, and the multi-channel approver pattern in `references\u002FHUMAN_REVIEW.md`.\n\n## Output parsing: when and how\n\nAdd an `outputParser` sub-node when downstream needs structured data, not free-form text.\n\n```ts\nconst parser = outputParser({\n    type: '@n8n\u002Fn8n-nodes-langchain.outputParserStructured',\n    config: {\n        parameters: {\n            schemaType: 'manual',\n            inputSchema: JSON.stringify({\n                type: 'object',\n                properties: {\n                    score: { type: 'integer', minimum: 1, maximum: 5 },\n                    category: { type: 'string', enum: ['bug', 'feature', 'question'] },\n                    reason: { type: 'string' },\n                    tags: { type: 'array', items: { type: 'string' } },\n                },\n                required: ['score', 'category', 'reason'],\n            }),\n            autoFix: true,\n            customizeRetryPrompt: true,\n            prompt: '...retry instructions...', \u002F\u002F generally leave as default\n        },\n        subnodes: {\n            languageModel: fixerModel,    \u002F\u002F coding-capable model, e.g. Claude Sonnet 4.6\n        },\n    },\n})\n```\n\n1. **Use `schemaType: 'manual'` with a real JSON schema, not `jsonSchemaExample`.** An example can't express optional fields, enums, value ranges, or array constraints, so you outgrow it the first time the shape gets non-trivial. A schema lets you mark fields required vs optional, define enums, constrain numbers and string formats, and gives the model clearer rules to follow. Reach for `schemaType: 'fromJson'` with an example only for one-off shapes you're certain will never grow constraints.\n2. **`autoFix: true` adds retry on parse failure.** Wire a coding-capable model as the fixer sub-node (e.g., Claude Sonnet 4.6 or similar). Fixing malformed JSON against a schema is a structured-output \u002F coding task, and a weak or generic model often produces another malformed retry, defeating the point.\n\nFor the full pattern including custom retry prompts, see `references\u002FSTRUCTURED_OUTPUT.md`.\n\n## Memory: brief mental model\n\n- **No memory:** stateless. Right for one-shot tasks (classify, summarize).\n- **`memoryBufferWindow`:** keeps the last N messages per memory key and persists across executions via n8n's internal store. The key is whatever expression you bind to `sessionKey`. Chat triggers fill `sessionId` automatically, but you can key on anything (Slack `thread_ts`, a webhook conversation ID, a multi-tenant composite). The default for chat memory. The \"window\" is the sliding cap on how many messages stay in context, not a scope on persistence.\n- **`memoryPostgres` \u002F `memoryRedis` \u002F similar:** reach for these when you need to query or read memory **outside** the agent: displaying conversation history in your own UI, analytics on past chats, or sharing memory with another system. Otherwise `memoryBufferWindow` is enough.\n\nPlumb a stable key from the trigger to memory consistently, or conversations get crossed. See `references\u002FMEMORY.md`.\n\n## RAG (retrieval augmented generation)\n\nn8n has the LangChain RAG primitives: document loaders, text splitters, embeddings, vector stores, retrievers, rerankers. The pieces work, but opinionated end-to-end recipes (\"which vector store, which chunking, when to rerank\") depend heavily on data shape and scale.\n\nThis skill keeps RAG opinions thin on purpose. See `references\u002FRAG.md` for more details on RAG.\n\n## Reference files\n\n| File | Read when |\n|---|---|\n| `references\u002FTOOLS.md` | Adding tools to an agent, choosing between the four tool types, writing tool names and descriptions |\n| `references\u002FSUBWORKFLOW_AS_TOOL.md` | Wiring a sub-workflow as an agent tool via `toolWorkflow`, mapping `fromAi` overrides |\n| `references\u002FSYSTEM_PROMPT.md` | Writing or refactoring a system prompt, deciding what goes in the system prompt vs tool descriptions |\n| `references\u002FSTRUCTURED_OUTPUT.md` | Forcing JSON output, configuring autoFix retries, validating downstream |\n| `references\u002FMEMORY.md` | Choosing a memory type, persistence and sessionId handling |\n| `references\u002FRAG.md` | Building retrieval-augmented agents, intentionally a stub |\n| `references\u002FHUMAN_REVIEW.md` | Adding human approval to a tool, configuring approval messages, multi-channel approver patterns |\n| `references\u002FCHAT_AGENT_PATTERNS.md` | Building a chat agent on Slack, Discord, Teams, Telegram, or any custom chat surface, multi-workflow shell + core + sub-agents topology |\n\n## Anti-patterns\n\n| Anti-pattern | What goes wrong | Fix |\n|---|---|---|\n| Generic tool names (`doStuff`, `runQuery`) | Model can't tell which tool to pick, skips them or hallucinates parameters | Verb-first specific names: `Search customer database`, `Generate image with Veo` |\n| Empty or one-line tool descriptions | Model has no clue when to invoke, bad selection | Write a real description: what it does, when to use, parameter meanings |\n| Cramming everything into the system prompt | Bloated prompt, reuse impossible, per-tool guidance buried | Move tool-specific instructions to tool descriptions, keep system prompt to persona + global rules |\n| Code-node tool where a sub-workflow would work | Not reusable, can't be tested independently, can't compose with branching | Use `toolWorkflow` with a proper sub-workflow |\n| Passing binary directly to a tool | Doesn't work, binary can't cross the tool boundary | Pre-stage to storage, pass keys via `fromAi`, tool fetches internally. See `n8n-binary-and-data-official` |\n| `outputParserStructured` without `autoFix` | One bad model output and the workflow fails | Set `autoFix: true` with a cheap fixer model |\n| Hardcoded `sessionId` or no sessionId | Conversations cross or memory never matches | Pass sessionId from trigger consistently to memory and tools |\n| Two near-identical tools instead of one with branching | Model gets confused, selection is non-deterministic | One tool with internal branching driven by parameters |\n| Hardcoding a system prompt that's reused across workflows or iterated often | Editing requires republishing, can't share across workflows, tuning churn lives in node JSON | Store in a Data Table, load at runtime |\n| Wrapping image \u002F audio \u002F video generation in an Agent | Binary doesn't flow through tools or out of the output formatter, Agent adds nodes for no gain | Use the provider's native single-call node directly (OpenAI Image, Gemini Image, ElevenLabs), HTTP Request only when going through an aggregator |\n| Reaching for Agent + Switch to route on natural-language input | Two nodes plus prompt boilerplate where Text Classifier is one node with N built-in output branches | Use Text Classifier (`@n8n\u002Fn8n-nodes-langchain.textClassifier`), each category gets its own output handle, wire downstream paths directly |\n| Tool that mutates user-visible state (send, pay, refund) without human review | Agent fires irreversible action on a wrong inference | Wrap with the review tool node that fits the channel (Slack\u002FChat\u002FDiscord\u002FTelegram), show actual params via `$tool.parameters` |\n| Filling the review approval message via `fromAi()` | The model paraphrases, you approve text not values | Use `$tool.parameters.\u003Cname>` directly so the literal call is visible |\n| Chat-triggered agent workflow that posts replies without filtering out the bot's own user ID | Bot's own messages re-trigger the workflow, infinite loop that burns runs and tokens until rate limits or n8n concurrency stops it | Prefer trigger-level filtering when available (Slack Trigger's `options.userIds` is an exclusion list, put the bot ID there). Otherwise filter on `$json.user !== '\u003CBOT_USER_ID>'` (or the surface equivalent) as the first node after the trigger. Required for ANY chat-triggered workflow that sends a reply (Slack, Discord, Teams, Telegram), regardless of complexity. See `references\u002FCHAT_AGENT_PATTERNS.md` for per-surface semantics |\n| Passing the bare blocks array to the Slack node's `blocksUi` when the agent returns Block Kit | The Slack node accepts the input silently and posts the message with no rich content; no error, no warning | Wrap as `{ \"blocks\": [...] }` with the value as a real array, not a stringified one. Expression: `={{ { \"blocks\": $('Agent').item.json.output.blocks } }}`. See `n8n-node-configuration-official` `references\u002FCOMMS_NODES.md` \"Block Kit messages\" |\n\n",{"data":33,"body":34},{"name":4,"description":6},{"type":35,"children":36},"root",[37,46,61,68,73,204,209,214,220,275,281,359,365,370,835,840,919,925,930,992,1041,1047,1081,1100,1132,1150,1156,1280,1285,1303,1309,1314,1419,1438,1444,1449,1513,1518,1536,1578,1589,1595,1607,2372,2423,2434,2440,2529,2540,2546,2551,2564,2570,2735,2741,3191],{"type":38,"tag":39,"props":40,"children":42},"element","h1",{"id":41},"n8n-agents",[43],{"type":44,"value":45},"text","n8n Agents",{"type":38,"tag":47,"props":48,"children":49},"p",{},[50,52,59],{"type":44,"value":51},"The n8n Agent node (",{"type":38,"tag":53,"props":54,"children":56},"code",{"className":55},[],[57],{"type":44,"value":58},"@n8n\u002Fn8n-nodes-langchain.agent",{"type":44,"value":60},") is a multi-turn LLM driver with sub-nodes for the model, memory, tools, and optional output parser.",{"type":38,"tag":62,"props":63,"children":65},"h2",{"id":64},"when-to-use-the-agent-node-vs-raw-chat-completion",[66],{"type":44,"value":67},"When to use the Agent node vs raw chat completion",{"type":38,"tag":47,"props":69,"children":70},{},[71],{"type":44,"value":72},"Decision:",{"type":38,"tag":74,"props":75,"children":76},"ul",{},[77,89,130,169,187],{"type":38,"tag":78,"props":79,"children":80},"li",{},[81,87],{"type":38,"tag":82,"props":83,"children":84},"strong",{},[85],{"type":44,"value":86},"Need tool calls, multi-turn reasoning, or memory?",{"type":44,"value":88}," Agent. Also a fine default when you don't want to think about it: standardizing on Agent across the workflow is reasonable and makes the path to upgrade simpler.",{"type":38,"tag":78,"props":90,"children":91},{},[92,97,99,105,107,113,115,121,122,128],{"type":38,"tag":82,"props":93,"children":94},{},[95],{"type":44,"value":96},"Want the lightest possible single-shot text-out call?",{"type":44,"value":98}," Basic LLM Chain (",{"type":38,"tag":53,"props":100,"children":102},{"className":101},[],[103],{"type":44,"value":104},"@n8n\u002Fn8n-nodes-langchain.chainLlm",{"type":44,"value":106},") with a chat-model sub-node (",{"type":38,"tag":53,"props":108,"children":110},{"className":109},[],[111],{"type":44,"value":112},"OpenRouter Chat Model",{"type":44,"value":114},", ",{"type":38,"tag":53,"props":116,"children":118},{"className":117},[],[119],{"type":44,"value":120},"OpenAI Chat Model",{"type":44,"value":114},{"type":38,"tag":53,"props":123,"children":125},{"className":124},[],[126],{"type":44,"value":127},"Anthropic Chat Model",{"type":44,"value":129},", etc.). No agent loop, no tool\u002Fmemory\u002Fparser slots, easier to debug. Note: chat-model nodes are sub-nodes, and they don't run standalone. They wire into a chain or agent. Agent works here too if you'd rather standardize.",{"type":38,"tag":78,"props":131,"children":132},{},[133,138,140,146,148,154,156,161,162,167],{"type":38,"tag":82,"props":134,"children":135},{},[136],{"type":44,"value":137},"Routing to one of N output branches based on natural-language input (the AI's job is to pick the branch)?",{"type":44,"value":139}," Use the Text Classifier node (",{"type":38,"tag":53,"props":141,"children":143},{"className":142},[],[144],{"type":44,"value":145},"@n8n\u002Fn8n-nodes-langchain.textClassifier",{"type":44,"value":147},"). N output handles, one per category, and downstream paths wire directly into each. Every category needs both a name AND a description (the description is what the model picks against, names alone aren't enough). Set ",{"type":38,"tag":53,"props":149,"children":151},{"className":150},[],[152],{"type":44,"value":153},"options.enableAutoFixing: true",{"type":44,"value":155}," for robustness on edge inputs. Pair with a chat-model sub-node (",{"type":38,"tag":53,"props":157,"children":159},{"className":158},[],[160],{"type":44,"value":112},{"type":44,"value":114},{"type":38,"tag":53,"props":163,"children":165},{"className":164},[],[166],{"type":44,"value":120},{"type":44,"value":168},", etc.). Don't reach for Agent + Switch for this. Text Classifier is one node and purpose-built.",{"type":38,"tag":78,"props":170,"children":171},{},[172,177,179,185],{"type":38,"tag":82,"props":173,"children":174},{},[175],{"type":44,"value":176},"Structured output but no tools?",{"type":44,"value":178}," Agent is the easier default with future expansion in mind. Basic LLM Chain also accepts an ",{"type":38,"tag":53,"props":180,"children":182},{"className":181},[],[183],{"type":44,"value":184},"outputParserStructured",{"type":44,"value":186}," sub-node and works fine where you want the lighter node.",{"type":38,"tag":78,"props":188,"children":189},{},[190,195,197,202],{"type":38,"tag":82,"props":191,"children":192},{},[193],{"type":44,"value":194},"Image \u002F audio \u002F video generation?",{"type":44,"value":196}," The native single-call node for that provider when calling them directly (OpenAI Image, Gemini Image, ElevenLabs, etc.). HTTP Request when routing through an aggregator (OpenRouter, Together, etc.), because no native aggregator node exists and the native nodes hardcode their provider's base URL on the media operation. ",{"type":38,"tag":82,"props":198,"children":199},{},[200],{"type":44,"value":201},"Don't wrap media generation in an Agent",{"type":44,"value":203},", see \"Binary and the agent boundary\" below.",{"type":38,"tag":47,"props":205,"children":206},{},[207],{"type":44,"value":208},"There are other LangChain \"chain\" \u002F utility nodes for narrow tasks: Information Extractor (pull structured fields from text), Sentiment Analysis (3-way branch), Summarization Chain, Basic LLM Chain.",{"type":38,"tag":47,"props":210,"children":211},{},[212],{"type":44,"value":213},"Agent is a reasonable default for most LLM steps. Reach for Basic LLM Chain when you specifically want the leaner node for a one-shot text call with no tools, memory, or iteration. Reach for Information Extractor \u002F Sentiment Analysis \u002F Summarization Chain \u002F Text Classifier when one of those purpose-built nodes matches the task exactly.",{"type":38,"tag":62,"props":215,"children":217},{"id":216},"non-negotiables",[218],{"type":44,"value":219},"Non-negotiables",{"type":38,"tag":221,"props":222,"children":223},"ol",{},[224,250],{"type":38,"tag":78,"props":225,"children":226},{},[227,232,234,240,242,248],{"type":38,"tag":82,"props":228,"children":229},{},[230],{"type":44,"value":231},"Tool names and descriptions are part of the prompt.",{"type":44,"value":233}," The model picks tools by name and description. Vague tool node names like (",{"type":38,"tag":53,"props":235,"children":237},{"className":236},[],[238],{"type":44,"value":239},"doStuff",{"type":44,"value":241},") or weak descriptions (\"does things with the data\") cause silent failure: the model skips your tool, mis-selects it, or hallucinates parameters. Treat both like API design. See ",{"type":38,"tag":53,"props":243,"children":245},{"className":244},[],[246],{"type":44,"value":247},"references\u002FTOOLS.md",{"type":44,"value":249},".",{"type":38,"tag":78,"props":251,"children":252},{},[253,258,260,265,267,273],{"type":38,"tag":82,"props":254,"children":255},{},[256],{"type":44,"value":257},"Structured output: parse AND autoFix.",{"type":44,"value":259}," ",{"type":38,"tag":53,"props":261,"children":263},{"className":262},[],[264],{"type":44,"value":184},{"type":44,"value":266}," with ",{"type":38,"tag":53,"props":268,"children":270},{"className":269},[],[271],{"type":44,"value":272},"autoFix: true",{"type":44,"value":274}," and a coding-capable fixer model (e.g., Claude Sonnet 4.6) is the production pattern.",{"type":38,"tag":62,"props":276,"children":278},{"id":277},"strong-defaults",[279],{"type":44,"value":280},"Strong defaults",{"type":38,"tag":74,"props":282,"children":283},{},[284,309,342],{"type":38,"tag":78,"props":285,"children":286},{},[287,292,294,300,302,308],{"type":38,"tag":82,"props":288,"children":289},{},[290],{"type":44,"value":291},"Tool descriptions are modular prompt fragments.",{"type":44,"value":293}," Anything specific to ",{"type":38,"tag":295,"props":296,"children":297},"em",{},[298],{"type":44,"value":299},"how to call this tool",{"type":44,"value":301}," belongs in the tool's description, not the system prompt. Keeps the system prompt focused, and tools become reusable across agents. See ",{"type":38,"tag":53,"props":303,"children":305},{"className":304},[],[306],{"type":44,"value":307},"references\u002FSYSTEM_PROMPT.md",{"type":44,"value":249},{"type":38,"tag":78,"props":310,"children":311},{},[312,325,327,333,335,341],{"type":38,"tag":82,"props":313,"children":314},{},[315,317,323],{"type":44,"value":316},"Sub-workflow tools (",{"type":38,"tag":53,"props":318,"children":320},{"className":319},[],[321],{"type":44,"value":322},"toolWorkflow",{"type":44,"value":324},") for anything multi-step.",{"type":44,"value":326}," Any workflow becomes a tool with typed ",{"type":38,"tag":53,"props":328,"children":330},{"className":329},[],[331],{"type":44,"value":332},"fromAi()",{"type":44,"value":334}," inputs, and composes with branching, error handling, sub-workflows. See ",{"type":38,"tag":53,"props":336,"children":338},{"className":337},[],[339],{"type":44,"value":340},"references\u002FSUBWORKFLOW_AS_TOOL.md",{"type":44,"value":249},{"type":38,"tag":78,"props":343,"children":344},{},[345,350,352,358],{"type":38,"tag":82,"props":346,"children":347},{},[348],{"type":44,"value":349},"Wrap tools with user-visible side effects in human review.",{"type":44,"value":351}," Sends, payments, refunds, account changes. Gate them behind a Slack \u002F Chat \u002F Discord \u002F Telegram approval node so a human signs off before the tool runs. See ",{"type":38,"tag":53,"props":353,"children":355},{"className":354},[],[356],{"type":44,"value":357},"references\u002FHUMAN_REVIEW.md",{"type":44,"value":249},{"type":38,"tag":62,"props":360,"children":362},{"id":361},"the-sub-node-pattern",[363],{"type":44,"value":364},"The sub-node pattern",{"type":38,"tag":47,"props":366,"children":367},{},[368],{"type":44,"value":369},"The Agent node has a main input (the prompt or user message) and sub-node inputs:",{"type":38,"tag":371,"props":372,"children":377},"pre",{"className":373,"code":374,"language":375,"meta":376,"style":376},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const aiAgent = node({\n    type: '@n8n\u002Fn8n-nodes-langchain.agent',\n    config: {\n        name: 'Customer Support Agent',\n        parameters: {\n            promptType: 'define',\n            text: '={{ $json.userMessage }}',\n            options: {\n                systemMessage: '...',\n                passthroughBinaryImages: true,    \u002F\u002F for vision \u002F multimodal\n            },\n        },\n        subnodes: {\n            model: openRouterModel,\n            memory: simpleMemory,\n            tools: [generateImage, editImage, searchKnowledgeBase],\n            outputParser: structuredParser,    \u002F\u002F optional\n        },\n    },\n})\n","ts","",[378],{"type":38,"tag":53,"props":379,"children":380},{"__ignoreMap":376},[381,421,456,474,504,521,551,581,598,628,658,667,676,693,715,737,777,804,812,821],{"type":38,"tag":382,"props":383,"children":386},"span",{"class":384,"line":385},"line",1,[387,393,399,405,411,416],{"type":38,"tag":382,"props":388,"children":390},{"style":389},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[391],{"type":44,"value":392},"const",{"type":38,"tag":382,"props":394,"children":396},{"style":395},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[397],{"type":44,"value":398}," aiAgent ",{"type":38,"tag":382,"props":400,"children":402},{"style":401},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[403],{"type":44,"value":404},"=",{"type":38,"tag":382,"props":406,"children":408},{"style":407},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[409],{"type":44,"value":410}," node",{"type":38,"tag":382,"props":412,"children":413},{"style":395},[414],{"type":44,"value":415},"(",{"type":38,"tag":382,"props":417,"children":418},{"style":401},[419],{"type":44,"value":420},"{\n",{"type":38,"tag":382,"props":422,"children":424},{"class":384,"line":423},2,[425,431,436,441,446,451],{"type":38,"tag":382,"props":426,"children":428},{"style":427},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[429],{"type":44,"value":430},"    type",{"type":38,"tag":382,"props":432,"children":433},{"style":401},[434],{"type":44,"value":435},":",{"type":38,"tag":382,"props":437,"children":438},{"style":401},[439],{"type":44,"value":440}," '",{"type":38,"tag":382,"props":442,"children":444},{"style":443},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[445],{"type":44,"value":58},{"type":38,"tag":382,"props":447,"children":448},{"style":401},[449],{"type":44,"value":450},"'",{"type":38,"tag":382,"props":452,"children":453},{"style":401},[454],{"type":44,"value":455},",\n",{"type":38,"tag":382,"props":457,"children":459},{"class":384,"line":458},3,[460,465,469],{"type":38,"tag":382,"props":461,"children":462},{"style":427},[463],{"type":44,"value":464},"    config",{"type":38,"tag":382,"props":466,"children":467},{"style":401},[468],{"type":44,"value":435},{"type":38,"tag":382,"props":470,"children":471},{"style":401},[472],{"type":44,"value":473}," {\n",{"type":38,"tag":382,"props":475,"children":477},{"class":384,"line":476},4,[478,483,487,491,496,500],{"type":38,"tag":382,"props":479,"children":480},{"style":427},[481],{"type":44,"value":482},"        name",{"type":38,"tag":382,"props":484,"children":485},{"style":401},[486],{"type":44,"value":435},{"type":38,"tag":382,"props":488,"children":489},{"style":401},[490],{"type":44,"value":440},{"type":38,"tag":382,"props":492,"children":493},{"style":443},[494],{"type":44,"value":495},"Customer Support Agent",{"type":38,"tag":382,"props":497,"children":498},{"style":401},[499],{"type":44,"value":450},{"type":38,"tag":382,"props":501,"children":502},{"style":401},[503],{"type":44,"value":455},{"type":38,"tag":382,"props":505,"children":507},{"class":384,"line":506},5,[508,513,517],{"type":38,"tag":382,"props":509,"children":510},{"style":427},[511],{"type":44,"value":512},"        parameters",{"type":38,"tag":382,"props":514,"children":515},{"style":401},[516],{"type":44,"value":435},{"type":38,"tag":382,"props":518,"children":519},{"style":401},[520],{"type":44,"value":473},{"type":38,"tag":382,"props":522,"children":524},{"class":384,"line":523},6,[525,530,534,538,543,547],{"type":38,"tag":382,"props":526,"children":527},{"style":427},[528],{"type":44,"value":529},"            promptType",{"type":38,"tag":382,"props":531,"children":532},{"style":401},[533],{"type":44,"value":435},{"type":38,"tag":382,"props":535,"children":536},{"style":401},[537],{"type":44,"value":440},{"type":38,"tag":382,"props":539,"children":540},{"style":443},[541],{"type":44,"value":542},"define",{"type":38,"tag":382,"props":544,"children":545},{"style":401},[546],{"type":44,"value":450},{"type":38,"tag":382,"props":548,"children":549},{"style":401},[550],{"type":44,"value":455},{"type":38,"tag":382,"props":552,"children":554},{"class":384,"line":553},7,[555,560,564,568,573,577],{"type":38,"tag":382,"props":556,"children":557},{"style":427},[558],{"type":44,"value":559},"            text",{"type":38,"tag":382,"props":561,"children":562},{"style":401},[563],{"type":44,"value":435},{"type":38,"tag":382,"props":565,"children":566},{"style":401},[567],{"type":44,"value":440},{"type":38,"tag":382,"props":569,"children":570},{"style":443},[571],{"type":44,"value":572},"={{ $json.userMessage }}",{"type":38,"tag":382,"props":574,"children":575},{"style":401},[576],{"type":44,"value":450},{"type":38,"tag":382,"props":578,"children":579},{"style":401},[580],{"type":44,"value":455},{"type":38,"tag":382,"props":582,"children":584},{"class":384,"line":583},8,[585,590,594],{"type":38,"tag":382,"props":586,"children":587},{"style":427},[588],{"type":44,"value":589},"            options",{"type":38,"tag":382,"props":591,"children":592},{"style":401},[593],{"type":44,"value":435},{"type":38,"tag":382,"props":595,"children":596},{"style":401},[597],{"type":44,"value":473},{"type":38,"tag":382,"props":599,"children":601},{"class":384,"line":600},9,[602,607,611,615,620,624],{"type":38,"tag":382,"props":603,"children":604},{"style":427},[605],{"type":44,"value":606},"                systemMessage",{"type":38,"tag":382,"props":608,"children":609},{"style":401},[610],{"type":44,"value":435},{"type":38,"tag":382,"props":612,"children":613},{"style":401},[614],{"type":44,"value":440},{"type":38,"tag":382,"props":616,"children":617},{"style":443},[618],{"type":44,"value":619},"...",{"type":38,"tag":382,"props":621,"children":622},{"style":401},[623],{"type":44,"value":450},{"type":38,"tag":382,"props":625,"children":626},{"style":401},[627],{"type":44,"value":455},{"type":38,"tag":382,"props":629,"children":631},{"class":384,"line":630},10,[632,637,641,647,652],{"type":38,"tag":382,"props":633,"children":634},{"style":427},[635],{"type":44,"value":636},"                passthroughBinaryImages",{"type":38,"tag":382,"props":638,"children":639},{"style":401},[640],{"type":44,"value":435},{"type":38,"tag":382,"props":642,"children":644},{"style":643},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[645],{"type":44,"value":646}," true",{"type":38,"tag":382,"props":648,"children":649},{"style":401},[650],{"type":44,"value":651},",",{"type":38,"tag":382,"props":653,"children":655},{"style":654},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[656],{"type":44,"value":657},"    \u002F\u002F for vision \u002F multimodal\n",{"type":38,"tag":382,"props":659,"children":661},{"class":384,"line":660},11,[662],{"type":38,"tag":382,"props":663,"children":664},{"style":401},[665],{"type":44,"value":666},"            },\n",{"type":38,"tag":382,"props":668,"children":670},{"class":384,"line":669},12,[671],{"type":38,"tag":382,"props":672,"children":673},{"style":401},[674],{"type":44,"value":675},"        },\n",{"type":38,"tag":382,"props":677,"children":679},{"class":384,"line":678},13,[680,685,689],{"type":38,"tag":382,"props":681,"children":682},{"style":427},[683],{"type":44,"value":684},"        subnodes",{"type":38,"tag":382,"props":686,"children":687},{"style":401},[688],{"type":44,"value":435},{"type":38,"tag":382,"props":690,"children":691},{"style":401},[692],{"type":44,"value":473},{"type":38,"tag":382,"props":694,"children":696},{"class":384,"line":695},14,[697,702,706,711],{"type":38,"tag":382,"props":698,"children":699},{"style":427},[700],{"type":44,"value":701},"            model",{"type":38,"tag":382,"props":703,"children":704},{"style":401},[705],{"type":44,"value":435},{"type":38,"tag":382,"props":707,"children":708},{"style":395},[709],{"type":44,"value":710}," openRouterModel",{"type":38,"tag":382,"props":712,"children":713},{"style":401},[714],{"type":44,"value":455},{"type":38,"tag":382,"props":716,"children":718},{"class":384,"line":717},15,[719,724,728,733],{"type":38,"tag":382,"props":720,"children":721},{"style":427},[722],{"type":44,"value":723},"            memory",{"type":38,"tag":382,"props":725,"children":726},{"style":401},[727],{"type":44,"value":435},{"type":38,"tag":382,"props":729,"children":730},{"style":395},[731],{"type":44,"value":732}," simpleMemory",{"type":38,"tag":382,"props":734,"children":735},{"style":401},[736],{"type":44,"value":455},{"type":38,"tag":382,"props":738,"children":740},{"class":384,"line":739},16,[741,746,750,755,759,764,768,773],{"type":38,"tag":382,"props":742,"children":743},{"style":427},[744],{"type":44,"value":745},"            tools",{"type":38,"tag":382,"props":747,"children":748},{"style":401},[749],{"type":44,"value":435},{"type":38,"tag":382,"props":751,"children":752},{"style":395},[753],{"type":44,"value":754}," [generateImage",{"type":38,"tag":382,"props":756,"children":757},{"style":401},[758],{"type":44,"value":651},{"type":38,"tag":382,"props":760,"children":761},{"style":395},[762],{"type":44,"value":763}," editImage",{"type":38,"tag":382,"props":765,"children":766},{"style":401},[767],{"type":44,"value":651},{"type":38,"tag":382,"props":769,"children":770},{"style":395},[771],{"type":44,"value":772}," searchKnowledgeBase]",{"type":38,"tag":382,"props":774,"children":775},{"style":401},[776],{"type":44,"value":455},{"type":38,"tag":382,"props":778,"children":780},{"class":384,"line":779},17,[781,786,790,795,799],{"type":38,"tag":382,"props":782,"children":783},{"style":427},[784],{"type":44,"value":785},"            outputParser",{"type":38,"tag":382,"props":787,"children":788},{"style":401},[789],{"type":44,"value":435},{"type":38,"tag":382,"props":791,"children":792},{"style":395},[793],{"type":44,"value":794}," structuredParser",{"type":38,"tag":382,"props":796,"children":797},{"style":401},[798],{"type":44,"value":651},{"type":38,"tag":382,"props":800,"children":801},{"style":654},[802],{"type":44,"value":803},"    \u002F\u002F optional\n",{"type":38,"tag":382,"props":805,"children":807},{"class":384,"line":806},18,[808],{"type":38,"tag":382,"props":809,"children":810},{"style":401},[811],{"type":44,"value":675},{"type":38,"tag":382,"props":813,"children":815},{"class":384,"line":814},19,[816],{"type":38,"tag":382,"props":817,"children":818},{"style":401},[819],{"type":44,"value":820},"    },\n",{"type":38,"tag":382,"props":822,"children":824},{"class":384,"line":823},20,[825,830],{"type":38,"tag":382,"props":826,"children":827},{"style":401},[828],{"type":44,"value":829},"}",{"type":38,"tag":382,"props":831,"children":832},{"style":395},[833],{"type":44,"value":834},")\n",{"type":38,"tag":47,"props":836,"children":837},{},[838],{"type":44,"value":839},"The four sub-node slots:",{"type":38,"tag":74,"props":841,"children":842},{},[843,857,878,898],{"type":38,"tag":78,"props":844,"children":845},{},[846,855],{"type":38,"tag":82,"props":847,"children":848},{},[849],{"type":38,"tag":53,"props":850,"children":852},{"className":851},[],[853],{"type":44,"value":854},"model",{"type":44,"value":856}," (required): the language model. OpenAI, Anthropic, OpenRouter, etc. Use chat-model variants, not completion variants.",{"type":38,"tag":78,"props":858,"children":859},{},[860,869,871,877],{"type":38,"tag":82,"props":861,"children":862},{},[863],{"type":38,"tag":53,"props":864,"children":866},{"className":865},[],[867],{"type":44,"value":868},"memory",{"type":44,"value":870}," (optional): conversation memory. Without it, every call is stateless. See ",{"type":38,"tag":53,"props":872,"children":874},{"className":873},[],[875],{"type":44,"value":876},"references\u002FMEMORY.md",{"type":44,"value":249},{"type":38,"tag":78,"props":879,"children":880},{},[881,890,892,897],{"type":38,"tag":82,"props":882,"children":883},{},[884],{"type":38,"tag":53,"props":885,"children":887},{"className":886},[],[888],{"type":44,"value":889},"tools",{"type":44,"value":891}," (optional, but the point of using an agent): tools the agent can call. See ",{"type":38,"tag":53,"props":893,"children":895},{"className":894},[],[896],{"type":44,"value":247},{"type":44,"value":249},{"type":38,"tag":78,"props":899,"children":900},{},[901,910,912,918],{"type":38,"tag":82,"props":902,"children":903},{},[904],{"type":38,"tag":53,"props":905,"children":907},{"className":906},[],[908],{"type":44,"value":909},"outputParser",{"type":44,"value":911}," (optional): forces structured JSON output. See ",{"type":38,"tag":53,"props":913,"children":915},{"className":914},[],[916],{"type":44,"value":917},"references\u002FSTRUCTURED_OUTPUT.md",{"type":44,"value":249},{"type":38,"tag":62,"props":920,"children":922},{"id":921},"triggers",[923],{"type":44,"value":924},"Triggers",{"type":38,"tag":47,"props":926,"children":927},{},[928],{"type":44,"value":929},"Different triggers shape the input differently:",{"type":38,"tag":74,"props":931,"children":932},{},[933,982],{"type":38,"tag":78,"props":934,"children":935},{},[936,949,950,956,958,964,966,972,974,980],{"type":38,"tag":82,"props":937,"children":938},{},[939,941,947],{"type":44,"value":940},"Chat Trigger (",{"type":38,"tag":53,"props":942,"children":944},{"className":943},[],[945],{"type":44,"value":946},"@n8n\u002Fn8n-nodes-langchain.chatTrigger",{"type":44,"value":948},")",{"type":44,"value":266},{"type":38,"tag":53,"props":951,"children":953},{"className":952},[],[954],{"type":44,"value":955},"availableInChat: true",{"type":44,"value":957},": powers the canvas chat tester so you can poke at an agent while building it. Input is ",{"type":38,"tag":53,"props":959,"children":961},{"className":960},[],[962],{"type":44,"value":963},"{ chatInput, sessionId, files[] }",{"type":44,"value":965},". ",{"type":38,"tag":53,"props":967,"children":969},{"className":968},[],[970],{"type":44,"value":971},"sessionId",{"type":44,"value":973}," is what memory keys on, so pass it through wherever conversation continuity is needed. Files come in via ",{"type":38,"tag":53,"props":975,"children":977},{"className":976},[],[978],{"type":44,"value":979},"files[]",{"type":44,"value":981},", see binary section below. Not a production surface, use Slack \u002F Discord \u002F Teams \u002F Telegram \u002F webhook for that.",{"type":38,"tag":78,"props":983,"children":984},{},[985,990],{"type":38,"tag":82,"props":986,"children":987},{},[988],{"type":44,"value":989},"Webhook",{"type":44,"value":991},": arbitrary input shape, no session by default. Manage continuity by passing a session\u002Fconversation ID through the request body and forwarding it to the memory node.",{"type":38,"tag":74,"props":993,"children":994},{},[995,1021,1031],{"type":38,"tag":78,"props":996,"children":997},{},[998,1003,1005,1011,1013,1019],{"type":38,"tag":82,"props":999,"children":1000},{},[1001],{"type":44,"value":1002},"External chat surface (Slack, Discord, Teams, Telegram)",{"type":44,"value":1004},": every chat-triggered workflow that posts replies MUST filter out the bot's own user ID, or it loops forever potentially crashing n8n. Prefer trigger-level filtering when the surface supports it (Slack's ",{"type":38,"tag":53,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":44,"value":1010},"options.userIds",{"type":44,"value":1012}," is an exclusion list); otherwise filter in the first node after the trigger. Semantics differ per surface, see ",{"type":38,"tag":53,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":44,"value":1018},"references\u002FCHAT_AGENT_PATTERNS.md",{"type":44,"value":1020},". Beyond the anti-loop filter, a simple bot (trigger → agent → reply) is fine in one workflow. Split into a \"shell\" workflow + agent-core sub-workflow once you need loading UX, sub-agents, reuse across surfaces, or robust error handling.",{"type":38,"tag":78,"props":1022,"children":1023},{},[1024,1029],{"type":38,"tag":82,"props":1025,"children":1026},{},[1027],{"type":44,"value":1028},"Manual \u002F Schedule",{"type":44,"value":1030},": ad-hoc invocations. Memory rarely useful unless explicitly continuing a previous run.",{"type":38,"tag":78,"props":1032,"children":1033},{},[1034,1039],{"type":38,"tag":82,"props":1035,"children":1036},{},[1037],{"type":44,"value":1038},"Execute Workflow Trigger",{"type":44,"value":1040}," (sub-workflow): when an agent is itself a tool of another agent. Treat the trigger's declared inputs as the contract.",{"type":38,"tag":62,"props":1042,"children":1044},{"id":1043},"binary-and-the-agent-boundary",[1045],{"type":44,"value":1046},"Binary and the agent boundary",{"type":38,"tag":47,"props":1048,"children":1049},{},[1050,1052,1057,1059,1065,1067,1072,1074,1079],{"type":44,"value":1051},"The model can ",{"type":38,"tag":295,"props":1053,"children":1054},{},[1055],{"type":44,"value":1056},"see",{"type":44,"value":1058}," uploaded files (vision) via ",{"type":38,"tag":53,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":44,"value":1064},"passthroughBinaryImages: true",{"type":44,"value":1066},". But ",{"type":38,"tag":82,"props":1068,"children":1069},{},[1070],{"type":44,"value":1071},"tools cannot receive binary",{"type":44,"value":1073},", and ",{"type":38,"tag":53,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":44,"value":332},{"type":44,"value":1080}," parameters are JSON only. Base64 is also not accepted by tools, even through non-AI bindings.",{"type":38,"tag":47,"props":1082,"children":1083},{},[1084,1086,1092,1093,1099],{"type":44,"value":1085},"Workaround: pre-stage uploads to storage before the agent runs, inject the storage keys into the system prompt, tools accept the key as a string parameter and re-fetch internally. Full pattern in ",{"type":38,"tag":53,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":44,"value":1091},"n8n-binary-and-data-official",{"type":44,"value":259},{"type":38,"tag":53,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":44,"value":1098},"references\u002FAGENT_TOOL_BINARY.md",{"type":44,"value":249},{"type":38,"tag":47,"props":1101,"children":1102},{},[1103,1105,1110,1112],{"type":44,"value":1104},"On the output side: the Agent's output formatter is text-shaped (or structured-text when an ",{"type":38,"tag":53,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":44,"value":909},{"type":44,"value":1111}," is wired). When a model returns binary (image bytes, audio bytes, video), the Agent doesn't surface it at all. There's nothing to dig out downstream, and trying to recover it via a Code or Set node after the Agent does not work. ",{"type":38,"tag":82,"props":1113,"children":1114},{},[1115,1117,1123,1125,1131],{"type":44,"value":1116},"For one-shot media generation, use the provider's native single-call node directly such as ",{"type":38,"tag":53,"props":1118,"children":1120},{"className":1119},[],[1121],{"type":44,"value":1122},"@n8n\u002Fn8n-nodes-langchain.googleGemini",{"type":44,"value":1124}," or ",{"type":38,"tag":53,"props":1126,"children":1128},{"className":1127},[],[1129],{"type":44,"value":1130},"@n8n\u002Fn8n-nodes-langchain.openAi",{"type":44,"value":249},{"type":38,"tag":47,"props":1133,"children":1134},{},[1135,1137,1142,1143,1148],{"type":44,"value":1136},"The exception: when a media step genuinely belongs in an agent (one tool among several, picked based on conversation context, or editing a previously-generated image), the workaround is a tool sub-workflow that uploads the result to storage and returns a key or URL. Pattern in ",{"type":38,"tag":53,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":44,"value":1091},{"type":44,"value":259},{"type":38,"tag":53,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":44,"value":1098},{"type":44,"value":1149},". Don't reach for this by default. The upload + key + re-fetch path adds nodes and a storage dependency you don't otherwise need. Only when the orchestration actually requires an agent's tool selection.",{"type":38,"tag":62,"props":1151,"children":1153},{"id":1152},"what-goes-in-the-system-prompt-vs-the-tool-description",[1154],{"type":44,"value":1155},"What goes in the system prompt vs the tool description",{"type":38,"tag":1157,"props":1158,"children":1159},"table",{},[1160,1189],{"type":38,"tag":1161,"props":1162,"children":1163},"thead",{},[1164],{"type":38,"tag":1165,"props":1166,"children":1167},"tr",{},[1168,1179],{"type":38,"tag":1169,"props":1170,"children":1171},"th",{},[1172,1174],{"type":44,"value":1173},"Belongs in ",{"type":38,"tag":82,"props":1175,"children":1176},{},[1177],{"type":44,"value":1178},"system prompt",{"type":38,"tag":1169,"props":1180,"children":1181},{},[1182,1184],{"type":44,"value":1183},"Belongs in the ",{"type":38,"tag":82,"props":1185,"children":1186},{},[1187],{"type":44,"value":1188},"tool's description",{"type":38,"tag":1190,"props":1191,"children":1192},"tbody",{},[1193,1207,1220,1233,1254,1267],{"type":38,"tag":1165,"props":1194,"children":1195},{},[1196,1202],{"type":38,"tag":1197,"props":1198,"children":1199},"td",{},[1200],{"type":44,"value":1201},"Persona, role, voice",{"type":38,"tag":1197,"props":1203,"children":1204},{},[1205],{"type":44,"value":1206},"What this specific tool does",{"type":38,"tag":1165,"props":1208,"children":1209},{},[1210,1215],{"type":38,"tag":1197,"props":1211,"children":1212},{},[1213],{"type":44,"value":1214},"Output format rules (\"respond in markdown\")",{"type":38,"tag":1197,"props":1216,"children":1217},{},[1218],{"type":44,"value":1219},"When to use this tool vs others",{"type":38,"tag":1165,"props":1221,"children":1222},{},[1223,1228],{"type":38,"tag":1197,"props":1224,"children":1225},{},[1226],{"type":44,"value":1227},"Refusal\u002Fsafety behavior",{"type":38,"tag":1197,"props":1229,"children":1230},{},[1231],{"type":44,"value":1232},"What each parameter means and its expected shape",{"type":38,"tag":1165,"props":1234,"children":1235},{},[1236,1249],{"type":38,"tag":1197,"props":1237,"children":1238},{},[1239,1241,1247],{"type":44,"value":1240},"Display protocols (\"show images via ",{"type":38,"tag":53,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":44,"value":1246},"![]()",{"type":44,"value":1248}," markdown\")",{"type":38,"tag":1197,"props":1250,"children":1251},{},[1252],{"type":44,"value":1253},"Examples of good vs bad invocations",{"type":38,"tag":1165,"props":1255,"children":1256},{},[1257,1262],{"type":38,"tag":1197,"props":1258,"children":1259},{},[1260],{"type":44,"value":1261},"Universal context (current date, user role)",{"type":38,"tag":1197,"props":1263,"children":1264},{},[1265],{"type":44,"value":1266},"Tool-specific gotchas (rate limits, edge cases)",{"type":38,"tag":1165,"props":1268,"children":1269},{},[1270,1275],{"type":38,"tag":1197,"props":1271,"children":1272},{},[1273],{"type":44,"value":1274},"Inter-tool flow (\"after generating, always show via display protocol\")",{"type":38,"tag":1197,"props":1276,"children":1277},{},[1278],{"type":44,"value":1279},"Tool-specific input transformations",{"type":38,"tag":47,"props":1281,"children":1282},{},[1283],{"type":44,"value":1284},"Benefit: tools become reusable. A well-described tool works in any agent that drops it in. The system prompt stays focused on role and shared behavior.",{"type":38,"tag":47,"props":1286,"children":1287},{},[1288,1290,1295,1297,1302],{"type":44,"value":1289},"For deeper guidance and worked examples, see ",{"type":38,"tag":53,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":44,"value":307},{"type":44,"value":1296}," and ",{"type":38,"tag":53,"props":1298,"children":1300},{"className":1299},[],[1301],{"type":44,"value":247},{"type":44,"value":249},{"type":38,"tag":62,"props":1304,"children":1306},{"id":1305},"tool-selection-the-four-types",[1307],{"type":44,"value":1308},"Tool selection: the four types",{"type":38,"tag":47,"props":1310,"children":1311},{},[1312],{"type":44,"value":1313},"Pick the lightest option that covers the job:",{"type":38,"tag":74,"props":1315,"children":1316},{},[1317,1362,1392,1402],{"type":38,"tag":78,"props":1318,"children":1319},{},[1320,1325,1327,1333,1334,1340,1341,1347,1349],{"type":38,"tag":82,"props":1321,"children":1322},{},[1323],{"type":44,"value":1324},"Native n8n tool node exists?",{"type":44,"value":1326}," (e.g., ",{"type":38,"tag":53,"props":1328,"children":1330},{"className":1329},[],[1331],{"type":44,"value":1332},"slackTool",{"type":44,"value":114},{"type":38,"tag":53,"props":1335,"children":1337},{"className":1336},[],[1338],{"type":44,"value":1339},"gmailTool",{"type":44,"value":114},{"type":38,"tag":53,"props":1342,"children":1344},{"className":1343},[],[1345],{"type":44,"value":1346},"calculatorTool",{"type":44,"value":1348},") Use it. Lowest config overhead.\n",{"type":38,"tag":74,"props":1350,"children":1351},{},[1352],{"type":38,"tag":78,"props":1353,"children":1354},{},[1355,1360],{"type":38,"tag":82,"props":1356,"children":1357},{},[1358],{"type":44,"value":1359},"Native node is missing an operation or needs custom params",{"type":44,"value":1361}," (e.g., a Notion endpoint the node doesn't expose, a non-standard header, a different pagination shape)? HTTP Request Tool with the service's \"Predefined Credential Type\". Reuses the existing OAuth \u002F API-key credential, gives full API access, no custom auth code.",{"type":38,"tag":78,"props":1363,"children":1364},{},[1365,1370,1372,1377,1379,1384,1386,1391],{"type":38,"tag":82,"props":1366,"children":1367},{},[1368],{"type":44,"value":1369},"Multi-step logic, or reusing a sub-workflow already in the project?",{"type":44,"value":1371}," Sub-workflow as tool (",{"type":38,"tag":53,"props":1373,"children":1375},{"className":1374},[],[1376],{"type":44,"value":322},{"type":44,"value":1378},"). Anything you can build as a workflow becomes a tool with typed ",{"type":38,"tag":53,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":44,"value":332},{"type":44,"value":1385}," inputs. The most powerful option in n8n, so default here when in doubt. See ",{"type":38,"tag":53,"props":1387,"children":1389},{"className":1388},[],[1390],{"type":44,"value":340},{"type":44,"value":249},{"type":38,"tag":78,"props":1393,"children":1394},{},[1395,1400],{"type":38,"tag":82,"props":1396,"children":1397},{},[1398],{"type":44,"value":1399},"Calling an external HTTP API the agent should orchestrate directly?",{"type":44,"value":1401}," HTTP Request Tool. Also good for slow async work via long-poll callback.",{"type":38,"tag":78,"props":1403,"children":1404},{},[1405,1410,1412,1418],{"type":38,"tag":82,"props":1406,"children":1407},{},[1408],{"type":44,"value":1409},"Tool already exists as a published, MCP-accessible workflow?",{"type":44,"value":1411}," MCP tool. Useful for cross-workflow agent capabilities. See ",{"type":38,"tag":53,"props":1413,"children":1415},{"className":1414},[],[1416],{"type":44,"value":1417},"n8n-extending-mcp-official",{"type":44,"value":249},{"type":38,"tag":47,"props":1420,"children":1421},{},[1422,1424,1429,1431,1436],{"type":44,"value":1423},"See ",{"type":38,"tag":53,"props":1425,"children":1427},{"className":1426},[],[1428],{"type":44,"value":247},{"type":44,"value":1430}," for deeper guidance on each option and how to wire ",{"type":38,"tag":53,"props":1432,"children":1434},{"className":1433},[],[1435],{"type":44,"value":332},{"type":44,"value":1437}," parameters.",{"type":38,"tag":62,"props":1439,"children":1441},{"id":1440},"human-review",[1442],{"type":44,"value":1443},"Human review",{"type":38,"tag":47,"props":1445,"children":1446},{},[1447],{"type":44,"value":1448},"Before adding or skipping human review on a tool, check with the user. Whether sign-off is needed is a product \u002F policy call (blast radius, audit requirements, how much they trust the model) that the user is better positioned to make than you. Surface the question, recommend based on the criteria below, and let them decide.",{"type":38,"tag":47,"props":1450,"children":1451},{},[1452,1454,1460,1461,1467,1468,1474,1475,1481,1483,1489,1491,1497,1499,1504,1506,1511],{"type":44,"value":1453},"When a tool's effects need human approval before execution (sends, payments, refunds, account changes, customer-facing actions), wrap it with a review tool node: ",{"type":38,"tag":53,"props":1455,"children":1457},{"className":1456},[],[1458],{"type":44,"value":1459},"slackHitlTool",{"type":44,"value":114},{"type":38,"tag":53,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":44,"value":1466},"discordHitlTool",{"type":44,"value":114},{"type":38,"tag":53,"props":1469,"children":1471},{"className":1470},[],[1472],{"type":44,"value":1473},"telegramHitlTool",{"type":44,"value":114},{"type":38,"tag":53,"props":1476,"children":1478},{"className":1477},[],[1479],{"type":44,"value":1480},"gmailHitlTool",{"type":44,"value":1482},", etc. (n8n's node names use ",{"type":38,"tag":53,"props":1484,"children":1486},{"className":1485},[],[1487],{"type":44,"value":1488},"Hitl",{"type":44,"value":1490}," for the human-in-the-loop pattern, and \"human review\" is what it's called in the UI.) The review node sits between the wrapped tool and the agent on the ",{"type":38,"tag":53,"props":1492,"children":1494},{"className":1493},[],[1495],{"type":44,"value":1496},"ai_tool",{"type":44,"value":1498}," connection: the wrapped tool's ",{"type":38,"tag":53,"props":1500,"children":1502},{"className":1501},[],[1503],{"type":44,"value":1496},{"type":44,"value":1505}," output wires into the review node, and the review node's ",{"type":38,"tag":53,"props":1507,"children":1509},{"className":1508},[],[1510],{"type":44,"value":1496},{"type":44,"value":1512}," output wires into the Agent. The agent calls through, the review node pauses for approval, on approve, the wrapped tool runs.",{"type":38,"tag":47,"props":1514,"children":1515},{},[1516],{"type":44,"value":1517},"Default to \u002F recommend human review when:",{"type":38,"tag":74,"props":1519,"children":1520},{},[1521,1526,1531],{"type":38,"tag":78,"props":1522,"children":1523},{},[1524],{"type":44,"value":1525},"The tool sends, pays, refunds, or otherwise mutates user-visible state.",{"type":38,"tag":78,"props":1527,"children":1528},{},[1529],{"type":44,"value":1530},"The approver is different from the chatter (manager-approves-customer-action, support team approves a customer-triggered refund).",{"type":38,"tag":78,"props":1532,"children":1533},{},[1534],{"type":44,"value":1535},"The trigger is non-interactive (order, form, schedule) but the tool's effect needs human sign-off.",{"type":38,"tag":47,"props":1537,"children":1538},{},[1539,1541,1546,1548,1554,1556,1562,1564,1569,1571,1577],{"type":44,"value":1540},"Approval messages should display the ",{"type":38,"tag":82,"props":1542,"children":1543},{},[1544],{"type":44,"value":1545},"actual parameters the wrapped tool will receive",{"type":44,"value":1547},", not text the model paraphrases. Use ",{"type":38,"tag":53,"props":1549,"children":1551},{"className":1550},[],[1552],{"type":44,"value":1553},"$tool.parameters.\u003Cname>",{"type":44,"value":1555}," directly, or iterate over ",{"type":38,"tag":53,"props":1557,"children":1559},{"className":1558},[],[1560],{"type":44,"value":1561},"$tool.parameters",{"type":44,"value":1563}," to list every param. Don't fill the approval text via ",{"type":38,"tag":53,"props":1565,"children":1567},{"className":1566},[],[1568],{"type":44,"value":332},{"type":44,"value":1570},". You'd be approving a paraphrase, not the literal call. Customize button labels with the actual values, e.g. ",{"type":38,"tag":53,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":44,"value":1576},"Approve {{ $tool.parameters.amount }} refund",{"type":44,"value":249},{"type":38,"tag":47,"props":1579,"children":1580},{},[1581,1583,1588],{"type":44,"value":1582},"Full config patterns, per-platform setup, and the multi-channel approver pattern in ",{"type":38,"tag":53,"props":1584,"children":1586},{"className":1585},[],[1587],{"type":44,"value":357},{"type":44,"value":249},{"type":38,"tag":62,"props":1590,"children":1592},{"id":1591},"output-parsing-when-and-how",[1593],{"type":44,"value":1594},"Output parsing: when and how",{"type":38,"tag":47,"props":1596,"children":1597},{},[1598,1600,1605],{"type":44,"value":1599},"Add an ",{"type":38,"tag":53,"props":1601,"children":1603},{"className":1602},[],[1604],{"type":44,"value":909},{"type":44,"value":1606}," sub-node when downstream needs structured data, not free-form text.",{"type":38,"tag":371,"props":1608,"children":1610},{"className":373,"code":1609,"language":375,"meta":376,"style":376},"const parser = outputParser({\n    type: '@n8n\u002Fn8n-nodes-langchain.outputParserStructured',\n    config: {\n        parameters: {\n            schemaType: 'manual',\n            inputSchema: JSON.stringify({\n                type: 'object',\n                properties: {\n                    score: { type: 'integer', minimum: 1, maximum: 5 },\n                    category: { type: 'string', enum: ['bug', 'feature', 'question'] },\n                    reason: { type: 'string' },\n                    tags: { type: 'array', items: { type: 'string' } },\n                },\n                required: ['score', 'category', 'reason'],\n            }),\n            autoFix: true,\n            customizeRetryPrompt: true,\n            prompt: '...retry instructions...', \u002F\u002F generally leave as default\n        },\n        subnodes: {\n            languageModel: fixerModel,    \u002F\u002F coding-capable model, e.g. Claude Sonnet 4.6\n        },\n    },\n})\n",[1611],{"type":38,"tag":53,"props":1612,"children":1613},{"__ignoreMap":376},[1614,1643,1671,1686,1701,1730,1764,1793,1809,1890,2002,2042,2125,2133,2205,2221,2241,2261,2295,2302,2317,2344,2352,2360],{"type":38,"tag":382,"props":1615,"children":1616},{"class":384,"line":385},[1617,1621,1626,1630,1635,1639],{"type":38,"tag":382,"props":1618,"children":1619},{"style":389},[1620],{"type":44,"value":392},{"type":38,"tag":382,"props":1622,"children":1623},{"style":395},[1624],{"type":44,"value":1625}," parser ",{"type":38,"tag":382,"props":1627,"children":1628},{"style":401},[1629],{"type":44,"value":404},{"type":38,"tag":382,"props":1631,"children":1632},{"style":407},[1633],{"type":44,"value":1634}," outputParser",{"type":38,"tag":382,"props":1636,"children":1637},{"style":395},[1638],{"type":44,"value":415},{"type":38,"tag":382,"props":1640,"children":1641},{"style":401},[1642],{"type":44,"value":420},{"type":38,"tag":382,"props":1644,"children":1645},{"class":384,"line":423},[1646,1650,1654,1658,1663,1667],{"type":38,"tag":382,"props":1647,"children":1648},{"style":427},[1649],{"type":44,"value":430},{"type":38,"tag":382,"props":1651,"children":1652},{"style":401},[1653],{"type":44,"value":435},{"type":38,"tag":382,"props":1655,"children":1656},{"style":401},[1657],{"type":44,"value":440},{"type":38,"tag":382,"props":1659,"children":1660},{"style":443},[1661],{"type":44,"value":1662},"@n8n\u002Fn8n-nodes-langchain.outputParserStructured",{"type":38,"tag":382,"props":1664,"children":1665},{"style":401},[1666],{"type":44,"value":450},{"type":38,"tag":382,"props":1668,"children":1669},{"style":401},[1670],{"type":44,"value":455},{"type":38,"tag":382,"props":1672,"children":1673},{"class":384,"line":458},[1674,1678,1682],{"type":38,"tag":382,"props":1675,"children":1676},{"style":427},[1677],{"type":44,"value":464},{"type":38,"tag":382,"props":1679,"children":1680},{"style":401},[1681],{"type":44,"value":435},{"type":38,"tag":382,"props":1683,"children":1684},{"style":401},[1685],{"type":44,"value":473},{"type":38,"tag":382,"props":1687,"children":1688},{"class":384,"line":476},[1689,1693,1697],{"type":38,"tag":382,"props":1690,"children":1691},{"style":427},[1692],{"type":44,"value":512},{"type":38,"tag":382,"props":1694,"children":1695},{"style":401},[1696],{"type":44,"value":435},{"type":38,"tag":382,"props":1698,"children":1699},{"style":401},[1700],{"type":44,"value":473},{"type":38,"tag":382,"props":1702,"children":1703},{"class":384,"line":506},[1704,1709,1713,1717,1722,1726],{"type":38,"tag":382,"props":1705,"children":1706},{"style":427},[1707],{"type":44,"value":1708},"            schemaType",{"type":38,"tag":382,"props":1710,"children":1711},{"style":401},[1712],{"type":44,"value":435},{"type":38,"tag":382,"props":1714,"children":1715},{"style":401},[1716],{"type":44,"value":440},{"type":38,"tag":382,"props":1718,"children":1719},{"style":443},[1720],{"type":44,"value":1721},"manual",{"type":38,"tag":382,"props":1723,"children":1724},{"style":401},[1725],{"type":44,"value":450},{"type":38,"tag":382,"props":1727,"children":1728},{"style":401},[1729],{"type":44,"value":455},{"type":38,"tag":382,"props":1731,"children":1732},{"class":384,"line":523},[1733,1738,1742,1747,1751,1756,1760],{"type":38,"tag":382,"props":1734,"children":1735},{"style":427},[1736],{"type":44,"value":1737},"            inputSchema",{"type":38,"tag":382,"props":1739,"children":1740},{"style":401},[1741],{"type":44,"value":435},{"type":38,"tag":382,"props":1743,"children":1744},{"style":395},[1745],{"type":44,"value":1746}," JSON",{"type":38,"tag":382,"props":1748,"children":1749},{"style":401},[1750],{"type":44,"value":249},{"type":38,"tag":382,"props":1752,"children":1753},{"style":407},[1754],{"type":44,"value":1755},"stringify",{"type":38,"tag":382,"props":1757,"children":1758},{"style":395},[1759],{"type":44,"value":415},{"type":38,"tag":382,"props":1761,"children":1762},{"style":401},[1763],{"type":44,"value":420},{"type":38,"tag":382,"props":1765,"children":1766},{"class":384,"line":553},[1767,1772,1776,1780,1785,1789],{"type":38,"tag":382,"props":1768,"children":1769},{"style":427},[1770],{"type":44,"value":1771},"                type",{"type":38,"tag":382,"props":1773,"children":1774},{"style":401},[1775],{"type":44,"value":435},{"type":38,"tag":382,"props":1777,"children":1778},{"style":401},[1779],{"type":44,"value":440},{"type":38,"tag":382,"props":1781,"children":1782},{"style":443},[1783],{"type":44,"value":1784},"object",{"type":38,"tag":382,"props":1786,"children":1787},{"style":401},[1788],{"type":44,"value":450},{"type":38,"tag":382,"props":1790,"children":1791},{"style":401},[1792],{"type":44,"value":455},{"type":38,"tag":382,"props":1794,"children":1795},{"class":384,"line":583},[1796,1801,1805],{"type":38,"tag":382,"props":1797,"children":1798},{"style":427},[1799],{"type":44,"value":1800},"                properties",{"type":38,"tag":382,"props":1802,"children":1803},{"style":401},[1804],{"type":44,"value":435},{"type":38,"tag":382,"props":1806,"children":1807},{"style":401},[1808],{"type":44,"value":473},{"type":38,"tag":382,"props":1810,"children":1811},{"class":384,"line":600},[1812,1817,1821,1826,1831,1835,1839,1844,1848,1852,1857,1861,1867,1871,1876,1880,1885],{"type":38,"tag":382,"props":1813,"children":1814},{"style":427},[1815],{"type":44,"value":1816},"                    score",{"type":38,"tag":382,"props":1818,"children":1819},{"style":401},[1820],{"type":44,"value":435},{"type":38,"tag":382,"props":1822,"children":1823},{"style":401},[1824],{"type":44,"value":1825}," {",{"type":38,"tag":382,"props":1827,"children":1828},{"style":427},[1829],{"type":44,"value":1830}," type",{"type":38,"tag":382,"props":1832,"children":1833},{"style":401},[1834],{"type":44,"value":435},{"type":38,"tag":382,"props":1836,"children":1837},{"style":401},[1838],{"type":44,"value":440},{"type":38,"tag":382,"props":1840,"children":1841},{"style":443},[1842],{"type":44,"value":1843},"integer",{"type":38,"tag":382,"props":1845,"children":1846},{"style":401},[1847],{"type":44,"value":450},{"type":38,"tag":382,"props":1849,"children":1850},{"style":401},[1851],{"type":44,"value":651},{"type":38,"tag":382,"props":1853,"children":1854},{"style":427},[1855],{"type":44,"value":1856}," minimum",{"type":38,"tag":382,"props":1858,"children":1859},{"style":401},[1860],{"type":44,"value":435},{"type":38,"tag":382,"props":1862,"children":1864},{"style":1863},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1865],{"type":44,"value":1866}," 1",{"type":38,"tag":382,"props":1868,"children":1869},{"style":401},[1870],{"type":44,"value":651},{"type":38,"tag":382,"props":1872,"children":1873},{"style":427},[1874],{"type":44,"value":1875}," maximum",{"type":38,"tag":382,"props":1877,"children":1878},{"style":401},[1879],{"type":44,"value":435},{"type":38,"tag":382,"props":1881,"children":1882},{"style":1863},[1883],{"type":44,"value":1884}," 5",{"type":38,"tag":382,"props":1886,"children":1887},{"style":401},[1888],{"type":44,"value":1889}," },\n",{"type":38,"tag":382,"props":1891,"children":1892},{"class":384,"line":630},[1893,1898,1902,1906,1910,1914,1918,1923,1927,1931,1936,1940,1945,1949,1954,1958,1962,1966,1971,1975,1979,1983,1988,1992,1997],{"type":38,"tag":382,"props":1894,"children":1895},{"style":427},[1896],{"type":44,"value":1897},"                    category",{"type":38,"tag":382,"props":1899,"children":1900},{"style":401},[1901],{"type":44,"value":435},{"type":38,"tag":382,"props":1903,"children":1904},{"style":401},[1905],{"type":44,"value":1825},{"type":38,"tag":382,"props":1907,"children":1908},{"style":427},[1909],{"type":44,"value":1830},{"type":38,"tag":382,"props":1911,"children":1912},{"style":401},[1913],{"type":44,"value":435},{"type":38,"tag":382,"props":1915,"children":1916},{"style":401},[1917],{"type":44,"value":440},{"type":38,"tag":382,"props":1919,"children":1920},{"style":443},[1921],{"type":44,"value":1922},"string",{"type":38,"tag":382,"props":1924,"children":1925},{"style":401},[1926],{"type":44,"value":450},{"type":38,"tag":382,"props":1928,"children":1929},{"style":401},[1930],{"type":44,"value":651},{"type":38,"tag":382,"props":1932,"children":1933},{"style":427},[1934],{"type":44,"value":1935}," enum",{"type":38,"tag":382,"props":1937,"children":1938},{"style":401},[1939],{"type":44,"value":435},{"type":38,"tag":382,"props":1941,"children":1942},{"style":395},[1943],{"type":44,"value":1944}," [",{"type":38,"tag":382,"props":1946,"children":1947},{"style":401},[1948],{"type":44,"value":450},{"type":38,"tag":382,"props":1950,"children":1951},{"style":443},[1952],{"type":44,"value":1953},"bug",{"type":38,"tag":382,"props":1955,"children":1956},{"style":401},[1957],{"type":44,"value":450},{"type":38,"tag":382,"props":1959,"children":1960},{"style":401},[1961],{"type":44,"value":651},{"type":38,"tag":382,"props":1963,"children":1964},{"style":401},[1965],{"type":44,"value":440},{"type":38,"tag":382,"props":1967,"children":1968},{"style":443},[1969],{"type":44,"value":1970},"feature",{"type":38,"tag":382,"props":1972,"children":1973},{"style":401},[1974],{"type":44,"value":450},{"type":38,"tag":382,"props":1976,"children":1977},{"style":401},[1978],{"type":44,"value":651},{"type":38,"tag":382,"props":1980,"children":1981},{"style":401},[1982],{"type":44,"value":440},{"type":38,"tag":382,"props":1984,"children":1985},{"style":443},[1986],{"type":44,"value":1987},"question",{"type":38,"tag":382,"props":1989,"children":1990},{"style":401},[1991],{"type":44,"value":450},{"type":38,"tag":382,"props":1993,"children":1994},{"style":395},[1995],{"type":44,"value":1996},"] ",{"type":38,"tag":382,"props":1998,"children":1999},{"style":401},[2000],{"type":44,"value":2001},"},\n",{"type":38,"tag":382,"props":2003,"children":2004},{"class":384,"line":660},[2005,2010,2014,2018,2022,2026,2030,2034,2038],{"type":38,"tag":382,"props":2006,"children":2007},{"style":427},[2008],{"type":44,"value":2009},"                    reason",{"type":38,"tag":382,"props":2011,"children":2012},{"style":401},[2013],{"type":44,"value":435},{"type":38,"tag":382,"props":2015,"children":2016},{"style":401},[2017],{"type":44,"value":1825},{"type":38,"tag":382,"props":2019,"children":2020},{"style":427},[2021],{"type":44,"value":1830},{"type":38,"tag":382,"props":2023,"children":2024},{"style":401},[2025],{"type":44,"value":435},{"type":38,"tag":382,"props":2027,"children":2028},{"style":401},[2029],{"type":44,"value":440},{"type":38,"tag":382,"props":2031,"children":2032},{"style":443},[2033],{"type":44,"value":1922},{"type":38,"tag":382,"props":2035,"children":2036},{"style":401},[2037],{"type":44,"value":450},{"type":38,"tag":382,"props":2039,"children":2040},{"style":401},[2041],{"type":44,"value":1889},{"type":38,"tag":382,"props":2043,"children":2044},{"class":384,"line":669},[2045,2050,2054,2058,2062,2066,2070,2075,2079,2083,2088,2092,2096,2100,2104,2108,2112,2116,2121],{"type":38,"tag":382,"props":2046,"children":2047},{"style":427},[2048],{"type":44,"value":2049},"                    tags",{"type":38,"tag":382,"props":2051,"children":2052},{"style":401},[2053],{"type":44,"value":435},{"type":38,"tag":382,"props":2055,"children":2056},{"style":401},[2057],{"type":44,"value":1825},{"type":38,"tag":382,"props":2059,"children":2060},{"style":427},[2061],{"type":44,"value":1830},{"type":38,"tag":382,"props":2063,"children":2064},{"style":401},[2065],{"type":44,"value":435},{"type":38,"tag":382,"props":2067,"children":2068},{"style":401},[2069],{"type":44,"value":440},{"type":38,"tag":382,"props":2071,"children":2072},{"style":443},[2073],{"type":44,"value":2074},"array",{"type":38,"tag":382,"props":2076,"children":2077},{"style":401},[2078],{"type":44,"value":450},{"type":38,"tag":382,"props":2080,"children":2081},{"style":401},[2082],{"type":44,"value":651},{"type":38,"tag":382,"props":2084,"children":2085},{"style":427},[2086],{"type":44,"value":2087}," items",{"type":38,"tag":382,"props":2089,"children":2090},{"style":401},[2091],{"type":44,"value":435},{"type":38,"tag":382,"props":2093,"children":2094},{"style":401},[2095],{"type":44,"value":1825},{"type":38,"tag":382,"props":2097,"children":2098},{"style":427},[2099],{"type":44,"value":1830},{"type":38,"tag":382,"props":2101,"children":2102},{"style":401},[2103],{"type":44,"value":435},{"type":38,"tag":382,"props":2105,"children":2106},{"style":401},[2107],{"type":44,"value":440},{"type":38,"tag":382,"props":2109,"children":2110},{"style":443},[2111],{"type":44,"value":1922},{"type":38,"tag":382,"props":2113,"children":2114},{"style":401},[2115],{"type":44,"value":450},{"type":38,"tag":382,"props":2117,"children":2118},{"style":401},[2119],{"type":44,"value":2120}," }",{"type":38,"tag":382,"props":2122,"children":2123},{"style":401},[2124],{"type":44,"value":1889},{"type":38,"tag":382,"props":2126,"children":2127},{"class":384,"line":678},[2128],{"type":38,"tag":382,"props":2129,"children":2130},{"style":401},[2131],{"type":44,"value":2132},"                },\n",{"type":38,"tag":382,"props":2134,"children":2135},{"class":384,"line":695},[2136,2141,2145,2149,2153,2158,2162,2166,2170,2175,2179,2183,2187,2192,2196,2201],{"type":38,"tag":382,"props":2137,"children":2138},{"style":427},[2139],{"type":44,"value":2140},"                required",{"type":38,"tag":382,"props":2142,"children":2143},{"style":401},[2144],{"type":44,"value":435},{"type":38,"tag":382,"props":2146,"children":2147},{"style":395},[2148],{"type":44,"value":1944},{"type":38,"tag":382,"props":2150,"children":2151},{"style":401},[2152],{"type":44,"value":450},{"type":38,"tag":382,"props":2154,"children":2155},{"style":443},[2156],{"type":44,"value":2157},"score",{"type":38,"tag":382,"props":2159,"children":2160},{"style":401},[2161],{"type":44,"value":450},{"type":38,"tag":382,"props":2163,"children":2164},{"style":401},[2165],{"type":44,"value":651},{"type":38,"tag":382,"props":2167,"children":2168},{"style":401},[2169],{"type":44,"value":440},{"type":38,"tag":382,"props":2171,"children":2172},{"style":443},[2173],{"type":44,"value":2174},"category",{"type":38,"tag":382,"props":2176,"children":2177},{"style":401},[2178],{"type":44,"value":450},{"type":38,"tag":382,"props":2180,"children":2181},{"style":401},[2182],{"type":44,"value":651},{"type":38,"tag":382,"props":2184,"children":2185},{"style":401},[2186],{"type":44,"value":440},{"type":38,"tag":382,"props":2188,"children":2189},{"style":443},[2190],{"type":44,"value":2191},"reason",{"type":38,"tag":382,"props":2193,"children":2194},{"style":401},[2195],{"type":44,"value":450},{"type":38,"tag":382,"props":2197,"children":2198},{"style":395},[2199],{"type":44,"value":2200},"]",{"type":38,"tag":382,"props":2202,"children":2203},{"style":401},[2204],{"type":44,"value":455},{"type":38,"tag":382,"props":2206,"children":2207},{"class":384,"line":717},[2208,2213,2217],{"type":38,"tag":382,"props":2209,"children":2210},{"style":401},[2211],{"type":44,"value":2212},"            }",{"type":38,"tag":382,"props":2214,"children":2215},{"style":395},[2216],{"type":44,"value":948},{"type":38,"tag":382,"props":2218,"children":2219},{"style":401},[2220],{"type":44,"value":455},{"type":38,"tag":382,"props":2222,"children":2223},{"class":384,"line":739},[2224,2229,2233,2237],{"type":38,"tag":382,"props":2225,"children":2226},{"style":427},[2227],{"type":44,"value":2228},"            autoFix",{"type":38,"tag":382,"props":2230,"children":2231},{"style":401},[2232],{"type":44,"value":435},{"type":38,"tag":382,"props":2234,"children":2235},{"style":643},[2236],{"type":44,"value":646},{"type":38,"tag":382,"props":2238,"children":2239},{"style":401},[2240],{"type":44,"value":455},{"type":38,"tag":382,"props":2242,"children":2243},{"class":384,"line":779},[2244,2249,2253,2257],{"type":38,"tag":382,"props":2245,"children":2246},{"style":427},[2247],{"type":44,"value":2248},"            customizeRetryPrompt",{"type":38,"tag":382,"props":2250,"children":2251},{"style":401},[2252],{"type":44,"value":435},{"type":38,"tag":382,"props":2254,"children":2255},{"style":643},[2256],{"type":44,"value":646},{"type":38,"tag":382,"props":2258,"children":2259},{"style":401},[2260],{"type":44,"value":455},{"type":38,"tag":382,"props":2262,"children":2263},{"class":384,"line":806},[2264,2269,2273,2277,2282,2286,2290],{"type":38,"tag":382,"props":2265,"children":2266},{"style":427},[2267],{"type":44,"value":2268},"            prompt",{"type":38,"tag":382,"props":2270,"children":2271},{"style":401},[2272],{"type":44,"value":435},{"type":38,"tag":382,"props":2274,"children":2275},{"style":401},[2276],{"type":44,"value":440},{"type":38,"tag":382,"props":2278,"children":2279},{"style":443},[2280],{"type":44,"value":2281},"...retry instructions...",{"type":38,"tag":382,"props":2283,"children":2284},{"style":401},[2285],{"type":44,"value":450},{"type":38,"tag":382,"props":2287,"children":2288},{"style":401},[2289],{"type":44,"value":651},{"type":38,"tag":382,"props":2291,"children":2292},{"style":654},[2293],{"type":44,"value":2294}," \u002F\u002F generally leave as default\n",{"type":38,"tag":382,"props":2296,"children":2297},{"class":384,"line":814},[2298],{"type":38,"tag":382,"props":2299,"children":2300},{"style":401},[2301],{"type":44,"value":675},{"type":38,"tag":382,"props":2303,"children":2304},{"class":384,"line":823},[2305,2309,2313],{"type":38,"tag":382,"props":2306,"children":2307},{"style":427},[2308],{"type":44,"value":684},{"type":38,"tag":382,"props":2310,"children":2311},{"style":401},[2312],{"type":44,"value":435},{"type":38,"tag":382,"props":2314,"children":2315},{"style":401},[2316],{"type":44,"value":473},{"type":38,"tag":382,"props":2318,"children":2320},{"class":384,"line":2319},21,[2321,2326,2330,2335,2339],{"type":38,"tag":382,"props":2322,"children":2323},{"style":427},[2324],{"type":44,"value":2325},"            languageModel",{"type":38,"tag":382,"props":2327,"children":2328},{"style":401},[2329],{"type":44,"value":435},{"type":38,"tag":382,"props":2331,"children":2332},{"style":395},[2333],{"type":44,"value":2334}," fixerModel",{"type":38,"tag":382,"props":2336,"children":2337},{"style":401},[2338],{"type":44,"value":651},{"type":38,"tag":382,"props":2340,"children":2341},{"style":654},[2342],{"type":44,"value":2343},"    \u002F\u002F coding-capable model, e.g. Claude Sonnet 4.6\n",{"type":38,"tag":382,"props":2345,"children":2347},{"class":384,"line":2346},22,[2348],{"type":38,"tag":382,"props":2349,"children":2350},{"style":401},[2351],{"type":44,"value":675},{"type":38,"tag":382,"props":2353,"children":2355},{"class":384,"line":2354},23,[2356],{"type":38,"tag":382,"props":2357,"children":2358},{"style":401},[2359],{"type":44,"value":820},{"type":38,"tag":382,"props":2361,"children":2363},{"class":384,"line":2362},24,[2364,2368],{"type":38,"tag":382,"props":2365,"children":2366},{"style":401},[2367],{"type":44,"value":829},{"type":38,"tag":382,"props":2369,"children":2370},{"style":395},[2371],{"type":44,"value":834},{"type":38,"tag":221,"props":2373,"children":2374},{},[2375,2408],{"type":38,"tag":78,"props":2376,"children":2377},{},[2378,2398,2400,2406],{"type":38,"tag":82,"props":2379,"children":2380},{},[2381,2383,2389,2391,2397],{"type":44,"value":2382},"Use ",{"type":38,"tag":53,"props":2384,"children":2386},{"className":2385},[],[2387],{"type":44,"value":2388},"schemaType: 'manual'",{"type":44,"value":2390}," with a real JSON schema, not ",{"type":38,"tag":53,"props":2392,"children":2394},{"className":2393},[],[2395],{"type":44,"value":2396},"jsonSchemaExample",{"type":44,"value":249},{"type":44,"value":2399}," An example can't express optional fields, enums, value ranges, or array constraints, so you outgrow it the first time the shape gets non-trivial. A schema lets you mark fields required vs optional, define enums, constrain numbers and string formats, and gives the model clearer rules to follow. Reach for ",{"type":38,"tag":53,"props":2401,"children":2403},{"className":2402},[],[2404],{"type":44,"value":2405},"schemaType: 'fromJson'",{"type":44,"value":2407}," with an example only for one-off shapes you're certain will never grow constraints.",{"type":38,"tag":78,"props":2409,"children":2410},{},[2411,2421],{"type":38,"tag":82,"props":2412,"children":2413},{},[2414,2419],{"type":38,"tag":53,"props":2415,"children":2417},{"className":2416},[],[2418],{"type":44,"value":272},{"type":44,"value":2420}," adds retry on parse failure.",{"type":44,"value":2422}," Wire a coding-capable model as the fixer sub-node (e.g., Claude Sonnet 4.6 or similar). Fixing malformed JSON against a schema is a structured-output \u002F coding task, and a weak or generic model often produces another malformed retry, defeating the point.",{"type":38,"tag":47,"props":2424,"children":2425},{},[2426,2428,2433],{"type":44,"value":2427},"For the full pattern including custom retry prompts, see ",{"type":38,"tag":53,"props":2429,"children":2431},{"className":2430},[],[2432],{"type":44,"value":917},{"type":44,"value":249},{"type":38,"tag":62,"props":2435,"children":2437},{"id":2436},"memory-brief-mental-model",[2438],{"type":44,"value":2439},"Memory: brief mental model",{"type":38,"tag":74,"props":2441,"children":2442},{},[2443,2453,2491],{"type":38,"tag":78,"props":2444,"children":2445},{},[2446,2451],{"type":38,"tag":82,"props":2447,"children":2448},{},[2449],{"type":44,"value":2450},"No memory:",{"type":44,"value":2452}," stateless. Right for one-shot tasks (classify, summarize).",{"type":38,"tag":78,"props":2454,"children":2455},{},[2456,2466,2468,2474,2476,2481,2483,2489],{"type":38,"tag":82,"props":2457,"children":2458},{},[2459,2465],{"type":38,"tag":53,"props":2460,"children":2462},{"className":2461},[],[2463],{"type":44,"value":2464},"memoryBufferWindow",{"type":44,"value":435},{"type":44,"value":2467}," keeps the last N messages per memory key and persists across executions via n8n's internal store. The key is whatever expression you bind to ",{"type":38,"tag":53,"props":2469,"children":2471},{"className":2470},[],[2472],{"type":44,"value":2473},"sessionKey",{"type":44,"value":2475},". Chat triggers fill ",{"type":38,"tag":53,"props":2477,"children":2479},{"className":2478},[],[2480],{"type":44,"value":971},{"type":44,"value":2482}," automatically, but you can key on anything (Slack ",{"type":38,"tag":53,"props":2484,"children":2486},{"className":2485},[],[2487],{"type":44,"value":2488},"thread_ts",{"type":44,"value":2490},", a webhook conversation ID, a multi-tenant composite). The default for chat memory. The \"window\" is the sliding cap on how many messages stay in context, not a scope on persistence.",{"type":38,"tag":78,"props":2492,"children":2493},{},[2494,2513,2515,2520,2522,2527],{"type":38,"tag":82,"props":2495,"children":2496},{},[2497,2503,2505,2511],{"type":38,"tag":53,"props":2498,"children":2500},{"className":2499},[],[2501],{"type":44,"value":2502},"memoryPostgres",{"type":44,"value":2504}," \u002F ",{"type":38,"tag":53,"props":2506,"children":2508},{"className":2507},[],[2509],{"type":44,"value":2510},"memoryRedis",{"type":44,"value":2512}," \u002F similar:",{"type":44,"value":2514}," reach for these when you need to query or read memory ",{"type":38,"tag":82,"props":2516,"children":2517},{},[2518],{"type":44,"value":2519},"outside",{"type":44,"value":2521}," the agent: displaying conversation history in your own UI, analytics on past chats, or sharing memory with another system. Otherwise ",{"type":38,"tag":53,"props":2523,"children":2525},{"className":2524},[],[2526],{"type":44,"value":2464},{"type":44,"value":2528}," is enough.",{"type":38,"tag":47,"props":2530,"children":2531},{},[2532,2534,2539],{"type":44,"value":2533},"Plumb a stable key from the trigger to memory consistently, or conversations get crossed. See ",{"type":38,"tag":53,"props":2535,"children":2537},{"className":2536},[],[2538],{"type":44,"value":876},{"type":44,"value":249},{"type":38,"tag":62,"props":2541,"children":2543},{"id":2542},"rag-retrieval-augmented-generation",[2544],{"type":44,"value":2545},"RAG (retrieval augmented generation)",{"type":38,"tag":47,"props":2547,"children":2548},{},[2549],{"type":44,"value":2550},"n8n has the LangChain RAG primitives: document loaders, text splitters, embeddings, vector stores, retrievers, rerankers. The pieces work, but opinionated end-to-end recipes (\"which vector store, which chunking, when to rerank\") depend heavily on data shape and scale.",{"type":38,"tag":47,"props":2552,"children":2553},{},[2554,2556,2562],{"type":44,"value":2555},"This skill keeps RAG opinions thin on purpose. See ",{"type":38,"tag":53,"props":2557,"children":2559},{"className":2558},[],[2560],{"type":44,"value":2561},"references\u002FRAG.md",{"type":44,"value":2563}," for more details on RAG.",{"type":38,"tag":62,"props":2565,"children":2567},{"id":2566},"reference-files",[2568],{"type":44,"value":2569},"Reference files",{"type":38,"tag":1157,"props":2571,"children":2572},{},[2573,2589],{"type":38,"tag":1161,"props":2574,"children":2575},{},[2576],{"type":38,"tag":1165,"props":2577,"children":2578},{},[2579,2584],{"type":38,"tag":1169,"props":2580,"children":2581},{},[2582],{"type":44,"value":2583},"File",{"type":38,"tag":1169,"props":2585,"children":2586},{},[2587],{"type":44,"value":2588},"Read when",{"type":38,"tag":1190,"props":2590,"children":2591},{},[2592,2608,2639,2655,2671,2687,2703,2719],{"type":38,"tag":1165,"props":2593,"children":2594},{},[2595,2603],{"type":38,"tag":1197,"props":2596,"children":2597},{},[2598],{"type":38,"tag":53,"props":2599,"children":2601},{"className":2600},[],[2602],{"type":44,"value":247},{"type":38,"tag":1197,"props":2604,"children":2605},{},[2606],{"type":44,"value":2607},"Adding tools to an agent, choosing between the four tool types, writing tool names and descriptions",{"type":38,"tag":1165,"props":2609,"children":2610},{},[2611,2619],{"type":38,"tag":1197,"props":2612,"children":2613},{},[2614],{"type":38,"tag":53,"props":2615,"children":2617},{"className":2616},[],[2618],{"type":44,"value":340},{"type":38,"tag":1197,"props":2620,"children":2621},{},[2622,2624,2629,2631,2637],{"type":44,"value":2623},"Wiring a sub-workflow as an agent tool via ",{"type":38,"tag":53,"props":2625,"children":2627},{"className":2626},[],[2628],{"type":44,"value":322},{"type":44,"value":2630},", mapping ",{"type":38,"tag":53,"props":2632,"children":2634},{"className":2633},[],[2635],{"type":44,"value":2636},"fromAi",{"type":44,"value":2638}," overrides",{"type":38,"tag":1165,"props":2640,"children":2641},{},[2642,2650],{"type":38,"tag":1197,"props":2643,"children":2644},{},[2645],{"type":38,"tag":53,"props":2646,"children":2648},{"className":2647},[],[2649],{"type":44,"value":307},{"type":38,"tag":1197,"props":2651,"children":2652},{},[2653],{"type":44,"value":2654},"Writing or refactoring a system prompt, deciding what goes in the system prompt vs tool descriptions",{"type":38,"tag":1165,"props":2656,"children":2657},{},[2658,2666],{"type":38,"tag":1197,"props":2659,"children":2660},{},[2661],{"type":38,"tag":53,"props":2662,"children":2664},{"className":2663},[],[2665],{"type":44,"value":917},{"type":38,"tag":1197,"props":2667,"children":2668},{},[2669],{"type":44,"value":2670},"Forcing JSON output, configuring autoFix retries, validating downstream",{"type":38,"tag":1165,"props":2672,"children":2673},{},[2674,2682],{"type":38,"tag":1197,"props":2675,"children":2676},{},[2677],{"type":38,"tag":53,"props":2678,"children":2680},{"className":2679},[],[2681],{"type":44,"value":876},{"type":38,"tag":1197,"props":2683,"children":2684},{},[2685],{"type":44,"value":2686},"Choosing a memory type, persistence and sessionId handling",{"type":38,"tag":1165,"props":2688,"children":2689},{},[2690,2698],{"type":38,"tag":1197,"props":2691,"children":2692},{},[2693],{"type":38,"tag":53,"props":2694,"children":2696},{"className":2695},[],[2697],{"type":44,"value":2561},{"type":38,"tag":1197,"props":2699,"children":2700},{},[2701],{"type":44,"value":2702},"Building retrieval-augmented agents, intentionally a stub",{"type":38,"tag":1165,"props":2704,"children":2705},{},[2706,2714],{"type":38,"tag":1197,"props":2707,"children":2708},{},[2709],{"type":38,"tag":53,"props":2710,"children":2712},{"className":2711},[],[2713],{"type":44,"value":357},{"type":38,"tag":1197,"props":2715,"children":2716},{},[2717],{"type":44,"value":2718},"Adding human approval to a tool, configuring approval messages, multi-channel approver patterns",{"type":38,"tag":1165,"props":2720,"children":2721},{},[2722,2730],{"type":38,"tag":1197,"props":2723,"children":2724},{},[2725],{"type":38,"tag":53,"props":2726,"children":2728},{"className":2727},[],[2729],{"type":44,"value":1018},{"type":38,"tag":1197,"props":2731,"children":2732},{},[2733],{"type":44,"value":2734},"Building a chat agent on Slack, Discord, Teams, Telegram, or any custom chat surface, multi-workflow shell + core + sub-agents topology",{"type":38,"tag":62,"props":2736,"children":2738},{"id":2737},"anti-patterns",[2739],{"type":44,"value":2740},"Anti-patterns",{"type":38,"tag":1157,"props":2742,"children":2743},{},[2744,2765],{"type":38,"tag":1161,"props":2745,"children":2746},{},[2747],{"type":38,"tag":1165,"props":2748,"children":2749},{},[2750,2755,2760],{"type":38,"tag":1169,"props":2751,"children":2752},{},[2753],{"type":44,"value":2754},"Anti-pattern",{"type":38,"tag":1169,"props":2756,"children":2757},{},[2758],{"type":44,"value":2759},"What goes wrong",{"type":38,"tag":1169,"props":2761,"children":2762},{},[2763],{"type":44,"value":2764},"Fix",{"type":38,"tag":1190,"props":2766,"children":2767},{},[2768,2812,2830,2848,2872,2902,2938,2963,2981,2999,3017,3042,3065,3094,3134],{"type":38,"tag":1165,"props":2769,"children":2770},{},[2771,2789,2794],{"type":38,"tag":1197,"props":2772,"children":2773},{},[2774,2776,2781,2782,2788],{"type":44,"value":2775},"Generic tool names (",{"type":38,"tag":53,"props":2777,"children":2779},{"className":2778},[],[2780],{"type":44,"value":239},{"type":44,"value":114},{"type":38,"tag":53,"props":2783,"children":2785},{"className":2784},[],[2786],{"type":44,"value":2787},"runQuery",{"type":44,"value":948},{"type":38,"tag":1197,"props":2790,"children":2791},{},[2792],{"type":44,"value":2793},"Model can't tell which tool to pick, skips them or hallucinates parameters",{"type":38,"tag":1197,"props":2795,"children":2796},{},[2797,2799,2805,2806],{"type":44,"value":2798},"Verb-first specific names: ",{"type":38,"tag":53,"props":2800,"children":2802},{"className":2801},[],[2803],{"type":44,"value":2804},"Search customer database",{"type":44,"value":114},{"type":38,"tag":53,"props":2807,"children":2809},{"className":2808},[],[2810],{"type":44,"value":2811},"Generate image with Veo",{"type":38,"tag":1165,"props":2813,"children":2814},{},[2815,2820,2825],{"type":38,"tag":1197,"props":2816,"children":2817},{},[2818],{"type":44,"value":2819},"Empty or one-line tool descriptions",{"type":38,"tag":1197,"props":2821,"children":2822},{},[2823],{"type":44,"value":2824},"Model has no clue when to invoke, bad selection",{"type":38,"tag":1197,"props":2826,"children":2827},{},[2828],{"type":44,"value":2829},"Write a real description: what it does, when to use, parameter meanings",{"type":38,"tag":1165,"props":2831,"children":2832},{},[2833,2838,2843],{"type":38,"tag":1197,"props":2834,"children":2835},{},[2836],{"type":44,"value":2837},"Cramming everything into the system prompt",{"type":38,"tag":1197,"props":2839,"children":2840},{},[2841],{"type":44,"value":2842},"Bloated prompt, reuse impossible, per-tool guidance buried",{"type":38,"tag":1197,"props":2844,"children":2845},{},[2846],{"type":44,"value":2847},"Move tool-specific instructions to tool descriptions, keep system prompt to persona + global rules",{"type":38,"tag":1165,"props":2849,"children":2850},{},[2851,2856,2861],{"type":38,"tag":1197,"props":2852,"children":2853},{},[2854],{"type":44,"value":2855},"Code-node tool where a sub-workflow would work",{"type":38,"tag":1197,"props":2857,"children":2858},{},[2859],{"type":44,"value":2860},"Not reusable, can't be tested independently, can't compose with branching",{"type":38,"tag":1197,"props":2862,"children":2863},{},[2864,2865,2870],{"type":44,"value":2382},{"type":38,"tag":53,"props":2866,"children":2868},{"className":2867},[],[2869],{"type":44,"value":322},{"type":44,"value":2871}," with a proper sub-workflow",{"type":38,"tag":1165,"props":2873,"children":2874},{},[2875,2880,2885],{"type":38,"tag":1197,"props":2876,"children":2877},{},[2878],{"type":44,"value":2879},"Passing binary directly to a tool",{"type":38,"tag":1197,"props":2881,"children":2882},{},[2883],{"type":44,"value":2884},"Doesn't work, binary can't cross the tool boundary",{"type":38,"tag":1197,"props":2886,"children":2887},{},[2888,2890,2895,2897],{"type":44,"value":2889},"Pre-stage to storage, pass keys via ",{"type":38,"tag":53,"props":2891,"children":2893},{"className":2892},[],[2894],{"type":44,"value":2636},{"type":44,"value":2896},", tool fetches internally. See ",{"type":38,"tag":53,"props":2898,"children":2900},{"className":2899},[],[2901],{"type":44,"value":1091},{"type":38,"tag":1165,"props":2903,"children":2904},{},[2905,2921,2926],{"type":38,"tag":1197,"props":2906,"children":2907},{},[2908,2913,2915],{"type":38,"tag":53,"props":2909,"children":2911},{"className":2910},[],[2912],{"type":44,"value":184},{"type":44,"value":2914}," without ",{"type":38,"tag":53,"props":2916,"children":2918},{"className":2917},[],[2919],{"type":44,"value":2920},"autoFix",{"type":38,"tag":1197,"props":2922,"children":2923},{},[2924],{"type":44,"value":2925},"One bad model output and the workflow fails",{"type":38,"tag":1197,"props":2927,"children":2928},{},[2929,2931,2936],{"type":44,"value":2930},"Set ",{"type":38,"tag":53,"props":2932,"children":2934},{"className":2933},[],[2935],{"type":44,"value":272},{"type":44,"value":2937}," with a cheap fixer model",{"type":38,"tag":1165,"props":2939,"children":2940},{},[2941,2953,2958],{"type":38,"tag":1197,"props":2942,"children":2943},{},[2944,2946,2951],{"type":44,"value":2945},"Hardcoded ",{"type":38,"tag":53,"props":2947,"children":2949},{"className":2948},[],[2950],{"type":44,"value":971},{"type":44,"value":2952}," or no sessionId",{"type":38,"tag":1197,"props":2954,"children":2955},{},[2956],{"type":44,"value":2957},"Conversations cross or memory never matches",{"type":38,"tag":1197,"props":2959,"children":2960},{},[2961],{"type":44,"value":2962},"Pass sessionId from trigger consistently to memory and tools",{"type":38,"tag":1165,"props":2964,"children":2965},{},[2966,2971,2976],{"type":38,"tag":1197,"props":2967,"children":2968},{},[2969],{"type":44,"value":2970},"Two near-identical tools instead of one with branching",{"type":38,"tag":1197,"props":2972,"children":2973},{},[2974],{"type":44,"value":2975},"Model gets confused, selection is non-deterministic",{"type":38,"tag":1197,"props":2977,"children":2978},{},[2979],{"type":44,"value":2980},"One tool with internal branching driven by parameters",{"type":38,"tag":1165,"props":2982,"children":2983},{},[2984,2989,2994],{"type":38,"tag":1197,"props":2985,"children":2986},{},[2987],{"type":44,"value":2988},"Hardcoding a system prompt that's reused across workflows or iterated often",{"type":38,"tag":1197,"props":2990,"children":2991},{},[2992],{"type":44,"value":2993},"Editing requires republishing, can't share across workflows, tuning churn lives in node JSON",{"type":38,"tag":1197,"props":2995,"children":2996},{},[2997],{"type":44,"value":2998},"Store in a Data Table, load at runtime",{"type":38,"tag":1165,"props":3000,"children":3001},{},[3002,3007,3012],{"type":38,"tag":1197,"props":3003,"children":3004},{},[3005],{"type":44,"value":3006},"Wrapping image \u002F audio \u002F video generation in an Agent",{"type":38,"tag":1197,"props":3008,"children":3009},{},[3010],{"type":44,"value":3011},"Binary doesn't flow through tools or out of the output formatter, Agent adds nodes for no gain",{"type":38,"tag":1197,"props":3013,"children":3014},{},[3015],{"type":44,"value":3016},"Use the provider's native single-call node directly (OpenAI Image, Gemini Image, ElevenLabs), HTTP Request only when going through an aggregator",{"type":38,"tag":1165,"props":3018,"children":3019},{},[3020,3025,3030],{"type":38,"tag":1197,"props":3021,"children":3022},{},[3023],{"type":44,"value":3024},"Reaching for Agent + Switch to route on natural-language input",{"type":38,"tag":1197,"props":3026,"children":3027},{},[3028],{"type":44,"value":3029},"Two nodes plus prompt boilerplate where Text Classifier is one node with N built-in output branches",{"type":38,"tag":1197,"props":3031,"children":3032},{},[3033,3035,3040],{"type":44,"value":3034},"Use Text Classifier (",{"type":38,"tag":53,"props":3036,"children":3038},{"className":3037},[],[3039],{"type":44,"value":145},{"type":44,"value":3041},"), each category gets its own output handle, wire downstream paths directly",{"type":38,"tag":1165,"props":3043,"children":3044},{},[3045,3050,3055],{"type":38,"tag":1197,"props":3046,"children":3047},{},[3048],{"type":44,"value":3049},"Tool that mutates user-visible state (send, pay, refund) without human review",{"type":38,"tag":1197,"props":3051,"children":3052},{},[3053],{"type":44,"value":3054},"Agent fires irreversible action on a wrong inference",{"type":38,"tag":1197,"props":3056,"children":3057},{},[3058,3060],{"type":44,"value":3059},"Wrap with the review tool node that fits the channel (Slack\u002FChat\u002FDiscord\u002FTelegram), show actual params via ",{"type":38,"tag":53,"props":3061,"children":3063},{"className":3062},[],[3064],{"type":44,"value":1561},{"type":38,"tag":1165,"props":3066,"children":3067},{},[3068,3078,3083],{"type":38,"tag":1197,"props":3069,"children":3070},{},[3071,3073],{"type":44,"value":3072},"Filling the review approval message via ",{"type":38,"tag":53,"props":3074,"children":3076},{"className":3075},[],[3077],{"type":44,"value":332},{"type":38,"tag":1197,"props":3079,"children":3080},{},[3081],{"type":44,"value":3082},"The model paraphrases, you approve text not values",{"type":38,"tag":1197,"props":3084,"children":3085},{},[3086,3087,3092],{"type":44,"value":2382},{"type":38,"tag":53,"props":3088,"children":3090},{"className":3089},[],[3091],{"type":44,"value":1553},{"type":44,"value":3093}," directly so the literal call is visible",{"type":38,"tag":1165,"props":3095,"children":3096},{},[3097,3102,3107],{"type":38,"tag":1197,"props":3098,"children":3099},{},[3100],{"type":44,"value":3101},"Chat-triggered agent workflow that posts replies without filtering out the bot's own user ID",{"type":38,"tag":1197,"props":3103,"children":3104},{},[3105],{"type":44,"value":3106},"Bot's own messages re-trigger the workflow, infinite loop that burns runs and tokens until rate limits or n8n concurrency stops it",{"type":38,"tag":1197,"props":3108,"children":3109},{},[3110,3112,3117,3119,3125,3127,3132],{"type":44,"value":3111},"Prefer trigger-level filtering when available (Slack Trigger's ",{"type":38,"tag":53,"props":3113,"children":3115},{"className":3114},[],[3116],{"type":44,"value":1010},{"type":44,"value":3118}," is an exclusion list, put the bot ID there). Otherwise filter on ",{"type":38,"tag":53,"props":3120,"children":3122},{"className":3121},[],[3123],{"type":44,"value":3124},"$json.user !== '\u003CBOT_USER_ID>'",{"type":44,"value":3126}," (or the surface equivalent) as the first node after the trigger. Required for ANY chat-triggered workflow that sends a reply (Slack, Discord, Teams, Telegram), regardless of complexity. See ",{"type":38,"tag":53,"props":3128,"children":3130},{"className":3129},[],[3131],{"type":44,"value":1018},{"type":44,"value":3133}," for per-surface semantics",{"type":38,"tag":1165,"props":3135,"children":3136},{},[3137,3150,3155],{"type":38,"tag":1197,"props":3138,"children":3139},{},[3140,3142,3148],{"type":44,"value":3141},"Passing the bare blocks array to the Slack node's ",{"type":38,"tag":53,"props":3143,"children":3145},{"className":3144},[],[3146],{"type":44,"value":3147},"blocksUi",{"type":44,"value":3149}," when the agent returns Block Kit",{"type":38,"tag":1197,"props":3151,"children":3152},{},[3153],{"type":44,"value":3154},"The Slack node accepts the input silently and posts the message with no rich content; no error, no warning",{"type":38,"tag":1197,"props":3156,"children":3157},{},[3158,3160,3166,3168,3174,3176,3182,3183,3189],{"type":44,"value":3159},"Wrap as ",{"type":38,"tag":53,"props":3161,"children":3163},{"className":3162},[],[3164],{"type":44,"value":3165},"{ \"blocks\": [...] }",{"type":44,"value":3167}," with the value as a real array, not a stringified one. Expression: ",{"type":38,"tag":53,"props":3169,"children":3171},{"className":3170},[],[3172],{"type":44,"value":3173},"={{ { \"blocks\": $('Agent').item.json.output.blocks } }}",{"type":44,"value":3175},". See ",{"type":38,"tag":53,"props":3177,"children":3179},{"className":3178},[],[3180],{"type":44,"value":3181},"n8n-node-configuration-official",{"type":44,"value":259},{"type":38,"tag":53,"props":3184,"children":3186},{"className":3185},[],[3187],{"type":44,"value":3188},"references\u002FCOMMS_NODES.md",{"type":44,"value":3190}," \"Block Kit messages\"",{"type":38,"tag":3192,"props":3193,"children":3194},"style",{},[3195],{"type":44,"value":3196},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3198,"total":695},[3199,3205,3219,3235,3253,3268,3281],{"slug":4,"name":4,"fn":5,"description":6,"org":3200,"tags":3201,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3202,3203,3204],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"slug":1091,"name":1091,"fn":3206,"description":3207,"org":3208,"tags":3209,"stars":22,"repoUrl":23,"updatedAt":3218},"handle binary data and files in n8n","Use when handling files, images, attachments, or binary data in n8n, OR when an AI agent needs to take a user-uploaded file as tool input or return a generated file. For Data Tables (schemas, dedup, persistent state), see the separate n8n-data-tables-official skill. Triggers on \"file\", \"image\", \"PDF\", \"attachment\", \"binary\", \"upload\", \"download\", chat trigger with files, agent tool that needs a file, vision\u002Fmultimodal, or any handling of non-JSON file data.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3210,3213,3216,3217],{"name":3211,"slug":3212,"type":15},"Automation","automation",{"name":3214,"slug":3215,"type":15},"File Uploads","file-uploads",{"name":8,"slug":8,"type":15},{"name":20,"slug":21,"type":15},"2026-07-08T05:45:01.884342",{"slug":3220,"name":3220,"fn":3221,"description":3222,"org":3223,"tags":3224,"stars":22,"repoUrl":23,"updatedAt":3234},"n8n-code-nodes-official","write custom logic in n8n","Use when the user reaches for a Code node, mentions writing JavaScript or Python in n8n, or any custom logic comes up in workflow design. Triggers on \"Code node\", \"Code\", \"JavaScript\", \"Python\", \"custom logic\", \"transform data\", \"$input\", \"$json transformation\", \"loop in code\", \"write a function\", or any time the obvious answer seems to be \"just put it in code.\"",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3225,3228,3231],{"name":3226,"slug":3227,"type":15},"Engineering","engineering",{"name":3229,"slug":3230,"type":15},"JavaScript","javascript",{"name":3232,"slug":3233,"type":15},"Python","python","2026-07-08T05:44:49.656127",{"slug":3236,"name":3236,"fn":3237,"description":3238,"org":3239,"tags":3240,"stars":22,"repoUrl":23,"updatedAt":3252},"n8n-credentials-and-security-official","manage credentials and security in n8n","Use when handling any auth, API keys, tokens, OAuth, bearer tokens, basic auth, or secret values in n8n workflows. Triggers on \"API key\", \"token\", \"bearer\", \"OAuth\", \"secret\", \"auth\", \"credentials\", \"Authorization header\", \"x-api-key\", or any node configuration that mentions a third-party service.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3241,3244,3245,3246,3249],{"name":3242,"slug":3243,"type":15},"Authentication","authentication",{"name":3211,"slug":3212,"type":15},{"name":8,"slug":8,"type":15},{"name":3247,"slug":3248,"type":15},"OAuth","oauth",{"name":3250,"slug":3251,"type":15},"Security","security","2026-07-08T05:45:07.766252",{"slug":3254,"name":3254,"fn":3255,"description":3256,"org":3257,"tags":3258,"stars":22,"repoUrl":23,"updatedAt":3267},"n8n-data-tables-official","manage n8n Data Tables","Use when working with n8n's built-in Data Tables, designing schemas, inserting\u002Fupdating\u002Fupserting rows, deduping, or querying. Triggers on \"Data Table\", \"data table\", `n8n-nodes-base.dataTable`, \"dedup\", \"idempotency\", \"lookup\", \"persistent state\", \"store across executions\", or any schema design discussion inside n8n.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3259,3262,3265,3266],{"name":3260,"slug":3261,"type":15},"Data Modeling","data-modeling",{"name":3263,"slug":3264,"type":15},"Database","database",{"name":8,"slug":8,"type":15},{"name":20,"slug":21,"type":15},"2026-07-08T05:44:52.048039",{"slug":3269,"name":3269,"fn":3270,"description":3271,"org":3272,"tags":3273,"stars":22,"repoUrl":23,"updatedAt":3280},"n8n-debugging-official","debug and fix n8n workflow errors","Use when an n8n workflow isn't working, errors appear, results don't match what was expected, or the user says \"this isn't working.\" Triggers on errors, unexpected output, \"it's not working\", \"why is this happening\", \"the workflow stopped\", failure investigation, or any debugging context.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3274,3275,3278,3279],{"name":3211,"slug":3212,"type":15},{"name":3276,"slug":3277,"type":15},"Debugging","debugging",{"name":8,"slug":8,"type":15},{"name":20,"slug":21,"type":15},"2026-07-08T05:45:05.897341",{"slug":3282,"name":3282,"fn":3283,"description":3284,"org":3285,"tags":3286,"stars":22,"repoUrl":23,"updatedAt":3293},"n8n-error-handling-official","implement error handling in n8n","Use when building any webhook-triggered workflow, scheduled\u002Fproduction-bound workflow, wiring a per-node error output, or any workflow where silent failure would drop user-visible work. Triggers on \"webhook\", \"respond to webhook\", \"API\", \"production\", \"error\", \"failure\", \"5xx\", \"try\u002Fcatch\", \"error workflow\", \"onError\", \"continueErrorOutput\", \"error branch\", \"node error output\", \"output(1)\", \"main[1]\", \"scheduled\", or any workflow that runs unattended.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3287,3288,3289,3292],{"name":3276,"slug":3277,"type":15},{"name":8,"slug":8,"type":15},{"name":3290,"slug":3291,"type":15},"Operations","operations",{"name":20,"slug":21,"type":15},"2026-07-08T05:44:59.710099",{"items":3295,"total":3435},[3296,3313,3326,3337,3347,3358,3371,3388,3397,3409,3419,3429],{"slug":3297,"name":3297,"fn":3298,"description":3299,"org":3300,"tags":3301,"stars":3310,"repoUrl":3311,"updatedAt":3312},"config-evals","configure workflow evaluations","Builds and maintains configuration-based evaluations on a workflow with the eval-config tool. Use when the user asks to set up, add, view, change, or remove an evaluation, score, grade, or judge a workflow's output, or measure answer quality against a test dataset. This is the only eval form Instance AI handles — it does not touch on-canvas evaluation nodes.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3302,3305,3306,3309],{"name":3303,"slug":3304,"type":15},"Evals","evals",{"name":8,"slug":8,"type":15},{"name":3307,"slug":3308,"type":15},"Testing","testing",{"name":20,"slug":21,"type":15},198156,"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fn8n","2026-07-24T05:37:07.398695",{"slug":3314,"name":3314,"fn":3315,"description":3316,"org":3317,"tags":3318,"stars":3310,"repoUrl":3311,"updatedAt":3325},"credential-setup-with-computer-use","configure n8n credentials via browser","Guides n8n credential setup through Computer Use browser tools. Use when a user needs OAuth apps, API keys, client IDs, client secrets, or other credential values from an external service console.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3319,3320,3323,3324],{"name":3211,"slug":3212,"type":15},{"name":3321,"slug":3322,"type":15},"Configuration","configuration",{"name":8,"slug":8,"type":15},{"name":3247,"slug":3248,"type":15},"2026-06-30T07:40:45.54",{"slug":3327,"name":3327,"fn":3255,"description":3328,"org":3329,"tags":3330,"stars":3310,"repoUrl":3311,"updatedAt":3336},"data-table-manager","Load before calling data-tables or parse-file. Use for natural standalone requests like \"what data tables do I have?\", \"show\u002Flist my tables\", or \"what columns are in this table?\", and whenever the user asks to list, show, create, inspect, import, seed, query, update, clean up, rename columns in, or delete data tables and rows, especially from CSV\u002FXLSX\u002FJSON attachments. Also load before building or planning workflows that create or write to Data Tables (then load workflow-builder before build-workflow).",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3331,3334,3335],{"name":3332,"slug":3333,"type":15},"Data Engineering","data-engineering",{"name":3263,"slug":3264,"type":15},{"name":8,"slug":8,"type":15},"2026-07-27T06:07:14.648144",{"slug":3338,"name":3338,"fn":3339,"description":3340,"org":3341,"tags":3342,"stars":3310,"repoUrl":3311,"updatedAt":3325},"debugging-executions","debug failed n8n workflow executions","Debug failed or wrong-output workflow executions using executions tools. Load when the user reports execution failures, unexpected node output, empty parameter values after a successful run, or a node showing a red or failed expression error.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3343,3344,3345,3346],{"name":3211,"slug":3212,"type":15},{"name":3276,"slug":3277,"type":15},{"name":8,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"slug":3348,"name":3348,"fn":3349,"description":3350,"org":3351,"tags":3352,"stars":3310,"repoUrl":3311,"updatedAt":3357},"intent-recognition","classify automation requests by control flow","Classifies automation requests using two decisions: anchor (which primitive owns the top-level control flow — workflow-anchored, agent-anchored, needs-clarification, or out-of-scope) and embeds_other (whether the other primitive appears embedded inside — an agent step inside a workflow, or a workflow invoked as an agent tool). Must be used before deciding the intent of any automation request, including compound requests with multiple independent automations, mid-build extensions to an existing workflow or agent, one-off questions or reports that need external systems you cannot query directly, and requests that need clarification before an anchor can be chosen, before choosing workflow-builder, planning, or an agent-oriented design.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3353,3354,3355,3356],{"name":17,"slug":18,"type":15},{"name":3211,"slug":3212,"type":15},{"name":8,"slug":8,"type":15},{"name":20,"slug":21,"type":15},"2026-07-30T05:30:06.772347",{"slug":3359,"name":3359,"fn":3360,"description":3361,"org":3362,"tags":3363,"stars":3310,"repoUrl":3311,"updatedAt":3370},"n8n-cli","manage n8n workflows from the CLI","Use the n8n CLI to manage workflows, credentials, executions, and more on an n8n instance. Use when the user asks to interact with n8n, automate workflows, manage credentials, or operate their instance from the command line.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3364,3365,3368,3369],{"name":3211,"slug":3212,"type":15},{"name":3366,"slug":3367,"type":15},"CLI","cli",{"name":8,"slug":8,"type":15},{"name":20,"slug":21,"type":15},"2026-04-06T18:38:40.360123",{"slug":3372,"name":3372,"fn":3373,"description":3374,"org":3375,"tags":3376,"stars":3310,"repoUrl":3311,"updatedAt":3387},"n8n-docs-assistant","retrieve n8n documentation and guidance","Answers n8n product, setup, credential, node, hosting, API, and usage questions from current n8n docs. Load n8n-docs via load_tool before calling it (search \"n8n docs\" if not visible). Use when the user asks how to configure, set up, troubleshoot, or understand n8n behavior, especially credential setup questions opened from the credential modal.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3377,3380,3381,3384],{"name":3378,"slug":3379,"type":15},"Documentation","documentation",{"name":8,"slug":8,"type":15},{"name":3382,"slug":3383,"type":15},"Reference","reference",{"name":3385,"slug":3386,"type":15},"Search","search","2026-07-27T06:07:15.692906",{"slug":3389,"name":3389,"fn":3390,"description":3391,"org":3392,"tags":3393,"stars":3310,"repoUrl":3311,"updatedAt":3325},"planned-task-runtime","manage n8n task runtimes","Handles system follow-up turns: planned-task-follow-up (synthesize, replan, build-workflow, checkpoint), background-task-completed, running-tasks context, and create-tasks silence rules. Load whenever any of these tags appear or after calling create-tasks.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3394,3395,3396],{"name":3211,"slug":3212,"type":15},{"name":8,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"slug":3398,"name":3398,"fn":3399,"description":3400,"org":3401,"tags":3402,"stars":3310,"repoUrl":3311,"updatedAt":3408},"planning","coordinate multi-artifact workflows","ONLY for coordinated multi-artifact work: multiple workflows with dependencies, shared data-table schema\u002Fmigration across tasks, or the user explicitly asked to review a plan first. Load create-tasks via load_tool before calling it (search \"create tasks\" if not visible). Do NOT use for new one-off workflows, single-workflow edits, verification-only requests, or standalone data-table ops — use workflow-builder or data-table-manager instead.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3403,3404,3405,3407],{"name":3211,"slug":3212,"type":15},{"name":8,"slug":8,"type":15},{"name":3406,"slug":3398,"type":15},"Planning",{"name":20,"slug":21,"type":15},"2026-07-27T06:07:16.673218",{"slug":3410,"name":3410,"fn":3411,"description":3412,"org":3413,"tags":3414,"stars":3310,"repoUrl":3311,"updatedAt":3418},"post-build-flow","verify and set up n8n workflows","Handles workflow verification and setup after build-workflow succeeds, or when the message contains workflow-verification-follow-up or workflow-setup-required. Load after direct builds, when verificationReadiness requires action, or on orchestrator verify\u002Fsetup follow-up turns.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3415,3416,3417],{"name":3211,"slug":3212,"type":15},{"name":8,"slug":8,"type":15},{"name":20,"slug":21,"type":15},"2026-07-24T05:37:08.421329",{"slug":3420,"name":3420,"fn":3421,"description":3422,"org":3423,"tags":3424,"stars":3310,"repoUrl":3311,"updatedAt":3428},"workflow-builder","build and edit n8n workflows","Load before calling build-workflow. Default path for all single-workflow work: new one-off workflows, existing-workflow edits, verification repairs, and workflow-local data tables. Write or edit a workspace source file, then call build-workflow with filePath. When the workflow creates or writes Data Tables, load data-table-manager first, then this skill. Do not load planning or create-tasks first. Load planning only when multiple coordinated workflows or shared cross-task data tables require a dependency-aware task graph.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3425,3426,3427],{"name":3211,"slug":3212,"type":15},{"name":8,"slug":8,"type":15},{"name":20,"slug":21,"type":15},"2026-07-30T05:30:07.798011",{"slug":4,"name":4,"fn":5,"description":6,"org":3430,"tags":3431,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[3432,3433,3434],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},25]