n8n-io/n8n · error · LLMServiceError

LLM does not support tools

Error message

LLM does not support tools

What it means

Construction-time guard in the discovery subgraph: config.llm.bindTools is not a function, so the agent cannot be created with the discovery tools (including the required submit tool). LLMServiceError records the offending model via _llmType(). Thrown during create/compile, before any discovery prompt runs.

Solutions

  1. Use a LangChain chat model with bindTools support for the discovery subgraph
  2. Wrap the model in a tool-capable adapter
  3. Verify the model type logged in the error's llmModel field and replace it with a tool-calling variant
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at packages/@n8n/ai-workflow-builder.ee/src/subgraphs/discovery.subgraph.ts:332 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12). Data as JSON: /api/errors/cacfe6a0a7fd1675. Report an issue: GitHub.

Appendix: source

Thrown at packages/@n8n/ai-workflow-builder.ee/src/subgraphs/discovery.subgraph.ts:332

		// Create agent with tools bound (including submit tool)
		const systemPrompt = ChatPromptTemplate.fromMessages([
			[
				'system',
				[
					{
						type: 'text',
						text: discoveryPrompt,
						cache_control: { type: 'ephemeral' },
					},
				],
			],
			['human', '{prompt}'],
			['placeholder', '{messages}'],
		]);

		if (typeof config.llm.bindTools !== 'function') {
			throw new LLMServiceError('LLM does not support tools', {
				llmModel: config.llm._llmType(),
			});
		}

		// Bind all tools including the output tool
		const allTools = [...tools, submitTool];
		this.agent = systemPrompt.pipe(config.llm.bindTools(allTools));
		this.plannerAgent = createPlannerAgent({
			llm: config.plannerLLM,
			tools: [
				createGetDocumentationTool().tool,
				createWebFetchTool(plannerSecurityFactory, ssrf).tool,
			],
		});

		// Build the subgraph
		const subgraph = new StateGraph(DiscoverySubgraphState)
			.addNode('discovery_agent', this.callAgent.bind(this))

View on GitHub (pinned to 5ac6606e81)