Educational framework exploring ergonomic, lightweight multi-agent orchestration. Managed by OpenAI Solution team.
Educational framework exploring ergonomic, lightweight multi-agent orchestration. Managed by OpenAI Solution team.
[!IMPORTANT] Swarm is now replaced by the OpenAI Agents SDK, which is a production-ready evolution of Swarm. The Agents SDK features key improvements and will be actively maintained by the OpenAI team.
We recommend migrating to the Agents SDK for all production use cases.
Requires Python 3.10+
pip install git+ssh://[email protected]/openai/swarm.git
or
pip install git+https://github.com/openai/swarm.git
from swarm import Swarm, Agent
client = Swarm()
def transfer_to_agent_b():
return agent_b
agent_a = Agent(
name="Agent A",
instructions="You are a helpful agent.",
functions=[transfer_to_agent_b],
)
agent_b = Agent(
name="Agent B",
instructions="Only speak in Haikus.",
)
response = client.run(
agent=agent_a,
messages=[{"role": "user", "content": "I want to talk to agent B."}],
)
print(response.messages[-1]["content"])
Hope glimmers brightly,
New paths converge gracefully,
What can I assist?
Swarm focuses on making agent coordination and execution lightweight, highly controllable, and easily testable.
It accomplishes this through two primitive abstractions: Agents and handoffs. An Agent encompasses instructions and tools, and can at any point choose to hand off a conversation to another Agent.
These primitives are powerful enough to express rich dynamics between tools and networks of agents, allowing you to build scalable, real-world solutions while avoiding a steep learning curve.
[!NOTE] Swarm Agents are not related to Assistants in the Assistants API. They are named similarly for convenience, but are otherwise completely unrelated. Swarm is entirely powered by the Chat Completions API and is hence stateless between calls.
Swarm explores patterns that are lightweight, scalable, and highly customizable by design. Approaches similar to Swarm are best suited for situations dealing with a large number of independent capabilities and instructions that are difficult to encode into a single prompt.
The Assistants API is a great option for developers looking for fully-hosted threads and built in memory management and retrieval. However, Swarm is an educational resource for developers curious to learn about multi-agent orchestration. Swarm runs (almost) entirely on the client and, much like the Chat Completions API, does not store state between calls.
Check out /examples for inspiration! Learn more about each one in its README.
basic: Simple examples of fundamentals like setup, function calling, handoffs, and context variablestriage_agent: Simple example of setting up a basic triage step to hand off to the right agentweather_agent: Simple example of function callingairline: A multi-agent setup for handling different customer service requests in an airline context.support_bot: A customer service bot which includes a user interface agent and a help center agent with several toolspersonal_shopper: A personal shopping agent that can help with making sales and refunding ordersStart by instantiating a Swarm client (which internally just instantiates an OpenAI client).
from swarm import Swarm
client = Swarm()
client.run()Swarm's run() function is analogous to the chat.completions.create() function in the Chat Completions API – it takes messages and returns messages and saves no state between calls. Importantly, however, it also handles Agent function execution, hand-offs, context variable references, and can take multiple turns before returning to the user.
At its core, Swarm's client.run() implements the following loop:
Agent
The (initial) agent to be called.
(required)
messages
List
A list of message objects, identical to Chat Completions messages
(required)
context_variables
dict
A dictionary of additional context variables, available to functions and Agent instructions
{}
max_turns
int
The maximum number of conversational turns allowed
float("inf")
model_override
str
An optional string to override the model being used by an Agent
None
execute_tools
bool
If False, interrupt execution and immediately returns tool_calls message when an Agent tries to call a function
True
stream
bool
If True, enables streaming responses
False
debug
bool
If True, enables debug logging
False
Once client.run() is finished (after potentially multiple calls to agents and tools) it will return a Response containing all the relevant updated state. Specifically, the new messages, the last Agent to be called, and the most up-to-date context_variables. You can pass these values (plus new user messages) in to your next execution of client.run() to continue the interaction where it left off – much like chat.completions.create(). (The run_demo_loop function implements an example of a full execution loop in /swarm/repl/repl.py.)
Response FieldsList
A list of message objects generated during the conversation. Very similar to Chat Completions messages, but with a sender field indicating which Agent the message originated from.
agent
Agent
The last agent to handle a message.
context_variables
dict
The same as the input variables, plus any changes.
An Agent simply encapsulates a set of instructions with a set of functions (plus some additional settings below), and has the capability to hand off execution to another Agent.
While it's tempting to personify an Agent as "someone who does X", it can also be used to represent a very specific workflow or step defined by a set of instructions and functions (e.g. a set of steps, a complex retrieval, single step of data transformation, etc). This allows Agents to be composed into a network of "agents", "workflows", and "tasks", all represented by the same primitive.
Agent Fieldsstr
The name of the agent.
"Agent"
model
str
The model to be used by the agent.
"gpt-4o"
instructions
str or func() -> str
Instructions for the agent, can be a string or a callable returning a string.
"You are a helpful agent."
functions
List
A list of functions that the agent can call.
[]
tool_choice
str
The tool choice for the agent, if any.
None
Agent instructions are directly converted into the system prompt of a conversation (as the first message). Only the instructions of the active Agent will be present at any given time (e.g. if there is an Agent handoff, the system prompt will change, but the chat history will not.)
agent = Agent(
instructions="You are a helpful agent."
)
The instructions can either be a regular str, or a function that returns a str. The function can optionally receive a context_variables parameter, which will be populated by the context_variables passed into client.run().
def instructions(context_variables):
user_name = context_variables["user_name"]
return f"Help the user, {user_name}, do whatever they want."
agent = Agent(
instructions=instructions
)
response = client.run(
agent=agent,
messages=[{"role":"user", "content": "Hi!"}],
context_variables={"user_name":"John"}
)
print(response.messages[-1]["content"])
Hi John, how can I assist you today?
Agents can call python functions directly.str (values will be attempted to be cast as a str).Agent, execution will be transferred to that Agent.context_variables parameter, it will be populated by the context_variables passed into client.run().def greet(context_variables, language):
user_name = context_variables["user_name"]
greeting = "Hola" if language.lower() == "spanish" else "Hello"
print(f"{greeting}, {user_nam