Field guide / 12 min
Choose who owns the agent loop
Responses for application-owned control, the Agents SDK for an in-app runner, or the Agents API for an OpenAI-managed harness.
An agent plans, calls tools, carries state, and may hand work to specialists. The key architecture decision is not how many agents exist—it is who owns the run loop, tool policy, state, approvals, and trace.
Working principles
One controller
Assign one layer to advance the run and resolve terminal states. Split-brain orchestration produces duplicated actions and unclear recovery.
Specialists need contracts
A handoff should define the goal, permitted tools, relevant context, output shape, and authority returned to the caller.
Trace before scale
Instrument one-agent runs before adding handoffs. Complexity without traces hides whether coordination improves the result.
Field procedure
- 01
Select loop ownership
Use Responses when your application owns each turn, the Agents SDK when its runner should advance tools and handoffs inside your application, or the Agents API when OpenAI should run a managed Codex harness and save progress for long-running tasks.
- 02
Define terminal states
Specify success, blocked, needs approval, budget exhausted, cancelled, and failed—with a caller action for each.
- 03
Bound every specialist
Give each specialist one outcome and a limited tool set. Return a typed result rather than an open-ended transcript.
- 04
Insert approval boundaries
Pause before external messages, destructive changes, purchases, credential use, or other high-impact actions.
- 05
Evaluate the workflow
Measure task success, tool errors, handoff count, latency, cost, and human interventions against a single-agent baseline.
PASS / FAIL
Acceptance checklist
- Loop owner is unambiguous.
- Stop and cancellation paths are tested.
- Handoffs carry bounded context and typed results.
- Traces exclude secrets and support incident review.
WATCH / REJECT
Failure patterns
- Adding agents as a substitute for a clear task graph.
- Allowing both app code and SDK code to retry writes.
- Calling a workflow complete when the transcript merely sounds confident.