Eszközök/MI-ágensek
Temporal teszt: ügynökök, amelyek túlélik az összeomlást és emberekre várnak
A Temporal tartós workflow-kként futtat ügynökfutásokat: az újrapróbálások, jóváhagyások és időzítők túlélik az összeomlást. Költség, adatvédelem, mikor ne használd.
- Típus
- Durable execution platform
- Ár
- MIT · self-hosting free · Cloud pay-as-you-go from $0
Balázs Csorba··8 perc olvasás
- Durable execution
- Workflow orchestration
- Human in the loop
- AI agents
- Self-hosting

A lényeg röviden
- A Temporal olyan ügynökfutásokhoz illik, amelyek percektől napokig tartanak, több rendszert érintenek és emberekre várnak. Egy néhány másodperc alatt kész chat-válaszhoz túlzás.
- A szerver MIT-licencű. A Temporal Cloud fizetés szerint működik, havi $0-tól, az Actions pedig milliónként $50, az első 5 millióig. A Business csomag havi $500-tól indul.
- A workflow-kódnak determinisztikusnak kell lennie. A modellhívások és az eszközök activity-be tartoznak, a futó workflow-k kódjának módosításához pedig verziókezelés kell.
- Az activity-k alapértelmezés szerint korlátlanul próbálkoznak újra, ezért minden modell-activity-hez kell retry policy és azoknak a hibatípusoknak a listája, amelyeket soha nem szabad újrapróbálni.
- A Cloud namespace-ek futhatnak olyan EU-s régiókban, mint Frankfurt és Írország, adatfeldolgozási szerződés és szabványos szerződési záradékok mellett. Önhosztolásnál ez a kérdés a saját tárhelyszolgáltatódhoz kerül.
A Temporal nyílt forráskódú, tartós végrehajtási platform. Az ügynököt hagyományos kódként írod meg, a platform pedig minden lépést rögzít, így egy futás túléli az összeomlásokat, a deployokat és a napokig tartó várakozást. Az ítéletem előre: olyan ügynökfutásokhoz való, amelyek percektől napokig tartanak, több rendszert érintenek, és egy lépést ember hagy jóvá. Egy néhány másodperc alatt kész chat-válaszhoz túlzás.
Két egyszerűbb dologgal versenyez, amelyeket a legtöbb csapat már üzemeltet: a LangGraph-hoz hasonló gráf-checkpointerrel és egy állapottáblás job queue-val. Ezek a helyes választ jelentik addig, amíg egy folyamat egy tizenkét lépéses futás közepén el nem hal, és a futásnak onnan kell folytatódnia, ahol abbahagyta. Ha senki nem vállalja a workflow-kódot, önhosztolásnál pedig a klasztert, hagyd ki a Temporalt.
Mi ez
- Egy parancs a kipróbáláshoz.
temporal server start-devlaptopon futtatja a szolgáltatást és a webes felületet, külső függőség nélkül. - Kétféleképpen futtatható. Saját szerveren önhosztolhatod, vagy használhatod a Temporal Cloudot, amelynek régiói között van AWS Frankfurt és Írország. A szerver MIT-licencű.
- Hagyományos kód. A workflow-k és az activity-k egyszerű függvények Go, Java, Python, TypeScript, .NET, Ruby vagy PHP nyelven, az SDK-tól függően.
Hogyan működik
A workflow dönti el, mi történik ezután. Egy activity végzi a munkát: meghív egy modellt, API-t hív, vagy fájlt ír. A Temporal minden döntést és minden activity-eredményt a workflow eseménytörténetében tárol. Összeomlás után egy worker ehhez a történethez játssza vissza a workflow-kódot, kihagyja a befejezett activity-ket, és az első befejezetlen lépésnél folytatja. Az ügynök szépen illeszkedik ehhez a szétválasztáshoz: a ciklus, az eszközválasztás és az átadások a workflow-ban élnek, és minden modell- vagy eszközhívás egy activity.
A visszajátszás a korlát. A workflow-kódnak minden visszajátszáskor ugyanazokat a hívásokat kell ugyanabban a sorrendben megtennie. Ezért ha benne API-t hívsz, órát olvasol vagy véletlen számot húzol, a visszajátszás megtörik. Ezt a munkát activity-kbe tedd, vagy Pythonban használd a workflow.now() és a workflow.random() függvényeket. A futó végrehajtásokkal rendelkező workflow módosításához verziókezelés kell. Egy activity típusának vagy azonosítójának megváltoztatása nem biztonságos, a bemenetei és időkorlátai viszont módosulhatnak.
Első lépések
A legegyszerűbb kezdés az OpenAI Agents SDK integráció, amely a temporalio-openai-agents csomagként érhető el. Az ügynököt a szokásos SDK-val írod meg egy workflow-n belül, majd az OpenAIAgentsPlugin-t a klienshez és a workerhez csatolod. Minden modellhívás activity lesz, így tartósan újrapróbálkozik, és visszajátszáskor nem ismétlődik meg.
from datetime import timedelta
from agents import Agent, Runner
from temporalio import workflow
from temporalio.client import Client
from temporalio.openai_agents import ModelActivityParameters, OpenAIAgentsPlugin
@workflow.defn
class HelloWorldAgent:
@workflow.run
async def run(self, prompt: str) -> str:
agent = Agent(name='Assistant', instructions='You only respond in haikus.')
result = await Runner.run(agent, input=prompt)
return result.final_output
# worker.py: the plugin sets the timeout for each model activity
client = await Client.connect(
'localhost:7233',
plugins=[
OpenAIAgentsPlugin(
model_params=ModelActivityParameters(
start_to_close_timeout=timedelta(seconds=30)
)
),
],
)
# starter.py: the same plugin, so payloads are converted the same way
client = await Client.connect('localhost:7233', plugins=[OpenAIAgentsPlugin()])
result = await client.execute_workflow(
HelloWorldAgent.run,
'Tell me about recursion in programming.',
id='my-workflow-id',
task_queue='openai-agents-basic-task-queue',
)ModelActivityParameters határozza meg, hogyan ütemeződnek a modell-activity-k. A start_to_close_timeout paraméter alapértelmezett értéke 60 másodperc. Eszközöknél a activity_as_tool() az I/O-t activity-ként futtatja, a sima @function_tool viszont a workflow-n belül fut, és determinisztikusnak kell lennie. Integráció van Google ADK-hoz, Pydantic AI-hoz, Mastra-hoz és a Vercel AI SDK-hoz is. A LangGraph-integráció public preview állapotban van.
Újrapróbálkozások és időkorlátok
Az újrapróbálás az a pont, ahol a tartós végrehajtás megtérül, és ahol az alapértelmezések fájnak. Egy sikertelen activity exponenciális visszatartással próbálkozik újra, az első másodperctől indulva, a próbálkozások között legfeljebb 100 másodpercet várva, a próbálkozások számának korlátja nélkül. Egy fizetés rögzítése pontosan ezt kívánja. Az a kérés, amely soha nem sikerülhet, például egy nem létező megrendelés lekérdezése, ezért egyáltalán nem szabad újrapróbálni. Három beállítás határozza meg a viselkedést:
- Start-to-close korlátozza egy próbálkozást. Nincs alapértelmezett értéke, a Temporal pedig erősen javasolja a beállítását.
- Schedule-to-close az egész activity-t korlátozza az újrapróbálásokkal együtt, így azt szabja meg, mennyi ideig futhat összesen egy modell-lépés.
- Retry policy a próbálkozások számának korlátját és azokat a hibatípusokat adja meg, amelyeket soha nem szabad újrapróbálni.
import httpx
from datetime import timedelta
from temporalio import activity
from temporalio.common import RetryPolicy
from temporalio.exceptions import ApplicationError
from temporalio.openai_agents import ModelActivityParameters
model_params = ModelActivityParameters(
start_to_close_timeout=timedelta(seconds=60),
schedule_to_close_timeout=timedelta(minutes=5),
retry_policy=RetryPolicy(maximum_attempts=5),
)
@activity.defn
async def lookup_order(order_id: str) -> dict:
async with httpx.AsyncClient() as client:
response = await client.get(f'https://shop.example.com/api/orders/{order_id}')
if response.status_code == 404:
# Retrying cannot make a missing order appear.
raise ApplicationError('Order not found', type='OrderNotFound', non_retryable=True)
response.raise_for_status()
return response.json()Az activity-kódnak emellett idempotensnek kell lennie, mert a Temporal azzal számol, hogy az activity-k hiba után újra lefutnak. Egy e-mailt küldő eszköznek olyan idempotency-kulcs kell, amelyet a fogadó rendszer elfogad.
Emberi jóváhagyás signalokkal
Itt a Temporal már nem csupán egy újrapróbálási könyvtár. A signal aszinkron üzenet egy futó workflow-nak. A Temporal human-in-the-loop mintája a döntést egy signal-kezelőben tárolja, és a workflow.wait_condition hívással vár rá. Amíg vár, az állapot az eseménytörténetben van, az időzítők pedig túlélik az újraindulásokat. A minta alapértelmezett időkorlátja öt perc, ami egy teszthez jó. Jóváhagyási sorhoz én napokat használnék.
import asyncio
from datetime import timedelta
from typing import Optional
from temporalio import workflow
@workflow.defn
class ApprovalWorkflow:
def __init__(self) -> None:
self.decision: Optional[str] = None
@workflow.signal
async def approval_decision(self, decision: str) -> None:
self.decision = decision
@workflow.run
async def run(self, request: str) -> str:
# propose_action and execute_action are activities defined elsewhere
proposal = await workflow.execute_activity(
propose_action, request, start_to_close_timeout=timedelta(seconds=60)
)
try:
await workflow.wait_condition(
lambda: self.decision is not None,
timeout=timedelta(days=3),
)
except asyncio.TimeoutError:
return 'no decision within three days'
if self.decision != 'approve':
return 'rejected'
return await workflow.execute_activity(
execute_action, proposal, start_to_close_timeout=timedelta(seconds=60)
)A query állapotot olvas anélkül, hogy megváltoztatná. Az update olyan kérés, amelyre a hívó vár, a validátor pedig még azelőtt elutasíthatja, hogy bekerülne a történetbe. Az elutasított update is egy Actionnek számít. A hosszú munkamenetek kemény korlátokba ütköznek: a végrehajtás 51 200 esemény, 2000 update vagy 10 000 signal felett leáll. Ezért a chat-szerű workflow-knak Continue-As-New kell. A workflow.info().is_continue_as_new_suggested() jelzi, mikor javasolja ezt a szerver. Hogy a jóváhagyási kapuk hová kerüljenek, az tervezési kérdés, amelyet a Human in the loop AI-ügynököknél című cikkemben járok körül.
Költség és üzemeltetés
Önhosztolásnál nincs licencdíj. A Temporal Cloud fizetés szerint működik, minimális költés nélkül, az új fiókok pedig 90 napig $150 kreditet kapnak. A táblázat a listaárakat mutatja, 2026 októberének állapota szerint.
| Opció | Ár | Benne van | Mi változik |
|---|---|---|---|
| Önhosztolt | Ingyenes, MIT | Semmi a Temporaltól | Te üzemelteted a szolgáltatásokat, az adatbázist, a keresőtárat és a frissítéseket |
| Cloud fizetés szerint | $0 alapdíj, plusz 10% support a használatra | Semmi | Actions milliónként $50, az első 5 millióig havonta |
| Cloud Business | A havi $500 vagy a használat 10%-a, amelyik nagyobb | 2,5 M Actions, 2,5 GB active, 100 GB retained | SAML benne van, a SCIM havi $500 extra |
| Cloud Enterprise | Éves, kapcsolatfelvétel az értékesítéssel | 10 M Actions, 10 GB active, 400 GB retained | SCIM benne van, P0 válaszidő 30 percen belül |
| Cloud Mission Critical | Éves, kapcsolatfelvétel az értékesítéssel | 10 M Actions, 10 GB active, 400 GB retained | Dedikált platform architect, P0 válaszidő 15 percen belül |
A használati szabályok többet mozgatnak a számlán, mint a főcím. Az Actions minden activity-indítást és újrapróbálást számolnak, valamint minden signalt, időzítőt, update-et, query-t és workflow-indítást. A példám 18 Actions, így 100 000 ilyen futás körülbelül $90 az Actionsben, a tárhely és a support előtt. Egy GB aktív tárhely egy hónapig tartva körülbelül $31, egy GB retained tárhely körülbelül 78 cent. Ha a Fairness be van kapcsolva, minden óra Actionsei 10 százalékkal nőnek.
A Business inkább a supportért, a SCIM-ért és a kötelezettségvállalási kedvezményekért éri meg, mint az Actionsökért. Az $500-os minimum 2,5 millió Actiont tartalmaz, ami több mint 130 000 ilyen futásra elég, mint a példám.
Hová mennek az adatok. Egy namespace egyetlen régióban jön létre. A régiólistán szerepel az AWS Frankfurt (eu-central-1), Írország (eu-west-1) és London (eu-west-2), valamint a GCP Frankfurt (europe-west3). A payloadokat a workereiden a Data Converterrel titkosíthatod, mielőtt elhagynák a workert. A Codec Server pedig a csapatodnak megengedi a történetek olvasását a webes felületen, kulcsok átadása nélkül. A megőrzött történetek a Cloudban legfeljebb 90 napig maradnak meg, így a hosszabb megőrzés exportot jelent. A tágabb kérdésekhez lásd: GDPR és LLM-adatrezidencia.
Az adatfeldolgozási szerződés. A Temporal szerződése, amely 2024. október 10-től hatályos, tartalmazza az EU szabványos szerződési záradékait és egy UK-addendumot. Az alvállalkozói melléklet az AWS-t nevezi meg az infrastruktúrához, a Google Cloudot a GCP-régiókban lévő namespace-ekhez, a Datastaxot, az Auth0-t, az Elasticet és a WorkOS-t pedig bizonyos szolgáltatásokhoz. Új alvállalkozó ellen a közzétételtől számított 15 napon belül tiltakozhatsz. A biztonsági mentéseket 30 napig őrzik, az ügyféladatokat a szerződés megszűnésekor törlik. A Temporal szerint SOC 2 Type 2 tanúsítvánnyal rendelkezik, és megfelel a GDPR-nek és a HIPAA-nak. Ezt tekintsd a felülvizsgálatod kiindulópontjának, nem jogi tanácsnak.
Önhosztolás. Ez ezeket a kérdéseket a saját tárhelyszolgáltatódra hárítja, az adatbázis, a keresőtár, a mentések és a frissítések pedig nálad maradnak. A szervernek négy szolgáltatása van, amelyek függetlenül skálázhatók: frontend, history, matching és worker. Elasticsearch vagy OpenSearch ajánlott, amint néhány végrehajtásnál többet futtatsz, a Docker Compose minta PostgreSQL-lel és Elasticsearch-csel fut. A Temporal azt javasolja, hogy egyszerre egy kisverziót lépj, a kiadások pedig akár kéthetente megjelenhetnek. A shardok száma build-időben rögzített, RBAC vagy auditnaplózás pedig nincs a dobozból. A gyártó ellenőrzőlistája a személyzetet jelentős költségnek nevezi. A hardvert nem árazom be, mert az a shardok számától és a terheléstől függ.
Hol gyengébb
- A determinizmus szokás kérdése. A futó végrehajtások közben módosított kód megtörheti a visszajátszást, a verziókezelés pedig régi kódutakat hagy karbantartásra.
- Kemény előzmény-határok. A végrehajtások 51 200 esemény, 2000 update vagy 10 000 signal felett leállnak, ezért a hosszú munkamenetekhez az elejétől Continue-As-New kell.
- Az újrapróbálás költségkeret. A korlátlan alapértelmezés az infrastruktúrának jó, a modellhívásoknak rosszul illik.
- Részben még preview. Az OpenTelemetry- és a LangGraph-integráció public preview, a sandbox-támogatás kiadás előtti, a streaming pedig kísérleti.
- Nem minden tartós. Az MCP-szerverek a workflow-n kívül futnak, és minden MCP-hívás activity-ként fut.
LocalShellTool, aComputerToolés aSQLiteSessionnem támogatott.
Ítélet
A Temporal a megfelelő alapértelmezés hosszú életű ügynökökhöz, amelyek több rendszert érintenek és emberekre várnak, feltéve, hogy valaki vállalja a workflow-kódot, önhosztolásnál pedig a klasztert is. Egyetlen modellhívásra egy HTTP-kérés mögött viszont rossz alapértelmezés.
- Válaszd, ha egy futás órákig vagy napokig tart, és egy újraindulás nem ismételhet meg egy fizetést, e-mailt vagy modellhívást.
- Válaszd, ha egy ember olyan lépéseket hagy jóvá, amelyek napokkal később jönnek, és a várakozásnak túl kell élnie az újraindulásokat.
- Hagyd ki, ha az ügynök másodpercek alatt válaszol. Egy időkorlát és egy újrapróbálás a modellhívás körül elég.
- Csak akkor önhosztolj, ha valaki gyakori frissítésekkel viszi a klasztert. Különben a Temporal Cloudot használd.
Három alternatíva lefedi a legtöbb esetet, amikor a Temporal túlzás:
- LangGraph-checkpointok LangGraph, ha az ügynök egy Python-gráf, az állapot kicsi, és a PostgreSQL már rendelkezésre áll. Az interruptjai emberi jóváhagyáshoz szüneteltetik a gráfot.
- Job queue állapottáblával ha a folyamat rögzített sorozata idempotens lépéseknek. Az újrapróbálásokat és az időzítőket magadnak kell megírnod, ez öt lépésnél rendben van, ötvennél fárasztó.
- Csak az OpenAI Agents SDK OpenAI Agents SDK, ha minden futás rövid, egy folyamatban marad, és soha nem kell túlélnie egy újraindulást.
Források
- Temporal Cloud: árak
- Temporal Cloud: árdokumentáció
- OpenAI Agents SDK integráció Pythonhoz
- Workflow-definíció és determinizmus
- Újrapróbálási szabályzatok
- Activity-időkorlátok
- Cloud actions referencia
- Eseménytörténet korlátai
- Üzenetkezelés Pythonban: signalok, query-k és update-ek
- Human-in-the-loop AI-ügynök minta
- Cloud biztonsági modell
- Cloud szolgáltatási régiók
- Adatfeldolgozási szerződés
- Önhosztolás telepítési útmutató
- Önhosztolt éles üzem ellenőrzőlista
- Önhosztolt láthatósági tárolók
- A Temporal Server architektúrája
- A Temporal szerver LICENSE fájlja
- Temporal integrációk áttekintése
- LangGraph integráció a Temporallal
- LangGraph perzisztencia
- LangGraph interruptok
- Önhosztolási útmutató és fejlesztői szerver
- Python SDK referencia: workflow.wait_condition
- Python SDK referencia: ApplicationError
Gyakori kérdések
Ingyenesen önhosztolható a Temporal?
A szerver MIT-licencű, és az árlap szerint a platform a saját infrastruktúrádon futhat, a Temporaltól származó díj nélkül. Az adatbázis, a keresőtár, a gépek és a működtetésükhöz szükséges emberek költsége továbbra is a tiéd.
Mibe kerül egy ügynökfutás a Temporal Cloudon?
Egy futás, amelyben van egy indítás, tizenkét activity-indítás, két újrapróbálás, egy update, egy signal és egy időzítő, körülbelül 18 Actions. Milliónként $50 mellett ez egy tized centnél kevesebb az Actionsben, a tárhely és a 10 százalékos supportdíj előtt.
Megismétli egy összeomlás a modellhívásaimat?
A befejezetteket nem. A Temporal a workflow-t a rögzített előzményeiből játssza újra, és kihagyja a már befejezett activity-ket. Az az activity, amely futott, amikor a worker leállt, a start-to-close timeout lejártával próbálkozik újra, ezért az activity-kódnak idempotensnek kell lennie.
Temporal vagy LangGraph?
A LangGraph kevesebb üzemeltetést igényel, ha az ügynök egyetlen gráf egyetlen Python-folyamatban, és egy PostgreSQL checkpointer elég. A Temporal olyan futásokhoz illik, amelyek napokig tartanak, több szolgáltatást fognak át, vagy amelyeknél a platform rögzíti az újrapróbálásokat és az időzítőket. A kettő össze is kombinálható, mert a LangGraph futhat Temporal-workflow-n belül, ami public preview állapotban van.