Continuable subagents: follow-ups and control

DataMind Oda can hand part of a task to a helper agent, called a subagent, that keeps working in the background and stays reachable after it starts: a continuable subagent. Oda can send it follow-ups, interrupt its current turn, and list the subagents of a chat with their status. This page covers everything after the start; how delegation itself begins is in Delegating work to subagents, and one-shot background runs are in Background subagents and job collection.

How a continuable subagent starts

Send a follow-up

Oda sends a follow-up with send_message, addressing a direct continuable subagent by its id; a resident subagent may also send a message to its direct parent. Messages travel between neighbours in the tree: down from a parent, or up to a direct parent. A deeper subagent is a candidate for an interrupt, not for a message.

Note

message delivered to agent <agent_id> confirms that the message reached the subagent, nothing more. The call returns no answer from the subagent, only that receipt, and a failure means the message was NOT delivered.

Interrupt a turn

See a chat's subagents

When a request is refused

WhenWhat appears
A message comes from outside the direct relationshipmessage delivery requires the exact live sender agent
The chat that started the subagent is not livedirect parent is not live; the message was not delivered
The subagent is being wound downsubagent "<id>" activation is being disposed; the message was not delivered
A message targets a subagent that cannot be resumedsubagent "<id>" has no supported continuation state and cannot be resumed; choose a different target
The active-subagent limit is reachedsubagent limit reached (active child limit: <n>); wait for an existing child to finish or complete this work with the current agents
A start repeats an existing subagent idsubagent "<id>" already exists
An image prompt meets a model without image inputModel "<model>" does not support image input.
A prompt carries too many imagesImage batch exceeds the configured image-count limit.

The active-subagent limit is shared across the chat's tree of subagents and defaults to eight; Subagent settings holds it. More failure messages are collected in Subagent failures and diagnostics.

Questions, answered

What can Oda do with a subagent's id?

Everything that happens after the start is addressed to that id: follow-ups, interrupts and the entries in the subagent list. A one-shot background run works differently; see Background subagents and job collection.

Does message delivered mean the subagent answered?

No. It confirms that the message reached the subagent, nothing more. The call returns no answer from the subagent, only that receipt, and a failure means the message was NOT delivered. A reply from the subagent, when it sends one, is a separate message.

Why was a follow-up not delivered?

A message goes through only between neighbours in the tree, and only while the chat that started the subagent is live: a caller that is not the exact live sender is refused, a message sent while that chat is not live is not delivered, and a subagent that is being wound down or cannot be resumed refuses the message as well. The exact lines are in the table above.

Can Oda stop a subagent that is still working?

Yes. Oda requests an interrupt for the subagent's current turn, and the line interrupt requested for agent <agent_id> means the request was accepted. The stop is cooperative, so the subagent may keep running briefly. Interrupting a subagent that already finished is an accepted no-op.

Does interrupting a subagent stop the subagents it started?

No. An interrupt stops only the target's current turn. Messages already waiting stay parked for a later message, and subagents it started keep running. The subagent itself stays available for follow-ups.

What happens to messages that were waiting when a subagent is interrupted?

They stay parked: an interrupt does not deliver or discard them. A later message wakes the subagent, and the parked messages are taken up then.

What does inactive mean in the subagent list?

No turn is executing for that subagent right now, whether it is loaded or must be resumed. It is not a verdict on the work: it does not say that the subagent finished, succeeded or failed, or that it waits for other subagents. A direct subagent stays a candidate for a follow-up in every status: a message steers it while it runs, or starts or resumes a turn when it is inactive.

Why is a background subagent missing from the list?

The list shows continuable subagents only. A one-shot background run cannot take follow-ups, so it never appears; its result is collected as a job instead, as described in Background subagents and job collection. An entry that cannot be read appears as a diagnostic, not as a subagent.

What is the diagnostic in the list?

In the descendants list, an entry that cannot be read takes a [diagnostic: <reason>] line instead. corrupt means its record cannot be read; unavailable means it was temporarily unreadable, and a later listing can show it again.

Why was an image follow-up refused?

Prompts can carry images only when the subagent's model accepts them; an image prompt to a subagent whose model takes text only is refused before anything is delivered (Model "<model>" does not support image input.), and a prompt that carries too many images is refused as a batch (Image batch exceeds the configured image-count limit.).

What happens to subagents when I archive the chat?

The subagents it started that are still running are stopped; subagents that are not running are left as they are. If one stop fails, the others still stop. Archiving a chat is described in Chat with Oda.

How many subagents can be active at once?

A chat allows a set number of active continuable subagents, shared across its whole tree of subagents and eight by default; Subagent settings holds the limit. At the limit, starting or resuming one is refused with subagent limit reached (active child limit: <n>); wait for an existing child to finish or complete this work with the current agents, and waiting for a subagent to finish frees a place.