[{"data":1,"prerenderedAt":1089},["ShallowReactive",2],{"tool-temporal-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":23,"sources":36,"cover":112,"og":113,"expertise":114,"locales":115,"lang":116,"title":119,"description":120,"coverAlt":121,"url":26,"pricing":122,"kind":123,"metaTitle":124,"takeaways":125,"faq":131,"toc":144,"blocks":172,"others":634},"temporal","2026-10-07",8,"agents",[9,10,11,12,13],"Durable execution","Workflow orchestration","Human in the loop","AI agents","Self-hosting",[15,16,17,18,19,20,21,22],"temporal workflow","temporal ai agents","durable execution for ai agents","temporal vs langgraph","temporal cloud pricing","temporal openai agents sdk","self-hosted temporal","temporal determinism rules",[24,27,30,33],{"name":25,"url":26},"Temporal","https:\u002F\u002Ftemporal.io",{"name":28,"url":29},"Workflow engine","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWorkflow_engine",{"name":31,"url":32},"Large language model","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLarge_language_model",{"name":34,"url":35},"Human-in-the-loop","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHuman-in-the-loop",[37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109],{"title":38,"url":39},"Temporal Cloud pricing","https:\u002F\u002Ftemporal.io\u002Fpricing",{"title":41,"url":42},"Temporal Cloud pricing documentation","https:\u002F\u002Fdocs.temporal.io\u002Fcloud\u002Fpricing",{"title":44,"url":45},"OpenAI Agents SDK integration for Python","https:\u002F\u002Fdocs.temporal.io\u002Fdevelop\u002Fpython\u002Fintegrations\u002Fopenai-agents",{"title":47,"url":48},"Workflow definition and determinism","https:\u002F\u002Fdocs.temporal.io\u002Fworkflow-definition",{"title":50,"url":51},"Retry policies","https:\u002F\u002Fdocs.temporal.io\u002Fencyclopedia\u002Fretry-policies",{"title":53,"url":54},"Activity timeouts","https:\u002F\u002Fdocs.temporal.io\u002Fencyclopedia\u002Fdetecting-activity-failures",{"title":56,"url":57},"Cloud actions reference","https:\u002F\u002Fdocs.temporal.io\u002Fcloud\u002Factions",{"title":59,"url":60},"Event history limits","https:\u002F\u002Fdocs.temporal.io\u002Fworkflow-execution\u002Fevent",{"title":62,"url":63},"Message passing in Python: signals, queries and updates","https:\u002F\u002Fdocs.temporal.io\u002Fdevelop\u002Fpython\u002Fmessage-passing",{"title":65,"url":66},"Human-in-the-loop AI agent sample","https:\u002F\u002Fdocs.temporal.io\u002Fai\u002Fcookbook\u002Fhuman-in-the-loop-python",{"title":68,"url":69},"Cloud security model","https:\u002F\u002Fdocs.temporal.io\u002Fcloud\u002Fsecurity",{"title":71,"url":72},"Cloud service regions","https:\u002F\u002Fdocs.temporal.io\u002Fcloud\u002Fregions",{"title":74,"url":75},"Data processing agreement","https:\u002F\u002Ftemporal.io\u002Fdpa",{"title":77,"url":78},"Self-hosted deployment guide","https:\u002F\u002Fdocs.temporal.io\u002Fself-hosted-guide\u002Fdeployment",{"title":80,"url":81},"Self-hosted production checklist","https:\u002F\u002Fdocs.temporal.io\u002Fself-hosted-guide\u002Fproduction-checklist",{"title":83,"url":84},"Self-hosted visibility stores","https:\u002F\u002Fdocs.temporal.io\u002Fself-hosted-guide\u002Fvisibility",{"title":86,"url":87},"Temporal Server architecture","https:\u002F\u002Fdocs.temporal.io\u002Ftemporal-service\u002Ftemporal-server",{"title":89,"url":90},"Temporal server LICENSE file","https:\u002F\u002Fgithub.com\u002Ftemporalio\u002Ftemporal\u002Fblob\u002Fmain\u002FLICENSE",{"title":92,"url":93},"Temporal integrations index","https:\u002F\u002Fdocs.temporal.io\u002Fintegrations",{"title":95,"url":96},"LangGraph integration with Temporal","https:\u002F\u002Fdocs.temporal.io\u002Fdevelop\u002Fpython\u002Fintegrations\u002Flanggraph",{"title":98,"url":99},"LangGraph persistence","https:\u002F\u002Fdocs.langchain.com\u002Foss\u002Fpython\u002Flanggraph\u002Fpersistence",{"title":101,"url":102},"LangGraph interrupts","https:\u002F\u002Fdocs.langchain.com\u002Foss\u002Fpython\u002Flanggraph\u002Finterrupts",{"title":104,"url":105},"Self-hosted guide and development server","https:\u002F\u002Fdocs.temporal.io\u002Fself-hosted-guide",{"title":107,"url":108},"Python SDK reference: workflow.wait_condition","https:\u002F\u002Fpython.temporal.io\u002Ftemporalio.workflow._context.html",{"title":110,"url":111},"Python SDK reference: ApplicationError","https:\u002F\u002Fpython.temporal.io\u002Ftemporalio.exceptions.ApplicationError.html","\u002Fimages\u002Fblog\u002Ftemporal\u002Fcover.webp","\u002Fimages\u002Fblog\u002Ftemporal\u002Fog.jpg","ai-engineer",[116,117,118],"en","de","hu","Temporal review: durable agents that survive crashes and wait for people","Temporal runs agent loops as durable workflows, so retries, approvals and timers survive crashes. Costs, data residency, determinism rules and when to skip it.","Cover art for the Temporal review: a workflow that retries model calls as activities and pauses until a person signs off.","MIT · self-hosting free · Cloud pay-as-you-go from $0","Durable execution platform","Temporal review: durable agents that wait · Balázs Csorba",[126,127,128,129,130],"Temporal fits agent runs that last minutes to days, touch several systems and wait for a person. It is overkill for a chat reply that finishes in seconds.","The server is MIT-licensed. Temporal Cloud is pay-as-you-go from $0 a month, with Actions at $50 per million for the first 5 million, and the Business plan starts at $500 a month.","Workflow code must be deterministic. Model calls and tools belong in activities, and changing running workflow code needs versioning.","Activities retry without a limit by default, so every model activity needs a retry policy and a list of error types that must never be retried.","Cloud namespaces can run in EU regions such as Frankfurt and Ireland, under a data processing agreement with standard contractual clauses. Self-hosting moves that question to your own hosting.",[132,135,138,141],{"q":133,"a":134},"Is Temporal free to self-host?","The server is MIT-licensed, and Temporal's pricing page says the platform can run on your own infrastructure at no cost from Temporal. The database, the search store, the machines and the people who run them are still yours to pay for.",{"q":136,"a":137},"What does one agent run cost on Temporal Cloud?","A run with one start, twelve activity starts, two retries, an update, a signal and a timer is about 18 Actions. At $50 per million that is under a tenth of a cent in Actions, before storage and the 10 percent support charge.",{"q":139,"a":140},"Does a crash repeat my model calls?","Completed ones, no. Temporal replays the workflow from its recorded history and skips activities that already finished. An activity that was running when its worker died is retried once its start-to-close timeout expires, which is why activity code must be idempotent.",{"q":142,"a":143},"Temporal or LangGraph?","LangGraph is less to run when the agent is one graph in one Python process and a PostgreSQL checkpointer is enough. Temporal fits runs that last days, span several services or need retries and timers recorded by the platform. The two can also combine, because LangGraph can run inside a Temporal workflow, which is in public preview.",[145,148,151,154,157,160,163,166,169],{"id":146,"title":147},"what-it-is","What it is",{"id":149,"title":150},"how-it-works","How it works",{"id":152,"title":153},"getting-started","Getting started",{"id":155,"title":156},"retries-and-timeouts","Retries and timeouts",{"id":158,"title":159},"human-approval","Human approval with signals",{"id":161,"title":162},"cost-and-deployment","Cost and deployment",{"id":164,"title":165},"where-it-falls-short","Where it falls short",{"id":167,"title":168},"verdict","Verdict",{"id":170,"title":171},"sources","Sources",[173,177,180,183,207,208,219,228,239,240,251,253,271,272,275,292,294,313,316,317,328,330,350,351,354,409,412,415,441,447,453,454,492,493,496,518,521,546,555,556],{"type":174,"content":175},"paragraph",[176],"Temporal is an open-source durable execution platform. You write the agent as ordinary code, and the platform records every step, so a run survives crashes, deploys and days of waiting. My verdict up front: it suits agent runs that last minutes to days, touch several systems and need a person to approve a step. It is overkill for a chat reply that finishes in two seconds.",{"type":174,"content":178},[179],"It competes with two simpler things most teams already run: a graph checkpointer such as LangGraph's, and a job queue with a state table. Those are the right answer until a process dies halfway through a twelve-step run and the run has to resume where it stopped. Skip Temporal if nobody will own its workflow code or, when you self-host, its cluster.",{"type":181,"level":182,"id":146,"text":147},"heading",2,{"type":184,"ordered":185,"items":186},"list",false,[187,197,202],[188,192,196],{"tag":189,"children":190},"strong",[191],"One command to try it. ",{"tag":193,"children":194},"code",[195],"temporal server start-dev"," runs the service and the web UI on a laptop, with no external dependencies.",[198,201],{"tag":189,"children":199},[200],"Two ways to run it. ","Self-host the server, or use Temporal Cloud, whose regions include AWS Frankfurt and Ireland. The server is MIT-licensed.",[203,206],{"tag":189,"children":204},[205],"Ordinary code. ","Workflows and activities are plain functions in Go, Java, Python, TypeScript, .NET, Ruby or PHP, depending on the SDK.",{"type":181,"level":182,"id":149,"text":150},{"type":174,"content":209},[210,211,214,215,218],"A ",{"tag":189,"children":212},[213],"workflow"," decides what happens next. An ",{"tag":189,"children":216},[217],"activity"," does the work: it calls a model, hits an API or writes a file. Temporal stores each decision and each activity result in the workflow's event history. After a crash, a worker replays the workflow code against that history, skips the finished activities and resumes at the first unfinished step. An agent maps onto that split cleanly: the loop, the tool choice and any handoffs live in the workflow, and every model or tool call is an activity.",{"type":220,"attrs":221,"inner":225,"caption":226},"diagram",{"viewBox":222,"role":223,"aria-labelledby":224},"0 0 720 330","img","d1-tm-t d1-tm-d","\u003Ctitle id=\"d1-tm-t\">How a durable agent run flows through Temporal\u003C\u002Ftitle>\u003Cdesc id=\"d1-tm-d\">A client starts the workflow and sends signals and updates to the Temporal Service, which stores the event history and timers. A worker polls the task queue, receives tasks from the service and returns results. On the worker, the workflow code runs the agent loop deterministically and hands each model call or tool call to an activity. The activities call the external LLM and tool APIs, and those calls are not replayed.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"ah-tm\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\u003Cpath d=\"M0 0L10 5L0 10z\" class=\"d-head\" \u002F>\u003C\u002Fmarker>\u003C\u002Fdefs>\u003Ctext x=\"20\" y=\"28\" class=\"d-title\">Durable agent run\u003C\u002Ftext>\u003Ctext x=\"700\" y=\"28\" text-anchor=\"end\" class=\"d-label\">history survives restarts\u003C\u002Ftext>\u003Crect x=\"20\" y=\"60\" width=\"160\" height=\"70\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"100\" y=\"88\" text-anchor=\"middle\" class=\"d-text\">Client or UI\u003C\u002Ftext>\u003Ctext x=\"100\" y=\"110\" text-anchor=\"middle\" class=\"d-small\">start, signal, update\u003C\u002Ftext>\u003Crect x=\"280\" y=\"60\" width=\"160\" height=\"70\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"360\" y=\"88\" text-anchor=\"middle\" class=\"d-text\">Temporal Service\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"110\" text-anchor=\"middle\" class=\"d-small\">event history, timers\u003C\u002Ftext>\u003Crect x=\"540\" y=\"60\" width=\"160\" height=\"70\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"620\" y=\"88\" text-anchor=\"middle\" class=\"d-text\">Worker\u003C\u002Ftext>\u003Ctext x=\"620\" y=\"110\" text-anchor=\"middle\" class=\"d-small\">polls task queue\u003C\u002Ftext>\u003Cpath d=\"M180 85 H278\" class=\"d-line\" marker-end=\"url(#ah-tm)\" \u002F>\u003Cpath d=\"M440 80 H538\" class=\"d-line\" marker-end=\"url(#ah-tm)\" \u002F>\u003Cpath d=\"M538 118 H440\" class=\"d-line\" marker-end=\"url(#ah-tm)\" \u002F>\u003Ctext x=\"489\" y=\"74\" text-anchor=\"middle\" class=\"d-small\">tasks\u003C\u002Ftext>\u003Ctext x=\"489\" y=\"138\" text-anchor=\"middle\" class=\"d-small\">results\u003C\u002Ftext>\u003Crect x=\"10\" y=\"172\" width=\"700\" height=\"104\" rx=\"12\" class=\"d-fill-muted\" \u002F>\u003Ctext x=\"690\" y=\"190\" text-anchor=\"end\" class=\"d-small\">runs on your workers\u003C\u002Ftext>\u003Crect x=\"20\" y=\"200\" width=\"200\" height=\"62\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"120\" y=\"226\" text-anchor=\"middle\" class=\"d-text\">Workflow code\u003C\u002Ftext>\u003Ctext x=\"120\" y=\"248\" text-anchor=\"middle\" class=\"d-small\">agent loop, deterministic\u003C\u002Ftext>\u003Crect x=\"260\" y=\"200\" width=\"200\" height=\"62\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"360\" y=\"226\" text-anchor=\"middle\" class=\"d-text\">Activities\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"248\" text-anchor=\"middle\" class=\"d-small\">model calls, tools\u003C\u002Ftext>\u003Crect x=\"500\" y=\"200\" width=\"200\" height=\"62\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"600\" y=\"226\" text-anchor=\"middle\" class=\"d-text\">LLM and tool APIs\u003C\u002Ftext>\u003Ctext x=\"600\" y=\"248\" text-anchor=\"middle\" class=\"d-small\">external, not replayed\u003C\u002Ftext>\u003Cpath d=\"M220 231 H258\" class=\"d-line\" marker-end=\"url(#ah-tm)\" \u002F>\u003Cpath d=\"M460 231 H498\" class=\"d-line\" marker-end=\"url(#ah-tm)\" \u002F>\u003Ctext x=\"20\" y=\"300\" class=\"d-small\">Replay skips finished activities; only unfinished steps run again after a crash.\u003C\u002Ftext>\u003Ctext x=\"20\" y=\"320\" class=\"d-label\">Activity retries follow your policy. The workflow is replayed, never run twice.\u003C\u002Ftext>",[227],"The workflow decides, the activities do the I\u002FO, and the service keeps the history that makes a restart harmless.",{"type":174,"content":229},[230,231,234,235,238],"Replay is the constraint. Workflow code must make the same calls in the same order on every replay, so calling an API, reading the clock or drawing random numbers inside it breaks replay. Put that work in activities, or use ",{"tag":193,"children":232},[233],"workflow.now()"," and ",{"tag":193,"children":236},[237],"workflow.random()"," in Python. Changing a workflow with running executions needs versioning. Changing an activity's type or ID is not safe, but its inputs and timeouts can change.",{"type":181,"level":182,"id":152,"text":153},{"type":174,"content":241},[242,243,246,247,250],"The quickest start is the OpenAI Agents SDK integration, shipped as the ",{"tag":193,"children":244},[245],"temporalio-openai-agents"," package. You write the agent with the normal SDK inside a workflow, then attach ",{"tag":193,"children":248},[249],"OpenAIAgentsPlugin"," to the client and the worker. Each model call becomes an activity, so it retries durably and is not repeated during replay.",{"type":193,"code":252},"from datetime import timedelta\nfrom agents import Agent, Runner\nfrom temporalio import workflow\nfrom temporalio.client import Client\nfrom temporalio.openai_agents import ModelActivityParameters, OpenAIAgentsPlugin\n\n\n@workflow.defn\nclass HelloWorldAgent:\n    @workflow.run\n    async def run(self, prompt: str) -> str:\n        agent = Agent(name='Assistant', instructions='You only respond in haikus.')\n        result = await Runner.run(agent, input=prompt)\n        return result.final_output\n\n\n# worker.py: the plugin sets the timeout for each model activity\nclient = await Client.connect(\n    'localhost:7233',\n    plugins=[\n        OpenAIAgentsPlugin(\n            model_params=ModelActivityParameters(\n                start_to_close_timeout=timedelta(seconds=30)\n            )\n        ),\n    ],\n)\n\n# starter.py: the same plugin, so payloads are converted the same way\nclient = await Client.connect('localhost:7233', plugins=[OpenAIAgentsPlugin()])\nresult = await client.execute_workflow(\n    HelloWorldAgent.run,\n    'Tell me about recursion in programming.',\n    id='my-workflow-id',\n    task_queue='openai-agents-basic-task-queue',\n)",{"type":174,"content":254},[255,258,259,262,263,266,267,270],{"tag":193,"children":256},[257],"ModelActivityParameters"," sets how model activities are scheduled, and its ",{"tag":193,"children":260},[261],"start_to_close_timeout"," defaults to 60 seconds. For tools, ",{"tag":193,"children":264},[265],"activity_as_tool()"," runs I\u002FO as an activity, while a plain ",{"tag":193,"children":268},[269],"@function_tool"," runs inside the workflow and must be deterministic. Integrations also exist for Google ADK, Pydantic AI, Mastra and the Vercel AI SDK. The LangGraph integration is in public preview.",{"type":181,"level":182,"id":155,"text":156},{"type":174,"content":273},[274],"Retries are where durable execution earns its keep, and where the defaults bite. A failed activity is retried with exponential backoff, starting at one second and capped at 100 seconds between attempts, with no limit on attempts. A payment capture wants that. A request that can never succeed, such as a lookup for an order that does not exist, should not be retried at all. Three settings decide the behaviour:",{"type":184,"ordered":185,"items":276},[277,282,287],[278,281],{"tag":189,"children":279},[280],"Start-to-close"," bounds one attempt. It has no default, and Temporal strongly recommends setting it.",[283,286],{"tag":189,"children":284},[285],"Schedule-to-close"," bounds the whole activity, retries included, so it caps how long one model step may run in total.",[288,291],{"tag":189,"children":289},[290],"Retry policy"," sets the attempt limit and the error types that must never be retried.",{"type":193,"code":293},"import httpx\nfrom datetime import timedelta\nfrom temporalio import activity\nfrom temporalio.common import RetryPolicy\nfrom temporalio.exceptions import ApplicationError\nfrom temporalio.openai_agents import ModelActivityParameters\n\nmodel_params = ModelActivityParameters(\n    start_to_close_timeout=timedelta(seconds=60),\n    schedule_to_close_timeout=timedelta(minutes=5),\n    retry_policy=RetryPolicy(maximum_attempts=5),\n)\n\n\n@activity.defn\nasync def lookup_order(order_id: str) -> dict:\n    async with httpx.AsyncClient() as client:\n        response = await client.get(f'https:\u002F\u002Fshop.example.com\u002Fapi\u002Forders\u002F{order_id}')\n    if response.status_code == 404:\n        # Retrying cannot make a missing order appear.\n        raise ApplicationError('Order not found', type='OrderNotFound', non_retryable=True)\n    response.raise_for_status()\n    return response.json()",{"type":295,"variant":296,"title":297,"body":298},"callout","warn","Every retry is a second model call",[299],[300,301,304,305,308,309,312],"A retry sends the request again, and every attempt counts another Action. Set ",{"tag":193,"children":302},[303],"maximum_attempts"," on every model activity, and raise ",{"tag":193,"children":306},[307],"ApplicationError"," with ",{"tag":193,"children":310},[311],"non_retryable=True"," for requests that cannot succeed.",{"type":174,"content":314},[315],"Activity code also has to be idempotent, because Temporal expects activities to re-execute after a failure. A tool that sends an email needs an idempotency key that the receiving system honours.",{"type":181,"level":182,"id":158,"text":159},{"type":174,"content":318},[319,320,323,324,327],"This is where Temporal stops being a retry library. A ",{"tag":189,"children":321},[322],"signal"," is an asynchronous message to a running workflow. Temporal's human-in-the-loop sample stores the decision in a signal handler and waits for it with ",{"tag":193,"children":325},[326],"workflow.wait_condition",". While it waits, the state lives in the event history and timers survive restarts. The sample's default timeout is five minutes, which suits a test. For an approval queue I would use days.",{"type":193,"code":329},"import asyncio\nfrom datetime import timedelta\nfrom typing import Optional\nfrom temporalio import workflow\n\n\n@workflow.defn\nclass ApprovalWorkflow:\n    def __init__(self) -> None:\n        self.decision: Optional[str] = None\n\n    @workflow.signal\n    async def approval_decision(self, decision: str) -> None:\n        self.decision = decision\n\n    @workflow.run\n    async def run(self, request: str) -> str:\n        # propose_action and execute_action are activities defined elsewhere\n        proposal = await workflow.execute_activity(\n            propose_action, request, start_to_close_timeout=timedelta(seconds=60)\n        )\n        try:\n            await workflow.wait_condition(\n                lambda: self.decision is not None,\n                timeout=timedelta(days=3),\n            )\n        except asyncio.TimeoutError:\n            return 'no decision within three days'\n        if self.decision != 'approve':\n            return 'rejected'\n        return await workflow.execute_activity(\n            execute_action, proposal, start_to_close_timeout=timedelta(seconds=60)\n        )",{"type":174,"content":331},[210,332,335,336,339,340,343,344,349],{"tag":189,"children":333},[334],"query"," reads state without changing it. An ",{"tag":189,"children":337},[338],"update"," is a request the caller waits on, and a validator can reject it before it is written to history. A rejected update still counts as an Action. Long sessions hit hard limits: an execution is terminated past 51,200 events, 2,000 updates or 10,000 signals, so chat-style workflows need Continue-As-New. ",{"tag":193,"children":341},[342],"workflow.info().is_continue_as_new_suggested()"," reports when the server suggests it. Where approval gates belong is a design question, which I cover in ",{"tag":345,"to":346,"children":347},"link","\u002Fblog\u002Fhuman-in-the-loop-ai-agents",[348],"Human in the loop for AI agents",".",{"type":181,"level":182,"id":161,"text":162},{"type":174,"content":352},[353],"Self-hosting carries no licence fee. Temporal Cloud is pay-as-you-go with no minimum spend, and new accounts get $150 of credit for 90 days. The table shows list prices as of October 2026.",{"type":355,"head":356,"rows":365},"table",[357,359,361,363],[358],"Option",[360],"Price",[362],"Included",[364],"What changes",[366,375,384,393,402],[367,369,371,373],[368],"Self-hosted",[370],"Free, MIT",[372],"Nothing from Temporal",[374],"You run the services, database, search store and upgrades",[376,378,380,382],[377],"Cloud pay-as-you-go",[379],"$0 base plus 10% support",[381],"Nothing",[383],"Actions at $50 per million for the first 5 million a month",[385,387,389,391],[386],"Cloud Business",[388],"Greater of $500 a month or 10% of usage",[390],"2.5M Actions, 2.5 GB active, 100 GB retained",[392],"SAML included, SCIM $500 a month extra",[394,396,398,400],[395],"Cloud Enterprise",[397],"Annual, contact sales",[399],"10M Actions, 10 GB active, 400 GB retained",[401],"SCIM included, P0 response under 30 minutes",[403,405,406,407],[404],"Cloud Mission Critical",[397],[399],[408],"Dedicated platform architect, P0 response under 15 minutes",{"type":174,"content":410},[411],"Usage rules move the bill more than the headline. Actions count every activity start and retry, and every signal, timer, update, query and workflow start. My example run is 18 Actions, so 100,000 such runs come to about $90 in Actions before storage and support. One GB of active storage held for a month costs about $31, and one GB of retained storage about 78 cents. With Fairness enabled, each hour's Actions rise by 10 percent.",{"type":174,"content":413},[414],"Business pays off through its support, SCIM and commitment discounts more than through its Actions. The $500 minimum includes 2.5 million Actions, which covers more than 130,000 runs like my example.",{"type":174,"content":416},[417,420,421,424,425,428,429,432,433,436,437,349],{"tag":189,"children":418},[419],"Where the data goes. ","A namespace is created in one region. The regions list includes AWS Frankfurt (",{"tag":193,"children":422},[423],"eu-central-1","), Ireland (",{"tag":193,"children":426},[427],"eu-west-1",") and London (",{"tag":193,"children":430},[431],"eu-west-2","), plus GCP Frankfurt (",{"tag":193,"children":434},[435],"europe-west3","). Payloads can be encrypted on your workers with the Data Converter before they leave, and a Codec Server lets your team read histories in the web UI without sharing keys. Retained history is kept for up to 90 days in Cloud, so longer retention means exporting. For the wider questions, see ",{"tag":345,"to":438,"children":439},"\u002Fblog\u002Fgdpr-llm-api-eu-data-residency",[440],"GDPR LLM data residency",{"type":174,"content":442},[443,446],{"tag":189,"children":444},[445],"The data processing agreement. ","Temporal's agreement, effective 10 October 2024, includes standard contractual clauses and a UK addendum. Its subprocessor list names AWS for infrastructure, Google Cloud for namespaces in GCP regions, and Datastax, Auth0, Elastic and WorkOS for specific services. You may object to a new subprocessor within 15 days of publication. Backups are kept for 30 days, and customer data is deleted on termination. Temporal says it is SOC 2 Type 2 certified and compliant with GDPR and HIPAA. Treat this as the start of your review, not as legal advice.",{"type":174,"content":448},[449,452],{"tag":189,"children":450},[451],"Self-hosting. ","That moves those questions to your own hosting provider, and you carry the database, the search store, backups and upgrades. The server has four services that scale independently: frontend, history, matching and worker. Elasticsearch or OpenSearch is recommended once you run more than a few executions, and the Docker Compose sample runs PostgreSQL with Elasticsearch. Temporal recommends upgrading one minor version at a time, and releases can arrive every two weeks. The shard count is fixed at build time, and there is no RBAC or audit logging out of the box. The vendor's checklist calls staffing a significant cost. I have not priced hardware, because it depends on shard count and load.",{"type":181,"level":182,"id":164,"text":165},{"type":184,"ordered":185,"items":455},[456,461,466,471,476],[457,460],{"tag":189,"children":458},[459],"Determinism is a habit. ","Editing code under running executions can break replay, and versioning leaves old code paths to maintain.",[462,465],{"tag":189,"children":463},[464],"Hard history ceilings. ","Executions terminate past 51,200 events, 2,000 updates or 10,000 signals, so long sessions need Continue-As-New from the start.",[467,470],{"tag":189,"children":468},[469],"Retries are a budget. ","The unlimited default suits infrastructure and suits model calls badly.",[472,475],{"tag":189,"children":473},[474],"Preview parts. ","The OpenTelemetry and LangGraph integrations are in public preview, sandbox support is pre-release and streaming is experimental.",[477,480,481,484,485,234,488,491],{"tag":189,"children":478},[479],"Not everything is durable. ","MCP servers run outside the workflow, and each MCP call runs as an activity. ",{"tag":193,"children":482},[483],"LocalShellTool",", ",{"tag":193,"children":486},[487],"ComputerTool",{"tag":193,"children":489},[490],"SQLiteSession"," are not supported.",{"type":181,"level":182,"id":167,"text":168},{"type":174,"content":494},[495],"Temporal is the right default for long-running agents that touch several systems and wait for people, provided someone will own the workflow code and, if you self-host, the cluster. It is the wrong default for one model call behind an HTTP request.",{"type":184,"ordered":497,"items":498},true,[499,504,508,513],[500,503],{"tag":189,"children":501},[502],"Adopt it if ","a run lasts hours or days, and a restart must not repeat a payment, an email or a model call.",[505,507],{"tag":189,"children":506},[502],"a person approves steps that may come days later, and the wait must survive restarts.",[509,512],{"tag":189,"children":510},[511],"Skip it if ","the agent answers in seconds. A timeout and a retry around the model call are enough.",[514,517],{"tag":189,"children":515},[516],"Self-host it only if ","someone will run the cluster through frequent upgrades. Otherwise use Temporal Cloud.",{"type":174,"content":519},[520],"Three alternatives cover most cases where Temporal is overkill:",{"type":184,"ordered":185,"items":522},[523,532,537],[524,527,531],{"tag":189,"children":525},[526],"LangGraph checkpoints ",{"tag":345,"to":528,"children":529},"\u002Ftools\u002Flanggraph",[530],"LangGraph"," when the agent is one Python graph, the state is small and PostgreSQL is already there. Its interrupts pause a graph for human approval.",[533,536],{"tag":189,"children":534},[535],"A job queue with a state table ","when the pipeline is a fixed sequence of idempotent steps. You build the retries and timers yourself, which is fine for five steps and tedious for fifty.",[538,541,545],{"tag":189,"children":539},[540],"The OpenAI Agents SDK alone ",{"tag":345,"to":542,"children":543},"\u002Ftools\u002Fopenai-agents-sdk",[544],"OpenAI Agents SDK"," when each run is short, stays in one process and never needs to survive a restart.",{"type":295,"variant":547,"title":548,"body":549},"tip","Start small",[550],[551,552,554],"Begin with ",{"tag":193,"children":553},[195]," and the $150 of Cloud credit. Move to a cluster only when a residency rule or measured volume makes the case.",{"type":181,"level":182,"id":170,"text":171},{"type":184,"ordered":185,"items":557},[558,562,565,568,571,574,577,580,583,586,589,592,595,598,601,604,607,610,613,616,619,622,625,628,631],[559],{"tag":560,"href":39,"children":561},"a",[38],[563],{"tag":560,"href":42,"children":564},[41],[566],{"tag":560,"href":45,"children":567},[44],[569],{"tag":560,"href":48,"children":570},[47],[572],{"tag":560,"href":51,"children":573},[50],[575],{"tag":560,"href":54,"children":576},[53],[578],{"tag":560,"href":57,"children":579},[56],[581],{"tag":560,"href":60,"children":582},[59],[584],{"tag":560,"href":63,"children":585},[62],[587],{"tag":560,"href":66,"children":588},[65],[590],{"tag":560,"href":69,"children":591},[68],[593],{"tag":560,"href":72,"children":594},[71],[596],{"tag":560,"href":75,"children":597},[74],[599],{"tag":560,"href":78,"children":600},[77],[602],{"tag":560,"href":81,"children":603},[80],[605],{"tag":560,"href":84,"children":606},[83],[608],{"tag":560,"href":87,"children":609},[86],[611],{"tag":560,"href":90,"children":612},[89],[614],{"tag":560,"href":93,"children":615},[92],[617],{"tag":560,"href":96,"children":618},[95],[620],{"tag":560,"href":99,"children":621},[98],[623],{"tag":560,"href":102,"children":624},[101],[626],{"tag":560,"href":105,"children":627},[104],[629],{"tag":560,"href":108,"children":630},[107],[632],{"tag":560,"href":111,"children":633},[110],[635,741,843,961],{"slug":636,"published":637,"minutes":6,"category":7,"tags":638,"keywords":644,"about":652,"sources":663,"cover":733,"og":734,"expertise":114,"locales":735,"lang":116,"title":736,"description":737,"coverAlt":738,"url":655,"pricing":739,"kind":740},"opencode","2026-10-09",[639,640,641,642,643],"AI coding agent","Terminal","Open source","Local models","MCP",[636,645,646,647,648,649,650,651],"opencode review","open source coding agent","opencode vs claude code","terminal coding agent","opencode local models","opencode permissions","opencode mcp",[653,656,657,660],{"name":654,"url":655},"OpenCode","https:\u002F\u002Fopencode.ai",{"name":31,"url":32},{"name":658,"url":659},"Model Context Protocol","https:\u002F\u002Fmodelcontextprotocol.io",{"name":661,"url":662},"Language Server Protocol","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLanguage_Server_Protocol",[664,667,670,673,676,679,682,685,688,691,694,697,700,703,706,709,712,715,718,721,724,727,730],{"title":665,"url":666},"OpenCode docs: intro and installation","https:\u002F\u002Fopencode.ai\u002Fdocs\u002F",{"title":668,"url":669},"OpenCode docs: providers, Models.dev and local models","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Fproviders\u002F",{"title":671,"url":672},"OpenCode docs: agents, Build, Plan and subagents","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Fagents\u002F",{"title":674,"url":675},"OpenCode docs: permissions and defaults","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Fpermissions\u002F",{"title":677,"url":678},"OpenCode docs: MCP servers","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Fmcp-servers\u002F",{"title":680,"url":681},"OpenCode docs: LSP servers","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Flsp\u002F",{"title":683,"url":684},"OpenCode docs: server and web interface","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Fserver\u002F",{"title":686,"url":687},"OpenCode docs: config and precedence","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Fconfig\u002F",{"title":689,"url":690},"OpenCode docs: Zen, pay-as-you-go models","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Fzen\u002F",{"title":692,"url":693},"OpenCode docs: Go subscription plans","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Fgo\u002F",{"title":695,"url":696},"OpenCode docs: share and data retention","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Fshare\u002F",{"title":698,"url":699},"OpenCode docs: enterprise and data handling","https:\u002F\u002Fopencode.ai\u002Fdocs\u002Fenterprise\u002F",{"title":701,"url":702},"GitHub: anomalyco\u002Fopencode, MIT licence and README","https:\u002F\u002Fgithub.com\u002Fanomalyco\u002Fopencode",{"title":704,"url":705},"OpenCode release v1.18.35 (6 October 2026)","https:\u002F\u002Fgithub.com\u002Fanomalyco\u002Fopencode\u002Freleases\u002Ftag\u002Fv1.18.35",{"title":707,"url":708},"Claude Code licence file (LICENSE.md)","https:\u002F\u002Fraw.githubusercontent.com\u002Fanthropics\u002Fclaude-code\u002Fmain\u002FLICENSE.md",{"title":710,"url":711},"Claude pricing: plans and Claude Code access","https:\u002F\u002Fclaude.com\u002Fpricing",{"title":713,"url":714},"Claude Code docs: connect to an LLM gateway","https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fllm-gateway",{"title":716,"url":717},"OpenAI Codex CLI repository (Apache-2.0)","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fcodex",{"title":719,"url":720},"ChatGPT pricing: Codex included in plans","https:\u002F\u002Flearn.chatgpt.com\u002Fdocs\u002Fpricing",{"title":722,"url":723},"Codex configuration: model providers and config.toml","https:\u002F\u002Flearn.chatgpt.com\u002Fdocs\u002Fconfig-file\u002Fconfig-advanced",{"title":725,"url":726},"Aider website: git integration and LLM support","https:\u002F\u002Faider.chat\u002F",{"title":728,"url":729},"Aider licence file (Apache-2.0)","https:\u002F\u002Fraw.githubusercontent.com\u002FAider-AI\u002Faider\u002Fmain\u002FLICENSE.txt",{"title":731,"url":732},"GDPR, Regulation (EU) 2016\u002F679, Article 28","https:\u002F\u002Feur-lex.europa.eu\u002Flegal-content\u002FEN\u002FTXT\u002FHTML\u002F?uri=CELEX:32016R0679","\u002Fimages\u002Fblog\u002Fopencode\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fopencode\u002Fog.jpg",[116,117,118],"OpenCode review: the open-source coding agent for any model","OpenCode is an MIT-licensed terminal coding agent for any model, hosted or local. Agents, permissions, MCP and LSP, plus the data-protection trade-offs.","Cover art for the OpenCode review: one agent loop in the terminal fanning out to a hosted API, a local model and Zen.","MIT · free, you pay the model provider","Coding agent",{"slug":742,"published":743,"minutes":6,"category":7,"tags":744,"keywords":750,"about":759,"sources":770,"cover":835,"og":836,"expertise":114,"locales":837,"lang":116,"title":838,"description":839,"coverAlt":840,"url":841,"pricing":842,"kind":745},"pydantic-ai","2026-10-08",[745,746,747,748,749],"Agent framework","Typed Python","Structured output","Dependency injection","OpenTelemetry",[751,752,753,754,755,756,757,758],"pydantic ai","pydantic ai review","pydantic ai vs langgraph","pydantic ai vs openai agents sdk","typed python agent framework","pydantic ai logfire pricing","pydantic ai 2.0 upgrade","python llm agent framework",[760,763,766,768],{"name":761,"url":762},"Pydantic","https:\u002F\u002Fpydantic.dev",{"name":764,"url":765},"Python (programming language)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPython_(programming_language)",{"name":748,"url":767},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDependency_injection",{"name":749,"url":769},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOpenTelemetry",[771,774,777,780,783,786,789,792,795,798,801,804,807,810,813,816,819,822,825,828,831,834],{"title":772,"url":773},"Pydantic AI documentation","https:\u002F\u002Fai.pydantic.dev\u002F",{"title":775,"url":776},"pydantic-ai 2.55.0 on PyPI (released 9 October 2026)","https:\u002F\u002Fpypi.org\u002Fproject\u002Fpydantic-ai\u002F",{"title":778,"url":779},"pydantic\u002Fpydantic-ai on GitHub: licence, stars and README","https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai",{"title":781,"url":782},"Pydantic AI release notes: 2.51.0 to 2.55.0 and the 2.52.0 security fix","https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai\u002Freleases",{"title":784,"url":785},"Pydantic AI version policy","https:\u002F\u002Fai.pydantic.dev\u002Fversion-policy\u002F",{"title":787,"url":788},"Pydantic AI upgrade guide: the V2 betas and the stable release","https:\u002F\u002Fai.pydantic.dev\u002Fproject\u002Fchangelog\u002F",{"title":790,"url":791},"Pydantic AI output: tool output, retries and output validators","https:\u002F\u002Fai.pydantic.dev\u002Foutput\u002F",{"title":793,"url":794},"Pydantic AI dependencies and RunContext","https:\u002F\u002Fai.pydantic.dev\u002Fdependencies\u002F",{"title":796,"url":797},"Pydantic AI models and providers","https:\u002F\u002Fai.pydantic.dev\u002Fmodels\u002Foverview\u002F",{"title":799,"url":800},"Pydantic AI unit testing with TestModel and FunctionModel","https:\u002F\u002Fai.pydantic.dev\u002Ftesting\u002F",{"title":802,"url":803},"Pydantic AI durable execution overview","https:\u002F\u002Fai.pydantic.dev\u002Fdurable_execution\u002Foverview\u002F",{"title":805,"url":806},"Pydantic Logfire: observability for Pydantic AI","https:\u002F\u002Fai.pydantic.dev\u002Flogfire\u002F",{"title":808,"url":809},"Pydantic Logfire pricing","https:\u002F\u002Fpydantic.dev\u002Fpricing",{"title":811,"url":812},"Pydantic security and compliance","https:\u002F\u002Fpydantic.dev\u002Fsecurity",{"title":814,"url":815},"OpenAI Agents SDK documentation","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002F",{"title":817,"url":818},"OpenAI Agents SDK tracing","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Ftracing\u002F",{"title":820,"url":821},"openai\u002Fopenai-agents-python on GitHub","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-agents-python",{"title":823,"url":824},"openai-agents 0.23.1 on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Fopenai-agents\u002F",{"title":826,"url":827},"langchain-ai\u002Flanggraph on GitHub","https:\u002F\u002Fgithub.com\u002Flangchain-ai\u002Flanggraph",{"title":829,"url":830},"langgraph 1.2.14 on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Flanggraph\u002F",{"title":832,"url":833},"LangGraph overview","https:\u002F\u002Fdocs.langchain.com\u002Foss\u002Fpython\u002Flanggraph\u002Foverview",{"title":101,"url":102},"\u002Fimages\u002Fblog\u002Fpydantic-ai\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fpydantic-ai\u002Fog.jpg",[116,117,118],"Pydantic AI review: typed Python agents with validated output","Pydantic AI 2.55 gives Python agents typed dependencies, validated output and OpenTelemetry tracing. What 2.0 changed, what Logfire costs and who should pick it.","Cover art for the Pydantic AI review: a typed agent loop with tools, a validation gate and a retry path back to the model.","https:\u002F\u002Fai.pydantic.dev","MIT · free library, Logfire Team from $49 a month",{"slug":844,"published":5,"minutes":845,"category":7,"tags":846,"keywords":851,"about":860,"sources":871,"cover":953,"og":954,"expertise":114,"locales":955,"lang":116,"title":956,"description":957,"coverAlt":958,"url":959,"pricing":960,"kind":740},"gemini-cli",9,[847,848,643,849,850],"Terminal agent","Gemini","Sandboxing","Data protection",[852,853,854,855,856,857,858,859],"gemini cli","gemini cli free tier","gemini cli pricing","gemini cli data privacy","gemini cli vs claude code","antigravity cli","gemini cli github action","gemini cli sandbox",[861,864,867,870],{"name":862,"url":863},"Gemini CLI","https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli",{"name":865,"url":866},"Vertex AI","https:\u002F\u002Fcloud.google.com\u002Fvertex-ai",{"name":868,"url":869},"Apache License","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FApache_License",{"name":658,"url":659},[872,875,878,881,883,886,889,892,895,898,901,904,907,910,913,916,919,922,925,927,930,933,936,939,942,945,947,950],{"title":873,"url":874},"Google Developers Blog: transitioning Gemini CLI to Antigravity CLI","https:\u002F\u002Fdevelopers.googleblog.com\u002Fen\u002Fan-important-update-transitioning-gemini-cli-to-antigravity-cli\u002F",{"title":876,"url":877},"Gemini CLI: quotas and pricing","https:\u002F\u002Fgeminicli.com\u002Fdocs\u002Fresources\u002Fquota-and-pricing\u002F",{"title":879,"url":880},"Gemini CLI: licence, terms of service and privacy notices","https:\u002F\u002Fgeminicli.com\u002Fdocs\u002Fresources\u002Ftos-privacy",{"title":882,"url":863},"GitHub: google-gemini\u002Fgemini-cli, the repository and README",{"title":884,"url":885},"Gemini CLI changelog: v0.63.0 released 6 October 2026","https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli\u002Fblob\u002Fmain\u002Fdocs\u002Fchangelogs\u002Flatest.md",{"title":887,"url":888},"Gemini CLI reference: flags and approval modes","https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli\u002Fblob\u002Fmain\u002Fdocs\u002Fcli\u002Fcli-reference.md",{"title":890,"url":891},"Gemini CLI configuration: settings.json and approval defaults","https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli\u002Fblob\u002Fmain\u002Fdocs\u002Freference\u002Fconfiguration.md",{"title":893,"url":894},"Gemini CLI sandboxing","https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli\u002Fblob\u002Fmain\u002Fdocs\u002Fcli\u002Fsandbox.md",{"title":896,"url":897},"Gemini CLI: context files (GEMINI.md)","https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli\u002Fblob\u002Fmain\u002Fdocs\u002Fcli\u002Fgemini-md.md",{"title":899,"url":900},"Gemini CLI: MCP servers","https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli\u002Fblob\u002Fmain\u002Fdocs\u002Ftools\u002Fmcp-server.md",{"title":902,"url":903},"Gemini API Additional Terms of Service","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fterms",{"title":905,"url":906},"Gemini Developer API pricing","https:\u002F\u002Fai.google.dev\u002Fgemini-api\u002Fdocs\u002Fpricing",{"title":908,"url":909},"Gemini Code Assist FAQs","https:\u002F\u002Fdocs.cloud.google.com\u002Fgemini\u002Fdocs\u002Fcodeassist\u002Ffaqs",{"title":911,"url":912},"Vertex AI data governance and zero data retention","https:\u002F\u002Fdocs.cloud.google.com\u002Fvertex-ai\u002Fgenerative-ai\u002Fdocs\u002Fdata-governance",{"title":914,"url":915},"Vertex AI data residency","https:\u002F\u002Fdocs.cloud.google.com\u002Fvertex-ai\u002Fgenerative-ai\u002Fdocs\u002Flearn\u002Fdata-residency",{"title":917,"url":918},"Vertex AI locations and endpoints","https:\u002F\u002Fdocs.cloud.google.com\u002Fvertex-ai\u002Fgenerative-ai\u002Fdocs\u002Flearn\u002Flocations",{"title":920,"url":921},"run-gemini-cli: the GitHub Action for Gemini CLI","https:\u002F\u002Fgithub.com\u002Fgoogle-github-actions\u002Frun-gemini-cli",{"title":923,"url":924},"Antigravity CLI migration guide","https:\u002F\u002Fantigravity.google\u002Fdocs\u002Fcli\u002Fgcli-migration",{"title":926,"url":711},"Claude pricing",{"title":928,"url":929},"Claude Code: data usage","https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fdata-usage",{"title":931,"url":932},"Claude Code: setup and plan requirements","https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsetup",{"title":934,"url":935},"Claude Code: permission modes","https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fpermission-modes",{"title":937,"url":938},"Claude Code: sandboxing","https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fsandboxing",{"title":940,"url":941},"Claude Code licence (LICENSE.md)","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-code\u002Fblob\u002Fmain\u002FLICENSE.md",{"title":943,"url":944},"OpenAI Codex pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fpricing",{"title":946,"url":717},"OpenAI Codex CLI repository",{"title":948,"url":949},"Codex: agent approvals and security","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fagent-approvals-security",{"title":951,"url":952},"Codex: sandboxing","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fconcepts\u002Fsandboxing","\u002Fimages\u002Fblog\u002Fgemini-cli\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fgemini-cli\u002Fog.jpg",[116,117,118],"Gemini CLI review: open source, but no longer free for individuals","Gemini CLI stays Apache-2.0 and gets releases, but the free individual route closed on 18 June 2026. What remains: Code Assist, billed API keys and Vertex AI.","Cover art for the Gemini CLI review: a prompt loop through an approval gate and a sandbox, with the free lane closed","https:\u002F\u002Fwww.geminicli.com","Apache-2.0 · free individual tier closed 18 June 2026",{"slug":962,"published":963,"minutes":964,"category":7,"tags":965,"keywords":969,"about":978,"sources":990,"cover":1081,"og":1082,"expertise":114,"locales":1083,"lang":116,"title":1084,"description":1085,"coverAlt":1086,"url":981,"pricing":1087,"kind":1088},"e2b","2026-10-02",12,[966,12,967,13,968],"Code sandbox","Firecracker","EU data residency",[970,971,972,973,974,975,976,977],"e2b sandbox","e2b pricing","e2b vs modal","e2b self-hosted","e2b code interpreter","ai agent code execution sandbox","e2b eu region","firecracker microvm for ai agents",[979,982,984,987],{"name":980,"url":981},"E2B","https:\u002F\u002Fe2b.dev",{"name":967,"url":983},"https:\u002F\u002Ffirecracker-microvm.github.io\u002F",{"name":985,"url":986},"Kernel-based Virtual Machine","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKernel-based_Virtual_Machine",{"name":988,"url":989},"General Data Protection Regulation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",[991,994,997,1000,1003,1006,1009,1012,1015,1018,1021,1024,1027,1030,1033,1036,1039,1042,1045,1048,1051,1054,1057,1060,1063,1066,1069,1072,1075,1078],{"title":992,"url":993},"E2B documentation: isolated sandboxes for agents","https:\u002F\u002Fe2b.dev\u002Fdocs",{"title":995,"url":996},"E2B billing and limits: plans, rates and API rate limits","https:\u002F\u002Fdocs.e2b.dev\u002Fbilling",{"title":998,"url":999},"E2B: how long a sandbox lives, timeouts and auto-pause","https:\u002F\u002Fdocs.e2b.dev\u002Ffaq\u002Fsandbox-lifetime",{"title":1001,"url":1002},"E2B: sandbox persistence, pause and resume","https:\u002F\u002Fdocs.e2b.dev\u002Fsandbox\u002Fpersistence",{"title":1004,"url":1005},"E2B: how template builds work, snapshots and kernel versions","https:\u002F\u002Fdocs.e2b.dev\u002Ftemplate\u002Fhow-it-works",{"title":1007,"url":1008},"E2B: template quickstart, build limits and templates versus snapshots","https:\u002F\u002Fdocs.e2b.dev\u002Ftemplate\u002Fquickstart",{"title":1010,"url":1011},"E2B: running your first sandbox","https:\u002F\u002Fdocs.e2b.dev\u002Fquickstart",{"title":1013,"url":1014},"E2B: run Python code in the code interpreter","https:\u002F\u002Fdocs.e2b.dev\u002Fcode-interpreting\u002Fsupported-languages\u002Fpython",{"title":1016,"url":1017},"E2B: internet access controls","https:\u002F\u002Fdocs.e2b.dev\u002Fnetwork\u002Finternet-access",{"title":1019,"url":1020},"E2B: secrets injected by the egress proxy","https:\u002F\u002Fdocs.e2b.dev\u002Fsecrets",{"title":1022,"url":1023},"E2B: is it SOC 2 compliant? Trust Center, DPA and sub-processors","https:\u002F\u002Fdocs.e2b.dev\u002Ffaq\u002Fsecurity-and-compliance",{"title":1025,"url":1026},"E2B: can I run sandboxes in the EU?","https:\u002F\u002Fdocs.e2b.dev\u002Ffaq\u002Feu-region",{"title":1028,"url":1029},"E2B: egress IP ranges and regions","https:\u002F\u002Fdocs.e2b.dev\u002Ffaq\u002Fegress-ip-ranges",{"title":1031,"url":1032},"E2B: does it support GPUs?","https:\u002F\u002Fdocs.e2b.dev\u002Ffaq\u002Fgpu-support",{"title":1034,"url":1035},"E2B: how to calculate the price of a sandbox, with current rates","https:\u002F\u002Fdocs.e2b.dev\u002Ffaq\u002Fcalculate-sandbox-price",{"title":1037,"url":1038},"E2B: Volumes beta limitations: file locking, mounts and regions","https:\u002F\u002Fdocs.e2b.dev\u002Ffaq\u002Fvolumes-beta-limitations",{"title":1040,"url":1041},"E2B: bring your own cloud (BYOC)","https:\u002F\u002Fdocs.e2b.dev\u002Fbyoc",{"title":1043,"url":1044},"E2B changelog: E2B Embed, the access token change and weekly releases","https:\u002F\u002Fdocs.e2b.dev\u002Fchangelog",{"title":1046,"url":1047},"E2B Embed: self-hosting on one machine (README)","https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fruntime\u002Ftree\u002Fmain\u002Fembed",{"title":1049,"url":1050},"E2B Embed: Docker Compose requirements and sizing","https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fruntime\u002Fblob\u002Fmain\u002Fembed\u002Fcompose\u002FREADME.md",{"title":1052,"url":1053},"E2B SDK repository, Apache-2.0","https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002FE2B",{"title":1055,"url":1056},"Firecracker: lightweight microVMs on KVM","https:\u002F\u002Fgithub.com\u002Ffirecracker-microvm\u002Ffirecracker",{"title":1058,"url":1059},"Modal pricing: per-second CPU, memory and GPU","https:\u002F\u002Fmodal.com\u002Fpricing",{"title":1061,"url":1062},"Modal sandboxes: lifetime, gVisor and VM runtimes","https:\u002F\u002Fmodal.com\u002Fdocs\u002Fguide\u002Fsandbox",{"title":1064,"url":1065},"Modal region selection: region codes","https:\u002F\u002Fmodal.com\u002Fdocs\u002Fguide\u002Fregion-selection",{"title":1067,"url":1068},"Daytona pricing: vCPU and GiB rates","https:\u002F\u002Fwww.daytona.io\u002Fpricing",{"title":1070,"url":1071},"Daytona documentation: sandbox isolation and start time","https:\u002F\u002Fwww.daytona.io\u002Fdocs\u002Fen\u002F",{"title":1073,"url":1074},"Daytona regions: shared United States and Europe","https:\u002F\u002Fwww.daytona.io\u002Fdocs\u002Fen\u002Fregions\u002F",{"title":1076,"url":1077},"Docker security: kernel namespaces, control groups and capabilities","https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Fsecurity\u002F",{"title":1079,"url":1080},"Regulation (EU) 2016\u002F679 (GDPR), EUR-Lex","https:\u002F\u002Feur-lex.europa.eu\u002Feli\u002Freg\u002F2016\u002F679\u002Foj","\u002Fimages\u002Fblog\u002Fe2b\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fe2b\u002Fog.jpg",[116,117,118],"E2B review: Firecracker sandboxes for agent code, billed per second","E2B runs each agent run in its own Firecracker microVM, with pause, resume and per-second billing. Where it fits, what the EU option costs and where self-hosting stops.","Cover art for the E2B review: agent code goes through an API into a microVM sandbox, and the result comes back into the loop.","Usage-based · Hobby free, Pro from $150 a month","Code execution sandbox",1791636874634]