[{"data":1,"prerenderedAt":773},["ShallowReactive",2],{"blog-pydantic-ai-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":23,"sources":34,"cover":101,"og":102,"expertise":103,"locales":104,"lang":105,"title":108,"description":109,"coverAlt":110,"metaTitle":111,"takeaways":112,"faq":118,"toc":131,"blocks":159,"others":501},"pydantic-ai","2026-10-08",8,"agents",[9,10,11,12,13],"Agent framework","Typed Python","Structured output","Dependency injection","OpenTelemetry",[15,16,17,18,19,20,21,22],"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",[24,27,30,32],{"name":25,"url":26},"Pydantic","https:\u002F\u002Fpydantic.dev",{"name":28,"url":29},"Python (programming language)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPython_(programming_language)",{"name":12,"url":31},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDependency_injection",{"name":13,"url":33},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOpenTelemetry",[35,38,41,44,47,50,53,56,59,62,65,68,71,74,77,80,83,86,89,92,95,98],{"title":36,"url":37},"Pydantic AI documentation","https:\u002F\u002Fai.pydantic.dev\u002F",{"title":39,"url":40},"pydantic-ai 2.55.0 on PyPI (released 9 October 2026)","https:\u002F\u002Fpypi.org\u002Fproject\u002Fpydantic-ai\u002F",{"title":42,"url":43},"pydantic\u002Fpydantic-ai on GitHub: licence, stars and README","https:\u002F\u002Fgithub.com\u002Fpydantic\u002Fpydantic-ai",{"title":45,"url":46},"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":48,"url":49},"Pydantic AI version policy","https:\u002F\u002Fai.pydantic.dev\u002Fversion-policy\u002F",{"title":51,"url":52},"Pydantic AI upgrade guide: the V2 betas and the stable release","https:\u002F\u002Fai.pydantic.dev\u002Fproject\u002Fchangelog\u002F",{"title":54,"url":55},"Pydantic AI output: tool output, retries and output validators","https:\u002F\u002Fai.pydantic.dev\u002Foutput\u002F",{"title":57,"url":58},"Pydantic AI dependencies and RunContext","https:\u002F\u002Fai.pydantic.dev\u002Fdependencies\u002F",{"title":60,"url":61},"Pydantic AI models and providers","https:\u002F\u002Fai.pydantic.dev\u002Fmodels\u002Foverview\u002F",{"title":63,"url":64},"Pydantic AI unit testing with TestModel and FunctionModel","https:\u002F\u002Fai.pydantic.dev\u002Ftesting\u002F",{"title":66,"url":67},"Pydantic AI durable execution overview","https:\u002F\u002Fai.pydantic.dev\u002Fdurable_execution\u002Foverview\u002F",{"title":69,"url":70},"Pydantic Logfire: observability for Pydantic AI","https:\u002F\u002Fai.pydantic.dev\u002Flogfire\u002F",{"title":72,"url":73},"Pydantic Logfire pricing","https:\u002F\u002Fpydantic.dev\u002Fpricing",{"title":75,"url":76},"Pydantic security and compliance","https:\u002F\u002Fpydantic.dev\u002Fsecurity",{"title":78,"url":79},"OpenAI Agents SDK documentation","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002F",{"title":81,"url":82},"OpenAI Agents SDK tracing","https:\u002F\u002Fopenai.github.io\u002Fopenai-agents-python\u002Ftracing\u002F",{"title":84,"url":85},"openai\u002Fopenai-agents-python on GitHub","https:\u002F\u002Fgithub.com\u002Fopenai\u002Fopenai-agents-python",{"title":87,"url":88},"openai-agents 0.23.1 on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Fopenai-agents\u002F",{"title":90,"url":91},"langchain-ai\u002Flanggraph on GitHub","https:\u002F\u002Fgithub.com\u002Flangchain-ai\u002Flanggraph",{"title":93,"url":94},"langgraph 1.2.14 on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Flanggraph\u002F",{"title":96,"url":97},"LangGraph overview","https:\u002F\u002Fdocs.langchain.com\u002Foss\u002Fpython\u002Flanggraph\u002Foverview",{"title":99,"url":100},"LangGraph interrupts","https:\u002F\u002Fdocs.langchain.com\u002Foss\u002Fpython\u002Flanggraph\u002Finterrupts","\u002Fimages\u002Fblog\u002Fpydantic-ai\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fpydantic-ai\u002Fog.jpg","ai-engineer",[105,106,107],"en","de","hu","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.","A square, triangle and circle entering a sorting frame, equal small squares coming out below.","Pydantic AI review: typed Python agents · Balázs Csorba",[113,114,115,116,117],"Pydantic AI 2.55.0, released on 9 October 2026, is MIT-licensed and free to run. Your costs are model tokens and, if you use it, Logfire records.","The 2.0 line became stable on 23 June 2026 after seven betas and moved configuration onto capabilities, so pin the version and follow the upgrade path.","Dependencies reach your tools through a typed RunContext, and output_type validates every answer, sending a failed check back to the model before your code sees it.","Tracing is opt-in and follows OpenTelemetry, so spans can go to Logfire or to any OpenTelemetry backend. Durable runs need Temporal, DBOS, Prefect, Restate or AWS Lambda.","Pick it for typed Python services. Pick the OpenAI Agents SDK for a small OpenAI-first stack, and LangGraph when explicit graphs, checkpoints and interrupts are the product.",[119,122,125,128],{"q":120,"a":121},"How much does Pydantic AI cost?","As of October 2026, the library is MIT-licensed and free. The bills come from your model provider and, if you use Logfire, from its records: Personal is free up to 10 million records a month with ingestion paused at the cap, Team is $49 a month, Growth is $249 a month, and Enterprise is quoted.",{"q":123,"a":124},"Is the 2.x line stable enough for production?","Yes, with the usual care. Minor releases are not meant to break public APIs, but features in beta modules can change, and each major version removes what was deprecated before. Security fixes for V1 continue for at least six months after the 2.0 stable release, so plan the move.",{"q":126,"a":127},"How does it compare with the OpenAI Agents SDK and LangGraph?","The OpenAI Agents SDK is smaller and turns tracing on by default. LangGraph is built around explicit graphs with checkpoints and interrupts. Pydantic AI sits between them: typed dependencies and validated output for Python code, with a provider prefix for roughly two dozen providers.",{"q":129,"a":130},"Does Logfire receive my prompts?","Only the spans you export. Instrumentation is opt-in, the docs describe how to exclude prompts and completions from spans, and Pydantic offers a Data Processing Addendum, a SOC 2 Type 2 report on request and a list of subprocessors.",[132,135,138,141,144,147,150,153,156],{"id":133,"title":134},"what-it-is","What it is",{"id":136,"title":137},"how-it-works","How it works",{"id":139,"title":140},"getting-started","Getting started",{"id":142,"title":143},"typed-agents-and-validation","Typed dependencies and validated output",{"id":145,"title":146},"tracing-and-durable-runs","Tracing and durable runs",{"id":148,"title":149},"cost-and-deployment","Cost, hosting and data protection",{"id":151,"title":152},"where-it-falls-short","Where it falls short",{"id":154,"title":155},"verdict","Verdict",{"id":157,"title":158},"sources","Sources",[160,164,167,170,195,196,199,205,208,209,212,215,218,219,222,225,247,250,251,260,263,270,271,274,321,324,330,333,340,341,344,354,357,360,404,405,408,431,432],{"type":161,"content":162},"paragraph",[163],"Pydantic AI is the Python agent framework from the team behind Pydantic, the data validation library. Dependencies, tools and results are ordinary Python types, and every structured answer from the model is checked before your code receives it. The verdict up front – use it for typed agents inside Python services, where the team already thinks in Pydantic models. Skip it if your team builds in TypeScript, wants a visual builder as the main way to design workflows, or cannot absorb API changes between releases.",{"type":165,"level":166,"id":133,"text":134},"heading",2,{"type":161,"content":168},[169],"The current release is 2.55.0, published on PyPI on 9 October 2026. It is MIT-licensed, needs Python 3.11 or newer and has about 20,500 stars on GitHub. The project calls itself “how Python does AI”: agents, realtime voice, image generation and embeddings, typed end to end. The 2.0 line became stable on 23 June 2026, so older tutorials may still describe the 1.x API.",{"type":171,"ordered":172,"items":173},"list",false,[174,180,185,190],[175,179],{"tag":176,"children":177},"strong",[178],"Typed dependencies. ","`deps_type` declares what an agent needs, and each run receives an instance through `deps=`.",[181,184],{"tag":176,"children":182},[183],"Validated output. ","`output_type` takes a Pydantic model, a union or a list of types. The model fills it through tool calling by default.",[186,189],{"tag":176,"children":187},[188],"About two dozen providers. ","A prefix such as `openai:`, `anthropic:` or `google:` selects the provider. The directory also covers Groq, Mistral, Ollama and OpenRouter, plus any OpenAI-compatible endpoint.",[191,194],{"tag":176,"children":192},[193],"Capabilities and durability. ","Capabilities bundle tools, hooks, instructions and model settings into one reusable unit. Durable runs plug in through Temporal, DBOS, Prefect, Restate and AWS Lambda.",{"type":165,"level":166,"id":136,"text":137},{"type":161,"content":197},[198],"An agent run is a loop with a check at the end. The agent sends its instructions, the message history and the tool schemas to the model. When the model calls a tool, Pydantic AI runs your Python function with the typed context and returns the result to the model. When the model stops calling tools, its output is validated against `output_type`. A failed check goes back to the model as a retry, and the default budget for output retries is one.",{"type":200,"src":201,"alt":202,"wide":203,"caption":204},"image","\u002Fimages\u002Fblog\u002Fpydantic-ai\u002Fdiagram-6.webp","One agent run in Pydantic AI Your code passes dependencies and input to an agent. The agent sends its instructions and tool schemas to the model. When the model calls a tool, the tool runs with the typed context and its result goes back to the model. When the model finishes, its output is validated against the output type. A failed check goes back to the model as a retry, and a passing answer is returned to your code.",true,"Each run loops between the model and the tools, and every answer passes the validation gate before it leaves the agent.",{"type":161,"content":206},[207],"Dependencies are passed to your functions, never to the model. A database pool or an HTTP session can sit next to the agent without appearing in a prompt. The model only sees the instructions, the tool schemas and the messages, which is what makes the boundary worth designing on purpose.",{"type":165,"level":166,"id":139,"text":140},{"type":161,"content":210},[211],"Install with `uv add pydantic-ai` or `pip install pydantic-ai`, then set the credentials your provider expects. The example below is a support triage agent. It takes a typed dependency, calls one tool and returns a validated object.",{"type":213,"code":214},"code","from dataclasses import dataclass\nfrom typing import Literal\n\nfrom pydantic import BaseModel, Field\nfrom pydantic_ai import Agent, RunContext\n\nfrom myshop.orders import OrderService\n\n\n@dataclass\nclass SupportDeps:\n    customer_id: int\n    orders: OrderService  # your own client, injected per run\n\n\nclass Triage(BaseModel):\n    category: Literal['refund', 'shipping', 'other']\n    risk: int = Field(ge=0, le=10, description='How urgently a person should review this')\n    reply: str\n\n\nsupport = Agent(\n    'openai:gpt-6-sol',\n    deps_type=SupportDeps,\n    output_type=Triage,\n    instructions='Triage the message. Check the order before you answer.',\n)\n\n\n@support.tool\nasync def latest_order(ctx: RunContext[SupportDeps]) -> str:\n    '''Return the status of the most recent order.'''\n    return await ctx.deps.orders.latest_status(ctx.deps.customer_id)\n\n\nresult = support.run_sync(\n    'Where is my parcel?',\n    deps=SupportDeps(customer_id=42, orders=OrderService()),\n)\nprint(result.output.category, result.output.risk)",{"type":161,"content":216},[217],"Two parts of that code do the work. The `Triage` class is both the schema sent to the model and the type your code receives. An answer outside the allowed categories or the 0 to 10 risk range is retried and, if it still fails, raises an error instead of reaching your code. The `RunContext[SupportDeps]` annotation gives the tool a typed view of your client, so the editor can check every attribute you use.",{"type":165,"level":166,"id":142,"text":143},{"type":161,"content":220},[221],"Dependencies are the part I would adopt first. `deps_type` declares the type, `RunContext[Deps]` gives tools, instructions and output validators access to `ctx.deps`, and a test can swap the real client for a fake with `agent.override(deps=...)`. The wiring stays in the constructor and the run call rather than in module-level globals, which keeps the agent easy to test.",{"type":161,"content":223},[224],"Output is where the framework earns its keep. By default the model returns structured data through its tool-calling interface, and a union of types becomes one output tool per member. The `TextOutput` and `PromptedOutput` markers switch to plain text for models with unreliable tool calling. `ToolOutput` gives one output tool its own retry budget, so a complex type can get more attempts than a simple one.",{"type":171,"ordered":172,"items":226},[227,232,237,242],[228,231],{"tag":176,"children":229},[230],"`ModelRetry` ","lets a tool or output function reject a value and tell the model what to change.",[233,236],{"tag":176,"children":234},[235],"`@agent.output_validator` ","runs your own checks after parsing, for example that an order number in the answer exists.",[238,241],{"tag":176,"children":239},[240],"`Agent(retries={'output': N})` ","raises the output retry budget for the whole agent. The default is one.",[243,246],{"tag":176,"children":244},[245],"`ToolOutput(Fruit, max_retries=2)` ","gives one output type its own retry count.",{"type":161,"content":248},[249],"Testing is where the design pays back. `TestModel` calls every tool and returns a structurally valid answer, `FunctionModel` lets a test script the model’s reply, and `ALLOW_MODEL_REQUESTS=False` blocks accidental calls to real providers in CI. A unit test of the support flow then needs no API key and no network.",{"type":165,"level":166,"id":145,"text":146},{"type":161,"content":252},[253,254,259],"Tracing is opt-in. Call `logfire.configure()` and `logfire.instrument_pydantic_ai()` at start-up, and each run, model response and tool call becomes an OpenTelemetry span that follows the generative AI semantic conventions. The Logfire SDK can send the same data to any OpenTelemetry backend, which matters if the telemetry has to stay in a system the team already runs. For the wider case, read ",{"tag":255,"to":256,"children":257},"link","\u002Fblog\u002Fagent-observability-opentelemetry",[258],"agent observability with OpenTelemetry",".",{"type":161,"content":261},[262],"Durable execution is the second feature to understand. The docs list eight engines. Temporal, DBOS, Prefect, Restate and AWS Lambda are co-maintained with their vendors, and Kitaru, Apache Airflow and Absurd come as external integrations. In 2.x you attach a durability capability to the agent. The README example adds `TemporalDurability()` to an agent’s capabilities inside a Temporal workflow.",{"type":264,"variant":265,"title":266,"body":267},"callout","warn","Durable is not the same as saved",[268],[269],"A durable engine keeps one run alive across crashes and restarts. It does not store your chat threads. The docs treat saving a conversation and resuming it later as a separate problem, so plan that storage on purpose.",{"type":165,"level":166,"id":148,"text":149},{"type":161,"content":272},[273],"As of October 2026, the library costs nothing to run. The licence covers the code, so the bills come from three places: model tokens from your provider, Logfire records if you use Logfire, and the infrastructure for a durable engine if you adopt one. The Logfire plans show the shape of the second bill.",{"type":275,"head":276,"rows":285},"table",[277,279,281,283],[278],"Plan",[280],"Price",[282],"Included",[284],"What changes",[286,295,304,312],[287,289,291,293],[288],"Personal",[290],"Free",[292],"10M records a month, hard-capped",[294],"3 projects, 30-day retention, 1 seat and 2 read-only guests",[296,298,300,302],[297],"Team",[299],"$49 a month",[301],"10M records, then $2 per million",[303],"5 seats (up to 12), 10 guests, 5 projects, 30-day retention, spending cap",[305,307,309,310],[306],"Growth",[308],"$249 a month",[301],[311],"Unlimited seats, guests and projects, 90-day retention, priority support and a BAA template",[313,315,317,319],[314],"Enterprise",[316],"Custom",[318],"By contract",[320],"Cloud, Dedicated or Self-hosted; SSO, SCIM and an SLA",{"type":161,"content":322},[323],"Logfire bills records: logs, spans and metrics. The included 10 million a month are covered by the plan credit, and above that Team and Growth charge $2 per million. A team that sends 30 million records a month pays $49 plus $40 for the extra 20 million, about $89 before any model tokens. The AI gateway adds a 5 percent markup on built-in providers, while up to three of your own provider keys pass through without markup.",{"type":264,"variant":325,"title":326,"body":327},"tip","Set the cap before the first load test",[328],[329],"Personal stops ingesting at 10 million records, and Team offers a spending cap. Switch the cap on before a load test or a bulk eval run, not after the first surprising invoice.",{"type":161,"content":331},[332],"Self-hosting the library is the default, because it is just code in your own environment. Logfire’s Enterprise tier adds a self-hosted option on your own Kubernetes cluster. For data protection, three flows matter. The model provider receives prompts and tool results, so its data processing terms and region come first. Logfire receives every span you export, so exclude prompts and completions at source where you do not need them. Pydantic offers a Data Processing Addendum for GDPR, a SOC 2 Type 2 report on request and a published list of subprocessors.",{"type":161,"content":334},[335,336],"Region is a setting to check on every plan. The plan matrix ticks EU or US data region for each hosted plan, from Personal to Enterprise Cloud. Enterprise Dedicated offers any Google Cloud region, and self-hosting keeps the data wherever you run it. The pricing page does not say which region a new project gets by default, so check that before you send personal data. ",{"tag":255,"to":337,"children":338},"\u002Fblog\u002Fgdpr-llm-api-eu-data-residency",[339],"The wider data residency question for model APIs is covered in a separate article.",{"type":165,"level":166,"id":151,"text":152},{"type":161,"content":342},[343],"The main risk is churn – and the changelog is open about it. The 2.0 line went through seven betas between 20 May and 10 June 2026 before the stable release on 23 June. Its breaking changes come in two groups: removals that the V1 deprecation warnings could not announce, and changes that V1 did warn about. Removed items include the Outlines integration and its extras, and `ModelProfile` changed from a dataclass to a TypedDict. A migration is a real task, not a version bump.",{"type":264,"variant":345,"title":346,"body":347},"note","Upgrade in this order",[348,350,352],[349],"Move to the latest V1 release, at least 1.100.0, where most of the removals were first deprecated.",[351],"Run the test suite with warnings visible and fix every deprecation warning.",[353],"Read the breaking-change list, then move to 2.x and pin the version.",{"type":161,"content":355},[356],"Minor releases are frequent too. Version 2.51.0 came out on 25 September 2026 and 2.55.0 on 9 October, so a loosely pinned project sees several changes in a fortnight. The version policy promises no intentional breaking changes in minor releases, but features in a beta module are explicitly unstable and may change in ways that break existing code. Treat any import from a beta module as a pinned dependency.",{"type":161,"content":358},[359],"Keep an eye on the security notes as well. Release 2.52.0 fixed a CPU and memory problem in the local `web_fetch` tool, where deeply nested HTML could consume excessive resources. Provider-native web fetching was not affected. Finally – it is a Python library. Teams that build agents in TypeScript need a different framework, and durable engines add infrastructure that someone must run or buy.",{"type":275,"head":361,"rows":372},[362,364,366,368,370],[363],"Tool",[365],"Licence",[367],"Version, October 2026",[369],"Strongest at",[371],"Tracing",[373,384,394],[374,376,378,380,382],[375],"Pydantic AI",[377],"MIT",[379],"2.55.0",[381],"Typed dependencies and validated output in Python",[383],"Opt-in, through Logfire or OpenTelemetry",[385,387,388,390,392],[386],"OpenAI Agents SDK",[377],[389],"0.23.1",[391],"Very few primitives: agents, handoffs, guardrails, sessions",[393],"On by default, exported to OpenAI unless disabled",[395,397,398,400,402],[396],"LangGraph",[377],[399],"1.2.14",[401],"Explicit graphs with checkpoints, interrupts and fault tolerance",[403],"LangSmith, a separate platform",{"type":165,"level":166,"id":154,"text":155},{"type":161,"content":406},[407],"Pydantic AI is my default for a Python team that already models its data with Pydantic and wants agents that are typed, testable and easy to run beside the rest of the service. It is the wrong choice for a TypeScript codebase, for a team that wants a visual graph editor as its main design tool, and for any team that cannot absorb API changes between releases. In those cases, the alternatives below fit better.",{"type":171,"ordered":203,"items":409},[410,415,423],[411,414],{"tag":176,"children":412},[413],"Adopt Pydantic AI ","when your services are Python, your data is already modelled in Pydantic and you want typed tools and validated output.",[416,419,422],{"tag":176,"children":417},[418],"Pick the ",{"tag":255,"to":420,"children":421},"\u002Fblog\u002Fopenai-agents-sdk",[386]," when you are committed to OpenAI and want very few primitives. Turn tracing off or add your own processor before real customer data flows through it.",[424,427,430],{"tag":176,"children":425},[426],"Pick ",{"tag":255,"to":428,"children":429},"\u002Fblog\u002Flanggraph",[396]," when the workflow is the product: explicit state, checkpoints and named approval steps. You write more code, and you control every transition.",{"type":165,"level":166,"id":157,"text":158},{"type":171,"ordered":172,"items":433},[434,438,441,444,447,450,453,456,459,462,465,468,471,474,477,480,483,486,489,492,495,498],[435],{"tag":436,"href":37,"children":437},"a",[36],[439],{"tag":436,"href":40,"children":440},[39],[442],{"tag":436,"href":43,"children":443},[42],[445],{"tag":436,"href":46,"children":446},[45],[448],{"tag":436,"href":49,"children":449},[48],[451],{"tag":436,"href":52,"children":452},[51],[454],{"tag":436,"href":55,"children":455},[54],[457],{"tag":436,"href":58,"children":458},[57],[460],{"tag":436,"href":61,"children":461},[60],[463],{"tag":436,"href":64,"children":464},[63],[466],{"tag":436,"href":67,"children":467},[66],[469],{"tag":436,"href":70,"children":470},[69],[472],{"tag":436,"href":73,"children":473},[72],[475],{"tag":436,"href":76,"children":476},[75],[478],{"tag":436,"href":79,"children":479},[78],[481],{"tag":436,"href":82,"children":482},[81],[484],{"tag":436,"href":85,"children":485},[84],[487],{"tag":436,"href":88,"children":488},[87],[490],{"tag":436,"href":91,"children":491},[90],[493],{"tag":436,"href":94,"children":494},[93],[496],{"tag":436,"href":97,"children":497},[96],[499],{"tag":436,"href":100,"children":500},[99],[502,561,634,704],{"slug":503,"published":504,"minutes":505,"category":7,"tags":506,"keywords":512,"about":523,"sources":533,"cover":555,"og":556,"expertise":103,"locales":557,"lang":105,"title":558,"description":559,"coverAlt":560},"agent-tool-design-descriptions-errors","2026-10-17",11,[507,508,509,510,511],"AI agents","Tool use","Function calling","MCP","Agent design",[513,514,515,516,517,518,519,520,521,522],"agent tool design","writing tool descriptions for llm","function calling best practices","tool use error handling","mcp tool design","tool calling is_error","how many tools should an agent have","tool search defer_loading","agent computer interface","llm tool schema design",[524,527,530],{"name":525,"url":526},"Intelligent agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIntelligent_agent",{"name":528,"url":529},"Model Context Protocol","https:\u002F\u002Fmodelcontextprotocol.io\u002F",{"name":531,"url":532},"Poka-yoke","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPoka-yoke",[534,537,540,543,546,549,552],{"title":535,"url":536},"Anthropic Engineering: Writing effective tools for agents, with agents (Sep 2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fwriting-tools-for-agents",{"title":538,"url":539},"Anthropic Engineering: Building effective agents (Dec 2024)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fbuilding-effective-agents",{"title":541,"url":542},"Claude Platform Docs: Define tools","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fdefine-tools",{"title":544,"url":545},"Claude Platform Docs: Handle tool calls","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fhandle-tool-calls",{"title":547,"url":548},"Claude Platform Docs: Tool search tool","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Ftool-search-tool",{"title":550,"url":551},"Model Context Protocol specification 2025-11-25: Tools","https:\u002F\u002Fmodelcontextprotocol.io\u002Fspecification\u002F2025-11-25\u002Fserver\u002Ftools",{"title":553,"url":554},"OpenAI API Docs: Function calling","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Ffunction-calling","\u002Fimages\u002Fblog\u002Fagent-tool-design-descriptions-errors\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fagent-tool-design-descriptions-errors\u002Fog.jpg",[105,106,107],"Designing tools for AI agents: names, descriptions, schemas and error messages","How to design agent tools that get picked and called correctly: task-shaped tools, descriptions, schemas, compact responses and errors a model can act on.","Three rectangular slots in a base, with a block of matching width lined up over the middle slot and two wrong-width blocks beside it.",{"slug":562,"published":504,"minutes":505,"category":7,"tags":563,"keywords":569,"about":582,"sources":592,"cover":628,"og":629,"expertise":103,"locales":630,"lang":105,"title":631,"description":632,"coverAlt":633},"coding-agents-legacy-codebase-migration",[564,565,566,567,568],"Legacy migration","Coding agents","Strangler fig","Testing","Code review",[570,571,572,573,574,575,576,577,578,579,580,581],"legacy code migration ai","coding agent legacy codebase","strangler fig pattern ai","characterization tests legacy code","ai code migration review","agent assisted refactoring","legacy modernization coding agent","differential testing migration","shadow traffic migration","ai code review gate","test harness before migration","llm code migration",[583,586,589],{"name":584,"url":585},"Legacy code","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLegacy_code",{"name":587,"url":588},"Characterization test","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCharacterization_test",{"name":590,"url":591},"Strangler fig pattern","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FStrangler_fig_pattern",[593,596,598,601,604,607,610,613,616,619,622,625],{"title":594,"url":595},"Martin Fowler: Strangler Fig (2024)","https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FStranglerFigApplication.html",{"title":597,"url":588},"Wikipedia: Characterization test",{"title":599,"url":600},"Google Research: Accelerating code migrations with AI (2024)","https:\u002F\u002Fresearch.google\u002Fblog\u002Faccelerating-code-migrations-with-ai\u002F",{"title":602,"url":603},"Ziftci et al.: Migrating Code At Scale With LLMs At Google (arXiv 2504.09691)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2504.09691",{"title":605,"url":606},"Anthropic: Effective harnesses for long-running agents (2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Feffective-harnesses-for-long-running-agents",{"title":608,"url":609},"Anthropic: Redesigning source control at Anthropic (2026)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fredesigning-source-control",{"title":611,"url":612},"METR: Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity","https:\u002F\u002Fmetr.org\u002Fblog\u002F2025-07-10-early-2025-ai-experienced-os-dev-study\u002F",{"title":614,"url":615},"Chand et al.: Why Industry Migrates and When It Trusts LLMs (ESEM 2026)","https:\u002F\u002Fdrops.dagstuhl.de\u002Fentities\u002Fdocument\u002F10.4230\u002FLIPIcs.ESEM.2026.85",{"title":617,"url":618},"Li et al.: Environment-in-the-Loop: Rethinking Code Migration with LLM-based Agents (arXiv 2602.09944)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2602.09944",{"title":620,"url":621},"AWS: Amazon Q Developer just reached a $260 million dollar milestone (2024)","https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdevops\u002Famazon-q-developer-just-reached-a-260-million-dollar-milestone\u002F",{"title":623,"url":624},"OpenAI: Why SWE-bench Verified no longer measures frontier coding capabilities (2026)","https:\u002F\u002Fopenai.com\u002Findex\u002Fwhy-we-no-longer-evaluate-swe-bench-verified\u002F",{"title":626,"url":627},"GitHub Docs: About GitHub Copilot cloud agent","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Fconcepts\u002Fagents\u002Fcoding-agent\u002Fabout-coding-agent","\u002Fimages\u002Fblog\u002Fcoding-agents-legacy-codebase-migration\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fcoding-agents-legacy-codebase-migration\u002Fog.jpg",[105,106,107],"Migrating a legacy codebase with coding agents: a strangler fig playbook","How to use coding agents on a legacy migration: characterization tests first, one seam per task, review gates and differential verification.","A stack of slabs with the top two replaced by fresh ones beside a seam and a check.",{"slug":635,"published":504,"minutes":636,"category":7,"tags":637,"keywords":641,"about":653,"sources":663,"cover":698,"og":699,"expertise":103,"locales":700,"lang":105,"title":701,"description":702,"coverAlt":703},"background-agents-async-pr-workflow",12,[565,638,639,568,640],"Pull requests","CI","Automation",[642,643,644,645,646,647,648,649,650,651,652],"background coding agent","async coding agent","cloud coding agent pull request","copilot coding agent limits","codex cloud tasks","claude code cloud sessions","jules coding agent limits","agent pull request review","coding agent sandbox","agent CI gating","cost per merged pull request",[654,657,660],{"name":655,"url":656},"Software agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_agent",{"name":658,"url":659},"Pull request","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDistributed_version_control",{"name":661,"url":662},"Continuous integration","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FContinuous_integration",[664,665,668,671,674,677,680,683,686,689,692,695],{"title":626,"url":627},{"title":666,"url":667},"GitHub Docs: Risks and mitigations for Copilot cloud agent","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Fconcepts\u002Fagents\u002Fcloud-agent\u002Frisks-and-mitigations",{"title":669,"url":670},"OpenAI Developers: Codex cloud environments","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fcloud\u002Fenvironments",{"title":672,"url":673},"Anthropic: Use Claude Code in the cloud","https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fclaude-code-on-the-web",{"title":675,"url":676},"Google Jules: Limits and plans","https:\u002F\u002Fjules.google\u002Fdocs\u002Fusage-limits\u002F",{"title":678,"url":679},"Google Jules: Getting started","https:\u002F\u002Fjules.google\u002Fdocs\u002F",{"title":681,"url":682},"GitHub Docs: About protected branches","https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fconfiguring-branches-and-merges-in-your-repository\u002Fmanaging-protected-branches\u002Fabout-protected-branches",{"title":684,"url":685},"GitHub Docs: Models and pricing for GitHub Copilot","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Freference\u002Fcopilot-billing\u002Fmodels-and-pricing",{"title":687,"url":688},"OpenAI Developers: Codex pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fpricing",{"title":690,"url":691},"Ehsani et al.: Where Do AI Coding Agents Fail? An Empirical Study of Failed Agentic Pull Requests in GitHub (MSR 2026, arXiv 2601.15195)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2601.15195",{"title":693,"url":694},"Peralta et al.: Why Are Agentic Pull Requests Merged or Rejected? An Empirical Study (MSR 2026, arXiv 2605.22534)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2605.22534",{"title":696,"url":697},"DORA: State of AI-assisted Software Development 2025","https:\u002F\u002Fdora.dev\u002Fdora-report-2025","\u002Fimages\u002Fblog\u002Fbackground-agents-async-pr-workflow\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fbackground-agents-async-pr-workflow\u002Fog.jpg",[105,106,107],"Background coding agents that open PRs: a practical async workflow","How async coding agents queue tasks, run in sandboxes, open draft PRs and pass CI. Provider limits, cost controls, review design and failure modes.","One card in a tray fanning out to five pads, all arrows leading to one page behind a gate.",{"slug":705,"published":706,"minutes":707,"category":7,"tags":708,"keywords":714,"about":726,"sources":734,"cover":767,"og":768,"expertise":103,"locales":769,"lang":105,"title":770,"description":771,"coverAlt":772},"context-rot-compaction-long-running-agents","2026-10-16",10,[709,710,711,712,713],"Context rot","Compaction","Context engineering","Long-running agents","Agent memory",[715,716,717,718,719,720,721,722,723,724,725],"context rot","context rot LLM","compaction AI agents","context engineering","long-running agents context window","Claude compaction API","context editing clear tool results","OpenAI responses compaction","lost in the middle LLM","agent context management","sub-agents context isolation",[727,730,733],{"name":728,"url":729},"Context window","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLarge_language_model#Context_window",{"name":731,"url":732},"Attention (machine learning)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAttention_(machine_learning)",{"name":525,"url":526},[735,738,741,744,747,749,752,755,758,761,764],{"title":736,"url":737},"Chroma: Context Rot: How Increasing Input Tokens Impacts LLM Performance (Jul 2025)","https:\u002F\u002Fresearch.trychroma.com\u002Fcontext-rot",{"title":739,"url":740},"Liu et al.: Lost in the Middle: How Language Models Use Long Contexts (2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2307.03172",{"title":742,"url":743},"Modarressi et al.: NoLiMa: Long-Context Evaluation Beyond Literal Matching (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.05167",{"title":745,"url":746},"Anthropic: Effective context engineering for AI agents (Sep 2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Feffective-context-engineering-for-ai-agents",{"title":748,"url":606},"Anthropic: Effective harnesses for long-running agents (Nov 2025)",{"title":750,"url":751},"Claude API docs: Compaction at a token threshold","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcompaction-threshold",{"title":753,"url":754},"Claude API docs: Compaction on demand","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcompaction-on-demand",{"title":756,"url":757},"Claude API docs: Context editing","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcontext-editing",{"title":759,"url":760},"Claude API docs: Memory tool","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fmemory-tool",{"title":762,"url":763},"OpenAI API docs: Compaction","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fcompaction",{"title":765,"url":766},"Cognition: Don't Build Multi-Agents","https:\u002F\u002Fcognition.ai\u002Fblog\u002Fdont-build-multi-agents","\u002Fimages\u002Fblog\u002Fcontext-rot-compaction-long-running-agents\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fcontext-rot-compaction-long-running-agents\u002Fog.jpg",[105,106,107],"Context rot in long-running agents: clearing, compaction, memory and sub-agents","Why LLM accuracy drops as context grows, and how clearing tool results, compaction, notes and sub-agents keep long-running agents on track.","A small square press squeezing a tall stack of sheets into a short one, two notes branching off.",1792261155558]