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
- Ensure child agents that suspend populate pendingSuspend with valid resumeSchema objects.
- Verify that child agent tools with suspendSchema use proper JSON Schema definitions.
- If child suspension is not needed, configure the child to not use suspend/resume tools.
- 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
- Ensure child agents populate pendingSuspend with valid resumeSchema objects.
- Do not configure child agents with suspendSchema tools unless the parent supports cascade.
- Keep parent and child agent library versions in sync.
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
- Delegated child input is missing or invalid
- Relation ${entityMetadata.name}#${relation.propertyName} and
- Invalid delegate sub-agent tool name "${name}": must start w
- ${toolName} requires resumeSubAgent and cancelSubAgent to be
- ${toolName} was registered without a runSubAgent callback, a
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/2dea59e2c1c045a7.
Report an issue: GitHub.