An agent can hand off part of a request to another agent instead of (or alongside) calling tools directly. List the other agent's name in delegates when you create or update it:
SELECT aidb.create_agent( name => 'sql_specialist', instructions => 'You answer questions about the orders and customers tables precisely.', model => 'my_gpt', tools => ARRAY['run_sql_query'] ); SELECT aidb.create_agent( name => 'help_desk', instructions => 'You help users with general questions, delegating data questions to the SQL specialist.', model => 'my_gpt', delegates => ARRAY['sql_specialist'] ); SELECT * FROM aidb.agent_converse('help_desk', 'How many orders came in last week?');
Presenting delegates to the model
Each configured delegate becomes an ordinary function-call tool, named after the delegate agent, with two arguments: prompt (required — the request to hand off) and conversation_id (optional — see continuing a delegate conversation below). The delegate's own instructions become that tool's description, so the delegating model sees them as "what this delegate is for" — write an agent's instructions with that dual purpose in mind if you expect it to be delegated to.
A delegate name must not collide with one of the agent's own tools, and it's validated to be a currently-registered agent at create_agent/update_agent time, the same as tools is.
Continuing a delegate conversation
Calling a delegate returns an object with answer and conversation_id. The model can pass that conversation_id back on a later delegate call in the same or a future agent_converse run to continue that specific delegate conversation — with its own prior history — instead of starting fresh each time. Omitting it (the common case) starts a new conversation with the delegate on every call.
Propagating behavior across a handoff
- Read-only mode propagates. If the delegating run is read-only, the delegate's own sub-call is forced read-only too — a read-only agent can't use delegation to reach a write through another agent. A read-only delegate call always returns
conversation_id: nulland can't be continued. - Debug mode propagates. If the top-level call passed
debug => true, the delegate's own actions are emitted asNOTICEmessages too. - Role doesn't propagate. A delegate runs under its own configured
role(or the current user, if it has none) — not the delegating agent's role. - Budgets don't propagate. Each delegate call gets its own fresh token/iteration budget and timeout, from its own configuration — a parent's budget doesn't constrain how much a delegate can do.
Delegation depth
Delegation chains are capped at 10 levels deep (a chain of agents, each delegating to the next). This exists mainly to fail fast on a cycle — one agent delegating back to itself, or two agents delegating back and forth — rather than recursing until Postgres's stack depth check aborts the backend. Hitting the limit stops the task immediately with an error; it isn't retried the way an ordinary tool failure might be.