Образовательная структура, изучающая эргономичную, легкую многоагентную оркестровку.
Предупреждение
В настоящее время Swarm является экспериментальной выборкой выборки, предназначенной для изучения эргономичных интерфейсов для многоагентных систем. Он не предназначен для использования в производстве, и поэтому не имеет официальной поддержки. (Это также означает, что мы не будем рассматривать PRS или проблемы!)
Основная цель роя - продемонстрировать узоры передачи и подпрограммы, исследуемые в оркестрирующих веществах: поваренная книга Handoff & Rootnes. Это не предназначено как отдельная библиотека и в первую очередь для образовательных целей.
Требуется Python 3.10+
pip install git+ssh://[email protected]/openai/swarm.git
или
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 фокусируется на том, чтобы сделать координацию агента и выполнение легкой, высоко контролируемой и легко проверяемой.
Это достигает этого через две примитивные абстракции: Agent
и передачу . Agent
охватывает instructions
и tools
и может в любом случае выбрать разговор другому Agent
.
Эти примитивы достаточно мощные, чтобы выразить богатую динамику между инструментами и сетями агентов, что позволяет вам создавать масштабируемые, реальные решения, избегая крутой кривой обучения.
Примечание
Редкие агенты не связаны с помощниками в API помощников. Они названы одинаково для удобства, но в остальном совершенно не связаны. Swarm полностью оснащен API завершения чата и, следовательно, не имеет состояния между вызовами.
Swarm исследует узоры, которые являются легкими, масштабируемыми и очень настраиваемыми по дизайну. Подходы, аналогичные рой, лучше всего подходят для ситуаций, посвященных большому количеству независимых возможностей и инструкций, которые трудно кодировать в одну подсказку.
Помощники API-отличный вариант для разработчиков, которые ищут полностью построенные потоки и встроенные в управление памятью и поиск. Тем не менее, Swarm-это образовательный ресурс для разработчиков, любопытных узнать о многоагентной оркестровке. Swarm работает (почти) полностью на клиенте и, как и API завершения чата, не хранит состояние между вызовами.
Проверьте /examples
для вдохновения! Узнайте больше о каждом из его Readme.
basic
: простые примеры основ, такие как настройка, вызов функций, передача и контекстные переменныеtriage_agent
: простой пример настройки базовой сортировки шаг, чтобы передать правильный агентweather_agent
: простой пример вызова функцийairline
: многоагентная настройка для обработки различных запросов на обслуживание клиентов в контексте авиакомпании.support_bot
: бот обслуживания клиентов, который включает агент пользовательского интерфейса и агент справочного центра с несколькими инструментамиpersonal_shopper
: личный агент по магазинам, который может помочь в совершении продаж и возврата заказов Начните с создания экземпляра клиента Swarm (который внутренне просто экземпляет клиента OpenAI
).
from swarm import Swarm
client = Swarm ()
client.run()
Функция Swarm's run()
messages
messages
chat.completions.create()
. Важно отметить, однако, что он также обрабатывает выполнение функции агента, передачу контекстных переменных и может принимать несколько поворотов, прежде чем вернуться к пользователю.
По своей сути, клиент Swarm.run client.run()
реализует следующий цикл:
Аргумент | Тип | Описание | По умолчанию |
---|---|---|---|
агент | Agent | (Начальный) агент должен быть вызван. | (необходимый) |
Сообщения | List | Список объектов сообщения, идентичный messages об завершении чата | (необходимый) |
Context_variables | dict | Словарь дополнительных контекстных переменных, доступных для функций и инструкций агента | {} |
max_turns | int | Максимальное количество разговорных поворотов разрешено | float("inf") |
model_override | str | Дополнительная строка для переопределения модели, используемой агентом | None |
execute_tools | bool | Если False , прерывайте выполнение и немедленно возвращает сообщение tool_calls , когда агент пытается вызвать функцию | True |
транслировать | bool | Если это True , позволяет потоковым ответам | False |
отлаживать | bool | Если это True , позволяет журналировать отладку | False |
Как только client.run()
завершен (после потенциально нескольких вызовов к агентам и инструментам) он вернет Response
содержащий все соответствующее обновленное состояние. В частности, новые messages
, последний Agent
, который можно назвать, и самый современный context_variables
. Вы можете передать эти значения (плюс новые сообщения пользователей) в следующее выполнение client.run()
чтобы продолжить взаимодействие, где оно осталось - очень похоже на chat.completions.create()
. (Функция run_demo_loop
реализует пример полного цикла выполнения в /swarm/repl/repl.py
.)
Response
Поле | Тип | Описание |
---|---|---|
Сообщения | List | Список объектов сообщения, сгенерированных во время разговора. Очень похоже на messages о завершении чата, но с полем sender указывающим, из какого Agent возникло сообщение. |
агент | Agent | Последний агент для обработки сообщения. |
Context_variables | dict | Так же, как входные переменные, плюс любые изменения. |
Agent
просто инкапсулирует набор instructions
с набором functions
(плюс некоторые дополнительные настройки ниже) и имеет возможность передать выполнение другому Agent
.
Хотя заманчиво олицевать Agent
как «кто -то, кто делает X», его также можно использовать для представления очень специфического рабочего процесса или шага, определяемого набором instructions
и functions
(например, набор шагов, сложный поиск, единственный шаг Преобразование данных и т. Д.). Это позволяет составлять Agent
в сеть «агентов», «рабочих процессов» и «задач», которые представлены одним и тем же примитивом.
Agent
Поле | Тип | Описание | По умолчанию |
---|---|---|---|
имя | str | Имя агента. | "Agent" |
модель | str | Модель, которая будет использоваться агентом. | "gpt-4o" |
инструкции | str или func() -> str | Инструкции для агента могут быть строкой или вызовом, возвращающим строку. | "You are a helpful agent." |
функции | List | Список функций, которые агент может позвонить. | [] |
Tool_choice | str | Выбор инструмента для агента, если таковые имеются. | None |
instructions
Agent
напрямую преобразуются в system
подсказку разговора (как первое сообщение). Только instructions
активного Agent
будут присутствовать в любой момент времени (например, если есть передача Agent
, система system
изменится, но история чата не будет.)
agent = Agent (
instructions = "You are a helpful agent."
)
instructions
могут быть обычной str
, либо функцией, которая возвращает str
. Функция может при желании получать параметр context_variables
, который будет заполнен context_variables
, передаваемым в 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?
Agent
S может вызывать функции Python напрямую.str
(значения будут предприняты для того, чтобы быть отменен как str
).Agent
, выполнение будет передано этому Agent
.context_variables
, она будет заполнена context_variables
передаваемым в 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_name } !" )
return "Done"
agent = Agent (
functions = [ greet ]
)
client . run (
agent = agent ,
messages = [{ "role" : "user" , "content" : "Usa greet() por favor." }],
context_variables = { "user_name" : "John" }
)
Hola, John!
Agent
имеет ошибку (отсутствующая функция, неправильный аргумент, ошибка), к чату будет добавлено ответ на ошибку, чтобы Agent
мог восстановиться изящно.Agent
вызывается несколько функций, они будут выполнены в этом порядке. Agent
может передать другому Agent
, вернув его в function
.
sales_agent = Agent ( name = "Sales Agent" )
def transfer_to_sales ():
return sales_agent
agent = Agent ( functions = [ transfer_to_sales ])
response = client . run ( agent , [{ "role" : "user" , "content" : "Transfer me to sales." }])
print ( response . agent . name )
Sales Agent
Он также может обновить context_variables
, вернув более полный объект Result
. Это также может содержать value
и agent
, если вы хотите, чтобы одна функция вернула значение, обновил агент и обновил контекстные переменные (или любое подмножество трех).
sales_agent = Agent ( name = "Sales Agent" )
def talk_to_sales ():
print ( "Hello, World!" )
return Result (
value = "Done" ,
agent = sales_agent ,
context_variables = { "department" : "sales" }
)
agent = Agent ( functions = [ talk_to_sales ])
response = client . run (
agent = agent ,
messages = [{ "role" : "user" , "content" : "Transfer me to sales" }],
context_variables = { "user_name" : "John" }
)
print ( response . agent . name )
print ( response . context_variables )
Sales Agent
{'department': 'sales', 'user_name': 'John'}
Примечание
Если Agent
вызывает несколько функций для передачи Agent
, будет использоваться только последняя функция передачи.
Swarm автоматически преобразует функции в схему JSON, которая передается в tools
завершения чата.
description
функции.required
.type
параметра (и по string
по умолчанию). def greet ( name , age : int , location : str = "New York" ):
"""Greets the user. Make sure to get their name and age before calling.
Args:
name: Name of the user.
age: Age of the user.
location: Best place on earth.
"""
print ( f"Hello { name } , glad you are { age } in { location } !" )
{
"type" : "function" ,
"function" : {
"name" : "greet" ,
"description" : "Greets the user. Make sure to get their name and age before calling.nnArgs:n name: Name of the user.n age: Age of the user.n location: Best place on earth." ,
"parameters" : {
"type" : "object" ,
"properties" : {
"name" : { "type" : "string" } ,
"age" : { "type" : "integer" } ,
"location" : { "type" : "string" }
} ,
"required" : [ "name" , "age" ]
}
}
}
stream = client . run ( agent , messages , stream = True )
for chunk in stream :
print ( chunk )
Использует те же события, что и потоковая передача API API. См. process_and_print_streaming_response
in /swarm/repl/repl.py
в качестве примера.
Были добавлены два новых типа событий:
{"delim":"start"}
и {"delim":"end"}
, чтобы сигнализировать каждый раз, когда Agent
обрабатывает одно сообщение (ответ или вызов функции). Это помогает идентифицировать переключатели между Agent
s.{"response": Response}
вернет объект Response
в конце потока с агрегированным (полным) ответом для удобства. Оценки имеют решающее значение для любого проекта, и мы призываем разработчиков принести свои собственные оценки для проверки эффективности своих роев. Для справки, у нас есть несколько примеров, как оценить рой в airline
, weather_agent
и triage_agent
QuickStart. Смотрите Readmes для более подробной информации.
Используйте run_demo_loop
, чтобы проверить свой рой! Это запустит реплику на вашей командной строке. Поддерживает потоковую передачу.
from swarm . repl import run_demo_loop
...
run_demo_loop ( agent , stream = True )