n8n-io/n8n · error · Error

agents.chat.delegate.childSuspendUnsupported

Error message

agents.chat.delegate.childSuspendUnsupported

What it means

Thrown by cascadeChildSuspension when the delegated child produced a pendingSuspend entry but its suspendPayload or resumeSchema is missing or malformed (resumeSchema is not a valid JSON Schema object). The constant DELEGATED_CHILD_SUSPEND_UNSUPPORTED_MESSAGE (agents.chat.delegate.childSuspendUnsupported) indicates the parent cannot cascade the child's suspension upward because the suspension metadata is incomplete.

Source

Thrown at packages/@n8n/agents/src/runtime/tools/delegate-sub-agent-tool.ts:828

		},
		emitChunk: createEmitChunkHelper(ctx, request),
	};
}

function isInterruptibleToolContext(
	ctx: ToolContext | InterruptibleToolContext,
): ctx is InterruptibleToolContext {
	return 'suspend' in ctx;
}

async function cascadeChildSuspension(
	ctx: InterruptibleToolContext,
	request: DelegateSubAgentRequest,
	output: DelegateSubAgentToolOutput,
): Promise<never> {
	const suspension = output.pendingSuspend?.[0];
	if (!suspension || !isJsonSchemaObject(suspension.resumeSchema)) {
		throw new Error(DELEGATED_CHILD_SUSPEND_UNSUPPORTED_MESSAGE);
	}

	return await ctx.suspend(suspension.suspendPayload, {
		resumeSchema: suspension.resumeSchema,
		continuation: {
			runId: suspension.runId,
			toolCallId: suspension.toolCallId,
			taskPath: request.taskPath,
			subAgentId: request.subAgentId,
			childCount: request.childCount,
			...(output.threadId !== undefined ? { threadId: output.threadId } : {}),
			...(output.resumeContext !== undefined ? { resumeContext: output.resumeContext } : {}),
		},
	});
}

function emitSubAgentStarted(
	ctx: ToolContext,

View on GitHub (pinned to 5ac6606e81)

Solutions

  1. Ensure child agents that suspend populate pendingSuspend with valid resumeSchema objects.
  2. Verify that child agent tools with suspendSchema use proper JSON Schema definitions.
  3. If child suspension is not needed, configure the child to not use suspend/resume tools.
  4. Check for version skew between parent and child agent packages.
Defensive patterns

Strategy: try-catch

Type guard

function hasValidSuspendSchema(suspension: unknown): boolean {
  return (
    typeof suspension === 'object' && suspension !== null &&
    'resumeSchema' in suspension &&
    typeof (suspension as any).resumeSchema === 'object' &&
    (suspension as any).resumeSchema !== null &&
    typeof (suspension as any).resumeSchema.type === 'string'
  );
}

Try / catch

try {
  await runDelegation();
} catch (e) {
  if (e instanceof Error && e.message === 'agents.chat.delegate.childSuspendUnsupported') {
    // child suspension cannot cascade; configure child to avoid suspend tools
  } else throw e;
}

Prevention

When it happens

Trigger: A delegated child agent suspends (returns output.status === 'suspended') but the pendingSuspend[0] entry lacks a valid resumeSchema (isJsonSchemaObject returns false) or is entirely missing. Also possible if a custom child agent returns a suspension without proper schema metadata.

Common situations: A child agent using a custom tool with a suspendSchema that is malformed or set to a non-object value. Version mismatch between parent and child agent libraries where the suspension shape changed. A child agent that returns 'suspended' status without populating pendingSuspend correctly.

Related errors


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