Delegation#
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 Managing agents 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 mode , 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.