Фрэймворкі агентаў разважаюць, Temporal выжывае: надзейнае выкананне для агентаў
LangGraph, CrewAI і AutoGen аркеструюць выклікі LLM, але не падзенні і тыднёвыя чаканні. Як надзейнае выкананне Temporal закрывае гэты прабел і калі яно залішняе.
Крыніцы: Agentic AI Frameworks in 2026: The 3 Everyone’s Using and the 1 Nobody Talks About
Інжынеры, які ствараюць агентныя сістэмы ў 2026 годзе, розмовляюць пра своія фрэймворкі, і практычна всі з іх называюць LangGraph, CrewAI, AutoGen або якуюсь іх сумешана версію. Жадны з эых інструментоў не ёсць паслабым. Проблема заключаецца у тым, што весь разговор ведэцца на неправільным роўні стака.
Сістэмы агентоў у працэсе вырабаткі паставляюць павтараючыся шаблон. Тое, што прыводзіць інжынера на змяну о 3 гадзіны ночы, рэдка калі ёсць фрэймворк, які вялікія рашэння пра тое, што будзе думаць агент. Як правіло, цэлая група проблем: працэс зупініваецца на паўпараграфе рабочага працэсу, крок выкананы два разы, таму што яго праказа не была ідэмпатным, выгнанне пада убівае дзейнаўчы задачу агента на 40-й хвіліне, і няма можнацьці ўзяць яе знову, альбо стан рабочага працэсу зберагаецца ў мэнтыяры Python, якая знікае, калі кантэйнер перэрабляецца.
Ні LangGraph, ні CrewAI, ні AutoGen не адмініструюць цыя сем’я на всіх етапах, і гэта ўзначальна, адколі яны створаны для коордынацыі вызоваў LLM і вікорыстоўвання інструментаў. Сістэмы працоўных агентаў насправдзе занепадаюць чыраз нехватку стойкай екзекуцыі — гэта значна старэйшая і менш прываблівая галузь, якая існавала прыбліжна на дзесяць гадоў раней за сам тэрмін «агент». Temporal, сістэма, якая яе стварыла, практычна не фігуруе ў дыскусіях пра канструкцыі агентаў, пры тым яна тыха стала канструкцыйным адлогам для все большай колькіства серйозных рэалізацый агентаў. У наступным чытаем, што добра робяць тры популярныя канструкцыі, дзе заканчваецца кожная абстракцыя, і чаму некантрэнтны чатверты варыянт заслуговае на бізнесавы рызык.
LangGraph
Участак LangGraph заключаецца у тым, што прыводзіць агента да формы явнага графа, створанага на адной тыпаванай становішчы, а не да формы няўыразнай ланцуга запітоў. Гэта мае рэальную ценнасць, адтолькі што трыбуты керавання стаюць можлівымі да аналізу і тэставання. Напрыклад, працэс сортавання можа выглядаць так:
from typing import TypedDict, Literal
from langgraph.graph import StateGraph, END
class TriageState(TypedDict):
ticket_id: str
category: Literal["billing", "technical", "abuse", "unknown"]
priority: int
assigned_queue: str | None
def classify_node(state: TriageState) -> TriageState:
category = llm_classify(state["ticket_id"]) # the only probabilistic step
return {**state, "category": category}
def route_node(state: TriageState) -> str:
# deterministic, testable, no LLM involved
return {
"billing": "billing_queue",
"technical": "tech_queue",
"abuse": "trust_and_safety_queue",
"unknown": "human_review",
}[state["category"]]
graph = StateGraph(TriageState)
graph.add_node("classify", classify_node)
graph.set_entry_point("classify")
graph.add_conditional_edges("classify", route_node)
app = graph.compile()
Гэта хорашая ідэя, напісана чыста. Проблемы пачынаюцца тады, калі ўсё трэба, каб працавала дыяўольш час ад однаго вызову invoke() і яго пункта перапакірання. Падумайце пра скоўанасць між разнымі сервісамі, рабочыяя працэсы, якія трываюць калькі дзён, або крокі, якія выконваюцца без удзеле LangGraph: задача ў Spark, чэрга на затверджэння, якая праходзіць праз Slack і вяртаеся за калькі дзён, або сервіс, які іншая каманда розгортае за сваім графіком. Механізм пунктавага перапакірання дэйсна працуе, але ён паводзіцца толькі з власным модэлем выканання LangGraph. Пасля перадачы на інфраструктуру, якая не мае звязку з LLM-амі, стойкасць становіцца чымось, што трэба стварыць вручную.
CrewAI
Мнагаагентную команду можна заявіць за калькі рэчэй:
from crewai import Agent, Task, Crew
researcher = Agent(role="Research Analyst", goal="Find relevant market data", tools=[search_tool])
writer = Agent(role="Report Writer", goal="Turn research into a client-ready summary")
crew = Crew(agents=[researcher, writer], tasks=[
Task(description="Research {company}'s Q2 earnings", agent=researcher),
Task(description="Write a 3-paragraph summary for the client", agent=writer),
])
crew.kickoff(inputs={"company": "Acme Corp"})
Няма жаднага інструмента, які бы за дваццаць хвілін ператворыў слабую ідэю пра рабочы працэс з калькольнікаў у работаючую дэманстрацыю быстрэй, чым CrewAI. Косты праказваюцца пазней. Функцыя kickoff() блакуе, няма можлівасці на паўзу на гады чы дні, няма можлівасці перапрыбутку па заданню, аднальнаму да адзіных інструментаў, і няма стойкага стану, аднальнага таму, што зберагае распрацоўшчык. Ён коордынуе працю LLM, але не ўтварае двіжка рабочых процэсаў, і яго ніколі не адавалі як такога, хоць багатыя команды часамі вынужданыя ставляцца да яго так.
AutoGen
Мінімальная наладка AutoGen супакоюе асістэнта з проксі-корыстнікам:
import autogen
assistant = autogen.AssistantAgent(name="assistant", llm_config={"config_list": config_list})
user_proxy = autogen.UserProxyAgent(name="user_proxy", human_input_mode="NEVER")
user_proxy.initiate_chat(assistant, message="Summarize this quarter's incident reports.")
Стыл AutoGen, які ўключае дыялогаванне і емергентныя элементы, падходзіць для даклуджання. Яго версія 2026 года, з болей структураваным інструментам і патэрамі, кераваныя запускамі задач, нават спрамована на адзельнэ кераванне працэсамі ад самага дыялогу. Пад этым фундаментам застаецца толькі транскрыпцыя паведамленняў, а не стойкі, упорадкованы журнал выканання. Калі працэс, які падтрымвае дыялог, зупініцца, застаецца толькі частковы журнал чату, а не вычысленне, якое можа будзе продаважанаць.
Спакульная прасоўка
Усе тры рашэння добра справляюцца з тым, што ў працоўнай практыцы ёсць новым: прыведзеннем LLM да розумовых выконанняў, выкарыстоўваннем інструментаў і сааврацтва з іншымі агентамі, кераванымі LLM. Але старэйшая, простэйшая проблема — абавесці, што багатоэтапны працэс будзе праверна завершаны незалежна ад таго, чы гэта будзе збой, перазапуск, тайма-аут чы іншы фактор — не ўскладненне, якое яны намагаюцца рашыць. Гэта не ў іх вінаватасці. Адчак ажыцоўленне такой апэкты ўсупраць ім — глыбока памылка.
Падумайце пра рэальны працэс выканання задач, а не пра дамавую версію: агент, які вырашае пытанні з рахункамі-фактурамі поставшчыкаў. Ён выявляе элементы рахунков-фактураў з PDF, прайшоўшы іх паравання з замовленням на закупку ў сістэме ERP, пазначае расходы, якія перасягаюць заданы ліміт, каб іх могла пераглянуць людзь, а пасля можа чакаць кілька дней на адпаведзенне, прычаму перш чым заносіць апраўданы даныя ў бухгалтэрыю. У разе невялікага кроку неабходна зробіць пракату без подвойнага занесення. Перыядкаванне працы ў серэдзіне працэсу не павінна спрычыняць перачынку з нуля чы ўсунення даных без следа.
┌────────────┐ ┌───────────────┐ ┌─────────────────┐ ┌───────────────┐
│ Extract │ --> │ Match against │ --> │ Human approval │ --> │ Post to ERP │
│ line items│ │ purchase order│ │ (can take days)│ │ (idempotent) │
└────────────┘ └───────────────┘ └─────────────────┘ └───────────────┘
▲ │
└───────────── retry on failure ───────────┘
Ніхто не стварыў LangGraph, CrewAI чы AutoGen з метай гарантаваць, што такія дыяграмы застануцца цілымі пасля перзапуску пада ў трэці дзень, калі хтось яшчэ аналізуе пункт 14. Гэта не стосуецца оркестрацыі LLM. Оажадана стойкая екзекуцыя, і сістэмы, якія гэта добра робяць, з Temporal у прымарный ролі, гадзінамі выкананяюць непрываблівую працу на бэкендзе: обработку платэжаў, выполненне замовленняў і мікросервісы на аснове патэрана saga, задоўга перш чым тэрмін «агент» стаў вжываным для пазначэння такіх програм.
Як працюе Temporal
Модэль Temporal выглядае прыгожа простаю. Працэйны лянцужок запісваецца як функцыя ў звычным кодзе, з цікламі, умовнымі вырачэннямі і вызовамі функцый, а Temporal забезпечвае, каб історыя выканання гэтай функцыі застаўалася стойкай. Калі працэс зупініцца ў будзь-які момент, Temporal перзапускае функцыю на адной з яе зберажаных історый змян да момента зупінкі і продовжвае працу дэтэрміністычна, без павторнага выканання парагонных эфектаў. Таінствам якраз і ў тым, што парагонныя эфекты, такія як вызов LLM, запыт да API чыў напіс у базе дадзенаў, знаходзяцца ў окрэмых функцыйх, якія называюцца актывнасцямі. Temporal павторна выкананыя гэтыя функцыйкі незалежна, з можлівасцю налаштавання інтэрвалу павторных спроб, тады калі функцыя працэйнага лянцужка толькі коордынуе іх.
Агент для супрацоўкі счытакоў выкладзены ў ніжыні спрыяе вызову LLM як аднай з актывнасцяў сярод іншых. Перш за ўсё, актывнасці — гэта тые часткі, якія вяршаюць вяроўныя звязкі з зовнішнім светам:
# activities.py — the parts that touch the outside world (LLMs, APIs, DBs)
from temporalio import activity
from dataclasses import dataclass
@dataclass
class Invoice:
invoice_id: str
vendor: str
line_items: list[dict]
@activity.defn
async def extract_line_items(pdf_url: str) -> list[dict]:
# calls a vision-capable LLM, or a dedicated OCR model — doesn't matter to the workflow
text = await download_and_ocr(pdf_url)
return await llm_extract_structured(text, schema=LINE_ITEM_SCHEMA)
@activity.defn
async def match_purchase_order(invoice: Invoice) -> dict:
po = await erp_client.get_purchase_order(invoice.vendor)
discrepancies = diff_line_items(invoice.line_items, po["line_items"])
return {"po_id": po["id"], "discrepancies": discrepancies}
@activity.defn
async def post_to_erp(invoice_id: str, po_id: str) -> dict:
# idempotency is enforced with a deterministic key derived from workflow inputs,
# not a random UUID generated per attempt — this is the same lesson as always
return await erp_client.post_journal_entry(
idempotency_key=f"invoice-post-{invoice_id}",
invoice_id=invoice_id,
po_id=po_id,
)
@activity.defn
async def notify_human_reviewer(invoice_id: str, discrepancies: list[dict]) -> None:
await slack_client.post_message(
channel="#ap-review",
text=f"Invoice {invoice_id} has {len(discrepancies)} discrepancies needing review.",
)
Далей йдзе працэс выканання задач, які берае на сябе ролю коардынаціі, яку зазвычай выпало бы віконваць LangGraph або CrewAI, пры чым стойкасць гэтага працэсу ўжо ёсць вбудованай і не залежыць ад наявнасці пункта перапаравання:
# workflows.py
from temporalio import workflow
from datetime import timedelta
@workflow.defn
class InvoiceReconciliationWorkflow:
def __init__(self) -> None:
self._approval_received = False
self._approved = False
@workflow.signal
async def submit_human_decision(self, approved: bool) -> None:
# A signal is how the outside world talks to a running, possibly-days-old workflow
self._approval_received = True
self._approved = approved
@workflow.run
async def run(self, pdf_url: str, invoice_id: str, vendor: str) -> dict:
line_items = await workflow.execute_activity(
extract_line_items, pdf_url,
start_to_close_timeout=timedelta(minutes=2),
retry_policy=workflow.RetryPolicy(maximum_attempts=3),
)
invoice = Invoice(invoice_id=invoice_id, vendor=vendor, line_items=line_items)
match_result = await workflow.execute_activity(
match_purchase_order, invoice,
start_to_close_timeout=timedelta(seconds=30),
retry_policy=workflow.RetryPolicy(maximum_attempts=5),
)
if match_result["discrepancies"]:
await workflow.execute_activity(
notify_human_reviewer, invoice_id, match_result["discrepancies"],
start_to_close_timeout=timedelta(seconds=10),
)
# This is the line that would be genuinely hard to write safely in the
# other three frameworks: wait, durably, for up to 7 days, for a signal
# that might arrive from a Slack button, a web form, anything —
# while the workflow's entire state sits safely in Temporal's history,
# costing zero compute while it waits.
await workflow.wait_condition(
lambda: self._approval_received,
timeout=timedelta(days=7),
)
if not self._approved:
return {"status": "rejected", "invoice_id": invoice_id}
result = await workflow.execute_activity(
post_to_erp, invoice_id, match_result["po_id"],
start_to_close_timeout=timedelta(seconds=30),
retry_policy=workflow.RetryPolicy(maximum_attempts=5),
)
return {"status": "posted", "invoice_id": invoice_id, "erp_result": result}
Некалькі дэталей заслуговаюць на увагу, адзёўна яны ёсць тыя самыя спосабы абвалення, якія робяць сістэмы з агентамі ненадзеянымі, і тут яны ўжо ёсць атрыбутамі часу выканання, а не функцыямі, якія трэба памятаць дадаць.
Семдзённы чаканне ўжо ўключана і вытрымае все. workflow.wait_condition не заставляе ніякога потока, процэсу чы рэзервуару працаваць цалую недзелю. Temporal зберагае стан рабочага процэсу у своем выtrzymлівым сховішчы, таму працоўнік можа быць перапрацаваны, скаляруваны да нуля чы абваліцца цэлкам у тым часе. Калі сігнал нарэшце прыйдзе, Temporal пераглядае історыю і продовжае працу самэлькі ў той момент await. Выпанаванне таго ж на checkpointer-е LangGraph чы на CrewAI crew па сутнасці значыла б перабудову модэлю абходжання падзей Temporal.
Практыкі падзею аўтаматычна, маюць вузкі дыяпазон і ніколі не павтараюць вядомую працу. Падазроўваючы, што post_to_erp не выйдзе, калі match_purchase_order успяшна выконаецца. Temporal не будзе паўтараць match_purchase_order, адколі яго рэзультат вялікі час ужэ знаходзіцца ў стойкай історыі. Упорачыце гэта з простаю версіяй той жа ідэі:
# BEFORE — naive retry loop, the kind you write at 11pm under deadline pressure
async def reconcile_invoice_naive(pdf_url, invoice_id, vendor):
for attempt in range(3):
try:
line_items = await extract_line_items(pdf_url)
match_result = await match_purchase_order(Invoice(invoice_id, vendor, line_items))
if match_result["discrepancies"]:
await notify_human_reviewer(invoice_id, match_result["discrepancies"])
approved = await wait_for_approval_somehow(invoice_id) # good luck
if not approved:
return {"status": "rejected"}
return await post_to_erp(invoice_id, match_result["po_id"])
except Exception:
continue # retries EVERYTHING from the top, including re-extracting the PDF
Эта наўінаўская версія па кожнай спробе зноў выконвае працэс адбору даных за дапамогай LLM, выкорыстоўваючы токены і грошы на крок, які вялікай часткай ужо працаваў, а wait_for_approval_somehow не мае адпаведнай рашыткі, калі ёму трэба прыжыць пасля перапрацоўкі. Версія Temporal не рашае гэтыя проблемы за дапамогай дадатковага коду; завдзяк спецыяльнай структурэ выканання гэтыя проблемы ніколі не выступаюць.
Простая Python значыць можлівасць тэставання. Temporal уключае фрэймворк для тэставання, які можа прыбліжна перакрыць час чакання timedelta(days=7) за мілісекунды ў рамках тэста, а таксама дазволяе імітаваць актывнасці без адносу да сеткі:
import pytest
from temporalio.testing import WorkflowEnvironment
from temporalio.worker import Worker
@pytest.mark.asyncio
async def test_rejected_invoice_does_not_post_to_erp():
async with await WorkflowEnvironment.start_time_skipping() as env:
async with Worker(
env.client, task_queue="test-queue",
workflows=[InvoiceReconciliationWorkflow],
activities=[extract_line_items, match_purchase_order, notify_human_reviewer, post_to_erp],
):
handle = await env.client.start_workflow(
InvoiceReconciliationWorkflow.run,
args=["fake.pdf", "INV-001", "Acme"],
id="test-invoice-001",
task_queue="test-queue",
)
await handle.signal(InvoiceReconciliationWorkflow.submit_human_decision, False)
result = await handle.result()
assert result["status"] == "rejected"
Зверніце увагу на відсутнасць: няма сапраўднага сну працаваючы семь дзён, няма втручання ў внутршнія механізмы пункта перагляду, няма ручнага аналізу ў зв’язку з перэзапускамі. Надзеяйнасць — цэла інфраструктура, якая вытрымлівае навантажэння, і гэта не тое, што кожны тэст павінен зноў падтверджваць.
Іспытанне обох слоёў
Равнамерны адказ — гэта не відмова ад LangGraph на корыстцю Temporal. Адны працуюць у разных слоях, і найлепшыя рэшыткі для практычнага выкарыстоўвання ў 2026 годзе ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ў
@activity.defn
async def run_agent_reasoning_step(ticket_text: str) -> dict:
# LangGraph handles the bounded, single-turn reasoning —
# classify, decide, draft — inside an activity that Temporal
# retries and times out like any other side effect.
result = triage_graph.invoke({"ticket_id": ticket_text, "audit_log": []})
return {"category": result["category"], "priority": result["priority"]}
@workflow.defn
class SupportTicketWorkflow:
@workflow.run
async def run(self, ticket_id: str, ticket_text: str) -> dict:
triage = await workflow.execute_activity(
run_agent_reasoning_step, ticket_text,
start_to_close_timeout=timedelta(seconds=30),
retry_policy=workflow.RetryPolicy(maximum_attempts=3),
)
if triage["priority"] >= 8:
await workflow.execute_activity(page_oncall_engineer, ticket_id, ...)
await workflow.wait_condition(lambda: self._acknowledged, timeout=timedelta(minutes=15))
# ... routing, SLA timers, escalation chains — all durable, all testable
Эта архітэктура рэкамендуецца для команды, чыя сістэма агентаў должна працаваць у рэальных умовах. Фрэймворк, створаны спецыяльна для LLM, адпрацоўвае тое, у чым ён супэрна — логічныя выводы за межамі певных крокаў. Адпаведны двыгун выканання адпрацоўвае тое, для чаго ён быў створаны, пераканаючыся, што весь працэс, незалежна ад таго, чы рэшае ён за хвіліны чы тыяжкія тыдні, і чы включае ён вызывы LLM чы затверджэння людзей, завершыцца правільна або ж ясна парадуць пра бяду. Ніхто з іх не павінен выпляваць ролю другога.
Калі часовыя затраты занадта велікі
Temporal мае своія недаклады, які робяць яго паслаблым стандартам для багаторох задач, якія выкалічваюць агенты. Гэта ўсё і ж распраўленая сістэма, якую трэба запускаць — будзь то самастаяны сервер чыя-то плата за Temporal Cloud, плюс працоўнікі і чэргі задач, тое ўсё значна большая інфраструктура, чым працэс на Python, які запускае LangGraph. Код рабочага прайсепту таксама павінен адпавядаць строгім правілам дэтэрмінізма. Блакітнае вызванне datetime.now(), выкарыстоўванне неконтрольванай адзінакавасці чы выконанне працоў з інпут/аўтаматом у самай функцыі рабочага прайсепту ўсе заборанены. Командам трэба час, каб прыміць гэта, а нарушэнне правіл вызывае заплутаныя паказнікі недэтэрмінізма пад пераглядам. Для короткай, адно-працэсовай задачы, напрыклад, для адпаведзення на запыт чы стварэння падсумку дакумента за адны вызов LLM, стойкае выкананне ёсць проста зайвым навантажэнням, адколі не існуе багатоэтапнага працэсу, які мог бы быць параджаны збоем.
Правіло прыняцтва рашэння
Выберыце надзейны спосаб выканання як основу тады, калі рабочы працэс можа трываць дольш часу, патрабуе коордынаціі межа службамі або чакання ад чалавека, або калі трэба перадважыць тое, што не павінна быць обрабатана два разы – напрыклад, грошы, запасы чы лістаўку, якая не павінна выйсць два разы. Дазвольце выбранайя рамцы LLM працаваць як компанент унутрь адна з ейных стэпаў. Калі все пачынаецца і заканчваецца ўнутрь адного цыклу запіт-адказ, праігноравайце яе, адтак як ўключэнне яе рашыла б проблэму, якой яшчо ня існуе.
Багато дыскусій на тэму „які фрэймворк агента вікорыстаты“ ігноруюць важлівішэ пітання: які саме рывень сістэмі насамрэч потрэбуе посілення безпекі? LangGraph, CrewAI і AutoGen ведуць корысні дэбаты шчодо того, як структуруваты міркування ШЫ і коордынацію кількох агентаў. Проце пітання про тыя, чы зможэ агентська сістэма вітрыматы невдалій запуск, розрыв мерэжы чы сітуацію, колі людыні потрыбно тры дні, шчоб натыснуты „погодыты“, залішаецца окрэмім, і механізмі робочых працэсів перэважно тыхо вірышуюць яго шчэ до появі концепціі агентського ШЫ. Популярні фрэймворкі налаштовуюць тыя, што відно у дэмонстраціях. Але саме той фактор, які ігноруюць, візначае, чы шчось все шчэ будзе функціонуваты праз місяць.