LangGraph, OpenAI Agents SDK ці Claude Agent SDK: падбірайце прымітыў пад задачу
Чатыры прыклады нагрузак — голас, надзейныя вяртанні сродкаў, міграцыя кода і аперацыі праз MCP — паказваюць, калі які агентны фрэймворк падыходзіць, з нататкамі пра прывязку, надзейнасць і рэальны час.
Крыніцы: The Best Agent Framework in 2026: LangGraph vs OpenAI Agents SDK vs Claude Agent SDK
У 2026 году парадыгмы параўнання продовжаюць спрамоўвацца на тры падходы до стварэння агентаў, прычаму кожны з іх будуецца на адной разнай основнай ідэі. LangGraph — гэта асяроддзе для апрацоўкі графаў, у якай вузлы ўособліваюць ся простымі функціямі, а рэбра вялі за перэходы між німі. SDK для агентаў OpenAI аб’ектуецца навакол перэдачы задач, калі агент перадае працу іншаму праз тыпаваныя сесіі, пры чым натыўна падтрымліваецца MCP. SDK для агентаў Claude ёсць неспадзеваным: ён дае агенту камп’ютар, адколькі компанія Anthropic створыла яго на базе екзекуцыі команд у bash, запісу файлаў і хуків, будучы перакананай, што здольны агент патрэбуе справжньяй шэлі.
Правы выбар залежыць ад таго, пра што рэдка спытваюць парадыгмы архітэктуры: якія задачы віконвае агент?
Тры прымітывы
LangGraph назначан для рабочых практык з інформацыяй працэю. Указываецца схема стану, і аб’ект з адакованым тыпам пераходзіць па графе з першага вузла да апошнага. Пакалькі фіксуюць гэты стан на кожным вузле, таму запуск можа продавацься пасля збою або пасля чакання на затверджэння ад чалавека, захаваючы свой кантэкст. Функцыя create_agent, якая з’явілася ў LangChain 1.0, якая стала загальна доступна 22 жаўтня 2025 года, ёсць лішэнь відображальнай шкляпай над гэтым рантаймам, што паканчывае старыя дыскусіі пра тое, калі выбіраць LangChain чы LangGraph.
SDK OpenAI Agents мае дзевяць основных элементаў, сярод яых Agents, Handoffs, Tools, Guardrails, Sessions і Realtime. Яго атамарныя елементы — гэта агенты, якія перадаюць задачы іншым агентам. Незалежнасць ад прадаўцоў з’явілася ў 2025 году завдзяк падтрымцы болейш чым 100 модэляў праз LiteLLM. MCP ёсць інструмент першага класу, а функцыя голасавання ўжо ёсць ў модэлях сяродыны gpt-realtime-2.
SDK для Claude Agent базуецца на сяродовішчы шэлу. Яго набор засобаў уключае Bash, Read, Write, Edit, Glob і Grep, а таксама хукі жыцёвага цыклу пад назвамі PreToolUse, PostToolUse і Stop, і падагенты, якія запускаюцца ў окрэмых, ізольаваных вікнах кантэксту. У канцы 2025 года компанія Anthropic зменіла назву з Claude Code SDK, таму што гэты інструмент таксама вікорыстоўваецца для глыбокіх даследжэнняў, стварэння відэа і ведэння нотатак, а не толькі для програмавання. Дазволеныя ўсё толькі мадэлі Claude, хоць іх можна запускаць на платформах Bedrock, Vertex і Azure Foundry.
Уявленне з 2025 года, якое трэба адмініструваць
Па распашчанай ў мінулым годзе думцы, SDK для OpenAI Agents прымушвае вікорыстоўваць мадэлі OpenAI. Гэта ужо майжэ паўтаро гадоў застарэлыя даныя. Афіцыйны рэпазітарый падтрымлівае API OpenAI Responses, а таксама прыблізна 100 іншых модэляў за дапамогою інтэграцый LiteLLM і Any-LLM.
# Install: pip install "openai-agents[litellm]"
# Env: export GEMINI_API_KEY=...
import os
from agents import Agent, Runner, function_tool
from agents.extensions.models.litellm_model import LitellmModel
@function_tool
def current_time_utc() -> str:
"""Return the current UTC time as an ISO-8601 string."""
from datetime import datetime, timezone
return datetime.now(timezone.utc).isoformat(timespec="seconds")
# OpenAI Agents SDK using Gemini via LiteLLM. No OpenAI key required.
gemini_model = LitellmModel(
model="gemini/gemini-2.5-pro",
api_key=os.environ["GEMINI_API_KEY"],
)
agent = Agent(
name="time-agent",
instructions="Answer time questions using the current_time_utc tool.",
model=gemini_model,
tools=[current_time_utc],
)
result = Runner.run_sync(agent, "What is the current UTC time?")
print(result.final_output)
# -> "The current UTC time is 2026-07-06T14:32:11+00:00."
Стварэнне модэлю LitellmModel на адпаведнае імя модэлю Gemini паказвае, што такі фрэймворкі можу працаваць па-іншым чынам за межамі экасістэмы OpenAI, а дэкоратар @function_tool ведае ся аднакова незалежна ад таго, які модэль знаходзіцца пад ўпрыемам. Шляхі, якія не належаць да OpenAI, опісваюцца як працюючыя за максымальна можлівая стандарты, пры чым рэваліднасць функцый можа разліцца залежна ад прадаўца. Калі строгія ліміты для модэляў не дапускаюцца, фрэймворкі конкуруюць за счытаннем своіх архітэктурных элементаў.
Тэставанне компаніі з чатырма агентамі
Узьмімо срэднія па велічыне фінтэх-компанію, назвамо яе Meridian, у якой ствараюцца чатыры агенты ў аднарозных камандах.
- Агент голасовага сапорту, які развяртае пытанні, зв’язаныя з білінгам, па тэлефону.
- Рабочы працэс вярнення грошаў, у яком участвуюць калькі агентаў, якія пераканальваюць правіла пра абман пры перадачы заявкі фінансавым віддзелам.
- Внутршній агент для міграціі коду, які аналізуе вялікі рэпазітарый на Java, прыкладзе трансфармазіі сынтаксісу і стварае запросы пра з’еднанне коду.
Чатыры варыянты практычнага прыемлівання паказваюць, якая парадыгма падходзіць для кожнага з яных.
Задача №1: голас і стрымінг у рэальны час
Команда, якая займаецца голасам, працуе ў межах строгага ліміту затрымкі — менейш 500 мс для стрымінгу, і трэба рэшаваць проблему втручання корыстувача. Этап перакладу голасу ў тэкст, які потым падае ў мадэль для перакладу тэксту ў голас, ёсць занадта медленным, адколі кожны крок у сеткі дадае додатковую затрымку.
Падходзіць SDK OpenAI Agents. Мадэль gpt-realtime-2 стрымуе аудыя-токены натыўна, а RealtimeAgent абгружае гэтыя можлівасці. Ні LangGraph, ні Claude Agent SDK не запрошвалі натыўных прыемнікаў для рэальнага часу на такам роўні ў серэдзіне 2026 года.
# Install: pip install openai-agents
# Env: export OPENAI_API_KEY=...
import asyncio
from agents import function_tool
from agents.realtime import RealtimeAgent, RealtimeRunner
@function_tool
def lookup_billing_balance(account_id: str) -> str:
"""Return the current outstanding balance for an account."""
# In production, this hits the billing service. Here it is a stub.
return "42.17 USD outstanding as of 2026-07-06."
voice_agent = RealtimeAgent(
name="meridian-billing-voice",
instructions=(
"You are Meridian's billing voice assistant. Answer politely, briefly. "
"Confirm the account_id before disclosing any balance."
),
tools=[lookup_billing_balance],
)
async def main():
runner = RealtimeRunner(
starting_agent=voice_agent,
config={"model_settings": {"model_name": "gpt-realtime-2.1"}},
)
# session handles the audio stream and tool calls
session = await runner.run()
async with session:
# Wire the audio input source here via sounddevice or pyaudio
async for event in session:
if event.type == "history_updated":
# The item contains the finalized transcript once the turn ends
print(f"History updated with item: {event.item}")
elif event.type == "error":
print(f"Error: {event.error}")
break
asyncio.run(main())
RealtimeAgent і RealtimeSession караюцься за прыходзячыя і выходзячыя аудыявыя стрымы, а таксама за цыкл вызова інструментаў; інструменты, адзначаныя з @function_tool, работаюць у рэальнай часе так сама, як і ў тэкстовым агенце. Фрэймворк адкрывае можлівасці цыклу змаганняў, тады калі стан WebSocket застаецца невідным.
Выпанаванне гэтага ў LangGraph або Claude Agent SDK значыць неабходнасць стварэння спецыяльнага коду для WebSocket, адказвання на дзіяльнасць голасу і складных сэмантык перарываў, што ператварае праект агента на праект медыя-пайплайну. Калі правілы компаніі выкалікаюць вікорыстанне Claude або Gemini для модэлю голасу, адпаведны адказ змініцца. Anthropic пазней дадаў можлівасці рэальнага часу, таму тыя, хто чытае пасля серэдзіны 2026 года, должны пераканацца ў аднаковасці функцый.
Роба два: стойкая оркестрацыя з апраўданнем чалавека
Працэс вярнення грошаў выклікае неабходнасць пераканання ў відсутнасці шахрайства, пасля чаго трэба отрымаць схвалення фінансавага віддзелу; для вярнення сум, большых за 500 долераў, неабходна чаканне на людзкую пераглядку, а пасля — фінальна рашынка, якая заносіцца назад у Postgres. Гэты працэс павінен працаваць нават пасля збоў сервера і справляцца з асінхроннымі паузамі людзей, не втрачаючы кантэксту.
LangGraph падходзіць. Контрольныя пункты у поўнай злучэнні з прыемам перэрыву даўаюць самэ той контрольны прыток, які патрэбен длігачасовым бізнес-працэсам. Команды, якія працуюць у прымэнні, падтрымліваюць гэю архітэктуру: Uber адзвярнуўся, што за дапамогою LangGraph у своіх сістэмах AutoCover і Validator заўсёды заошчаджае або 21 000 гадзін працы распрацоўшчыкаў, а LinkedIn опублікаваў артыкул пра іерархічную семантычную дрэву памяці для свайго Hiring Assistant; дызайн яго керуючага элемента і падэйнтных агентаў рассматрываецца окрэма ў тэхнічных даповедзях LangChain.
from typing import TypedDict, Literal
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import MemorySaver
from langgraph.types import interrupt, Command
from langchain_google_genai import ChatGoogleGenerativeAI
# LangGraph is provider-agnostic. Here it uses Gemini.
llm = ChatGoogleGenerativeAI(model="gemini-2.5-pro", temperature=0)
class RefundState(TypedDict):
order_id: str
amount_usd: float
customer_reason: str
fraud_risk: Literal["low", "medium", "high"] | None
finance_decision: Literal["approved", "denied"] | None
human_review_needed: bool
def fraud_check(state: RefundState) -> RefundState:
"""Run the LLM-backed fraud check against the customer's stated reason."""
prompt = (
f"Assess fraud risk for refund of ${state['amount_usd']:.2f}. "
f"Customer reason: {state['customer_reason']!r}. "
"Respond with one word: low, medium, or high."
)
verdict = llm.invoke(prompt).content.strip().lower()
if verdict not in {"low", "medium", "high"}:
verdict = "high" # fail-closed on ambiguous LLM output
return {**state, "fraud_risk": verdict}
def finance_approval(state: RefundState) -> RefundState:
"""Above $500 or medium risk, pause for a human. Otherwise auto-approve."""
needs_human = state["amount_usd"] > 500 or state["fraud_risk"] in {"medium", "high"}
if needs_human:
# Pause the graph. On resume, interrupt returns the human's decision.
human_decision = interrupt({
"order_id": state["order_id"],
"amount_usd": state["amount_usd"],
"fraud_risk": state["fraud_risk"],
"prompt": "Approve (yes/no)?",
})
return {**state, "human_review_needed": True, "finance_decision": human_decision}
return {**state, "human_review_needed": False, "finance_decision": "approved"}
# Build the graph
graph = StateGraph(RefundState)
graph.add_node("fraud_check", fraud_check)
graph.add_node("finance_approval", finance_approval)
graph.add_edge(START, "fraud_check")
graph.add_conditional_edges(
"fraud_check",
lambda s: "finance_approval" if s["fraud_risk"] != "high" else END,
)
graph.add_edge("finance_approval", END)
# Checkpointer. For production, swap MemorySaver for PostgresSaver.
compiled = graph.compile(checkpointer=MemorySaver())
# Run it. Interrupt fires on the $850 refund and the graph pauses.
config = {"configurable": {"thread_id": "order-4291"}}
result = compiled.invoke(
{
"order_id": "4291",
"amount_usd": 850.00,
"customer_reason": "arrived damaged, no photo",
"fraud_risk": None,
"finance_decision": None,
"human_review_needed": False,
},
config=config,
)
# Later, a human reviewer says yes. Resume with Command.
final = compiled.invoke(Command(resume="approved"), config=config)
Шаблон паузы і продажу паказвае стойкую рэалізацыю коду. Выклік функцыі interrupt() у вузле затверджэння фінансавых операцый запісвае тэкушчы стан у checkpointer, і сістэма можа зупініцца ў тым моменце. Чырвоныя гадзіны пазней команда з параметрам resume = approved продолжае працу з таго ж месца паузы пад тым самым ID ніткі, не перзапускаючы перакананне пра шахрайство.
Існуе адзін застэрэжны момент, стосаваны стойкасці. Сістэма з адкрытым кодам зберагае стан у MemorySaver, які знаходзіцца ў памяці процэса. Рэальна вяснаванне пасля збою пад навантажэнням выклікаецца за дапамогою LangGraph Platform, якая падтрымваная Postgres, або спецыяльнага PostgresSaver.
SDK OpenAI Agents апранае Sessions для зберагчыць стан размовы і Sandbox Agents для работы на далёкі тэрмін, але не мае аналогаў у вачынцы стварэння пунктавых контрольных точак на рэвэрсе графа. SDK Claude Agent зберагчыць стан сесіі у фармаце JSONL локальна, або выкарыстоўвае Managed Agents для абслужвання дадзеных, але за цэну вікорыстоўвання толькі модэляў Claude. Наразе LangGraph контролюець працэс оркестрацыі.
Заданне троэ: работа з файламі і шэлам
Агент для міграцыі з команды распрацоўшчыкаў павінен працаваць з рэпазітарыем на Java з 400 000 лініяў коду, застосавваць змяны сінтаксісу, запускаць тэсты на елементарныя функцыі і ствараць запросы прыўязкі коду. Гэта значыць чытанне і рэдагаванне файлаў, запуск команд у шэле і рэагаванне на памылкі кампайляра. Bash і Edit станавяць практычна весь обсяг работы.
SDK для Claude Agent адаптаваецца даўжынай да гэтага, адколькі галоўная ідэя Anthropic — даўаць агентам камп’ютар. У яго ёсць встроеныя інструменты для Bash, Read, Write, Edit, Glob і Grep, а яго хукі выступаюць як срэдства кантролю. Хук PreToolUse можа застаўляць меры захоплення проты разрушальных каманд, а хук PostToolUse можа запускаць фарматары або лінтары. Падагенты дзельна распадзяюць работу па ператварэнні ў ізольаваных кантэкстах, таму довгі лог ад памылак кампайляра, які перадаецца падагенту, не забруднюе вікна галоўнага агента.
# Install: pip install claude-agent-sdk
# Env: export ANTHROPIC_API_KEY=...
import anyio
from claude_agent_sdk import (
ClaudeSDKClient,
ClaudeAgentOptions,
AgentDefinition,
HookMatcher,
)
# PreToolUse hook: block Bash calls that look like rm -rf
async def block_dangerous_bash(input_data, tool_use_id, context):
if input_data.get("tool_name") == "Bash":
cmd = input_data.get("tool_input", {}).get("command", "")
if "rm -rf" in cmd or "rm -rf" in cmd:
return {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "rm -rf blocked by policy",
}
}
return {}
# Subagent: runs in isolated context to lint one file
lint_agent = AgentDefinition(
description="Run linters on a single file and return a concise report.",
prompt=(
"You are the lint subagent. Given a file path, run the project's linter "
"on it and return a one-paragraph summary of failures. Do not fix anything."
),
tools=["Bash", "Read"], # Note: tools is deprecated in favor of skills in recent SDKs
)
options = ClaudeAgentOptions(
system_prompt=(
"You are Meridian's code migration agent. Walk the target directory, "
"apply the migration, run tests, and open a PR. Prefer small commits."
),
allowed_tools=["Bash", "Read", "Write", "Edit", "Glob", "Grep"],
hooks={"PreToolUse": [HookMatcher(hooks=[block_dangerous_bash])]},
agents={"lint": lint_agent},
# resume="mig-run-2026-07-06-01", # uncomment to resume a prior session
)
async def main():
async with ClaudeSDKClient(options=options) as client:
await client.query(
"Migrate services/payments/ from Java 17 to Java 21. "
"For every file you touch, delegate to the `lint` subagent afterward. "
"Do NOT commit or open PRs yet. Stop after changes are on disk."
)
async for message in client.receive_response():
print(message)
anyio.run(main)
Спісак allowed_tools задае сераўак агента. Хукі ствараюць механізм контролю, які знаходзяцца внутрь цыклу агента, а не навакола яго: хук PreToolUse выконваецца перад выкарыстоўванням інструмента, а рашэнне deny негайна паставляе кантакт. Падагент lint мае своі сабе інструменты і вікно кантэксту. Няўясковыя выданні SDK заменяюць поле tools у AgentDefinition на skills, хоць яно ўсё ўсё працюе. Прыведзены прыклад паказвае, як вярнуць стан сесіі з файлаў JSONL на локальным дыску.
У LangGraph гэтыя прымітывы shell павінны быць напісаныя як спецыяльныя функцыі Python. Агенты Sandbox SDK ад OpenAI работаюць у контэйнерах, чыя архітэктура супадае, але набор прымітыў не мае такога ж іменавання і не ўтвараецца на адной заснованай на файлах основе. Проблема заключаецца ў блокаванні на модэлі: каманда, якая строго протыяўстоўляецца блокаванню на роўні модэля, не можа вікорыстоўваць Claude Agent SDK і вынуждэна апісваць прымітывы bash і edit сама, выкарыстоўваючы LangGraph.
Роба чатырох: оркестрацыя з акцэнтам на MCP
Панель керування команды платформы адпавядае на аднае запытанне, якое задае інжынер. У спіну за гэтым агент запоўнюе даны пра аберанні з Sentry, тыкеты з Linear, інцыдэнты з PagerDuty і даны пра корыстнікаў з Postgres. Паўнае большасць зусілляў направленыя на коордынацыю сервераў MCP трэціх сторон, а дужа малая — на стварэнне самай адпаведзі.
У гэтым аспекце SDK OpenAI Agents і SDK Claude Agent знаходзяцца на аднам рэвэлі. У обох случаях MCP ёсцца асновным элементам, а серверы працуюць як локальныя функцыі. LangGraph таксама можа выкарыстоўваць MCP, але ў серэдзіне 2026 года для гэтага трэба больш коду, і команды часта самі ператвараюць серверы ў інструменты. Разлік між гэтымі двума лідэрамі ёсцца второсортным фактарам.
- Выберыце SDK OpenAI Agents для власнага трэйсінгу, строгіх правіл і перадачы задач спецыялістам-падагентам, або калі прызначальна ўсунуць простыя задачы сінтэзу да дэшавшыхся прадаўцоў за дапамогою LiteLLM.
- Выберыце SDK Claude Agent для кірваты лайфсайку, строгай ізоляціі падагентаў і надзеям на надзеямнае выкарыстоўванне інструментаў з боку Claude.
Спецыяльныя абгульнікі API для популярных інструментаў SaaS займаюць часінь інжынераў. Стандарт MCP стандартызуе кантэкст і пошук інструментаў, таму фрэймворку проста трэба не заважаць, а оба SDK падтрымляюць гэты патэрн натыўна.
Падсумак па віду работы
- Рэальны час для голасу з можлівасцю перэрыву: OpenAI Agents SDK.
- Стойкія мнагаагентныя працэсы з парадзеннем чалавека: LangGraph.
- Работа з файламі, шэлем і міграцыяя коду: Claude Agent SDK.
- Складная оркестрацыя за дапамою MCP: OpenAI Agents SDK або Claude Agent SDK.
Прымечанне пра CrewAI
Багато чытачаў спакушаныя падазроўваць прысутнасць CrewAI ў такім порэванні. Пасля перагляду выявілася, што доказы ўзьязцоўвання яго нынешней версіі, Flows і прыклады ўпрабавання ў корпоратывах не былі настолькі пераканлівыя, як для трох прынцыповых выбораў, таму яго не павелі, ўтрымуючыся ад дадавання менш надзеяных джэрэл.
Рэальны выбор
Чатыры агента былі розмешчаныя на трох платформах: агенты для працы з голасамі і на платформе на базе SDK OpenAI, агент для апрацоўкі запітаў на вырачэнне вярнення грошаў на платформе LangGraph, а таксама агент для міграцыі на платформе на базе SDK Claude Agent. Спарчы пра тое, якая платформа крашчая, — глыткі падход. Галоўная задача — падпарадкаваць основныя элементы платформы пад фармат выконвання заведама.
Наступны раунд, верагодна, знову ачыне спарчы пра стойкасць платформ, калі LangGraph Platform будзе конкуруваць з Managed Agents ад Anthropic. LangGraph можа атрымаць прыорытэтныя рэальнага часу элементы, або ж Anthropic можа адкрыць свае SDK для іншых прадаўцоў модэляў. Да тэх пэўнасці саме гэтыя элементы вялі за сабой структуру платформы.
Супаўзяныя матэрыялы
- Стварэнне мульты-агента-рутэра з LangGraph і агентам-надзірнікамі — Як раздзеліць аднаго перавантажанага агента на спецыялістаў за дапамогою агента-надзірніка ў LangGraph, выкарыстоўваючы готавыя дапаможнікі і ручны StateGraph, а таксама прыметы дызайну станаў і падазры ў цікле.
- Автанявальная мульты-агента-команда ў LangGraph: архітэктар, тэставальнік, дэбаггер — Стварэнне машыны станаў у LangGraph на Python, дзе архітэктар, распрацоўшчык, сандбокс pytest, дэбаггер і рэвізор саавершаюць работу і ціклююць, пакуль тэсты не пройдуць.