Skip to content

Commit b302974

Browse files
authored
docs: Add more clarity on multi-agent design patterns (#1650)
This pull request updates the "Agents" documentation page to mention both manger and handoffs design patterns. I've got a feedback from a customer that the Agents SDK documentation does not mention the "agents as tools" design pattern when mentioning handoffs, so he thought this SDK supports only handoffs. This is a valid feedback, so we can consider improving the documentation to give more clarity.
1 parent 053dbc4 commit b302974

File tree

1 file changed

+47
-7
lines changed

1 file changed

+47
-7
lines changed

docs/agents.md

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,47 @@ agent = Agent(
7171

7272
When you pass an `output_type`, that tells the model to use [structured outputs](https://platform.openai.com/docs/guides/structured-outputs) instead of regular plain text responses.
7373

74-
## Handoffs
74+
## Multi-agent system design patterns
7575

76-
Handoffs are sub-agents that the agent can delegate to. You provide a list of handoffs, and the agent can choose to delegate to them if relevant. This is a powerful pattern that allows orchestrating modular, specialized agents that excel at a single task. Read more in the [handoffs](handoffs.md) documentation.
76+
There are many ways to design multi‑agent systems, but we commonly see two broadly applicable patterns:
77+
78+
1. Manager (agents as tools): A central manager/orchestrator invokes specialized sub‑agents as tools and retains control of the conversation.
79+
2. Handoffs: Peer agents hand off control to a specialized agent that takes over the conversation. This is decentralized.
80+
81+
See [our practical guide to building agents](https://cdn.openai.com/business-guides-and-resources/a-practical-guide-to-building-agents.pdf) for more details.
82+
83+
### Manager (agents as tools)
84+
85+
The `customer_facing_agent` handles all user interaction and invokes specialized sub‑agents exposed as tools. Read more in the [tools](tools.md#agents-as-tools) documentation.
86+
87+
```python
88+
from agents import Agent
89+
90+
booking_agent = Agent(...)
91+
refund_agent = Agent(...)
92+
93+
customer_facing_agent = Agent(
94+
name="Customer-facing agent",
95+
instructions=(
96+
"Handle all direct user communication. "
97+
"Call the relevant tools when specialized expertise is needed."
98+
),
99+
tools=[
100+
booking_agent.as_tool(
101+
tool_name="booking_expert",
102+
tool_description="Handles booking questions and requests.",
103+
),
104+
refund_agent.as_tool(
105+
tool_name="refund_expert",
106+
tool_description="Handles refund questions and requests.",
107+
)
108+
],
109+
)
110+
```
111+
112+
### Handoffs
113+
114+
Handoffs are sub‑agents the agent can delegate to. When a handoff occurs, the delegated agent receives the conversation history and takes over the conversation. This pattern enables modular, specialized agents that excel at a single task. Read more in the [handoffs](handoffs.md) documentation.
77115

78116
```python
79117
from agents import Agent
@@ -84,9 +122,9 @@ refund_agent = Agent(...)
84122
triage_agent = Agent(
85123
name="Triage agent",
86124
instructions=(
87-
"Help the user with their questions."
88-
"If they ask about booking, handoff to the booking agent."
89-
"If they ask about refunds, handoff to the refund agent."
125+
"Help the user with their questions. "
126+
"If they ask about booking, hand off to the booking agent. "
127+
"If they ask about refunds, hand off to the refund agent."
90128
),
91129
handoffs=[booking_agent, refund_agent],
92130
)
@@ -155,13 +193,14 @@ agent = Agent(
155193
name="Weather Agent",
156194
instructions="Retrieve weather details.",
157195
tools=[get_weather],
158-
model_settings=ModelSettings(tool_choice="get_weather")
196+
model_settings=ModelSettings(tool_choice="get_weather")
159197
)
160198
```
161199

162200
## Tool Use Behavior
163201

164202
The `tool_use_behavior` parameter in the `Agent` configuration controls how tool outputs are handled:
203+
165204
- `"run_llm_again"`: The default. Tools are run, and the LLM processes the results to produce a final response.
166205
- `"stop_on_first_tool"`: The output of the first tool call is used as the final response, without further LLM processing.
167206

@@ -182,6 +221,7 @@ agent = Agent(
182221
```
183222

184223
- `StopAtTools(stop_at_tool_names=[...])`: Stops if any specified tool is called, using its output as the final response.
224+
185225
```python
186226
from agents import Agent, Runner, function_tool
187227
from agents.agent import StopAtTools
@@ -203,6 +243,7 @@ agent = Agent(
203243
tool_use_behavior=StopAtTools(stop_at_tool_names=["get_weather"])
204244
)
205245
```
246+
206247
- `ToolsToFinalOutputFunction`: A custom function that processes tool results and decides whether to stop or continue with the LLM.
207248

208249
```python
@@ -242,4 +283,3 @@ agent = Agent(
242283
!!! note
243284

244285
To prevent infinite loops, the framework automatically resets `tool_choice` to "auto" after a tool call. This behavior is configurable via [`agent.reset_tool_choice`][agents.agent.Agent.reset_tool_choice]. The infinite loop is because tool results are sent to the LLM, which then generates another tool call because of `tool_choice`, ad infinitum.
245-

0 commit comments

Comments
 (0)