[{"data":1,"prerenderedAt":748},["ShallowReactive",2],{"blog-llamaindex-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":22,"sources":29,"cover":56,"og":57,"expertise":58,"locales":59,"lang":60,"title":63,"description":64,"coverAlt":65,"metaTitle":66,"takeaways":67,"faq":73,"toc":86,"blocks":111,"others":477},"llamaindex","2026-07-14",10,"agents",[9,10,11,12,13],"Agent framework","RAG","Python","Document parsing","Workflows",[4,15,16,17,18,19,20,21],"llamaindex vs langgraph","llamaindex workflows","llama index agent framework","llamaparse pricing","rag framework python","durable workflows python","document agent framework",[23,26],{"name":24,"url":25},"LlamaIndex","https:\u002F\u002Fgithub.com\u002Frun-llama\u002Fllama_index",{"name":27,"url":28},"Retrieval-augmented generation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation",[30,32,35,38,41,44,47,50,53],{"title":31,"url":25},"LlamaIndex repository README and focus note",{"title":33,"url":34},"Agent Workflows: introduction","https:\u002F\u002Fdevelopers.llamaindex.ai\u002Fpython\u002Fllamaagents\u002Fworkflows\u002F",{"title":36,"url":37},"Agent Workflows: writing durable workflows","https:\u002F\u002Fdevelopers.llamaindex.ai\u002Fpython\u002Fllamaagents\u002Fworkflows\u002Fdurable_workflows\u002F",{"title":39,"url":40},"Agent Workflows: observability","https:\u002F\u002Fdevelopers.llamaindex.ai\u002Fpython\u002Fllamaagents\u002Fworkflows\u002Fobservability\u002F",{"title":42,"url":43},"LlamaAgents overview","https:\u002F\u002Fdevelopers.llamaindex.ai\u002Fpython\u002Fllamaagents\u002Foverview\u002F",{"title":45,"url":46},"llama-index-core on PyPI","https:\u002F\u002Fpypi.org\u002Fproject\u002Fllama-index-core\u002F",{"title":48,"url":49},"LlamaIndex and LlamaParse pricing","https:\u002F\u002Fwww.llamaindex.ai\u002Fpricing",{"title":51,"url":52},"LiteParse documentation","https:\u002F\u002Fdevelopers.llamaindex.ai\u002Fliteparse\u002F",{"title":54,"url":55},"LangGraph on GitHub","https:\u002F\u002Fgithub.com\u002Flangchain-ai\u002Flanggraph","\u002Fimages\u002Fblog\u002Fllamaindex\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllamaindex\u002Fog.jpg","ai-engineer",[60,61,62],"en","de","hu","LlamaIndex review: the widest data toolkit, with its centre of gravity already moved","LlamaIndex in 2026: an MIT-licensed Python data and agent framework with 300+ integrations, event-driven Workflows, and a company that has moved its focus to LlamaParse.","Eight spokes around a central square hub, one much longer spoke reaching a distant box.","LlamaIndex: wide toolkit, shifting focus · Balázs Csorba",[68,69,70,71,72],"LlamaIndex is still the widest open-source data toolkit for LLM applications: more than 300 integration packages, one thin adapter each, on top of a small set of core abstractions.","Workflows, its orchestration layer, is event-driven: a step takes an event and returns an event, the graph is derived from type annotations, and it is validated before the run starts.","Durability is opt-in and hand-written. A run is ephemeral by default; snapshots come from `Context.to_dict()` plus a loop the team writes, and resume is at-least-once, so steps must be safe to repeat.","The company's own README now states that the focus is document parsing and extraction. LlamaParse is the paid product, priced in credits, and LiteParse is the local open-source parser.","The verdict: use the open-source core, and specifically Workflows as a small library, but keep the framework's blast radius small, because the maintenance direction has plainly moved.",[74,77,80,83],{"q":75,"a":76},"Is LlamaIndex still worth using in 2026?","Yes, with a narrowed scope. The MIT-licensed core is maintained, `llama-index-core` was at version 0.14.25 on 21 September 2026, and the Workflows orchestration layer is genuinely well designed for branching and looping logic. What has changed is the company's stated focus, which the README puts on document parsing and extraction rather than on the framework.",{"q":78,"a":79},"What are LlamaIndex Workflows and how do they work?","A workflow is a subclass of `Workflow` with methods decorated by `@step`. Each step accepts one event type and returns another, and the framework routes by type annotation, so branches are ordinary `if` statements and loops are steps returning an event handled earlier. Concurrency is a step returning `list[Event]` paired with a step accepting `list[Event]`. The event graph is validated before the run starts.",{"q":81,"a":82},"How does LlamaIndex handle durability and retries?","It does not, by default. Once `run()` returns, the state is gone. The documented mechanism is a checkpoint loop: serialise the context with `Context.to_dict()` when a `StepStateChanged` event marks a step as finished, then rebuild it with `Context.from_dict()` and call `run(ctx=...)`. Resume is at-least-once, so a step in flight when the snapshot was taken runs again. The DBOS runtime plugin is the alternative that removes the loop.",{"q":84,"a":85},"How much does LlamaParse cost?","The pricing page sells credits rather than seats: 1,000 credits at $1.25, 10,000 credits free, 40,000 on the $50 starter tier and 400,000 on the $500 pro tier, with pay-as-you-go caps of $500 and $5,000 a month. Concurrent parse jobs are 5 on free and starter, 20 on pro and 100 on enterprise. Parse, extract, classify and index all draw on the same balance.",[87,90,93,96,99,102,105,108],{"id":88,"title":89},"what-it-is","What it is",{"id":91,"title":92},"how-it-works","How Workflows works",{"id":94,"title":95},"getting-started","Getting started",{"id":97,"title":98},"durability","Durability and retries",{"id":100,"title":101},"where-it-falls-short","Where it falls short",{"id":103,"title":104},"the-pivot","The pivot to document processing",{"id":106,"title":107},"verdict","Verdict",{"id":109,"title":110},"sources","Sources",[112,116,119,122,142,165,166,192,198,226,236,237,240,242,264,283,284,305,307,322,323,326,383,386,393,394,397,412,415,421,422,425,439,443,446,447],{"type":113,"content":114},"paragraph",[115],"LlamaIndex is an MIT-licensed Python framework for wiring LLM applications to data. It began as a set of connectors and index abstractions for retrieval, and it is still the widest such toolkit: the repository publishes more than 300 integration packages covering model providers, embedding models, vector stores, document loaders and rerankers. That breadth is why most teams meet the project first, and why it stays useful even though the company's own attention has moved elsewhere. The position taken here is simple: use the open-source core, and be deliberate about which hosted parts get adopted.",{"type":113,"content":117},[118],"It sits between the model provider and the application. Nothing in the core talks to a model provider directly; every model, embedder and vector store arrives through an integration package implementing a core abstract class. That is a clean boundary and also the source of the main complaint: the same abstraction has to cover OpenAI, a local Ollama process and a dozen embedding models, so the useful common denominator is narrower than the surface area suggests. Against LangGraph it competes for the same orchestration role, against LangChain it competes on data handling, and against a hand-assembled vector store plus reranker it competes on convenience rather than capability.",{"type":120,"level":121,"id":88,"text":89},"heading",2,{"type":113,"content":123},[124,125,129,130,133,134,137,138,141],"Package layout is the first thing to check, and it is where most confusion starts. ",{"tag":126,"children":127},"code",[128],"llama-index-core"," holds the abstractions and ships Workflows with them. ",{"tag":126,"children":131},[132],"llama-index"," is the starter package that installs core plus a selection of integrations. Workflows also publishes on its own as ",{"tag":126,"children":135},[136],"llama-index-workflows",", and when it arrives through core it is imported as ",{"tag":126,"children":139},[140],"llama_index.core.workflow",". Everything else is a separate install, which is the only reason the dependency tree stays workable.",{"type":143,"ordered":144,"items":145},"list",false,[146,151,153,155,157,163],[147,148,150],"MIT licence. The current ",{"tag":126,"children":149},[128]," release is 0.14.25, published on 21 September 2026.",[152],"More than 300 integration packages on PyPI, each one a thin adapter over a core abstract class.",[154],"Workflows, the orchestration layer, is event-driven: a step receives an event and returns another, and the framework routes by type annotation rather than by a declared edge.",[156],"The event graph is validated before a run starts. Workflows where an event has no producer, a produced event has no consumer, or no terminal event is reachable are rejected.",[158,159,162],"Runs are ephemeral by default. Persistence is opt-in through ",{"tag":126,"children":160},[161],"Context.to_dict()"," snapshots, or through a runtime plugin such as DBOS that journals step transitions into a database.",[164],"Python is the practical target for the framework. Only LiteParse, the company's new local parser, ships bindings beyond Python.",{"type":120,"level":121,"id":91,"text":92},{"type":113,"content":167},[168,169,172,173,176,177,180,181,184,185,188,189,191],"Workflows is the part worth understanding, because it is also the part that outlives the framework's RAG reputation. A workflow is a subclass of ",{"tag":126,"children":170},[171],"Workflow"," whose methods are decorated with ",{"tag":126,"children":174},[175],"@step",". Each step accepts one event type and returns another; returning the start event's type begins a run, returning ",{"tag":126,"children":178},[179],"StopEvent"," ends it. Branches are ordinary ",{"tag":126,"children":182},[183],"if"," statements that return different event types, and a loop is a step that returns an event type handled earlier in the graph. Concurrency is a step that returns ",{"tag":126,"children":186},[187],"list[Event]",", paired with another step that accepts ",{"tag":126,"children":190},[187]," and acts as the fan-in.",{"type":193,"src":194,"alt":195,"wide":196,"caption":197},"image","\u002Fimages\u002Fblog\u002Fllamaindex\u002Fdiagram-7.webp","Workflows: typed events move the run forward A start event triggers a retrieval step that fans out over eight parallel workers, a reranking step, and a terminal stop event. Below, a checkpoint step serialises the context to JSON after each finished step, and a resume path replays only the unfinished work.",true,"The graph is derived from the step signatures and validated before the first event is dispatched. Persistence is not part of the runtime: it is a loop the team writes around it.",{"type":143,"ordered":144,"items":199},[200,205,210,216],[201,202,204],"Return ",{"tag":126,"children":203},[187]," when a step has a finite batch and can produce every work item before downstream workers start.",[206,207,209],"Accept ",{"tag":126,"children":208},[187]," when the step needs the whole batch of results before it can continue.",[211,212,215],"Call ",{"tag":126,"children":213},[214],"ctx.send_event(...)"," when the number of events is unknown in advance, or when an event has to be dispatched from outside a step.",[217,218,221,222,225],"Use ",{"tag":126,"children":219},[220],"ctx.store"," for shared per-run state, and ",{"tag":126,"children":223},[224],"Resource(...)"," for clients, models and configuration that must not be serialised into a snapshot.",{"type":113,"content":227},[228,229,231,232,235],"The type annotations are load-bearing rather than decorative. Before execution the framework derives the event graph from the step signatures and refuses to start a workflow with an unproduced event, an unconsumed event or no reachable ",{"tag":126,"children":230},[179],". That catches a class of wiring bug that a hand-written function composition does not catch at all, and it is the strongest argument for the design. The price is that a deliberately dynamic workflow has to fall back on ",{"tag":126,"children":233},[234],"ctx.send_event"," and declare which static checks to skip, which in practice means a workflow becomes progressively less checkable as it becomes more capable.",{"type":120,"level":121,"id":94,"text":95},{"type":113,"content":238},[239],"The smallest useful workflow is about twenty lines. Two install shapes are supported and they differ in the import path, which is the detail that catches people:",{"type":126,"code":241},"import asyncio\n\nfrom llama_index.core import VectorStoreIndex\nfrom workflows import Workflow, step\nfrom workflows.events import Event, StartEvent, StopEvent\n\n\nclass Answered(Event):\n    question: str\n    answer: str\n\n\nclass TriageFlow(Workflow):\n    index: VectorStoreIndex\n\n    @step\n    async def retrieve(self, ev: StartEvent) -> Answered:\n        retriever = self.index.as_retriever(similarity_top_k=8)\n        nodes = await retriever.aretrieve(ev.question)\n        best = max(nodes, key=lambda n: n.score or 0.0)\n        return Answered(question=ev.question, answer=best.node.get_content())\n\n    @step\n    async def answer(self, ev: Answered) -> StopEvent:\n        return StopEvent(result=ev.answer)\n\n\nasync def main():\n    flow = TriageFlow(index=VectorStoreIndex.from_documents(documents), timeout=60)\n    result = await flow.run(question=\"What is the refund window?\")\n    print(result.result)\n\nasyncio.run(main())",{"type":113,"content":243},[244,247,248,251,252,255,256,259,260,263],{"tag":126,"children":245},[246],"run()"," returns a ",{"tag":126,"children":249},[250],"WorkflowHandler",". It is awaitable, and keeping the handler instead of awaiting it inline also gives access to ",{"tag":126,"children":253},[254],"stream_events()"," for progress reporting. The ",{"tag":126,"children":257},[258],"timeout"," argument is in seconds and is set on the constructor. Every step is async by design, so a standalone script needs a single ",{"tag":126,"children":261},[262],"asyncio.run"," entry point; inside FastAPI or a notebook it is not necessary.",{"type":265,"variant":266,"title":267,"body":268},"callout","tip","Choose the install shape deliberately",[269],[270,271,273,274,276,277,279,280,282],"If only the orchestration is needed, install ",{"tag":126,"children":272},[136]," alone; install ",{"tag":126,"children":275},[128]," when the retrieval components come with it, because that package re-exports Workflows under ",{"tag":126,"children":278},[140],". The starter package ",{"tag":126,"children":281},[132]," pulls in a default selection of integrations, which most applications replace on the first day anyway.",{"type":120,"level":121,"id":97,"text":98},{"type":113,"content":285},[286,287,289,290,292,293,296,297,300,301,304],"Workflows are ephemeral by default: once ",{"tag":126,"children":288},[246]," returns, the state is gone and the next run starts from nothing. For a fan-out over hundreds of documents that should not restart from zero, the documented mechanism is a checkpoint loop. ",{"tag":126,"children":291},[161]," serialises the in-flight events and the state store, ",{"tag":126,"children":294},[295],"Context.from_dict()"," rebuilds them, and ",{"tag":126,"children":298},[299],"run(ctx=...)"," continues in a different process. There is no built-in checkpointer to switch on: the run emits an internal ",{"tag":126,"children":302},[303],"StepStateChanged"," event when a step finishes, and that is the signal to snapshot.",{"type":126,"code":306},"import json\n\nfrom workflows.events import StepState, StepStateChanged\n\nhandler = flow.run(question=q)\n\nasync for ev in handler.stream_events(expose_internal=True):\n    if isinstance(ev, StepStateChanged) and ev.step_state == StepState.NOT_RUNNING:\n        json.dump(handler.ctx.to_dict(), open(\"run.json\", \"w\"))\n\nresult = await handler\n\n# after a restart: resume from the last snapshot\nctx = Context.from_dict(flow, json.load(open(\"run.json\")))\nresult = await flow.run(ctx=ctx)",{"type":113,"content":308},[309,310,313,314,317,318,321],"Two properties of this design surface in operations. Resume is at-least-once: a step that was mid-execution when the snapshot was taken is rewound and runs again, so up to ",{"tag":126,"children":311},[312],"num_workers"," items are duplicated. And the snapshot is JSON, so a value the serialiser cannot encode makes ",{"tag":126,"children":315},[316],"to_dict()"," raise and the whole snapshot fail, not just the offending field. Heavy inputs therefore belong in a ",{"tag":126,"children":319},[320],"Resource",", which is re-created on resume instead of being serialised. Teams that would rather not own the loop can use the DBOS runtime plugin, which journals step transitions into a database and needs no checkpoint code.",{"type":120,"level":121,"id":100,"text":101},{"type":113,"content":324},[325],"The weaknesses are structural rather than bugs. Breadth is a maintenance surface: with hundreds of integrations, an upgrade can move the model wrapper you did not mean to touch, and pinning one integration often means pinning core. The high-level API hides enough that a prototype can reach production without anyone recording which chunk size, which top-k and which prompt template produced the answer; the defaults are convenient and are not documented as defaults. Durability is opt-in and hand-written, which is the opposite of what a long-running batch job wants. And the company behind the framework has publicly narrowed its focus, which is awkward to evaluate in 2026.",{"type":327,"head":328,"rows":337},"table",[329,331,333,335],[330],"Framework",[332],"Orchestration model",[334],"Durability and state",[336],"Where it wins",[338,350,361,372],[339,344,346,348],[340],{"tag":341,"children":342},"strong",[343],"LlamaIndex Workflows",[345],"Event-driven steps, control flow in plain Python",[347],"No built-in checkpointer; context snapshots written by the team, or the DBOS runtime plugin",[349],"Retrieval and document components live in the same library",[351,355,357,359],[352],{"tag":341,"children":353},[354],"LangGraph",[356],"Explicit state graph with conditional edges",[358],"Durable execution and checkpointers are the default",[360],"State transitions are the artefact, and stay inspectable as a graph",[362,366,368,370],[363],{"tag":341,"children":364},[365],"Haystack",[367],"Pipelines of typed components",[369],"Per-component error branches and retries",[371],"A stable component catalogue for retrieval-heavy applications",[373,377,379,381],[374],{"tag":341,"children":375},[376],"DSPy",[378],"Declarative modules, optimised offline against a metric",[380],"None; it is not an orchestration runtime",[382],"Prompt and module tuning, before any serving code exists",{"type":113,"content":384},[385],"Read the durability column across and the practical split is legible. LangGraph makes checkpointing the default and buys that by making the graph explicit, which costs cognition and pays in legibility. Workflows keeps control in plain Python, which reads better and inspects worse: a workflow that fans out over 500 documents is 500 concurrent calls whose ordering no tool is helping you see. For a team whose work is to reason about state transitions, that is the wrong trade. For a team that wants to write ordinary Python and have it behave, it is the right one.",{"type":113,"content":387},[388,389,392],"A second caveat belongs here. A dynamic workflow loses static analysis, and the documentation is explicit that unreachable steps and one-off events are exactly what those checks cannot see. Migrating a hand-drawn graph into Workflows tends to reach for ",{"tag":126,"children":390},[391],"skip_graph_checks"," early, which quietly disables the check that catches dead branches, which is the same check that would have caught the wiring mistake in the first place.",{"type":120,"level":121,"id":103,"text":104},{"type":113,"content":395},[396],"The repository README now carries an unmissable note: the current focus of LlamaIndex is document parsing and extraction, and LlamaParse is the company's enterprise platform for it. That changes what a maintenance budget is funding. The integration packages still ship and still work; what is no longer guaranteed is that each of them is extended when a new provider appears.",{"type":143,"ordered":144,"items":398},[399,401,403,405,410],[400],"LlamaParse is the paid product: agentic OCR, parsing, extraction and indexing, sold in credits rather than in seats.",[402],"LiteParse is the open-source counterweight: a Rust parser that runs locally with no LLM, no cloud dependency and no API key, with bindings for TypeScript, Python, Rust and browser WASM.",[404],"ParseBench and ExtractBench are the company's own public benchmarks for parsing and extraction.",[406,407,409],"The framework stays MIT-licensed and published on PyPI, with ",{"tag":126,"children":408},[128]," at 0.14.25 as of 21 September 2026.",[411],"The result is a split strategy: open tooling for local parsing, a hosted platform for hard documents, and the agent framework in between as the integration surface.",{"type":113,"content":413},[414],"That is a defensible business decision and a mild warning for anyone choosing a framework now. The parts of the stack most likely to be maintained are the parts behind the paywall, and the MIT core is what remains useful as a library. Read it as an argument for keeping the framework's blast radius small: use Workflows for orchestration, keep loading and parsing in house where that is possible, and be explicit about which calls leave your infrastructure.",{"type":265,"variant":416,"title":417,"body":418},"note","LlamaParse pricing, in numbers",[419],[420],"The pricing page sells credits, not seats: 1,000 credits at $1.25, 10,000 credits on the free tier, 40,000 on the $50 starter tier and 400,000 on the $500 pro tier, with pay-as-you-go caps of $500 and $5,000 a month. Concurrent parse jobs are 5 on free and starter, 20 on pro and 100 on enterprise. Parse, extract, classify and index all draw the same balance, and the same table lists smart result caching with a re-parse at zero credits, which is worth confirming for a specific parse configuration rather than assuming.",{"type":120,"level":121,"id":106,"text":107},{"type":113,"content":423},[424],"The verdict is that LlamaIndex remains the most complete answer to a narrow question, how to get documents into an LLM application without writing the integration layer yourself, and a mediocre answer to the broader question of how to orchestrate an agent. Workflows is genuinely good at turning branching logic into typed, validated Python, and its at-least-once checkpoint model is honest about its own failure semantics. What the framework does not offer is a runtime to point at and watch: no state graph to inspect, no persistence on by default, and a maintenance direction that has plainly moved elsewhere.",{"type":143,"ordered":196,"items":426},[427,429,431,433,435,437],[428],"Use it when most of your data is documents and the connector, chunker, embedder and reranker abstractions are already written for you. That is a real saving, and it was the original purpose.",[430],"Use Workflows on its own as a small library when the orchestration is branching, looping Python currently tangled inside asyncio. The typed event graph and the pre-run validation are the reason.",[432],"Do not pick it for a graph that has to be reasoned about. If the state transitions are the artefact under scrutiny, an explicit graph beats Python control flow.",[434],"Do not pick it for the hosted platform. LlamaParse, Extract and the index service are a separate paid product with credit pricing, and tying your ingestion bill to a framework is a decision rather than a default.",[436],"Avoid it for a TypeScript or Go stack. The core is Python; only the new LiteParse parser ships broader bindings.",[438],"Re-evaluate in a year if the integration breadth is load-bearing. With the company's focus on parsing and extraction, the long tail of vector store and embedder integrations is the part most exposed to slow maintenance.",{"type":440,"content":441},"quote",[442],"The current focus of LlamaIndex is to build the best AI-powered engine for document parsing and extraction.",{"type":113,"content":444},[445],"That sentence sits in the project README rather than in a blog post, which is unusual and worth noticing: the framework's own maintainers are the ones stating where the roadmap is going. Read as engineering, it says the orchestration layer is maintained but is not the destination, and the paid document pipeline is.",{"type":120,"level":121,"id":109,"text":110},{"type":143,"ordered":196,"items":448},[449,453,456,459,462,465,468,471,474],[450],{"tag":451,"href":25,"children":452},"a",[31],[454],{"tag":451,"href":34,"children":455},[33],[457],{"tag":451,"href":37,"children":458},[36],[460],{"tag":451,"href":40,"children":461},[39],[463],{"tag":451,"href":43,"children":464},[42],[466],{"tag":451,"href":46,"children":467},[45],[469],{"tag":451,"href":49,"children":470},[48],[472],{"tag":451,"href":52,"children":473},[51],[475],{"tag":451,"href":55,"children":476},[54],[478,537,610,680],{"slug":479,"published":480,"minutes":481,"category":7,"tags":482,"keywords":488,"about":499,"sources":509,"cover":531,"og":532,"expertise":58,"locales":533,"lang":60,"title":534,"description":535,"coverAlt":536},"agent-tool-design-descriptions-errors","2026-10-17",11,[483,484,485,486,487],"AI agents","Tool use","Function calling","MCP","Agent design",[489,490,491,492,493,494,495,496,497,498],"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",[500,503,506],{"name":501,"url":502},"Intelligent agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIntelligent_agent",{"name":504,"url":505},"Model Context Protocol","https:\u002F\u002Fmodelcontextprotocol.io\u002F",{"name":507,"url":508},"Poka-yoke","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPoka-yoke",[510,513,516,519,522,525,528],{"title":511,"url":512},"Anthropic Engineering: Writing effective tools for agents, with agents (Sep 2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fwriting-tools-for-agents",{"title":514,"url":515},"Anthropic Engineering: Building effective agents (Dec 2024)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fbuilding-effective-agents",{"title":517,"url":518},"Claude Platform Docs: Define tools","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fdefine-tools",{"title":520,"url":521},"Claude Platform Docs: Handle tool calls","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fhandle-tool-calls",{"title":523,"url":524},"Claude Platform Docs: Tool search tool","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Ftool-search-tool",{"title":526,"url":527},"Model Context Protocol specification 2025-11-25: Tools","https:\u002F\u002Fmodelcontextprotocol.io\u002Fspecification\u002F2025-11-25\u002Fserver\u002Ftools",{"title":529,"url":530},"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",[60,61,62],"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":538,"published":480,"minutes":481,"category":7,"tags":539,"keywords":545,"about":558,"sources":568,"cover":604,"og":605,"expertise":58,"locales":606,"lang":60,"title":607,"description":608,"coverAlt":609},"coding-agents-legacy-codebase-migration",[540,541,542,543,544],"Legacy migration","Coding agents","Strangler fig","Testing","Code review",[546,547,548,549,550,551,552,553,554,555,556,557],"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",[559,562,565],{"name":560,"url":561},"Legacy code","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLegacy_code",{"name":563,"url":564},"Characterization test","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCharacterization_test",{"name":566,"url":567},"Strangler fig pattern","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FStrangler_fig_pattern",[569,572,574,577,580,583,586,589,592,595,598,601],{"title":570,"url":571},"Martin Fowler: Strangler Fig (2024)","https:\u002F\u002Fmartinfowler.com\u002Fbliki\u002FStranglerFigApplication.html",{"title":573,"url":564},"Wikipedia: Characterization test",{"title":575,"url":576},"Google Research: Accelerating code migrations with AI (2024)","https:\u002F\u002Fresearch.google\u002Fblog\u002Faccelerating-code-migrations-with-ai\u002F",{"title":578,"url":579},"Ziftci et al.: Migrating Code At Scale With LLMs At Google (arXiv 2504.09691)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2504.09691",{"title":581,"url":582},"Anthropic: Effective harnesses for long-running agents (2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Feffective-harnesses-for-long-running-agents",{"title":584,"url":585},"Anthropic: Redesigning source control at Anthropic (2026)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Fredesigning-source-control",{"title":587,"url":588},"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":590,"url":591},"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":593,"url":594},"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":596,"url":597},"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":599,"url":600},"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":602,"url":603},"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",[60,61,62],"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":611,"published":480,"minutes":612,"category":7,"tags":613,"keywords":617,"about":629,"sources":639,"cover":674,"og":675,"expertise":58,"locales":676,"lang":60,"title":677,"description":678,"coverAlt":679},"background-agents-async-pr-workflow",12,[541,614,615,544,616],"Pull requests","CI","Automation",[618,619,620,621,622,623,624,625,626,627,628],"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",[630,633,636],{"name":631,"url":632},"Software agent","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_agent",{"name":634,"url":635},"Pull request","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDistributed_version_control",{"name":637,"url":638},"Continuous integration","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FContinuous_integration",[640,641,644,647,650,653,656,659,662,665,668,671],{"title":602,"url":603},{"title":642,"url":643},"GitHub Docs: Risks and mitigations for Copilot cloud agent","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Fconcepts\u002Fagents\u002Fcloud-agent\u002Frisks-and-mitigations",{"title":645,"url":646},"OpenAI Developers: Codex cloud environments","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fcloud\u002Fenvironments",{"title":648,"url":649},"Anthropic: Use Claude Code in the cloud","https:\u002F\u002Fcode.claude.com\u002Fdocs\u002Fen\u002Fclaude-code-on-the-web",{"title":651,"url":652},"Google Jules: Limits and plans","https:\u002F\u002Fjules.google\u002Fdocs\u002Fusage-limits\u002F",{"title":654,"url":655},"Google Jules: Getting started","https:\u002F\u002Fjules.google\u002Fdocs\u002F",{"title":657,"url":658},"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":660,"url":661},"GitHub Docs: Models and pricing for GitHub Copilot","https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcopilot\u002Freference\u002Fcopilot-billing\u002Fmodels-and-pricing",{"title":663,"url":664},"OpenAI Developers: Codex pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fcodex\u002Fpricing",{"title":666,"url":667},"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":669,"url":670},"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":672,"url":673},"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",[60,61,62],"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":681,"published":682,"minutes":6,"category":7,"tags":683,"keywords":689,"about":701,"sources":709,"cover":742,"og":743,"expertise":58,"locales":744,"lang":60,"title":745,"description":746,"coverAlt":747},"context-rot-compaction-long-running-agents","2026-10-16",[684,685,686,687,688],"Context rot","Compaction","Context engineering","Long-running agents","Agent memory",[690,691,692,693,694,695,696,697,698,699,700],"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",[702,705,708],{"name":703,"url":704},"Context window","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FLarge_language_model#Context_window",{"name":706,"url":707},"Attention (machine learning)","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAttention_(machine_learning)",{"name":501,"url":502},[710,713,716,719,722,724,727,730,733,736,739],{"title":711,"url":712},"Chroma: Context Rot: How Increasing Input Tokens Impacts LLM Performance (Jul 2025)","https:\u002F\u002Fresearch.trychroma.com\u002Fcontext-rot",{"title":714,"url":715},"Liu et al.: Lost in the Middle: How Language Models Use Long Contexts (2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2307.03172",{"title":717,"url":718},"Modarressi et al.: NoLiMa: Long-Context Evaluation Beyond Literal Matching (2025)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2502.05167",{"title":720,"url":721},"Anthropic: Effective context engineering for AI agents (Sep 2025)","https:\u002F\u002Fwww.anthropic.com\u002Fengineering\u002Feffective-context-engineering-for-ai-agents",{"title":723,"url":582},"Anthropic: Effective harnesses for long-running agents (Nov 2025)",{"title":725,"url":726},"Claude API docs: Compaction at a token threshold","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcompaction-threshold",{"title":728,"url":729},"Claude API docs: Compaction on demand","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcompaction-on-demand",{"title":731,"url":732},"Claude API docs: Context editing","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fcontext-editing",{"title":734,"url":735},"Claude API docs: Memory tool","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Fmemory-tool",{"title":737,"url":738},"OpenAI API docs: Compaction","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fcompaction",{"title":740,"url":741},"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",[60,61,62],"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.",1792261156272]