Как собрать ИИ-агента
на OpenAI Agents SDK
tools · handoffs · MCP
Function tools, handoffs между ролями и MCP — от Hello World до сценария research → draft под контент
Если вы ищете, как создать ИИ-агента, начните с простого вопроса: задача решается одним «умным помощником» или ей нужна команда с разными ролями?
Коротко. Один агент — это модель плюс инструкции плюс набор инструментов. Он сам решает, когда вызвать инструмент, и возвращает результат. Команда агентов нужна, когда роли сильно различаются: исследование, черновик, проверка, публикация.
Что соберёте по гайду
От Hello World на Python до команды с tools, handoffs и MCP — и мини-пайплайна research → draft с HITL перед публикацией.
Кому хватит одного агента, а кому нужна команда с handoffs
Маркер: простыми словами. Handoff (передача) — это когда один агент отдаёт диалог другому. Специалист дальше сам ведёт разговор и отвечает пользователю. Это не «подсказка в чат», а смена ответственного.
Чем агент отличается от чата с промптом
В обычном чате вы каждый раз пишете промпт и копируете ответ. Агент работает в цикле: получил задачу → подумал → вызвал инструмент → прочитал результат → продолжил → отдал финал.
У агента есть:
- инструкции — кто он и что нельзя делать;
- tools — «руки»: поиск, запись файла, вызов API;
- лимит ходов — сколько раз можно крутить цикл, чтобы не уйти в бесконечность.
Чат отвечает текстом. Агент может ещё и сделать действие: сохранить черновик, дернуть CRM, отправить сообщение в Telegram (после вашего разрешения).
Когда triage → specialist окупается, а когда мешает
Схема triage → specialist звучит красиво: диспетчер смотрит запрос и передаёт его исследователю, копирайтеру или исполнителю. Она окупается, если:
- у ролей разные инструкции и разные tools;
- одна ошибка «универсала» дорого стоит (публикация, платёж, удаление);
- поток задач однотипный: бриф → research → draft → review.
Она мешает, если:
- задач мало и все простые («перепиши абзац»);
- вы раздули 7 агентов вместо 2–3;
- нет лимита передач — агенты гоняют задачу по кругу.
Правило на старте: один агент с 2–4 tools. Команду добавляйте, когда один агент начинает путаться в ролях или открывать лишние инструменты.
OpenAI Agents SDK vs режим агента в ChatGPT
Путаница здесь частая. «ChatGPT агент», «Agent Builder» и «OpenAI Agents SDK» — это разные пути.
SDK, Agent Builder и UI-агент — три разных пути
| Путь | Что это | Кому подходит |
|---|---|---|
| Режим агента в ChatGPT | Интерфейс в продукте OpenAI: агент внутри чата | Быстрый тест без кода |
| Agent Builder | Визуальная сборка агентов в экосистеме OpenAI | Прототип без Python |
| OpenAI Agents SDK | Python-пакет: код, tools, handoffs, MCP, sessions, HITL | Когда нужен свой сценарий, сервер и контроль |
Agents SDK — это code-first стек: вы пишете логику в Python и запускаете её у себя или на сервере. Документация позиционирует SDK как production-ready развитие эксперимента Swarm: мало абстракций, есть Agents, handoffs / agents-as-tools, guardrails и tracing.
Из России доступ к API OpenAI часто упирается в оплату и регистрацию. Честно: без зарубежной карты или посредника ключ может быть недоступен. Рабочие обходы на старте:
- прогнать логику на бесплатных локальных моделях и перенести схему на OpenAI позже;
- держать финальную публикацию в Make/n8n/Telegram отдельно от LLM;
- если API недоступен — собрать похожий пайплайн ролей в no-code (n8n) и вернуться к SDK, когда ключ появится.
Этот гайд всё равно полезен: роли, tools, handoffs и MCP — одни и те же идеи, даже если движок позже сменится.
Почему Assistants API больше не стартовая точка
Agents SDK по умолчанию опирается на Responses API — современный транспорт запросов к моделям OpenAI. Assistants API (Assistants / Threads / Runs) официально устаревает: отключение запланировано на 26 августа 2026. Новые интеграции на Assistants начинать не стоит.
Маркер: простыми словами. Responses API — «труба», по которой ходят сообщения и вызовы инструментов. Agents SDK — «диспетчер» поверх этой трубы: сам крутит ходы, tools, передачи и память.
Когда брать что:
- короткий сценарий на 1–2 вызова tool — можно Responses API напрямую;
- несколько ролей, approvals, MCP, сессии — берите Agents SDK.
Эстафета triage → specialist
Пакет задачи заходит на диспетчера, вспыхивают function tools, затем контроль уходит research → writer → critic. Сбоку — разъём MCP: внешние серверы без смены роли агента.
- Triage решает, кому отдать полный контроль (handoff), а не размазывать всё в одном промпте.
- Tools — локальные «руки» агента: поиск, файл, Telegram.
- MCP — чужой инструмент по протоколу; HITL мигает на опасном шаге critic.
Дальше — Hello World на Python, затем tools, handoffs и подключение MCP уже кодом.
Редакционная схема потока Agents SDK, не UI OpenAI. Цикл ~28 с: вход → tools → handoff → MCP → HITL → выход.
Установка и первый Hello World на Python
Это обязательный how-to блок. Повторите его до любых handoffs и MCP.
pip, ключ API и минимальный Agent + Runner
Что нужно:
- Python 3.10 или новее;
- пакет
openai-agents(актуальная линия 0.19.x, на конец июля 2026 — 0.19.1); - ключ в переменной окружения
OPENAI_API_KEY.
Шаг 1. Создайте папку проекта и виртуальное окружение:
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install openai-agents
Шаг 2. Положите ключ в окружение (не в git и не в скриншот чата):
export OPENAI_API_KEY=sk-...
Шаг 3. Создайте файл hello_agent.py:
from agents import Agent, Runner
agent = Agent(
name="Assistant",
instructions="Ты короткий помощник. Отвечай по-русски, без воды.",
)
result = Runner.run_sync(agent, "Напиши одно предложение: что такое ИИ-агент.")
print(result.final_output)
Шаг 4. Запустите:
python hello_agent.py
Маркер: простыми словами. `Agent` — описание роли (имя, инструкции, tools). `Runner` — движок, который крутит цикл «подумал → вызвал tool → продолжил», пока не получит финальный ответ.
Признак успеха. В терминале появляется короткий русский ответ без traceback. Значит SDK установлен, ключ читается, цикл Runner отработал.
Типичные ошибки на первом запуске
ModuleNotFoundError: agents— пакет стоит не в том окружении. Активируйте.venvи сноваpip install openai-agents.- Ошибка авторизации / 401 — нет
OPENAI_API_KEYв этой же сессии терминала или ключ битый. Проверьтеecho $OPENAI_API_KEY(должно быть непусто). - Python 3.9 и ниже — пакет требует ≥3.10. Обновите интерпретатор.
- Чужой туториал со старой версией (
0.2.x,0.14.x) — сверяйтесь с PyPI и официальной документацией SDK, а не с копиями в блогах.
Function tools: даём агенту руки, а не только текст
Без tools агент — умный чат. С tools он может считать, читать файл, дергать ваш сервис.
Маркер: простыми словами. Function tool — обычная Python-функция, которую модель может вызвать как действие. SDK сам строит схему аргументов из сигнатуры и описания функции.
@function_tool и схема аргументов
Минимальный пример:
from agents import Agent, Runner, function_tool
@function_tool
def save_draft(title: str, body: str) -> str:
"""Сохраняет черновик статьи в локальный файл drafts.txt."""
with open("drafts.txt", "a", encoding="utf-8") as f:
f.write(f"# {title}\n{body}\n\n")
return f"Черновик «{title}» сохранён"
agent = Agent(
name="Writer",
instructions="Пиши коротко. Когда черновик готов — сохрани через save_draft.",
tools=[save_draft],
)
result = Runner.run_sync(agent, "Тема: 3 ошибки в ТЗ на статью. Сохрани черновик.")
print(result.final_output)
Что важно новичку:
- docstring читает модель — пишите по-русски, что делает функция и когда её звать;
- типы аргументов (
str,int) помогают не сломать вызов; - для опасных действий (отправка, удаление) позже включите
needs_approval— человек подтверждает шаг.
Кроме своих функций есть hosted tools OpenAI (web search, file search, code interpreter и др.) — их выполняет сторона OpenAI, без вашего локального callback.
Сколько tools достаточно, чтобы агент не «плавал»
Ориентир: 2–5 tools на одного агента. Если список длинный, модель чаще выбирает не тот инструмент или «забывает» нужный.
Практика:
- researcher — поиск + чтение базы;
- writer — сохранение черновика;
- executor — публикация (только с approval).
Не давайте одному агенту сразу CRM, почту, оплату, диск и Telegram. Раздутый список tools — главный способ сжечь бюджет и получить хаос.
Handoffs: как передать задачу другому агенту без хаоса
Мультиагентные системы пугают словом «оркестрация». В SDK есть два понятных паттерна.
Маркер: простыми словами. Agents-as-tools — специалист работает как инструмент у менеджера. Менеджер вызывает его, получает результат и сам пишет финальный ответ пользователю. Handoff — специалист забирает разговор целиком.
Handoffs vs agents-as-tools — когда что выбирать
| Паттерн | Кто отвечает пользователю | Когда брать |
|---|---|---|
| Handoff | Специалист после передачи | Диспетчер → эксперт с другими правилами и tools |
| Agents-as-tools | Менеджер | Research / writer / critic как подзадачи одного ответа |
Пример мысли на пальцах:
- «Это вопрос в поддержку биллинга» → handoff биллинг-агенту;
- «Собери факты, потом напиши черновик, потом проверь» → manager + as_tool, один владелец ответа.
Паттерны можно комбинировать: triage передаёт writer’у (handoff), а writer внутри вызывает critic как tool.
Для handoffs в инструкции полезен рекомендованный prefix из SDK (RECOMMENDED_PROMPT_PREFIX / prompt_with_handoff_instructions) — модель лучше понимает, когда передавать управление.
Лимит передач и защита от бесконечного цикла
Типичная проблема мультиагентных систем: агенты вечно «перекидывают» задачу.
Как защититься:
- задайте лимит ходов Runner /
max_turnsу вызовов; - в triage чётко опишите критерии маршрута («если не research и не draft — уточни у человека»);
- не делайте взаимных handoffs без стоп-условия;
- на публикацию ставьте HITL, а не автоперевод «в прод».
Итог блока. Handoff — смена владельца диалога. As-tool — аренда специалиста без потери контроля. Для контент-пайплайна чаще выигрывает менеджер + as_tool; для поддержки «одна роль отвечает клиенту» — чистые handoffs.
MCP: подключаем внешние инструменты к агенту
Свои function tools покрывают то, что вы написали в Python. MCP нужен, когда инструменты уже живут снаружи: файловая система, вики, CRM-коннектор, сервер в Cursor.
Маркер: простыми словами. MCP (Model Context Protocol) — общий «разъём» между ИИ-приложением и внешними инструментами. В документации его сравнивают с USB-C для AI: один стандарт, много устройств.
Stdio, Streamable HTTP и HostedMCPTool — как выбрать транспорт
| Вариант | Где крутится вызов | Типичный кейс |
|---|---|---|
| HostedMCPTool | На стороне OpenAI | Публичный MCP URL / коннектор |
| MCPServerStreamableHttp | В вашем Python-процессе | Свой или удалённый MCP по URL + headers |
| MCPServerStdio | Локальный subprocess | PoC: filesystem MCP через npx |
| SSE (устаревший) | Локально | Только старые серверы; для новых — не default |
Как выбрать:
- быстрый локальный эксперимент → stdio;
- свой сервер в сети → Streamable HTTP;
- хотите, чтобы OpenAI сам ходил в MCP URL → HostedMCPTool.
Подключение в общем виде: либо tools=[HostedMCPTool(...)], либо mcp_servers=[MCPServerStdio(...)] / MCPServerStreamableHttp(...). Классы и параметры — в разделе MCP официальной документации SDK (ссылка в конце статьи).
Approvals и фильтр tools, чтобы не открыть лишнее
MCP-сервер может отдать десятки tools. Агенту это вредно.
Делайте так:
- включите фильтр tools (
tool_filter/ static allow-list) — только нужные имена; - на запись, отправку, удаление —
require_approval/needs_approval; - не учите SSE как основной путь: протокол уходит от SSE к Streamable HTTP и stdio.
Признак успеха MCP. В tracing видно list_tools и конкретный MCP tool call, а агент не видит «лишние» действия вне allow-list.
Память, guardrails и человек в контуре
Агент без памяти каждый раз начинает с нуля. Агент без тормозов может опубликовать черновик с ошибкой.
Маркер: простыми словами. Guardrails — автоматические проверки входа и выхода (токсичность, утечка секретов, «не тот формат»). HITL (human-in-the-loop) — пауза, пока человек не нажмёт approve или reject.
Sessions — что агент помнит между шагами
Sessions — встроенная память между запусками Runner (например, SQLiteSession). Удобно для многошагового брифа: «допиши прошлый черновик», «учти правки редактора».
Важно: не смешивайте в одном run session-память SDK с параллельными механизмами вроде conversation_id / previous_response_id — документация прямо запрещает такую кашу.
HITL на опасных действиях (отправка, удаление, оплата)
Ставьте человека в контур, когда шаг необратим:
- публикация в Telegram / WordPress;
- письмо клиенту;
- удаление файла;
- списание или смена тарифа.
Как это выглядит в SDK: tool с needs_approval → run останавливается на interruptions → вы сохраняете state → approve/reject → продолжаете Runner.run с этим state. Долгое ожидание человека сериализуется через to_json / from_json.
Нюанс guardrails: input-проверки надёжнее вешать на первого агента цепочки, output — на того, кто отдаёт финал. Для side-effects лучше tool-level approval, а не только «вежливый промпт».
Рынок тоже идёт к HITL: даже крупные B2B-анонсы про офисных ИИ-агентов подчёркивают ручное подтверждение важных действий. Workflow важнее набора чатов — один инструмент решает кусок, система связывает шаги.
Сценарий research → draft → review под контент и лиды
Соберём мини-контент-завод на идеях SDK — без пересказа чужих travel-demo.
Роли triage / research / writer / critic / executor
Рекомендуемая схема для контента:
Triage
Классифицирует: research / draft / publish / clarify.
Researcher
Собирает факты (web search, MCP, ваша база).
Writer
Пишет черновик по брифу и фактам.
Critic
Проверяет факты, тон, CTA; лучше как agent-as-tool у менеджера.
Executor
Пишет файл или шлёт в канал только после HITL.
Оркестрация:
- внутри контент-цикла — manager + agents-as-tools (один владелец ответа + critic);
- на ветке «опубликовать» — handoff или отдельный executor с approval.
Псевдо-каркас ролей:
Manager
├─ research.as_tool(...)
├─ writer.as_tool(...)
├─ critic.as_tool(...)
└─ publish_draft (function_tool, needs_approval=True)
Так вы не теряете контроль и не плодите бесконечные handoffs.
Вывод в файл, Telegram или Make/n8n без переписывания гайда конкурента
Финальный шаг агента — не «ещё один абзац», а артефакт:
- дописать
drafts/slug.md; - отправить HTTP webhook в Make/n8n;
- положить текст в очередь Telegram-бота.
Agents SDK здесь остаётся мозгом. Make/n8n — руками публикации, которые у вас уже настроены. Не нужно переносить весь гайд n8n внутрь этой статьи: достаточно endpoint’а «принял JSON → опубликовал».
Что должно получиться за один прогон: бриф → факты → черновик → замечания critic → пауза HITL → файл или webhook. Если паузы нет — в прод не пускайте.
Где команда сливает бюджет на агентах
Ошибки ниже повторяются чаще, чем «не тот фреймворк».
Раздутый список tools и «вечные» handoffs
Симптомы: агент вызывает не тот tool; токены улетают на пустые круги; в логах десятки transfer_to_* без финала. Лечение: меньше tools, явные роли, max_turns, critic как as_tool, publish только с approval.
Секреты в репо и путаница стеков
Ключ только в env / секретах CI; не коммитьте .env; не вставляйте sk- в скриншоты. Assistants API ≠ Agents SDK; UI-агент ChatGPT ≠ ваш Python Runner; SSE MCP ≠ актуальный default; 7 агентов «на вырост» почти всегда хуже 2–3 рабочих.
Ещё риск: агент с широкими MCP-tools без sandbox и approvals. Даже новости про sandbox-инциденты сводятся к простой морали — режьте права и подтверждайте опасные шаги.
Чеклист запуска и куда расти дальше
Мини-чеклист перед продом
- Python ≥ 3.10,
openai-agents0.19.x, ключ в env - Hello World через
Agent+Runnerпроходит - У каждого агента 2–5 tools, есть docstring
- Выбран паттерн: handoff или as_tool (не «всё сразу без правил»)
- Есть лимит ходов
- MCP: выбран транспорт, SSE не default, включён tool filter
- Publish / delete / pay — только с HITL
- Sessions не смешаны с чужими id диалога в одном run
- Секреты не в git
- Есть tracing/логи на первый боевой прогон
От одного SDK-агента к контент-заводу и обучению
Когда Hello World и один writer стабильны, наращивайте так:
- researcher + writer;
- critic;
- executor с approval;
- мост в Telegram / WordPress / Make.
Дальше упираетесь не в «ещё фреймворк», а в процесс: брифы, статусы, календарь, QA. Если нужна система целиком — обучение работе с агентами и контент-заводом закрывает как раз этот слой: роли, автоматизация, публикация, а не только вызов модели.
FAQ
Короткие ответы на частые вопросы по Agents SDK, MCP и старту с нуля.
Чем OpenAI Agents SDK отличается от n8n AI Agent и CrewAI
Agents SDK — code-first runtime OpenAI: tools, handoffs, MCP, sessions, HITL в Python. n8n сильнее no-code и готовыми HTTP/Telegram-узлами; для SDK обычно делают маленький Python-сервис и дергают его из сценария. CrewAI удобен ролевым DSL «команда», но другой экосистемой и другим control flow. На mayai.ru уже есть отдельные гайды по n8n/CrewAI/MAF — здесь фокус именно на официальном стеке OpenAI.
Нужен ли MCP, если хватает своих function tools
Нет. Свои @function_tool часто достаточны для файла, webhook и простой CRM-обёртки. MCP подключайте, когда инструмент уже существует как MCP-сервер или его используют несколько клиентов (Cursor, другой агент, хостинг OpenAI).
Можно ли собрать агента бесплатно / с нуля
«С нуля» — да: код SDK открытый, Hello World пишется за вечер. «Бесплатно навсегда» — почти нет: нужны Python-среда и обычно платные вызовы модели. Без доступа к OpenAI API из РФ можно отработать схему ролей на доступной модели/локально, а публикацию оставить в Make/n8n.
С чего начать маркетологу без бэкенд-опыта
1) Повторить Hello World из этого гайда.
2) Добавить один save_draft.
3) Добавить critic как as_tool.
4) Включить approval на «отправить».
5) Отдать JSON в уже знакомый Make/n8n.
Не начинайте с семи агентов и трёх MCP-серверов.
Что проверяли по источникам
- Официальная документация OpenAI Agents SDK (install, Runner, tools, multi-agent).
- Раздел MCP SDK: Hosted / Streamable HTTP / stdio; SSE как legacy.
- Deprecations OpenAI: Assistants API — shutdown 26.08.2026.
- PyPI: пакет
openai-agentsлиния 0.19.x (0.19.1 на 29.07.2026). - Фоновые публикации о спросе на бизнес-агентов и важности workflow (не тема страницы).
Ключевые ссылки для самостоятельной проверки: документация Agents SDK, MCP в SDK, handoffs, deprecations OpenAI, PyPI openai-agents.
