OpenAI Agents SDK: официальный фреймворк для мультиагентных систем на Python
📂 Исходный код на GitHubОфициальный фреймворк OpenAI для создания мультиагентных систем на Python: агенты с инструментами и guardrails, передача задач между агентами, голосовые и realtime-агенты, встроенная трассировка.
У OpenAI есть свой ответ на вопрос «как собирать мультиагентные системы» — Agents SDK. Это открытый Python-фреймворк под лицензией MIT: лёгкий, почти без зависимостей, но с полным набором деталей для production. В его основе лежит простая идея: агент — это LLM, настроенная инструкциями, инструментами, проверками входа и выхода (guardrails) и правилами передачи задач другим агентам. SDK поставляется через PyPI, работает с OpenAI Responses и Chat Completions API, а через адаптеры — ещё и с сотней других LLM. Есть и версия для JavaScript/TypeScript — openai-agents-js.
Ключевые концепции
В SDK восемь основных строительных блоков:
| Концепция | Что делает |
|---|---|
| Agent | LLM с инструкциями, инструментами, guardrails и handoffs |
| Handoffs | Передача задачи другому агенту целиком |
| Tools | Действия агента: функции, MCP-серверы, хостинговые инструменты |
| Guardrails | Настраиваемые проверки входных и выходных данных |
| Human in the loop | Встроенные механизмы подтверждения человеком во время работы агента |
| Sessions | Автоматическое ведение истории диалога между запусками |
| Tracing | Трассировка всех запусков для отладки и оптимизации |
| Agents as tools | Использование агента как инструмента внутри другого агента |
Разница между handoff и «агентом как инструментом» простая. Handoff — это полная передача управления: первый агент уходит, второй отвечает пользователю. Agent-as-tool — это вызов подчинённого агента за ответом, после которого управление возвращается.
Установка
Нужен Python 3.10 или новее. Классический способ через venv:
python -m venv .venv
source .venv/bin/activate
pip install openai-agents
Или через uv:
uv init
uv add openai-agents
Есть необязательные группы зависимостей: voice для голосовых агентов и redis для хранения сессий в Redis. Ставятся они так: pip install 'openai-agents[voice]'.
Первый агент
Минимальный рабочий пример занимает четыре строки. Перед запуском задайте переменную окружения OPENAI_API_KEY:
from agents import Agent, Runner
agent = Agent(name="Assistant", instructions="You are a helpful assistant")
result = Runner.run_sync(agent, "Write a haiku about recursion in programming.")
print(result.final_output)
Runner умеет работать синхронно, как в примере, и асинхронно. Тем, кто живёт в Jupyter, проще взять готовый ноутбук с примером.
По README у SDK четыре основных сценария запуска: обычный текстовый агент, агент в песочнице, realtime-агент и голосовой конвейер. Первые два покрывают большинство задач, последние два — отдельные разделы ниже.
Guardrails и человек в цикле
У агентов, работающих с внешним миром, две вечные проблемы: на вход может прийти мусор, а на выход — что-то опасное. Guardrails решают обе: это настраиваемые проверки входных и выходных данных, которые срабатывают до и после вызова модели.
Когда агент получает право действовать — запускать код, менять файлы, тратить деньги, — возникает и другой вопрос: кто подтверждает важные шаги. Для этого в SDK встроены механизмы human in the loop: выполнение можно поставить на паузу, показать человеку, что агент собирается сделать, и дождаться решения.
Песочница, realtime и голос
Помимо обычных текстовых агентов, SDK даёт три специализированных типа.
Sandbox agents — агенты с доступом к контейнеру. Они могут читать файлы, запускать команды и применять патчи, сохраняя состояние рабочей области между шагами. Это делает их подходящими для длинных задач вроде разбора репозитория. На macOS и Linux есть локальный UnixLocalSandboxClient, на Windows — DockerSandboxClient из опциональной группы docker.
Realtime agents — голосовые и мультимодальные агенты с низкой задержкой поверх WebSocket. Они работают на сервере и поддерживают все обычные возможности агентов: инструменты, handoffs, guardrails.
Voice pipelines — конвейер «речь → агент → речь». Сначала speech-to-text, затем обычный агентный workflow, затем text-to-speech. Внутрь конвейера можно положить любой обычный Agent:
from agents import Agent
from agents.voice import AudioInput, SingleAgentVoiceWorkflow, VoicePipeline
agent = Agent(name="Assistant", instructions="You are a helpful voice assistant.")
pipeline = VoicePipeline(workflow=SingleAgentVoiceWorkflow(agent))
result = await pipeline.run(AudioInput(buffer=audio_bytes))
async for event in result.stream():
...
Сессии и трассировка
Две вещи, которые обычно приходится дописывать руками, здесь встроены.
Sessions автоматически хранят историю диалога между запусками агента. Не нужно собирать сообщения в список и передавать их обратно — фреймворк делает это сам. Хранилище подключаемое: от простого файлового до Redis через опциональную группу зависимостей.
Tracing записывает каждый запуск агента: какие вызовы инструментов случились, какие handoffs сработали, сколько это заняло. Без этого отладка мультиагентной системы превращается в угадывание. Трассировки открываются в специальном UI — по ним видно, где workflow тормозит или ломается. Данные можно экспортировать и во внешние системы.
Работа с другими LLM
Название говорит «OpenAI», но SDK провайдер-агностичен. Через интеграции any-llm и LiteLLM фреймворк работает с сотней моделей разных провайдеров. Для MCP-инструментов используется официальный MCP Python SDK, а схемы инструментов строятся на Pydantic.
Такая архитектура позволяет начать на моделях OpenAI и переключить провайдера точечной правкой конфигурации, не переписывая логику агентов.
Что ещё посмотреть
- Документация — подробные руководства по каждой концепции.
- Каталог примеров — рабочие сценарии: от hello world до исследовательских агентов и голосовых приложений.
- Issues на GitHub — сюда принимают баг-репорты и пожелания.
Одно ограничение стоит знать заранее: pull requests от внешних разработчиков проект не принимает — только от коллабораторов репозитория. Это оговорено в CONTRIBUTING.md. Код при этом открыт под MIT, так что форкать и расширять SDK никто не запрещает.