[{"data":1,"prerenderedAt":633},["ShallowReactive",2],{"tool-openai-agents-sdk-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":23,"sources":33,"cover":64,"og":65,"expertise":66,"locales":67,"lang":68,"title":71,"description":72,"coverAlt":73,"url":36,"pricing":74,"kind":75,"metaTitle":76,"takeaways":77,"faq":83,"toc":96,"blocks":121,"others":417},"openai-agents-sdk","2026-09-11",10,"agents",[9,10,11,12,13],"Agent runtime","Tracing","Guardrails","MCP","Python",[15,16,17,18,19,20,21,22],"openai agents sdk","openai agents sdk vs langgraph","python agent framework comparison","openai agents sdk guardrails","agent run tracing tool calls","openai agents sdk human in the loop","openai-agents pypi","agents sdk vs responses api",[24,27,30],{"name":25,"url":26},"Model context protocol","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FModel_context_protocol",{"name":28,"url":29},"Software framework","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_framework",{"name":31,"url":32},"Agentic AI","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAgentic_AI",[34,37,40,43,46,49,52,55,58,61],{"title":35,"url":36},"OpenAI Agents SDK documentation: Intro, and Agents SDK or Responses API","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002F",{"title":38,"url":39},"OpenAI Agents SDK documentation: Running agents","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Frunning_agents\u002F",{"title":41,"url":42},"OpenAI Agents SDK documentation: Guardrails","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Fguardrails\u002F",{"title":44,"url":45},"OpenAI Agents SDK documentation: Human-in-the-loop","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Fhuman_in_the_loop\u002F",{"title":47,"url":48},"OpenAI Agents SDK documentation: Tracing","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Ftracing\u002F",{"title":50,"url":51},"OpenAI Agents SDK documentation: Configuration","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Fconfig\u002F",{"title":53,"url":54},"openai-agents 0.23.1 on PyPI, release history and licence","https:\u002F\u002Fpypi.org\u002Fproject\u002Fopenai-agents\u002F",{"title":56,"url":57},"OpenAI: The next evolution of the Agents SDK (15 April 2026)","https:\u002F\u002Fopenai.com\u002Findex\u002Fthe-next-evolution-of-the-agents-sdk\u002F",{"title":59,"url":60},"OpenAI API documentation: Agents, comparison of the three runtimes","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fagents",{"title":62,"url":63},"Arize: AI agent frameworks compared (1 October 2026)","https:\u002F\u002Farize.com\u002Fai-agents\u002Fagent-frameworks\u002F","\u002Fimages\u002Fblog\u002Fopenai-agents-sdk\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fopenai-agents-sdk\u002Fog.jpg","ai-engineer",[68,69,70],"en","de","hu","OpenAI Agents SDK: a small agent runtime with sharp edges","A review of the OpenAI Agents SDK: the runner loop, tracing, guardrails and approvals, plus what the release churn and the Responses-only features cost.","Diagram of the Agents SDK runner loop: input, agent, model call, final output, guardrails, and tool calls feeding back into the input","MIT · API pay per token","Agent framework","OpenAI Agents SDK review · Balázs Csorba",[78,79,80,81,82],"The Python package is MIT licensed, needs Python 3.10 or newer, and stood at version 0.23.1 on 2 October 2026 after 123 PyPI releases since March 2025.","The Runner caps a run at max_turns=10 by default and raises MaxTurnsExceeded, which is a sensible default most teams should keep.","Tracing is enabled by default and carries model and tool inputs and outputs, so production runs should set trace_include_sensitive_data=False.","Guardrails run beside the agent by default, so tokens are already spent when a tripwire fires; run_in_parallel=False is the setting for cost-sensitive paths.","Computer use, hosted tool search and programmatic tool calling are rejected on Chat Completions models and on non-Responses backends, which makes the provider-agnostic claim thinner than it reads.",[84,87,90,93],{"q":85,"a":86},"Is the OpenAI Agents SDK free?","The SDK itself is MIT licensed and installs with pip install openai-agents. The money goes to the API: the models the loop calls are billed per token, and OpenAI states that the harness and sandbox capabilities from April 2026 use standard API pricing based on tokens and tool use.",{"q":88,"a":89},"Can the OpenAI Agents SDK run non-OpenAI models?","It can. The package ships LiteLLM and AnyLLM adapters, reads OPENAI_BASE_URL, and the project README claims support for 100 or more models. Several capabilities are Responses-only and are rejected on Chat Completions models and on non-Responses backends, so test a complete agent run rather than a single model call.",{"q":91,"a":92},"What is the difference between the Agents SDK and the Responses API?","The Responses API is the model interface; the SDK adds a runtime around it that owns turns, tool dispatch, guardrails, handoffs and sessions. If the job is one call that returns one response, the SDK adds machinery nothing uses, and the Responses API is the smaller choice.",{"q":94,"a":95},"How does human approval of tool calls work?","Set needs_approval on a function tool, on Agent.as_tool(), on ShellTool or on ApplyPatchTool, and the run pauses with ToolApprovalItem entries in result.interruptions. Convert the result with to_state(), call state.approve() or state.reject(), and resume with Runner.run(agent, state). Callable approval rules fail closed when the arguments cannot be parsed.",[97,100,103,106,109,112,115,118],{"id":98,"title":99},"what-it-is","What it is",{"id":101,"title":102},"how-it-works","How the loop works",{"id":104,"title":105},"getting-started","Getting started",{"id":107,"title":108},"guardrails-and-approvals","Guardrails and approvals",{"id":110,"title":111},"tracing-and-cost","Tracing and cost control",{"id":113,"title":114},"where-it-shingles","Where it shingles",{"id":116,"title":117},"verdict","Verdict",{"id":119,"title":120},"sources","Sources",[122,130,133,136,139,182,183,186,195,198,216,217,220,222,225,231,232,235,247,256,257,260,272,275,281,282,285,288,350,353,354,357,372,375,383,384],{"type":123,"content":124},"paragraph",[125,129],{"tag":126,"children":127},"strong",[128],"OpenAI Agents SDK"," is the agent runtime OpenAI ships for Python and TypeScript: a small set of primitives, a turn loop, and tracing that is switched on before anyone asks for it. It is a good default for a team standardising on OpenAI models that would rather the loop belonged to a library than to hand-written asyncio. It is the wrong tool the moment the workflow turns into a state machine.",{"type":123,"content":131},[132],"It sits between the raw Responses API and a full orchestration framework. The Responses API is the model interface. The SDK adds a Runner that owns turns, tool dispatch, guardrails, handoffs and sessions. Graph runtimes such as LangGraph sit above both and encode the workflow explicitly. The SDK documentation draws the line itself: use the Responses API directly when the intention is to own the loop, tool dispatch and state handling.",{"type":134,"level":135,"id":98,"text":99},"heading",2,{"type":123,"content":137},[138],"The design is deliberately thin. An Agent is instructions plus a model plus tools. Delegation has exactly two shapes: Agent.as_tool() for a manager that keeps the conversation, and handoff() for a specialist that takes it over. Guardrails are ordinary functions that return a tripwire flag. Everything else, sessions, MCP, sandbox clients, realtime and voice, is a module around that core rather than a new abstraction to learn first.",{"type":140,"ordered":141,"items":142},"list",false,[143,153,158,163,168,172,177],[144,147,148,152],{"tag":126,"children":145},[146],"Package",": ",{"tag":149,"children":150},"code",[151],"openai-agents"," on PyPI, MIT licensed, requires Python 3.10 or newer.",[154,157],{"tag":126,"children":155},[156],"Version",": 0.23.1 on 2 October 2026, the 123rd release since 0.0.1 shipped on 4 March 2025; 77 of those releases landed in 2026 alone.",[159,162],{"tag":126,"children":160},[161],"Models",": the OpenAI Responses API by default, Chat Completions as an explicit alternative, LiteLLM and AnyLLM adapters for other providers.",[164,167],{"tag":126,"children":165},[166],"Tools",": plain Python functions behind the @function_tool decorator, plus hosted tools, computer use, shell and apply-patch.",[169,171],{"tag":126,"children":170},[12],": stdio, Streamable HTTP, the deprecated SSE transport and hosted MCP servers, each with tool filters and approval policies.",[173,176],{"tag":126,"children":174},[175],"Memory",": SQLite, SQLAlchemy, Redis, MongoDB, Dapr, encrypted and OpenAI Conversations-backed sessions.",[178,181],{"tag":126,"children":179},[180],"Durable execution",": not in the box; the documentation routes long-running runs to Temporal, DBOS, Dapr or Restate.",{"type":134,"level":135,"id":101,"text":102},{"type":123,"content":184},[185],"Runner.run() is a loop, not a function call. It sends the current input to the model, then does one of three things with what comes back: treats text of the expected output type with no tool calls as the final output, switches to another agent on a handoff, or executes the requested tools, appends their results and goes round again.",{"type":187,"attrs":188,"inner":192,"caption":193},"diagram",{"viewBox":189,"role":190,"aria-labelledby":191},"0 0 720 360","img","oa-loop-t oa-loop-d","\u003Ctitle id=\"oa-loop-t\">One turn of the OpenAI Agents SDK runner loop\u003C\u002Ftitle>\u003Cdesc id=\"oa-loop-d\">Input goes to an agent and then to a model call. A model response that carries text of the expected type and no tool calls ends the run as the final output, and both are exported as traces. Otherwise the model emits tool calls, whose results are appended to the input and the loop repeats, bounded by a max_turns limit that defaults to 10. Guardrails run alongside the agent.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"ah-oa\" 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=\"26\" class=\"d-title\">THE RUNNER LOOP\u003C\u002Ftext>\u003Ctext x=\"700\" y=\"26\" text-anchor=\"end\" class=\"d-label\">source: agents sdk docs\u003C\u002Ftext>\u003Crect x=\"20\" y=\"44\" width=\"150\" height=\"62\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"95\" y=\"70\" text-anchor=\"middle\" class=\"d-text\">input\u003C\u002Ftext>\u003Ctext x=\"95\" y=\"90\" text-anchor=\"middle\" class=\"d-small\">string or items\u003C\u002Ftext>\u003Crect x=\"205\" y=\"44\" width=\"150\" height=\"62\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"280\" y=\"70\" text-anchor=\"middle\" class=\"d-text\">agent\u003C\u002Ftext>\u003Ctext x=\"280\" y=\"90\" text-anchor=\"middle\" class=\"d-small\">instructions, tools\u003C\u002Ftext>\u003Crect x=\"390\" y=\"44\" width=\"150\" height=\"62\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"465\" y=\"70\" text-anchor=\"middle\" class=\"d-text\">model call\u003C\u002Ftext>\u003Ctext x=\"465\" y=\"90\" text-anchor=\"middle\" class=\"d-small\">Responses API\u003C\u002Ftext>\u003Crect x=\"575\" y=\"44\" width=\"125\" height=\"62\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"637\" y=\"70\" text-anchor=\"middle\" class=\"d-text\">final output\u003C\u002Ftext>\u003Ctext x=\"637\" y=\"90\" text-anchor=\"middle\" class=\"d-small\">no tool calls\u003C\u002Ftext>\u003Cpath d=\"M170 75H201\" class=\"d-line\" marker-end=\"url(#ah-oa)\" \u002F>\u003Cpath d=\"M355 75H386\" class=\"d-line\" marker-end=\"url(#ah-oa)\" \u002F>\u003Cpath d=\"M540 75H571\" class=\"d-line\" marker-end=\"url(#ah-oa)\" \u002F>\u003Crect x=\"205\" y=\"170\" width=\"150\" height=\"62\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"280\" y=\"196\" text-anchor=\"middle\" class=\"d-text\">guardrails\u003C\u002Ftext>\u003Ctext x=\"280\" y=\"216\" text-anchor=\"middle\" class=\"d-small\">input, output, tools\u003C\u002Ftext>\u003Crect x=\"390\" y=\"170\" width=\"150\" height=\"62\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"465\" y=\"196\" text-anchor=\"middle\" class=\"d-text\">tool calls\u003C\u002Ftext>\u003Ctext x=\"465\" y=\"216\" text-anchor=\"middle\" class=\"d-small\">function, MCP, hosted\u003C\u002Ftext>\u003Crect x=\"575\" y=\"170\" width=\"125\" height=\"62\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"637\" y=\"196\" text-anchor=\"middle\" class=\"d-text\">traces\u003C\u002Ftext>\u003Ctext x=\"637\" y=\"216\" text-anchor=\"middle\" class=\"d-small\">batched export\u003C\u002Ftext>\u003Cpath d=\"M280 106V168\" class=\"d-line\" marker-end=\"url(#ah-oa)\" \u002F>\u003Cpath d=\"M465 106V168\" class=\"d-line\" marker-end=\"url(#ah-oa)\" \u002F>\u003Cpath d=\"M637 106V168\" class=\"d-line\" marker-end=\"url(#ah-oa)\" \u002F>\u003Cpath d=\"M465 232V292H95V110\" class=\"d-line-accent\" marker-end=\"url(#ah-oa)\" \u002F>\u003Ctext x=\"280\" y=\"314\" text-anchor=\"middle\" class=\"d-small\">tool results are appended to the input, and the loop repeats\u003C\u002Ftext>\u003Ctext x=\"280\" y=\"340\" text-anchor=\"middle\" class=\"d-label\">max_turns defaults to 10\u003C\u002Ftext>",[194],"The run ends on text of the expected type with no tool calls. Everything else is another turn, up to the default cap of ten.",{"type":123,"content":196},[197],"That definition of final output is worth reading twice, because it is what makes the loop a loop. A run finishes when the model produces text of the requested type and asks for nothing. Anything else keeps it alive, which is why max_turns is the first setting to decide deliberately rather than inherit. Passing max_turns=None removes the limit entirely.",{"type":199,"variant":200,"title":201,"body":202},"callout","tip","Three entry points, one RunConfig",[203],[204,207,208,211,212,215],{"tag":126,"children":205},[206],"Runner.run()"," is asynchronous. ",{"tag":126,"children":209},[210],"Runner.run_sync()"," wraps it for scripts and notebooks. ",{"tag":126,"children":213},[214],"Runner.run_streamed()"," returns a RunResultStreaming whose stream_events() iterator yields typed events while the model works. All three take a RunConfig that overrides model, provider, guardrails, tracing and tool-error behaviour for a single run.",{"type":134,"level":135,"id":104,"text":105},{"type":123,"content":218},[219],"pip install openai-agents is the whole setup, and the SDK reads OPENAI_API_KEY when it first creates a client. A minimal agent with a tool and a typed answer is about twenty lines:",{"type":149,"code":221},"from pydantic import BaseModel\n\nfrom agents import Agent, Runner, function_tool\n\n\n@function_tool\ndef order_status(order_id: str) -> str:\n    \"\"\"Look up the fulfilment status of an order.\"\"\"\n    return STATUS.get(order_id, \"unknown\")\n\n\nclass Reply(BaseModel):\n    answer: str\n    order_id: str\n\n\nagent = Agent(\n    name=\"Order assistant\",\n    instructions=\"Answer with the status of the order the customer names.\",\n    tools=[order_status],\n    output_type=Reply,\n)\n\nresult = Runner.run_sync(agent, \"Where is order A-1024?\", max_turns=6)\nprint(result.final_output)\nprint(result.context_wrapper.usage.total_tokens)",{"type":123,"content":223},[224],"The decorator derives the JSON schema from the signature and the docstring, so the model sees exactly as much as that docstring states. output_type turns the final message into a validated Pydantic model instead of a string. usage is aggregated across every model call in the run, including the ones that produced tool calls and handoffs.",{"type":199,"variant":226,"title":227,"body":228},"warn","Tracing is on, and it stores payloads",[229],[230],"Tracing is enabled by default and exports to the OpenAI backend with trace_include_sensitive_data left at True, so generation spans carry model inputs and outputs and function spans carry tool arguments and results. Production runs that touch customer data should set RunConfig.trace_include_sensitive_data=False, or the environment variable OPENAI_AGENTS_TRACE_INCLUDE_SENSITIVE_DATA=0 before the process starts.",{"type":134,"level":135,"id":107,"text":108},{"type":123,"content":233},[234],"Guardrails are the part that gets misunderstood most often, because they do not all fire at the same point. Input guardrails run only for the first agent in a chain, output guardrails only for the agent that produces the final output, and neither of them looks at the delegated work in between.",{"type":140,"ordered":141,"items":236},[237,239,241,243,245],[238],"Set run_in_parallel=False on an input guardrail to block the agent before it starts. The default runs the guardrail beside the agent, which lowers latency but means tokens are already spent when a tripwire fires.",[240],"Tool guardrails wrap individual function tools and local MCP tools, and are the only kind that sees every call in a multi-agent chain.",[242],"A tripwire raises InputGuardrailTripwireTriggered or OutputGuardrailTripwireTriggered. A guardrail function that raises is treated as an unknown verdict and the runner persists the completed turn before surfacing the error.",[244],"needs_approval on a tool, on Agent.as_tool(), on ShellTool or on ApplyPatchTool pauses the run instead; the pending calls appear in result.interruptions.",[246],"Callable approval rules fail closed. If the arguments are missing, malformed or not a JSON object, the call requires manual approval rather than being waved through.",{"type":123,"content":248},[249,250,255],"Approval state is serialisable through RunState, so a paused run can sit in a queue and resume in another process. The documentation is explicit that RunState.from_json() authenticates nothing: a snapshot in untrusted hands is a set of instructions the server will execute, so it belongs in server-side storage with the reviewer authenticated by the application. That is the same approval pattern as ",{"tag":251,"to":252,"children":253},"link","\u002Fblog\u002Fhuman-in-the-loop-ai-agents",[254],"human-in-the-loop review",", with a state file instead of a socket.",{"type":134,"level":135,"id":110,"text":111},{"type":123,"content":258},[259],"Tracing is the strongest reason to pick this SDK and the least controlled part of it. Spans cover the runner, each task and turn, each agent, each generation, each function call, guardrails, handoffs and audio. The default BatchTraceProcessor exports in the background every few seconds, which means a worker can finish a job and exit before the dashboard shows the run.",{"type":140,"ordered":141,"items":261},[262,264,266,268,270],[263],"Spans emitted by default: runner, task, turn, agent, generation, function, guardrail, handoff, transcription and speech.",[265],"Turn it off globally with OPENAI_AGENTS_DISABLE_TRACING=1 or set_tracing_disabled(True), or for one run with RunConfig(tracing_disabled=True).",[267],"For a delivery guarantee, call flush_traces() after the trace context closes. Disabling tracing does not discard spans that a processor has already buffered.",[269],"add_trace_processor() adds a destination and leaves the OpenAI exporter registered. set_trace_processors() replaces the default and needs its own BatchTraceProcessor with an exporter.",[271],"The documentation lists roughly 27 external processors, among them Langfuse, MLflow, Arize Phoenix, LangSmith, Braintrust, Datadog and Pydantic Logfire.",{"type":123,"content":273},[274],"Cost control is arithmetic rather than configuration. result.context_wrapper.usage carries requests, input_tokens, output_tokens, total_tokens, per-request entries and cached and reasoning token detail; the compaction request a Responses session issues is added to the same totals. The number that matters is cost per successful run, and the lever with the most leverage is still max_turns, because a loop that needs twelve turns to fail will spend twelve turns every single time.",{"type":199,"variant":276,"title":277,"body":278},"note","Zero data retention",[279],[280],"Tracing is unavailable to organisations on a Zero Data Retention policy, so the built-in dashboard is not an option there. The same reasoning applies to any self-hosted exporter: put the redaction and the delivery in the same exporter. A redactor registered as a separate processor does not stop another processor from receiving the unredacted payload, because trace processors are independent observers.",{"type":134,"level":135,"id":113,"text":114},{"type":123,"content":283},[284],"Start with the weaknesses. Durable execution is not in the box: a run that must survive a process restart, wait hours for an approval or resume in a new container needs Temporal, DBOS, Dapr or Restate alongside it. The Python sandbox and harness work landed in 0.14.0 in April 2026, and TypeScript support was still described as future work at the time of writing. Tracing ships payloads to OpenAI by default and is simply unavailable under ZDR. And the provider-agnostic claim is thinner than it sounds: computer use, hosted tool search and programmatic tool calling are rejected on Chat Completions models and on non-Responses backends.",{"type":123,"content":286},[287],"Then there is churn. The project shipped 77 releases in the first nine months of 2026, and 0.21.0 raised the floor to openai>=3.0.0,\u003C4, which moved the default provider onto HTTPX2 and broke applications that passed a legacy httpx client. A version still prefixed 0.x at that cadence is an argument for pinning and for reading the changelog rather than the release headline.",{"type":289,"head":290,"rows":306},"table",[291,295,299,302],[292],{"tag":126,"children":293},[294],"Option",[296],{"tag":126,"children":297},[298],"Control model",[300],{"tag":126,"children":301},[180],[303],{"tag":126,"children":304},[305],"Latest release, October 2026",[307,317,328,339],[308,311,313,315],[309],{"tag":126,"children":310},[128],[312],"Model-directed loop, handoffs, agents as tools",[314],"External: Temporal, DBOS, Dapr, Restate",[316],"0.23.1",[318,322,324,326],[319],{"tag":126,"children":320},[321],"LangGraph",[323],"Explicit graph with checkpoints",[325],"Built in",[327],"1.2.14",[329,333,335,337],[330],{"tag":126,"children":331},[332],"Pydantic AI",[334],"Code orchestration, typed agents",[336],"External: Temporal, DBOS, Prefect, Restate",[338],"2.54.0",[340,344,346,348],[341],{"tag":126,"children":342},[343],"Google ADK",[345],"Model-directed agents plus workflow agents",[347],"Built in, ADK 2.0 workflow runtime",[349],"2.11.0",{"type":123,"content":351},[352],"Read the fourth column before the second. LangGraph at 1.x and ADK at 2.x sit under a compatibility promise; 0.23.1 means OpenAI can move a constructor signature in a patch release, which it has already done once with the openai client floor. The control-model column matters less than it looks: a model-directed loop is faster to build, and a graph is easier to reason about only for as long as the graph stays small.",{"type":134,"level":135,"id":116,"text":117},{"type":123,"content":355},[356],"The SDK wins on the things that are hard to retrofit. Tracing that exists before the observability code is written, approval interrupts that serialise cleanly, and MCP across four transports without a hand-rolled client are all real engineering time saved. It loses on the things that cannot be added later without a rewrite: durable execution, and an explicit control flow that makes a workflow auditable.",{"type":140,"ordered":358,"items":359},true,[360,362,364,366,368,370],[361],"Adopt it when the team is standardising on OpenAI models and the workflow is a tool loop with guardrails and approvals. That is the case it was designed for.",[363],"Adopt it when tracing is non-negotiable, because the span model and the dashboard are already wired to the runtime instead of bolted on afterwards.",[365],"Adopt it for MCP-heavy agents, where four transports and per-server tool filters save more code than the framework costs.",[367],"Do not adopt it as the only runtime if runs must survive a restart, wait for a human for hours, or resume in a fresh container. Pair it with Temporal or DBOS from the first day.",[369],"Do not adopt it for a workflow whose next step is a business rule. If the sequence is known, a graph runtime or plain code says it more honestly than a model that might not follow it.",[371],"Skip it entirely when the whole job is one model call returning one response. The Responses API plus Pydantic is smaller and cheaper.",{"type":123,"content":373},[374],"None of that is a knock-on the package. It is a small, readable, MIT-licensed library that does a narrow job properly and says so in its own documentation. The failure mode to avoid is not picking it; it is picking it because the tracing is free and then discovering a year later that the workflow logic lives in prompts nobody can diff. Keep durable execution and the business rules outside the runner.",{"type":376,"content":377},"quote",[378,382],{"tag":379,"children":380},"em",[381],"Enough features to be worth using, but few enough primitives to make it quick to learn."," — the two design principles stated in the OpenAI Agents SDK documentation.",{"type":134,"level":135,"id":119,"text":120},{"type":140,"ordered":358,"items":385},[386,390,393,396,399,402,405,408,411,414],[387],{"tag":388,"href":36,"children":389},"a",[35],[391],{"tag":388,"href":39,"children":392},[38],[394],{"tag":388,"href":42,"children":395},[41],[397],{"tag":388,"href":45,"children":398},[44],[400],{"tag":388,"href":48,"children":401},[47],[403],{"tag":388,"href":51,"children":404},[50],[406],{"tag":388,"href":54,"children":407},[53],[409],{"tag":388,"href":57,"children":410},[56],[412],{"tag":388,"href":60,"children":413},[59],[415],{"tag":388,"href":63,"children":416},[62],[418,482,531,585],{"slug":419,"published":420,"minutes":421,"category":7,"tags":422,"keywords":426,"about":433,"sources":437,"cover":474,"og":475,"expertise":66,"locales":476,"lang":68,"title":477,"description":478,"coverAlt":479,"url":440,"pricing":480,"kind":481},"mcp-reference-servers","2026-09-25",9,[12,423,424,425],"Reference servers","Tool protocol","Server SDKs",[427,428,429,430,431,432],"mcp reference servers","modelcontextprotocol servers github","write an mcp server","mcp server examples","mcp server sdk","mcp server security",[434],{"name":435,"url":436},"Model Context Protocol","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FModel_Context_Protocol",[438,441,444,447,450,453,456,459,462,465,468,471],{"title":439,"url":440},"MCP reference servers repository","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers",{"title":442,"url":443},"Repository README and server list","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Fblob\u002Fmain\u002FREADME.md",{"title":445,"url":446},"Security policy","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Fblob\u002Fmain\u002FSECURITY.md",{"title":448,"url":449},"Release process and trusted publishing","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Fblob\u002Fmain\u002FRELEASING.md",{"title":451,"url":452},"Filesystem server README","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Fblob\u002Fmain\u002Fsrc\u002Ffilesystem\u002FREADME.md",{"title":454,"url":455},"Everything server feature list","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Fblob\u002Fmain\u002Fsrc\u002Feverything\u002Fdocs\u002Ffeatures.md",{"title":457,"url":458},"MCP Registry","https:\u002F\u002Fregistry.modelcontextprotocol.io\u002F",{"title":460,"url":461},"Archived reference servers","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers-archived",{"title":463,"url":464},"Model Context Protocol documentation","https:\u002F\u002Fmodelcontextprotocol.io\u002F",{"title":466,"url":467},"TypeScript MCP SDK","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Ftypescript-sdk",{"title":469,"url":470},"Python MCP SDK","https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fpython-sdk",{"title":472,"url":473},"FastMCP on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Ffastmcp\u002F","\u002Fimages\u002Fblog\u002Fmcp-reference-servers\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fmcp-reference-servers\u002Fog.jpg",[68,69,70],"MCP reference servers: what they demonstrate and what they omit","A review of modelcontextprotocol\u002Fservers: seven reference servers, what each one teaches, the SDK versions behind them and why none of them should reach production.","Seven reference servers fanning out from a single MCP client over stdio","MIT","Protocol tooling",{"slug":483,"published":484,"minutes":6,"category":7,"tags":485,"keywords":491,"about":499,"sources":506,"cover":523,"og":524,"expertise":66,"locales":525,"lang":68,"title":526,"description":527,"coverAlt":528,"url":529,"pricing":530,"kind":486},"aider","2026-09-23",[486,487,488,489,490],"Coding agent","Terminal","Git workflow","BYO key","Open source",[483,492,493,494,495,496,497,498],"aider vs claude code","aider polyglot benchmark","ai pair programming terminal","aider leaderboard","open source coding agent","aider architect mode","aider install",[500,503],{"name":501,"url":502},"Aider","https:\u002F\u002Faider.chat\u002F",{"name":504,"url":505},"Aider on GitHub","https:\u002F\u002Fgithub.com\u002FAider-AI\u002Faider",[507,509,512,515,518,520],{"title":508,"url":502},"Aider website",{"title":510,"url":511},"Aider LLM leaderboards","https:\u002F\u002Faider.chat\u002Fdocs\u002Fleaderboards\u002F",{"title":513,"url":514},"Aider linting and testing","https:\u002F\u002Faider.chat\u002Fdocs\u002Fusage\u002Flint-test.html",{"title":516,"url":517},"Aider token limits","https:\u002F\u002Faider.chat\u002Fdocs\u002Ftroubleshooting\u002Ftoken-limits.html",{"title":519,"url":505},"Aider repository on GitHub",{"title":521,"url":522},"aider-chat on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Faider-chat\u002F","\u002Fimages\u002Fblog\u002Faider\u002Fcover.webp","\u002Fimages\u002Fblog\u002Faider\u002Fog.jpg",[68,69,70],"Aider review: git-first pair programming in the terminal","A review of Aider 0.86.2, an Apache-2.0 terminal pair programmer whose benchmark ranks models honestly and whose release cadence has stopped.","Cover art for the Aider review: a terminal session turning a single request into a row of git commits","https:\u002F\u002Faider.chat","Free · BYO API key",{"slug":532,"published":533,"minutes":421,"category":7,"tags":534,"keywords":539,"about":546,"sources":556,"cover":577,"og":578,"expertise":66,"locales":579,"lang":68,"title":580,"description":581,"coverAlt":582,"url":583,"pricing":584,"kind":486},"openhands","2026-09-09",[486,535,536,537,538],"Sandboxed execution","Automations","Self-hosted","MIT licence",[532,540,541,542,543,544,496,545],"openhands self-host","open hands coding agent","openhands vs claude code","agent canvas","openhands docker sandbox","openhands cloud pricing",[547,550,553],{"name":548,"url":549},"OpenHands","https:\u002F\u002Fwww.openhands.dev",{"name":551,"url":552},"OpenHands on GitHub","https:\u002F\u002Fgithub.com\u002FOpenHands\u002FOpenHands",{"name":554,"url":555},"Intelligent agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIntelligent_agent",[557,559,562,565,568,571,574],{"title":558,"url":552},"OpenHands README",{"title":560,"url":561},"OpenHands licence (MIT)","https:\u002F\u002Fgithub.com\u002FOpenHands\u002FOpenHands\u002Fblob\u002Fmain\u002FLICENSE",{"title":563,"url":564},"Agent Canvas 1.25.0 release notes","https:\u002F\u002Fdocs.openhands.dev\u002Fopenhands\u002Fusage\u002Fagent-canvas\u002Frelease-notes\u002Fv1.25.0.md",{"title":566,"url":567},"OpenHands sandbox overview","https:\u002F\u002Fdocs.openhands.dev\u002Fopenhands\u002Fusage\u002Fsandboxes\u002Foverview.md",{"title":569,"url":570},"OpenHands quick start","https:\u002F\u002Fdocs.openhands.dev\u002Fopenhands\u002Fusage\u002Finstallation",{"title":572,"url":573},"OpenHands pricing","https:\u002F\u002Fwww.openhands.dev\u002Fpricing",{"title":575,"url":576},"Introducing the OpenHands Index","https:\u002F\u002Fwww.openhands.dev\u002Fblog\u002Fintroducing-the-openhands-index","\u002Fimages\u002Fblog\u002Fopenhands\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fopenhands\u002Fog.jpg",[68,69,70],"OpenHands: the open-source coding agent you operate","OpenHands 1.25.0 is an MIT-licensed coding agent platform with a web canvas, a CLI, sandboxed execution and scheduled automations. A review of where it is strong and where it gets heavy.","Cover artwork for the OpenHands review showing a loop from task to agent to sandboxed run and back","https:\u002F\u002Fgithub.com\u002FAll-Hands-AI\u002FOpenHands","Free · self-host",{"slug":586,"published":587,"minutes":6,"category":7,"tags":588,"keywords":593,"about":600,"sources":604,"cover":626,"og":627,"expertise":66,"locales":628,"lang":68,"title":629,"description":630,"coverAlt":631,"url":603,"pricing":632,"kind":589},"cursor","2026-09-02",[589,590,591,592,12],"AI code editor","Coding agents","CLI","Usage-based pricing",[586,594,595,596,597,598,599],"cursor vs github copilot","cursor pricing","cursor cli","ai code editor","cursor usage limits","cursor pro plus",[601],{"name":602,"url":603},"Cursor","https:\u002F\u002Fcursor.com",[605,608,611,614,617,620,623],{"title":606,"url":607},"Cursor pricing","https:\u002F\u002Fcursor.com\u002Fpricing",{"title":609,"url":610},"Cursor models and pricing docs","https:\u002F\u002Fcursor.com\u002Fdocs\u002Fmodels-and-pricing",{"title":612,"url":613},"Cursor CLI documentation","https:\u002F\u002Fcursor.com\u002Fdocs\u002Fcli\u002Foverview",{"title":615,"url":616},"GitHub Copilot plans","https:\u002F\u002Fgithub.com\u002Ffeatures\u002Fcopilot\u002Fplans",{"title":618,"url":619},"Claude pricing","https:\u002F\u002Fclaude.com\u002Fpricing",{"title":621,"url":622},"Claude Code cost documentation","https:\u002F\u002Fdocs.claude.com\u002Fen\u002Fdocs\u002Fclaude-code\u002Fcosts",{"title":624,"url":625},"Cline pricing","https:\u002F\u002Fcline.bot\u002Fpricing","\u002Fimages\u002Fblog\u002Fcursor\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fcursor\u002Fog.jpg",[68,69,70],"Cursor reviewed: an AI code editor billed past its sticker price","Cursor bundles an editor, a terminal agent and cloud runs behind one subscription. What the two usage pools really cost, and when Copilot, Claude Code or Cline is the better buy.","Abstract pipeline artwork for the Cursor review","Free · Pro from $20 per month",1791383548744]