Главная / Статьи / Команды сравнили 6 фреймворков ИИ-агентов на Python, чтобы вам не пришлось этого делать: LangGraph против

Команды сравнили 6 фреймворков ИИ-агентов на Python, чтобы вам не пришлось этого делать: LangGraph против

Подробный обзор фреймворков ИИ-агентов на Python: LangGraph против CrewAI против PydanticAI против OpenAI SDK против Smolagents против Google AD — контракты.

2590 слов

В следующих заметках описывается практический подход к рассмотрению шести фреймворков ИИ-агентов на Python: LangGraph, CrewAI, PydanticAI, OpenAI SDK, Smolagents и Google ADK. Основное внимание уделяется контрактам, проверкам и местам для вставки кода, а не мотивирующим формулировкам.

Вы создали один и тот же оркестратор исследований шесть раз. Только два из этих решений остались работоспособными к концу уикенда.

В процессе работы вы шесть раз создавали один и тот же оркестратор исследований. Только два из этих решений оставались работоспособными на выходных. Сначала запишите условия использования: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Очевидность затрат с самого начала предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Ведите журнал с информацией об идентификаторе запроса, идентификаторе модели и времени задержки при каждом вызове. Без такой записи периодические ошибки поставщика могут выглядеть как баги приложения.

Настройка: что вы на самом деле создали

При работе над книгой «The Setup: What you Actually Built» сначала запишите условия работы системы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Храните конфигурацию вне кода приложения. Файлы с настройками окружения, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Фиксируйте ID запроса, ID модели и время задержки при каждом вызове. Без такой отчетности периодические ошибки поставщика будут выглядеть как баги в самом приложении.

Фреймворк 1: LangGraph — рай для любителей контроля

При работе над Framework 1: LangGraph — Рай для тех, кто любит контроль, сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и что происходит при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Документируйте одновременно успешный и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Записывайте идентификатор запроса, идентификатор модели и время задержки при каждом вызове. Без такой записи периодические ошибки поставщика будут выглядеть как баги приложения.

Framework 2: CrewAI — Машина для быстрой разработки прототипов

При работе над Framework 2: CrewAI — The Fast Prototype Machine сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и что происходит при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые модули большим скриптам. Когда какой-то шаг терпит неудачу, ошибка должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Записывайте идентификатор запроса, идентификатор модели и время задержки при каждом вызове. Без такой отслеживающей информации периодические ошибки поставщика кажутся багами приложения.

researcher = Agent(
    role="Financial Research Analyst",
    goal="Find and verify recent financial data",
    backstory="You're a senior analyst at a hedge fund...",
)

Framework 3: PydanticAI — The Quiet Overachiever

При работе над Framework 3: PydanticAI — The Quiet Overachiever сначала запишите контракт: необходимые входные данные, сигнал о успехе и что происходит при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Рассматривайте этот этап как контракт между входными данными и проверенными выходными данными. Дайте названия результатам обработки, определите критерии успеха и не допускайте безупречного завершения работы только частично. Записывайте идентификатор запроса, идентификатор модели и время задержки при каждом вызове. Без такой отчетности периодические ошибки поставщика могут выглядеть как баги приложения. При работе над Framework 3: PydanticAI — The Quiet Overachiever сначала запишите контракт: необходимые входные данные, сигнал о успехе и что происходит при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, которое операторы могут проверять, не читая весь код.

agent = Agent(
    "openai:gpt-4o",
    result_type=CompanyAnalysis,  # Pydantic model
    system_prompt="You are a financial research assistant.",
)

Именно здесь всё становится интересным

Подход «Именно здесь всё становится интересным» работает наилучшим образом, когда его рассматривают как измеримую поверхность. Сначала соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию, прежде чем расширять объём исследования. Документируйте одновременно успешный сценарий работы и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не последующими улучшениями. Закрепите интерпретатор и файл блокировки зависимостей до того, как начнёте изучать циклы. Различия между ноутбуком и средой CI являются наиболее распространённой причиной скрытых сбоев при демонстрации API.

Фреймворк 4: OpenAI Agents SDK — неожиданный хит

Framework 4: OpenAI Agents SDK — Этот инструмент дает наилучшие результаты, когда с ним работают как с измеримой системой. Сначала зафиксируйте один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию, прежде чем расширять объём задач. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое какой-либо операции причина должна быть связана с конкретной функцией, а не с запутанной цепочкой действий. Закрепите версию интерпретатора и файл с информацией о зависимостях до того, как начнёте использовать циклы. Различия в версиях программного обеспечения между ноутбуком и средой CI являются наиболее распространённой причиной скрытых сбоев в демонстрациях API.

agent = Agent(
    name="Researcher",
    instructions="You are a financial research assistant.",
    tools=[search_tool, db_tool],
    handoffs=[summary_agent],
)

Framework 5: Smolagents — Мечта сторонников открытого кода

Framework 5: Smolagents — The Open-Source Purist’s Dream работает наилучшим образом, когда рассматривается как измеримая структура. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия всем элементам, определите критерии успеха и не соглашайтесь на молчаливое частичное выполнение задачи. Закрепите интерпретатор и файлы с информацией о зависимостях до того, как начнете использовать циклы. Различия в работе приложения на ноутбуке и в среде CI являются наиболее распространенной причиной незаметных сбоев в демонстрациях API. Framework 5: Smolagents — The Open-Source Purist’s Dream работает наилучшим образом, когда рассматривается как измеримая структура. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Храните конфигурацию вне кода приложения. Файлы с настройками окружения, хранилища конфиденциальных данных и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код приложения.

agent = CodeAgent(
    tools=[search_tool, db_tool],
    model=InferenceClientModel(),
)
result = agent.run("Analyze recent financial news for Acme Corp")

Framework 6: Google ADK — Тайный лидер в корпоративном сегменте

Для Framework 6: Google ADK — Тайный лидер в корпоративном сегменте необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не пытаясь угадать скрытое состояние. Необходимо одновременно задокументировать успешный и аварийный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами, добавляемыми позже. Необходимо разделить процесс создания клиента от цикла обработки сообщений, чтобы можно было заменять поставщиков без необходимости переписывать машину состояний диалога.

from google.adk.agents import Agent
root_agent = Agent(
    model="gemini-2.5-flash",
    name="financial_analyst",
    instruction="You are a financial research assistant.",
    tools=[search_tool, db_tool],
)

Вердикт: Всё зависит от обстоятельств (но не так, как вы думаете)

В заключение: всё зависит (но не так, как вы думаете). Перед изменением кода необходимо определить входные данные, ответственного за выполнение шага и критерии завершения. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Лучше использовать небольшие, тестируемые единицы вместо обширных скриптов. При сбое шага он должен указывать на конкретную причину, а не на запутанную цепочку операций. Разделяйте создание клиента и цикл обработки сообщений, чтобы можно было заменять поставщики без переписывания машины состояний разговора.

Полная таблица сравнения

Для полной таблицы сравнения необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия элементам, определите критерии успеха и не допускайте молчаливого частичного завершения работы. Отделите процесс создания клиента от цикла обработки сообщений, чтобы можно было заменять поставщиков без переписывания машины состояний диалога. Для полной таблицы сравнения необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, которое операторы могут проверять, не читая весь граф структуры.

| Metric            | LangGraph   | CrewAI          | PydanticAI    | OpenAI SDK       | Smolagents      | Google ADK      |
| ----------------- | ----------- | --------------- | ------------- | ---------------- | --------------- | --------------- |
| Lines of code     | ~210        | ~340            | ~130          | ~150             | ~95             | ~180            |
| Time to prototype | 3 hrs       | 45 min          | 1.5 hrs       | 1 hr             | 30 min          | 2 hrs           |
| Avg tokens/run    | 2,847       | 4,216           | 2,912         | 2,791            | 3,340           | 3,102           |
| Multi-agent       | Yes (graph) | Yes (teams)     | Manual        | Yes (handoffs)   | Yes (hierarchy) | Yes (AgentTeam) |
| Type safety       | TypedDict   | Pydantic config | Full generics | Generic context  | Minimal         | Standard        |
| MCP support       | Yes         | Limited         | Native + A2A  | Native           | Yes             | Yes             |
| Model-agnostic    | Yes         | Yes             | Yes (20+)     | Yes (100+)       | Yes (LiteLLM)   | Gemini-first    |
| Best debugger     | LangSmith   | Logs            | IDE/types     | Built-in tracing | Code output     | ADK Web UI      |
| GitHub stars      | ~48K        | ~44K            | ~15K          | ~16K             | ~26K            | ~23K            |
| 2 AM debug        | 9/10        | 5/10            | 8/10          | 7/10             | 8/10            | 6/10            |

Единственная вещь, которую стоит знать перед началом

При работе над «Единственной вещью, которую стоит знать перед началом», сначала запишите условия работы: необходимые входные данные, сигнал успеха и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Задокументируйте одновременно успешный и восстановительный сценарии работы. Повторные попытки, проверки со стороны оператора и обработка некорректных сообщений являются частью продукта, а не последующими улучшениями. Записывайте идентификатор запроса, идентификатор модели и время задержки при каждом вызове. Без такой отчетности периодические ошибки поставщика могут выглядеть как баги приложения.

Чек-лист операционной работы

Для чек-листа операционной работы определите входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние.

Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Визуальное отображение затрат заранее предотвращает неожиданные счета при переходе с демо-среды в общедоступные среды.

Разделяйте процесс создания клиента от цикла обработки сообщений, чтобы можно было менять поставщиков без переписывания машины состояний диалога.

Создавайте контрольные точки после дорогостоящих операций. Функция возобновления не должна снова взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить последующий шаг.

Фиксируйте версии зависимостей и сохраняйте хэш изображения, использованного для демонстрации. Воспроизводимость важнее устного опыта сотрудников.

Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое какого-либо шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций.

Перед внедрением стека заморозьте версии, сделайте копию «золотого» отчета для критической цепочки операций и уточните шаги возврата к предыдущему состоянию. В совместных средах необходимы ограничения на частоту запросов, проверки принадлежности пользователя и четко определенный ответственный за обновление секретов. Предпочтите надежность любой сложной одноразовой демонстрации.

Примечание для d8a5e6e43262: не храните ключи поставщика в репозитории, установите лимит токенов на одну сессию и сохраняйте отчеты рядом с фикстчерами для оценки, чтобы последующие замены моделей оставались сопоставимыми.

Что касается мер укрепления безопасности номер 0, определите входные данные, ответственного за выполнение шага и критерии завершения до изменения кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия файлам, определите критерии успеха и не допускайте безответственного частичного выполнения задачи.

Подробности усиления безопасности 0/819: измерьте время выполнения, класс ошибки и расход токенов для этой записи, затем решите, следует ли сохранить изменение на основе фиксированного набора вопросов, а не на основе единичных примеров.

При работе над записью об усилении безопасности №1 сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и что происходит при частичной неудаче. Такой чек-лист помогает сохранять честность последующих изменений в коде. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, которое операторы могут проверять, не читая весь код.

Подробности усиления безопасности 1/819: измерьте время выполнения, класс ошибки и расход токенов для этой записи, затем решите, следует ли сохранить изменение на основе фиксированного набора вопросов, а не на основе единичных примеров.

Принцип укрепления №2 наилучшим образом работает, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда какой-либо шаг срабатывает некорректно, причина сбоя должна указывать на конкретный ответственный элемент, а не на запутанную цепочку операций.

Деталь укрепления №2/819: измерьте время выполнения шага, класс ошибки и расход токенов для этой записи, затем решите, следует ли сохранять изменения, опираясь на заранее определенный набор критериев, а не на устные описания.

Для принципа укрепления №3 определите входные данные, ответственного за выполнение шага и критерии завершения работы до изменения кода. Операторы должны иметь возможность повторно выполнить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние. Записывайте время выполнения и стоимость в использовании токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные расходы при переходе с демо-среды в общедоступные среды.

Подробности укрепления 3/819: измерьте время выполнения, класс ошибки и расход токенов для этой записи, затем решите, следует ли сохранить изменение на основе фиксированного набора вопросов, а не на основе единичных примеров.

При работе над записью об укреплении 4 сначала запишите контракт: необходимые входные данные, сигнал успешного выполнения и что происходит при частичной неудаче. Такой чек-лист помогает сохранять честность последующих изменений в коде. Документируйте как успешный сценарий, так и сценарий восстановления одновременно. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не последующими улучшениями.

Подробности укрепления 4/819: измерьте время выполнения, класс ошибки и расход токенов для этой записи, затем решите, следует ли сохранить изменение на основе фиксированного набора вопросов, а не на основе единичных примеров.

Пункт 5 по усилению безопасности работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия элементам, определите критерии успеха и не соглашайтесь на молчаливое частичное выполнение задач.

Подробность 5/819 по усилению безопасности: измерьте время выполнения, класс ошибок и расход токенов для этого пункта, затем решите, следует ли сохранять изменения, опираясь на фиксированный набор вопросов, а не на устные описания.

Маркер переписи 1 для d8a5e6e43262: перефразируйте соседние утверждения на языке операторов, сохраните слоты [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.

Маркер переписи 2 для d8a5e6e43262: перефразируйте соседние утверждения на языке операторов, сохраните слоты [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.

Перепишите маркер 3 для d8a5e6e43262: перефразируйте сопутствующие утверждения на языке операторов, сохраните поле [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.

Перепишите маркер 4 для d8a5e6e43262: перефразируйте сопутствующие утверждения на языке операторов, сохраните поле [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.

Перепишите маркер 5 для d8a5e6e43262: перефразируйте сопутствующие утверждения на языке операторов, сохраните поле [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.

Перепишите маркер 6 для d8a5e6e43262: перефразируйте сопутствующие утверждения на языке операторов, сохраните поле [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.

Перепишите маркер 7 для d8a5e6e43262: перефразируйте сопутствующие утверждения на языке операторов, сохраните поле [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.

Перепишите маркер 8 для d8a5e6e43262: перефразируйте сопутствующие утверждения на языке операторов, сохраните слоты [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.

Перепишите маркер 9 для d8a5e6e43262: перефразируйте сопутствующие утверждения на языке операторов, сохраните слоты [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.

Перепишите маркер 10 для d8a5e6e43262: перефразируйте сопутствующие утверждения на языке операторов, сохраните слоты [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.