Галоўная / Артыкулы / Практычныя прытамулі: Найкращая парадыгма агентаў у 2026 годзе: LangGraph протык OpenAI Agents

Практычныя прытамулі: Найкращая парадыгма агентаў у 2026 годзе: LangGraph протык OpenAI Agents

Практычныя прыказкі: Найлепшая парадграф для агентоў у 2026 годзе: LangGraph проты OpenAI Agents: контракты, перакананні та шаблоны коду для команд, якія викорыстоўваюць гэты падход.

2343 слоў

У гэтым керавані перакладзены пацек з сыр'ёў да рабочай системы для: Найлепшага фрэймворку агентаў у 2026 годзе: LangGraph протык OpenAI Agents SDK протык Claude Agent SDK. Акцэнт ставіцца на практычныя крокі, чысткія перакананні та код, які можна падставіць у репазітарый без неабяснення меты. Для агульнага відображэння неабходна прадзефінаваць вхідныя даны, адпаведальную за крок і критэрыя завершэння пры зміне коду. Аперацыйныя працавальнікі должны магчымае перадзеўсці крок з вядомага пункта контролю без неабяснення схованага стану. Запісваюцься часы выконання та вартасць токенав або запытак праз адныя з функцыйнальных рэзультатаў. Відразлівае відображэння вартасцей запобегае неспадзяваным рахункам, калі пацек пераходзіць з дэмавайнага режыма ў спяльныя среды.

Тры прымітывы

Калі працуеце над The Three Primitives, спачатку запісайце умовы викорыстоўвання: неабходныя даны, сігнал успеху і тое, што выходзіць па частым неудачам. Такі список дапамагае залічваць змяны ў кодзе чыста і прозрачна. Храніце настройкі паза кодам прыемліка. Файлы сераўнавання, сховішчы секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяжнага чытання всіх элементаў системы. Стварайце контрольныя пункты пасля дорогіх крокаў. Програма не должна занова ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе виконанне на пазнейшы елемент.

Упадак у перакананнях 2025 года

Калі працюеце над проектам «A 2025 Belief to Drop», спачатку запісайце умовы працы: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список контроля дапамагае заліцвачыць змяны ў кодзе.

# 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."

Представляем Meridian

Калі працуеце над Introducing Meridian, спачатку запісайте умовы викорыстоўвання: неабходныя даны, сігнал успеху і тое, што выходзіць па частковай нявыполненасці. Такі список дапамагае залічваць пазнейшыя змены ў кодзе чыста і прозрачна. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшоў, прычына нявыполненасці павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Робіце перапактовку пасля дорогіх крокаў. Система не павинна зноў стягваць плата за той самы вызов LLM, калі аператар праканае выконанне наступнага элемента. Калі працуеце над Introducing Meridian, спачатку запісайте умовы викорыстоўвання: неабходныя даны, сігнал успеху і тое, што выходзіць па частковай нявыполненасці. Такі список дапамагае залічваць пазнейшыя змены ў кодзе чыста і прозрачна. Запісвайце час выконання і вартасць токенав або запыткаў разам з функцыйнальнымі рэзультатамі. Відразлівасць вартасці з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмавайнага режыма ў спакульнае сераўерное сэрאвара.

Робочая навантажэння 1: Голас і стрімінг у рэальны час

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

# 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())

Рабочая навантажэння 2: Стойкая оркестрацыя калькольніка агентаў з HITL

Рабочая навантажэння 2: Надзвычайна стойкая оркестрацыя калькуляў з HITL работае наякша, калі яе спрыяваць як вимерную паверхню. Зафіксавайце адна ідеальная транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнэння. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў є частью продукту, а не наступным этапам дорабкі. Храніце стан графа ў простам і типаваным формате. Вкладзеныя блокі маскуюць інфармацыю пра тое, який вузел запісаў якое поле, і спакоююць працу пасля перарываў.

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)

Рабочая навантажэння 3: Связана з кодаваннем і адзірваная на файлы і шэл

Рабочая навантажэння 3: Роботы, якія стосуюцца кодавання і работаюць з файламі та шэламі, найкраща працуюць, калі іх расследжваюць як меркаваныя аспекты. Перш чым расширваць масштаб, зафіксавайце адны ідеальны прыклад роботы, адзін прыклад неудачы і прыметку па адвярненню змян. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адную адповядальнасць, а не на заплутаны ланцюг дзеянняў. Рэжым графа павінен застацца простым і з адначыным типам дадзеных. Вкладаныя структуры дадзеных маскуюць інфармацыю пра тое, який вузел запісаў канкрэтны поле, і спакоююць працу пасля перерываў. Рабочая навантажэння 3: Роботы, якія стосуюцца кодавання і работаюць з файламі та шэламі, найкраща працуюць, калі іх расследжваюць як меркаваныя аспекты. Перш чым расширваць масштаб, зафіксавайце адны ідеальны прыклад роботы, адзін прыклад неудачы і прыметку па адвярненню змян. Запісвайце часы выканання і косты токенавання або запытак праза функцыйнальныя рэзултаты. Відразувая візуабельнасць костаў запобегае неспакойным рашчыткам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.

# 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)

Рабочая навантажэння 4: Коардынацыя інструментаў з высокай нагрузкай MCP

Для рабочай навантажэння 4: Коардынацыя інструментаў з высокай нагрузкай MCP неабходна прадзефінаваць вхідныя даны, адпаведальную особу за кожны крок і критэрыя завершэння працы перад змінайом коду. Аператары должны магчымае перзапускати крокі з вядомай точкі контролю, не падозрываючы прыхованы стан системы. Конфігурацыю трэба залічыць паза кодам прыемніка. Файлы сераўнавання, хранільнікі секрэтных данных і флагі функцыяй должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь граф супрацоўкі. Аутентыфікацыя павінна выконвацца на воратах системы, а прабачэнне прав на доступ — на роўні дадзеных. Толькі токэн-носільцы не є межай адпаведнае часткі системы.

Матрыца рашэнняў

Для матрыцы адзінакоў неабходна прадзефінаваць вхідныя даны, адпаведальную особу за кожны крок і критэрыя завершэння працы перад зменым коду. Аператары должны магчымае запускаваць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабходна аддзефінаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія перакрыцця і обработка некоректных паведамленняў є частью продукту, а не елементамі пазнейшай дапрацоўкі. Неабходна людзкая аправарэнне для тых крокаў, якіе выкарыстоўваюць грошы або зміняюць даны прадукцыі. Працэс кампайлявання не є адпаведніком пачатковай готовасці продукту для выверты.

Пра CrewAI

Для On CrewAI неабяжна прадзефінавацыя вхідных дадзеных, адпраўніка крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае перапрацаваць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына неудачы должна вказываць на адну конкрэтную адпраўніцу, а не на заплутаны ланцоўкі задач. Неабяжна людская апрацоўка тых крокаў, якія выкорыстоўваюць грошы або зміняюць даны для працы. Компіляцыйныя налашчэння не ўзначаюць павнае адпраўнення системы. Для On CrewAI неабяжна прадзефінавацыя вхідных дадзеных, адпраўніка крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае перапрацаваць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабяжна фіксавацыя часу выконання, а таксама косту токеноў чы запытаў разам з функцыйнальнымі рэзултатамі. Відразувая візуабільнасць костоў запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спаканую.

Праўільны выбор

Калі працуеце над проектам «The Real Choice», спачатку запісайте угоду: неабяцковыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список пераконтролюе чыстасць пазнейшых змян у кодзе. Зберагаюце настройкі пазначыней ад коду прыемліка. Файлы сераўнавання, хранілішчы секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяцковага чытання всіх элементаў системы. Стварайце контрольныя пункты пасля дорогіх крокаў. Система вярнення працы не должна занова ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе роботу да наступнага элемента.

Чыстак для эксплуатацыі

Чыстак для эксплуатацыі працюе наякша, калі яго спрыймаюць як мерыемую структуру. Запісайце адну ідеальную версію роботы, адзін прыклад невыпання і прыметкі па адвярненню змян, перш чым расширваць сферу працы.

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

Зберагаюце стан графа ў простам і типаваным формате. Вкладаныя блобы маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спакоююць працэз виконання пасля перерываў.

Калі дозволяе бюджет, дадзіце тэст на перакананне, які працюе над критычным шляхам у системе CI з викорыстаннем фіксатываў, а не рэальных платных API.

Запісвайце час виконання адпаведна да вартасці токена чытае запита разам з функцыйнальнымі рэзултатамі. Відразы вартасці з самага пачатку запобегае неспакою, калі шлях пераходзіць з дэмаверсіі ў спакульнаныя сераўсы.

Зберагаюце стан графа ў простам і типаваным формате. Вкладаныя блобы маскуюць інфармацію пра тое, який вузел запісаў якое поле, і спакоююць працэз виконання пасля перерываў.

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

Запіска параграфу 2c64e0b378d9: не трэба кантрацеўваць ключы прадаўцаў у репазітарыі, задаць максымальную кантроль на токены за сесію, а таксама зберагчы транскрыпціі праза фіксатуры адлічэння, каб пазнейшыя замены моделей заставалі пораўнанневымі.

Запіска па прыняццю заходаў абароны 0 будзе эфектывней, якшо яе спрыяваць як мерыемую плошчу. Зберагчы адну ідеальную транскрыпцію, адзін прыклад неудачы і запіску пра вярнэнне да пачатковага стану перш чым расширваць масштаб. Валіць лепш маленькія, тэставаныя елементы чым вялікія скрыпты. Калі якісь крок не выйшае, прычына неудачы павінна вказваць на адну конкрэтную адпаведальнасць, а не на заплутаны процес.

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

Для пункта 1 адаптавання захоўнай спроможнасці неабходна пазначыць вхідныя даны, адпаведальнага за выкананне кроку і критэрыя завершэння пры перамены коду. Аператары должны магчымае запускаваць крок з вядомай точкі контролю, не прабуючы здогадвацца пра схованы стан. Запісвайце час выканання і вартасьць токеноў або запытак па боку функцыйнальных рэзультаатаў. Візуабельнасьць вартасей з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спакульную.

Дзялей 1/821 адаптавання захоўнай спроможнасці: звярзывайце час выканання, класы каштоўкаў і вартасьць токеноў для гэтага пункта, а потым вырашайце, чы робіць змяну на адной падставе фіксаванага набора пытанняў, а не на адной лячбе.