# Agno > Agno is an agent platform for customer-facing and internal agents. Build agents, teams and workflows with the Agno SDK, run them on AgentOS in your own infrastructure, and manage them from the Control Plane. Serve agents through your product over REST and through MCP clients. Use this index to choose what to read. Follow the linked indexes rather than guessing page URLs. Summaries help select a source; consult the linked page for details and the documentation for version-specific APIs. To set up Agno or build a new agent, start with [Set up Agno](https://www.agno.com/start.md). To serve agents you already have, see [Run existing agents](https://www.agno.com/run-existing-agents.md). For a specific use case, choose its Build guide below. Product pages explain the components. ## Build - [Set up Agno and build your first agent](https://www.agno.com/start.md): Type: Build. Choose a deployment target, run the shared setup prompt, and verify your first agent. - [Build a docs agent](https://www.agno.com/build/docs-agent.md): Type: Build. Build an assistant grounded in your documentation and serve it over MCP. - [Serve agents to your end users](https://www.agno.com/build/end-user-management.md): Type: Build. Plan identity, per-user data isolation, roles and authorization for a customer-facing agent. - [Put an agent in your product](https://www.agno.com/build/in-product-agent.md): Type: Build. Connect an agent to your application with authenticated sessions, streaming and controlled actions. - [Run agents you already have](https://www.agno.com/run-existing-agents.md): Type: Build. Evaluate serving existing agents on AgentOS before deciding whether to port their implementation. ## Learn - [Agno SDK](https://www.agno.com/products/sdk.md): Type: Conceptual. Python primitives for agents, teams and workflows, with tools, knowledge and memory. - [AgentOS runtime](https://www.agno.com/products/runtime.md): Type: Conceptual. Serve agents as an API in your own infrastructure and operate their sessions and runs. - [Control Plane](https://www.agno.com/products/control-plane.md): Type: Conceptual. Manage agents, inspect sessions and traces, and review approvals and evaluations. ## Choosing and comparing - [Compare agent frameworks](https://www.agno.com/compare.md): Type: Comparison. Find a comparison, including strengths, tradeoffs and sources. - [Agno vs LangGraph](https://www.agno.com/compare/agno-vs-langgraph.md): Type: Comparison. Compare capabilities and when to choose each; source review dated 2026-08-10. - [Agno vs CrewAI](https://www.agno.com/compare/agno-vs-crewai.md): Type: Comparison. Compare capabilities and when to choose each; source review dated 2026-08-10. - [Agno vs OpenAI Agents SDK](https://www.agno.com/compare/agno-vs-openai-agents-sdk.md): Type: Comparison. Compare capabilities and when to choose each; source review dated 2026-08-10. ## Pricing and enterprise - [Pricing](https://www.agno.com/pricing.md): Type: Reference. Free, Pro and Enterprise plans, included capabilities and add-ons. - [Enterprise](https://www.agno.com/enterprise.md): Type: Reference. Enterprise deployment, governance, support and contact information. ## Evidence - [Benchmarks](https://www.agno.com/benchmarks.md): Type: Reference. Agent instantiation time and memory, with hardware, versions, measurement date and reproduction harness. - [Customers](https://www.agno.com/customers.md): Type: Reference. Production deployments, attributed customer accounts and linked case studies. - [Engineering blog](https://www.agno.com/blog.md): Type: Reference. Full index of engineering guides and case studies, with publication dates. ## Documentation and reference - [Canonical names and naming history](https://www.agno.com/taxonomy.json): Type: Reference. Canonical product names, aliases, historical names such as Phidata, and sourced deprecations with replacements. - [Documentation index](https://docs.agno.com/llms.txt): Type: Reference. SDK and AgentOS guides, examples and API reference; consult for implementation details. - [Docs MCP server](https://docs.agno.com/mcp): Type: Reference. Query the Agno documentation from a coding agent that supports MCP. - [Source code and cookbook](https://github.com/agno-agi/agno): Type: Reference. Agno source, working examples and release history. - [Changelog](https://www.agno.com/changelog.md): Type: Changelog. Dated feature and fix entries, with release versions where available. ## Optional - [Full page index](https://www.agno.com/sitemap.md): Type: Reference. Every listed page, build guide and published article, with type and summary. - [About](https://www.agno.com/about.md): Type: Conceptual. The team behind Agno. - [Community](https://www.agno.com/community.md): Type: Reference. Community support and places to participate. - [Full site content for LLMs](https://www.agno.com/llms-full.txt): Type: Reference. An expanded content export; use the page index for targeted retrieval. --- # Build guides # Set up Agno and build your first agent > Choose a deployment target, run the shared setup prompt, and verify your first agent. - Type: Build - Canonical: https://www.agno.com/start.md ## Before you start Have a coding agent with terminal access, Git, and credentials for your chosen model provider. Follow the selected repository's README and setup-platform skill for its Python, container and cloud prerequisites. Keep credentials in the repository's documented local environment configuration. Already have agents? Start with [Run existing agents](https://www.agno.com/run-existing-agents.md). Already have AgentOS running? Skip setup and choose a use case below. ## Choose a deployment target Choose the target you already use. Docker is the option for a self-hosted container setup. Cloud account and deployment requirements live in each repository. ### agentos-railway Give your coding agent this prompt, identical to the website's copy-prompt action: ```text Help me set up my agent platform and build my first agent. Clone https://github.com/agno-agi/agentos-railway into a folder called agent-platform, cd in, and run the setup-platform skill (in .agents/skills/). ``` ### agentos-aws Give your coding agent this prompt, identical to the website's copy-prompt action: ```text Help me set up my agent platform and build my first agent. Clone https://github.com/agno-agi/agentos-aws into a folder called agent-platform, cd in, and run the setup-platform skill (in .agents/skills/). ``` ### agentos-gcp Give your coding agent this prompt, identical to the website's copy-prompt action: ```text Help me set up my agent platform and build my first agent. Clone https://github.com/agno-agi/agentos-gcp into a folder called agent-platform, cd in, and run the setup-platform skill (in .agents/skills/). ``` ### agentos-azure Give your coding agent this prompt, identical to the website's copy-prompt action: ```text Help me set up my agent platform and build my first agent. Clone https://github.com/agno-agi/agentos-azure into a folder called agent-platform, cd in, and run the setup-platform skill (in .agents/skills/). ``` ### agentos-fly Give your coding agent this prompt, identical to the website's copy-prompt action: ```text Help me set up my agent platform and build my first agent. Clone https://github.com/agno-agi/agentos-fly into a folder called agent-platform, cd in, and run the setup-platform skill (in .agents/skills/). ``` ### agentos-render Give your coding agent this prompt, identical to the website's copy-prompt action: ```text Help me set up my agent platform and build my first agent. Clone https://github.com/agno-agi/agentos-render into a folder called agent-platform, cd in, and run the setup-platform skill (in .agents/skills/). ``` ### agentos-modal Give your coding agent this prompt, identical to the website's copy-prompt action: ```text Help me set up my agent platform and build my first agent. Clone https://github.com/agno-agi/agentos-modal into a folder called agent-platform, cd in, and run the setup-platform skill (in .agents/skills/). ``` ### agentos-helm Give your coding agent this prompt, identical to the website's copy-prompt action: ```text Help me set up my agent platform and build my first agent. Clone https://github.com/agno-agi/agentos-helm into a folder called agent-platform, cd in, and run the setup-platform skill (in .agents/skills/). ``` ### agentos-docker Give your coding agent this prompt, identical to the website's copy-prompt action: ```text Help me set up my agent platform and build my first agent. Clone https://github.com/agno-agi/agentos-docker into a folder called agent-platform, cd in, and run the setup-platform skill (in .agents/skills/). ``` ## Verify the result Before moving on, have the coding agent report the runtime URL and installed Agno version, confirm the database is reachable, and run a real request against the first agent. Confirm that its session persists. If you need MCP, verify tool discovery and a tool invocation from your intended client. Connect the runtime to the Control Plane and confirm the same session is visible. ## If setup fails Use the selected repository's setup-platform instructions and logs to identify the failing step. Check model credentials for provider errors, database configuration for connection failures, and port availability for startup failures. Reuse the existing checkout when retrying; do not overwrite its environment or database. Report the failed command and actionable error with secrets removed. ## Choose what to build - [Build a docs agent](https://www.agno.com/build/docs-agent.md) - [Serve agents to your end users](https://www.agno.com/build/end-user-management.md) - [Put an agent in your product](https://www.agno.com/build/in-product-agent.md) [Platform walkthrough](https://www.agno.com/blog/build-your-own-agent-platform.md) # Build a docs agent > Build an assistant grounded in your documentation and serve it over MCP. - Type: Build - Canonical: https://www.agno.com/build/docs-agent.md ## Set up Start with [Set up Agno](https://www.agno.com/start.md). If you already have a running AgentOS, keep that deployment and add the use case there. Use the installed SDK version's documentation, available through the [documentation index](https://docs.agno.com/llms.txt) or [docs MCP server](https://docs.agno.com/mcp). ## Build 1. Specify the documentation URLs or files, the product version, and whether the sources are public or restricted. 2. Add those sources to the agent's knowledge using the ingestion approach documented for your SDK version. Preserve source URLs so answers can cite the relevant page. 3. Instruct the agent to answer from the documentation, cite its sources, and say when the docs do not answer a question. 4. Register the agent with AgentOS and configure its MCP surface using the current MCP documentation. Expose only the tools intended for readers of your documentation. 5. Connect the intended MCP client. For hosted clients, deploy to a reachable HTTPS endpoint and configure the access policy appropriate to your sources. ## Verify Test a documented question, a question the docs cannot answer, and a version-specific question. Verify citations resolve and a client can discover and call the agent. For restricted sources, test that an unauthorized caller cannot retrieve them. ## Give your coding agent this task > Build a docs assistant on this platform using the documentation sources I provide. Match the installed SDK version, preserve citations, and expose the assistant over MCP. Verify a supported answer, an unsupported question, and the intended access policy. Report the runtime and MCP URLs plus the checks performed. ## Read next - [Documentation ingestion example](https://www.agno.com/blog/ingest-llm-friendly-documentation-from-any-site-that-supports-the-llms-txt-standard.md) - [Serving a product agent](https://www.agno.com/blog/how-to-build-an-agent-for-your-product.md) # Serve agents to your end users > Plan identity, per-user data isolation, roles and authorization for a customer-facing agent. - Type: Build - Canonical: https://www.agno.com/build/end-user-management.md ## Set up Start with [Set up Agno](https://www.agno.com/start.md). If you already have a running AgentOS, keep that deployment and add the use case there. Use the installed SDK version's documentation, available through the [documentation index](https://docs.agno.com/llms.txt) or [docs MCP server](https://docs.agno.com/mcp). ## Build 1. Identify your identity provider, tenant model, and the resources each role may access. 2. Configure runtime authentication using the documented JWT verification and authorization settings for your installed version. Derive identity from verified credentials. 3. Configure per-user isolation for sessions, memory and other persisted resources. Scope knowledge retrieval and application tools to the authenticated user or tenant as well. 4. Define end-user roles separately from the operators who manage the platform. Check [pricing](https://www.agno.com/pricing.md) for the plan that covers the management features you need. 5. Enforce authorization on the server for reads, writes, session history and tool calls. ## Verify Create two test users with distinct data. Verify each can access their own resources and cannot access the other's, including by supplying the other's session or user identifiers. Verify missing or invalid credentials fail, and a lower-privilege role cannot perform a restricted action. Repeat these checks across every transport you expose. ## Give your coding agent this task > Add authenticated end-user access to this AgentOS using our identity provider and tenant model. Configure user isolation and resource authorization, then demonstrate positive and negative access tests with two users and two roles. Keep credentials and customer data out of the test report. ## Read next - [Per-user isolation](https://www.agno.com/blog/per-user-isolation-now-covers-the-whole-platform.md) - [Customer-facing agent requirements](https://www.agno.com/blog/best-frameworks-for-customer-facing-ai-agents.md) # Put an agent in your product > Connect an agent to your application with authenticated sessions, streaming and controlled actions. - Type: Build - Canonical: https://www.agno.com/build/in-product-agent.md ## Set up Start with [Set up Agno](https://www.agno.com/start.md). If you already have a running AgentOS, keep that deployment and add the use case there. Use the installed SDK version's documentation, available through the [documentation index](https://docs.agno.com/llms.txt) or [docs MCP server](https://docs.agno.com/mcp). ## Build 1. Define one user task the agent should complete and the application tools it needs. 2. Follow [end-user management](https://www.agno.com/build/end-user-management.md) to establish identity, data scope and permissions. 3. Register the agent with AgentOS and connect your application's UI to its documented API or supported interface. Match the UI integration to your frontend stack and SDK version. 4. Handle streaming, failures, cancellation and session resumption in the UI. Keep server credentials out of the browser. 5. Require an approval step for actions that need user confirmation, and show the proposed action before executing it. ## Verify Complete the target task through the actual application. Reload and resume a session, cancel a run, and exercise a failed tool call. Verify that users cannot retrieve another user's history or invoke tools outside their permissions. Add representative task evaluations before expanding the agent's scope. ## Give your coding agent this task > Embed an agent for the user task I describe in our application. Use our existing identity and frontend stack, connect to AgentOS, and implement streaming, failure handling and session resumption. Verify the task end to end and test authorization and approval boundaries. [Implementation walkthrough](https://www.agno.com/blog/how-to-build-an-agent-for-your-product.md) # Run agents you already have > Evaluate serving existing agents on AgentOS before deciding whether to port their implementation. - Type: Build - Canonical: https://www.agno.com/run-existing-agents.md ## Start with your existing implementation The [runtime overview](https://www.agno.com/products/runtime.md) describes AgentOS. The site lists support for Agno, LangGraph, DSPy and the Claude Agent SDK. Consult the [current documentation index](https://docs.agno.com/llms.txt) for the integration and version requirements of your framework before changing code. ## Integrate and verify 1. Record your framework and version, dependencies, entry point, persistence requirements, and one representative successful run. 2. If you need a new runtime deployment, follow [Set up Agno](https://www.agno.com/start.md). Keep your existing agent implementation available for comparison. 3. Follow the documented integration for that framework. Check streaming, sessions, tools, authentication and any framework-specific limitations individually. 4. Run the same representative task through AgentOS and compare the result and state behavior with the original run. ## If there is no documented integration Do not assume compatibility or a mandatory rewrite. Identify the unsupported boundary and evaluate a custom integration or an explicit port. Porting to Agno primitives is a separate decision with its own behavior tests. ## Give your coding agent this task > Inspect my existing agent's framework, version and runtime requirements. Find its documented AgentOS integration and identify unsupported capabilities before editing. Preserve the current implementation, wire up the supported integration, and compare a representative run end to end. Explain any changes or remaining gaps. [Compare frameworks](https://www.agno.com/compare.md) # Site content ## Agno — the agent platform that builds itself URL: https://www.agno.com Agno is a self-driving agent platform that runs in your cloud. An agent platform is the shared foundation your agents run on: one runtime that serves them, one database for sessions, memory, knowledge and traces, one auth layer and one control plane. Build customer-facing and internal agents, teams and workflows in pure Python with the Agno SDK and run them in your own cloud on the AgentOS runtime, which serves the same agent to your product over REST, to ChatGPT and Claude over MCP, and to Slack and Discord over chat. Manage them from the Agno Control Plane, which connects directly from your browser to your runtime so your data stays in your database. Coding agents build and improve the system: code, logs, traces and evals live in one place, so a coding agent can set up the platform and improve the agents running on it. Agno is model-agnostic: bring OpenAI, Anthropic, Google or any supported provider and switch without rewriting your agents. ## Agno Knowledge Base — guides for building and shipping agents URL: https://www.agno.com/kb The Agno knowledge base: guides, tutorials and best practices for building, running, and scaling agents with Agno. Guides are filed under topics such as Distribution, Integrations, Models and Agent Economics, and cover shipping an agent as a Claude connector or a ChatGPT plugin, connecting it to Slack, and choosing a model for each agent task. Each guide is a how-to with the code and the configuration it takes to finish the job. ## AgentOS — serve your agents to real users URL: https://www.agno.com/products/runtime AgentOS is the agent runtime. One command turns the agent you built with the SDK into a production service in your cloud, on your database, behind your auth, and exposes it over an API real users can hit. It feeds the control plane everything you need to operate: chat, tracing, sessions, knowledge, memory and evals. There is no rewrite between prototype and production: the agents you build are the agents you run. ## Agent SDK — built for coding agents URL: https://www.agno.com/products/sdk Agno is a Python SDK for building agent platforms. It gives you three primitives: agents, teams and workflows. You attach capabilities like memory, knowledge and learning as your use case needs them. Agno 3.0 is built for coding agents. The docs ship as an MCP server at https://docs.agno.com/mcp. Give your coding agent the MCP command and it assembles your system from documented parts. An agent is one model with tools and instructions. A team is a group of agents that work together in one of four modes: coordinate, route, broadcast and tasks. A workflow runs agents, teams and functions through six step types: Step, Steps, Parallel, Loop, Condition and Router. Capabilities include learning, context providers, memory, knowledge, state, storage, sessions, guardrails, hooks, dependencies, a filesystem and human in the loop. There are 30+ model providers and 100+ tool integrations behind one API. For operations there is background execution, evals, observability and a scheduler. An agent is created in 3.2 microseconds and holds 5.2 KiB of memory, measured on the public harness you can run yourself. Register the same agents, teams and workflows with AgentOS to run them behind a FastAPI application. ## Control Plane — watch your agents, step in when it matters URL: https://www.agno.com/products/control-plane The Agno Control Plane brings every agent, team and workflow you run under a single pane of glass: chat with any agent, follow full traces of every run, inspect sessions, knowledge, memory and evals, then intervene mid-run. Approvals, guardrails and an audit trail are built in. It connects directly to your AgentOS, and on Enterprise you can self-host it so every byte stays in your own environment. ## Pricing URL: https://www.agno.com/pricing The runtime is free. The SDK and AgentOS are open source, so the Free plan ($0/month) builds your agent platform, runs it in your own cloud at any scale, and serves it over REST, in Claude and ChatGPT over MCP, and in Slack and Discord. Serving costs nothing on any plan. Free also gives you the full control plane against a local AgentOS: chat, sessions, traces, studio, memory, knowledge, learnings, metrics, evaluations, approvals and the scheduler, all unlimited. Pro ($150/month) points that control plane at a live deployment: one live AgentOS connection, three team seats, role-based access control and email support, with extra seats at $30/month, extra connections at $95/month and SAML SSO at $300/month. Enterprise (custom pricing) is end-user management for the people your agents serve: end-user identity, roles and audit logs, custom RBAC with per-resource scoping, security reviews, monthly office hours, and dedicated help building your product agent and your ChatGPT and Claude apps. ## Enterprise — the agent platform inside your perimeter URL: https://www.agno.com/enterprise Enterprise runs the whole Agno platform inside your VPC. You self-host the control plane, connect it over SAML SSO with custom RBAC and keep an audit log of every action. Your data, context and learning loop stay in your system. Plans include SLAs, security reviews and monthly office hours with our engineering team. Reach the team at enterprise@agno.com. ## About Agno URL: https://www.agno.com/about Agno builds the Agno SDK, AgentOS and the Control Plane. The SDK and AgentOS are open source. Everyone from solo builders to the Fortune 5 runs agents on Agno. Find the code on GitHub (agno-agi), the team on X (@AgnoHQ) and the community on Discord. ## Benchmarks: agent instantiation, measured URL: https://www.agno.com/benchmarks Median time and memory to create one agent, 1,000 iterations per framework, one process per framework. Measured on 2026-08-09 (Apple M4 Max · macOS 15.7 · Python 3.12.8) against published PyPI releases. Reproduce with the public harness: https://github.com/agno-agi/agno/tree/main/cookbook/09_evals/performance/comparison | Framework | Version | Median time | Median memory | Time vs Agno | Memory vs Agno | |---|---|---|---|---|---| | Agno | 2.8.7 | 3.2 µs | 5.2 KiB | 1x | 1x | | LangGraph | 1.2.10 | 1,092.8 µs | 145.4 KiB | 342x slower | 27.8x more | | CrewAI | 1.15.14 | 18,297.6 µs | 23.6 KiB | 5,736x slower | 4.5x more | ### Benchmark FAQ **Why does every request need its own agent?** Because agents hold state: conversation history, memory and whatever a tool cached along the way. Share one agent between users and that state travels with it, which is how user A’s data ends up in user B’s session. Externalizing state helps only if every tool you ever write remains stateless, an invariant no framework can verify for you. The sound approach is the one FastAPI takes with database sessions: give every request its own. An object cannot leak state it never shared. The open question is whether instantiation is cheap enough to repeat on every request, and that is what these numbers measure. **What exactly do these benchmarks measure?** Each script instantiates one agent with one tool and a model binding; we record the median time and memory over 1,000 runs, with every framework in its own process. The harness is open source in the Agno repository. It measures construction alone. Inference is a separate question, and model calls dominate it in every framework. **When do these numbers not matter?** With a single tenant, they do not. With a shared object you can prove holds no state, they do not either. They begin to matter the moment you serve more than one user, because from then on you pay the instantiation cost on every request, multiplied by your request rate. ## Agno vs LangGraph URL: https://www.agno.com/compare/agno-vs-langgraph LangGraph facts checked against their own docs on 2026-08-10. Both frameworks produce durable, resumable agents; a feature checklist settles little. The difference is one of kind. LangGraph is a formalism: you express the system as a graph and compile it. Agno is infrastructure: plain Python above, with a runtime, approvals with real access control and a control plane beneath. For teams serving many users, that is the deciding line. | Aspect | LangGraph | Agno | |---|---|---| | What you write | A graph: state, nodes, edges. You compile it, then invoke it. | Agents, teams and workflows in plain Python. No graph to compile. | | Crash recovery | Checkpointers save state each super-step. You re-invoke with the thread id and it resumes from the last checkpoint. | Run checkpointing persists each tool batch. continue_run resumes the same run in place, and the cookbook proves it with a SIGKILL test. | | Long-running work | Checkpoint replay covers crashes when you re-invoke. The hosted platform adds a managed task queue. | A durable job queue ships in the runtime. Jobs survive restarts and deploys, any replica can claim them, and failures land in a dead letter queue. | | Streaming | Stream reconnection is a feature of the hosted platform. | Streams are resumable in the open source runtime. Reconnect with the last event index and catch up, on any replica with Redis. | | Time travel | Walk checkpoint history and fork from any checkpoint. The snapshot restores full graph state. | Continue from any message of any past run. Forks become sibling runs in the same session, so history forms a tree. | | Human in the loop | interrupt() pauses anywhere in a node and waits for days. On resume the whole node runs again, so code before the pause must be idempotent. | Pauses at tool boundaries and waits in your database. Resume picks up exactly where it stopped. Nothing runs twice. | | Approvals | You build the approval flow on top of interrupt(): the inbox, the approver identity, the access rules. | Included by default. Pending approvals persist, admins resolve them by scope, and the requester cannot approve their own run. | | Serving many users | You key threads by id in your own code. Per-user auth ships with the licensed Agent Server, outside the MIT library. | Every request gets a fresh copy of the agent, on by default. JWT scopes and user isolation come with AgentOS. | | Runtime | The Agent Server is a licensed product: managed cloud, hybrid or self-hosted on the Enterprise plan. | AgentOS is open source. One command serves your agents in your cloud, on your database. | | Creating one agent | 1.1 ms and 145 KiB, measured with the public harness. | 3.2 µs and 5.2 KiB, same harness, same day. | | License | MIT for the library. The server verifies a license key at startup. | Apache 2.0 for the SDK and AgentOS. | ### Where LangGraph is strong - interrupt() can pause anywhere inside a node, mid-function. Agno pauses at tool and step boundaries. - Checkpoints snapshot full graph state every super-step once a checkpointer is enabled. Agno forks restore the conversation transcript. - The low-level graph API gives you precise, explicit control over every edge. - LangSmith tracing and evaluation are mature and deeply integrated. ### Choose LangGraph when - You want your control flow drawn as an explicit graph you can inspect edge by edge. - You need to pause in the middle of arbitrary code, where tool boundaries do not suffice. - Your team already lives in LangSmith and wants its deployment story. ### Choose Agno when - You serve many users and want isolation, approvals and access control from the start. - You want resume semantics that never run the same code twice. - You want the runtime on infrastructure you own, no license key required. ### Sources - LangGraph docs: persistence: https://docs.langchain.com/oss/python/langgraph/persistence - LangGraph docs: interrupts: https://docs.langchain.com/oss/python/langgraph/interrupts - Agno docs: checkpointing examples: https://docs.agno.com/examples/agents/checkpointing/crash-recovery - Agno docs: human in the loop: https://docs.agno.com/hitl/overview - The benchmark harness: https://github.com/agno-agi/agno/tree/main/cookbook/09_evals/performance/comparison ## Agno vs CrewAI URL: https://www.agno.com/compare/agno-vs-crewai CrewAI facts checked against their own docs on 2026-08-10. CrewAI is a quick way to prototype a crew of role-playing agents, and Flows add structure when needed. Agno is infrastructure for running agents in production. The divide appears after the demo, and it concerns isolation: CrewAI keeps memory in local files and separates users by convention. Agno separates them by construction, giving every request its own agent, backed by your database, with approvals and access control built in. | Aspect | CrewAI | Agno | |---|---|---| | What you write | Crews of agents with roles, goals and backstories, plus Flows for structured steps. | Agents, teams and workflows in plain Python. | | State | A unified memory store on local disk by default (LanceDB), flow state in local SQLite. | Sessions, memory and knowledge in your own database from day one. | | Crash recovery | Flows can persist state and resume by id. Crews themselves offer checkpoint-based resume of interrupted kickoffs. | Run checkpointing persists each tool batch. continue_run resumes the same run in place after a crash. | | Long-running work | Kickoffs run inside your process. Managed execution comes with the AMP platform. | A durable job queue ships in the runtime. Jobs survive restarts and deploys, any replica can claim them, and failures land in a dead letter queue. | | Streaming | A dropped connection ends the stream. | Streams are resumable. Reconnect with the last event index and catch up where you left off. | | Human in the loop | Tasks can request human input inline. Building an approval flow with roles is left to you. | Pauses persist in your database and wait as long as needed. Admin approvals with scopes are built in. | | Serving many users | You tag memories with scope paths and source labels in your code. Isolation is a convention. | Every request gets its own agent, so isolation is structural. JWT scopes and user isolation come with AgentOS. | | Runtime | The AMP platform deploys crews to managed infrastructure. Your own VPC comes with the Enterprise contract. | AgentOS is open source and self-hosted. Your cloud, your database, your auth. | | Creating one agent | 18.3 ms and 23.6 KiB, measured with the public harness. | 3.2 µs and 5.2 KiB, same harness, same day. | | License | MIT for the framework. The platform is a hosted product. | Apache 2.0 for the SDK and AgentOS. | ### Where CrewAI is strong - The role, goal and backstory model makes a first crew genuinely quick to build. - Flows give you typed state, routers and resumable runs when you need structure. - Crew Studio lets people build without writing code. - It stands alone. It does not depend on LangChain. ### Choose CrewAI when - You are prototyping a role-based crew and want the fastest path to a working demo. - Your team wants a no-code builder and a fully managed deployment path. - You have a single tenant, so files on local disk suffice. ### Choose Agno when - You are past the prototype and real users are about to arrive. - You want memory and sessions in a real database, not files beside the process. - You want isolation, approvals and access control without writing conventions for them. ### Sources - CrewAI docs: memory: https://docs.crewai.com/en/concepts/memory - CrewAI docs: flows: https://docs.crewai.com/en/concepts/flows - CrewAI pricing: https://www.crewai.com/pricing - Agno docs: checkpointing examples: https://docs.agno.com/examples/agents/checkpointing/crash-recovery - The benchmark harness: https://github.com/agno-agi/agno/tree/main/cookbook/09_evals/performance/comparison ## Agno vs OpenAI Agents SDK URL: https://www.agno.com/compare/agno-vs-openai-agents-sdk OpenAI Agents SDK facts checked against their own docs on 2026-08-10. The OpenAI Agents SDK is a small, well-designed library, and inside the OpenAI platform it is the natural choice. A library, though, hands you the loop and leaves the service around it to you. Agno covers the same primitives, remains indifferent to your choice of model and supplies the service: a runtime, crash recovery, approvals and tracing that never leaves your system. | Aspect | OpenAI Agents SDK | Agno | |---|---|---| | What you write | Agents with handoffs, guardrails and sessions. A minimal, code-first loop. | Agents, teams and workflows in plain Python. | | Models | OpenAI models are the paved road. Other providers go through beta adapters with documented gaps. | Model-agnostic by design. Switch providers without rewriting your agents. | | Tracing | Traces go to OpenAI servers by default. Zero Data Retention orgs get no tracing at all. | Tracing lives in your AgentOS, on your infrastructure. Nothing leaves. | | Durability | It is a library. Crash recovery and long-running work come from third parties like Temporal. | Checkpointing, crash recovery and a durable job queue are built in. Runs resume in place, and background jobs survive restarts and deploys. | | Streaming | A dropped connection ends the stream. | Streams are resumable. Reconnect with the last event index and catch up where you left off. | | Approvals | Human-in-the-loop hooks exist. The inbox, the approver identity and the access rules are yours to build. | Included by default. Pending approvals persist, admins resolve them by scope, and the requester cannot approve their own run. | | Runtime | You build and host the service yourself. | AgentOS is the service. One command, your cloud, your database, your auth. | | Maturity | Pre-1.0 and moving fast, with releases most weeks. | Stable 2.x, with every release on our releases page. | | License | MIT. | Apache 2.0 for the SDK and AgentOS. | ### Where OpenAI Agents SDK is strong - The loop is small and well documented. You can read all of it in an afternoon. - Handoffs between agents are simple and work well. - Inside the OpenAI platform the integration is deep: hosted tools, traces, realtime and voice agents. - Session storage has many backends, from SQLite to Redis to Dapr. ### Choose OpenAI Agents SDK when - You are committed to OpenAI models and want the deepest platform integration. - You want the smallest possible library and are prepared to build the service around it. - You need realtime or voice agents on the OpenAI stack today. ### Choose Agno when - You want to pick your model provider freely, now and later. - You want crash recovery, a durable job queue and approvals without wiring third parties together. - You want a runtime and a control plane without building them yourself. ### Sources - OpenAI Agents SDK docs: models: https://openai.github.io/openai-agents-python/models/ - OpenAI Agents SDK docs: tracing: https://openai.github.io/openai-agents-python/tracing/ - Agno docs: checkpointing examples: https://docs.agno.com/examples/agents/checkpointing/crash-recovery - Agno docs: human in the loop: https://docs.agno.com/hitl/overview - The benchmark harness: https://github.com/agno-agi/agno/tree/main/cookbook/09_evals/performance/comparison ### Pricing FAQ **Which Agno plan is right for me?** Start on Free. The SDK and AgentOS are open source, so you can build your agent platform, run it anywhere at any scale, and serve your agents over REST, in Claude and ChatGPT over MCP, and in Slack. Move to Pro when you want the control plane pointed at a live deployment, so your team can watch the runs and operate the agents together. Choose Enterprise when your agents serve your own end users and you need to manage them: their identity, their roles, their audit trail, and access scoped per resource. **What do I actually pay for?** The control plane. The runtime is open source and free at any scale, and serving your agents costs nothing on any plan. What Pro buys is seeing and operating what you have deployed: the control plane pointed at a live AgentOS, shared access for your team, roles and service accounts. What Enterprise buys is end-user management, for the people your agents serve rather than the people who build them. **What is the difference between the free tier and Pro?** Free connects the control plane to AgentOS instances on your own machine. Pro connects it to a live deployment, with one live connection, three team seats and roles. With Pro your whole team can see and operate the agents you deploy, wherever a run came from: your product, Claude, ChatGPT or Slack. **Can I serve my agents in Claude and ChatGPT on the free plan?** Yes. AgentOS is open source and serves your agents over MCP, so a deployment you run yourself can be added to Claude or ChatGPT as a custom connector on any plan, including Free. Nothing in the serving path runs on our infrastructure. Pro and Enterprise are about seeing and governing those runs, not about permission to serve them. **What counts as a live connection in Agno's AgentOS?** A live connection is a running AgentOS instance that you register with the hosted control plane. Your team can then chat with agents, inspect traces and monitor sessions from one dashboard. You can develop on your own computer for free, with a local instance at an address like http://localhost:7777. When you deploy that agent to a server and it runs around the clock at a real URL, that is a live connection. Pro includes one live connection. Each additional connection is $95 per month. **How many members and live connections does Agno Pro include?** Pro starts with three team seats and one live connection for $150 per month. Everyone on those seats shares access to the same connected runtimes. The Owner, Admin, Member and Viewer roles decide who can read, run or change what. **Can I add more seats or connections to Agno Pro?** Yes. Extra seats are $30 per month each. Extra live connections are $95 per month each. Add them as your team and your fleet grow. The plan does not change, and usage inside a connection stays unlimited. **Does Agno charge per event, per token or for data egress?** No. There are no per-event fees, no token fees and no egress fees. You pay for seats and live connections. Monitoring, retention, knowledge and everything else inside a connection is unmetered. **Where does Agno's AgentOS store my data, and how long do you keep it?** In your own database, inside your own infrastructure. AgentOS runs as a container in your VPC. The control plane reads from your runtime directly in the browser. Agno never holds a copy of your data. You keep everything until you delete it, so retention is infinite and entirely your call. **Does Agno support SSO and role-based access control?** Pro includes the Owner, Admin, Member and Viewer roles, and SAML SSO is available on Pro as an add-on. SAML SSO is included on Enterprise, along with custom RBAC with per-resource scoping. Tell us about your identity provider and the access rules your organization needs. **What is the difference between a team seat and an end user?** A team seat is someone who builds, operates or monitors your agent platform in the control plane. An end user is someone your agents serve. A support agent used by five thousand customers needs one or two seats, and end-user identity, which is part of Enterprise. **Can you list my agent in the Claude and ChatGPT directories?** A directory listing is submitted from your own organization portal under your own verified identity, so it is always yours to file. What we do on Enterprise is get you ready for it and help you through it: conformance checks against both platforms, the submission pack, and the identity layer a public listing requires. **How do I upgrade from Free to Pro?** Start your 14-day free trial of Pro from the control plane and register your first live connection. Your agents do not change. The AgentOS instance you ran locally is the same one you connect. There is no migration and no rewrite. --- # Blog archive # A2A vs MCP: what each protocol does and when you need both > MCP connects an agent to tools and data, while A2A connects agents to each other. How they differ and when you need both. - Published: 2026-10-13 - Author: Cosette Cressler - Categories: Engineering, Integrations - Canonical: https://www.agno.com/blog/a2a-vs-mcp - Markdown: https://www.agno.com/blog/a2a-vs-mcp.md MCP (Model Context Protocol) connects an AI agent to tools and data: a database, a GitHub repo, a search API. A2A (Agent2Agent Protocol) connects an agent to other agents, so it can hand off a task to an agent built by another team, on another framework, and get the result back. They solve different problems, and production systems that use one may eventually need both. People mix them up because they look alike on the surface: both are open standards governed by the Agentic AI Foundation, part of the Linux Foundation, and both can run over HTTP. The difference is what sits on the other end of the connection: either a tool your agent controls or an agent that makes its own decisions. ![What's on the other end of the connection. MCP: your agent makes a tool call to an MCP server whose tools are all visible, and it calls each one. A2A: your agent sends a task to another agent that advertises its skills; its tools, prompts, and steps are shared only if it chooses, and it decides how to do the task.](https://www.agno.com/images/a2a-mcp-other-end.svg) ## What is MCP? MCP is an open protocol that gives an AI application a standard way to connect to tools, data, and prompts. Anthropic released it in November 2024 and later donated it to the Agentic AI Foundation, a Linux Foundation fund co-founded by Anthropic, Block, and OpenAI. An MCP server wraps a capability, such as querying Postgres, reading files, or creating a Jira ticket, and describes it in a way a model can understand. An MCP client, usually inside an agent or an assistant like Claude or ChatGPT, discovers those capabilities and calls them. Write the server once, and any MCP-compatible client can use it. The current specification, dated 2026-07-28, introduced a stateless protocol core. Each request carries its own protocol version and client information, so MCP servers can scale behind an ordinary load balancer without relying on protocol-level sessions. An MCP server exposes what a system can do, but it doesn't decide when to call a tool or in what order. The agent makes those decisions. ## What is A2A? A2A is an open protocol that lets AI agents built on different frameworks, by different teams or companies, discover each other and work together on tasks. Google announced it in April 2025 and donated it to the Linux Foundation that June. Version 1.0, its first stable specification, shipped in March 2026, and by April the project counted more than 150 supporting organizations, including Microsoft, AWS, Salesforce, SAP, and ServiceNow. In August 2026, A2A joined MCP in the Agentic AI Foundation. Each A2A agent publishes an Agent Card, a JSON document at a well-known URL (`/.well-known/agent-card.json`) that describes what the agent can do, where to reach it, and how to authenticate. Another agent reads the card, sends a message, and gets back a task it can follow until the work is done, including streamed updates for long-running jobs. ![How an A2A call works. One, discover: read the Agent Card for skills, endpoint, and auth. Two, delegate: send a message and get back a task. Three, follow: track the task with streamed updates. A task moves from submitted to working, can pause for input, and ends completed.](https://www.agno.com/images/a2a-call-flow.png) The key difference from MCP is that the agent on the other end doesn't have to expose its internals. It advertises skills and returns results; whether it also reveals its tools, prompts, or intermediate steps is its own choice rather than something the protocol requires. Some implementations do stream them, and Agno's A2A streams can include tool names and arguments. That matters when the agent belongs to another team or another company: you can delegate work to it without either side having to open up how it works. ## How do A2A and MCP differ? MCP exposes tools and capabilities, which can also include an agent. A2A provides a standard way for agents to exchange messages and delegate tasks. Most of the practical differences come down to control: an MCP client directs each call, while an A2A agent that receives a task decides for itself how to complete it. | | MCP | A2A | | ---------------- | --------------------------------------------------------- | ----------------------------------------------------------- | | Connects | An agent to tools, data, and prompts | An agent to other agents | | The other side | A tool that does what it's told | An agent that decides how to do the task | | What you can see | Every tool, its inputs, and its schema | The skills it advertises, plus whatever it chooses to share | | Discovery | The client lists the server's tools | The client reads the agent's Agent Card | | Unit of work | A tool call, with optional support for asynchronous tasks | A message exchange or a task with status updates | | Typical example | An agent querying Postgres or GitHub | A support agent handing a refund to a billing agent | | Created by | Anthropic, November 2024 | Google, April 2025 | To choose, look at what's on the other end of the connection. If your agent should direct it step by step, put it behind MCP. If it should own the task and decide how to finish it, reach it over A2A. ## When should you use MCP, A2A, or both? MCP fits when your agent needs to act on a system directly, and A2A fits when the work belongs to another agent. Many systems end up using both. Take a support agent for a subscription company. It uses MCP to search the help center and look up the customer in the CRM. When a customer asks for a refund, it doesn't call the payments API itself. It hands the refund to the billing team's agent over A2A. The billing agent has its own MCP connections to the payments API and the ledger, plus its own rules about when a refund needs approval. It doesn't have to surface any of that, and here it doesn't. The support agent only knows that the billing agent advertises a refund skill, so it sends the request and gets the outcome back. ![One system, both protocols. The support team's agent uses MCP to reach the help center and the CRM, and sends a refund task over A2A to the billing team's agent. The billing agent uses MCP to reach the payments API and the ledger and applies its own approval rules, none of which it surfaces to the support agent.](https://www.agno.com/images/a2a-mcp-support-billing.svg) Splitting the work this way keeps each team's logic with the team that owns it. The billing team can change its refund rules, switch payment providers, or add an approval step, and the support agent doesn't have to change at all. MCP on its own works when a single agent needs access to tools. A2A becomes useful when a task has to cross a team or company boundary, or reach an agent built on a different framework. If you're deciding how to expose your own product to outside assistants, there's a related choice between publishing raw MCP tools and publishing an agent behind them. We covered that in [A pile of MCP tools is not an agent](https://www.agno.com/blog/mcp-server-vs-agent). ## How do you use MCP and A2A with Agno? Agno supports both protocols in both directions: your agents can call MCP servers and A2A agents, and AgentOS can expose your agents over MCP and A2A. Install the extras for AgentOS, MCP, and A2A: ```bash uv pip install -U "agno[os,mcp,a2a,openai]" export OPENAI_API_KEY="your-openai-api-key" ``` To serve the billing agent from the example over both protocols, turn on both in AgentOS: ```python from agno.agent import Agent from agno.models.openai import OpenAIResponses from agno.os import AgentOS billing_agent = Agent( id="billing-agent", name="Billing Agent", model=OpenAIResponses(id="gpt-5.5"), instructions="Process refund requests. Refunds over $50 need approval.", ) agent_os = AgentOS( agents=[billing_agent], a2a_interface=True, # serve an Agent Card and A2A endpoints mcp=True, # serve AgentOS over MCP ) app = agent_os.get_app() ``` The agent's Agent Card is then available at `/a2a/agents/billing-agent/.well-known/agent-card.json`. Any compatible A2A client can call it, including one built with Google ADK or another framework. From an Agno agent or plain Python, use the A2A client: ```python import asyncio from agno.client.a2a import A2AClient async def main(): client = A2AClient("https://billing.example.com/a2a/agents/billing-agent") result = await client.send_message( message="Refund the duplicate $30 charge for customer 4821" ) print(result.content) asyncio.run(main()) ``` If AgentOS runs with authorization turned on, every A2A request needs a valid token (passed through the client's `headers`), so the billing team decides who can delegate work to its agent. On the tool side, Agno agents connect to any MCP server through [MCPTools](https://docs.agno.com/tools/mcp/overview); the [A2A interface docs](https://docs.agno.com/agent-os/interfaces/a2a/introduction) and [A2A client docs](https://docs.agno.com/agent-os/client/a2a-client) cover the full setup. --- # Community Roundup: September 2026 > Agno's September recap: PublicSurface puts agents in front of anonymous users, page storage turns your docs into agent knowledge, rerankers work on every vector database, and AgentOS MCP servers scale across replicas. - Published: 2026-10-05 - Author: Cosette Cressler - Categories: Community, Product - Canonical: https://www.agno.com/blog/community-roundup-september-2026 - Markdown: https://www.agno.com/blog/community-roundup-september-2026.md Agno shipped seven patch releases in September, headlined by PublicSurface for public agents, page storage for docs-backed knowledge, and MCP servers that scale across replicas. More than 50 community contributors landed changes alongside us, and the community shipped some incredible projects of its own. There's a lot to cover, so let's dive in. ## New releases & features ### PublicSurface serves agents to anonymous users Say you want a product assistant on your marketing site. Visitors aren't logged in, and they shouldn't get anywhere near your admin API or your internal teams. Pass `public=PublicSurface(...)` to `AgentOS` and list the components anonymous users may reach. Everything you leave off that list stays private. Public requests run against per-client and global quotas, per minute and per day, and AgentOS counts them in PostgreSQL so every replica enforces the same numbers. Request size, run time, output size, and concurrent runs all have ceilings you can set. Later in the month, PublicSurface gained support for sharing an AgentOS with the Control Plane. Set `authorization=True` and one URL serves anonymous chat on the routes you picked, while verified JWTs reach the full REST API under their scopes. Read the changelog entries on [PublicSurface](https://www.agno.com/blog/serve-agents-to-the-public-with-publicsurface) and [running it with the Control Plane](https://www.agno.com/blog/run-the-control-plane-and-a-public-agent-on-one-agentos), or learn more about [PublicSurface](https://docs.agno.com/agent-os/public-surface) in the docs. ### Page storage turns your docs into agent knowledge Keeping an agent in step with your docs usually means a crawler, a chunker, and a vector table that drift apart. A refresh dies halfway through, and the agent serves new text against old vectors. `Knowledge.sync_pages` takes a site's `llms.txt` URL, discovers the pages, fetches their Markdown, embeds them, and publishes each page's text, catalog entry, and vectors in one transaction. A page either publishes whole or keeps its previous version. Unchanged pages skip re-embedding, and the sync report lists every page that failed or was removed. Once the pages are published, the `PageFileSystem` toolkit lets an agent work through them with `ls`, `tree`, `rg`, `grep`, `cat`, and `head`, the way an engineer works through a repo. Vector search finds the right page, and the agent then reads all of it. The toolkit is read-only: no shell, no writes, and bounded output. Read the changelog entries on [page storage](https://www.agno.com/blog/publish-your-docs-as-agent-knowledge-with-page-storage) and [PageFileSystem](https://www.agno.com/blog/give-agents-a-read-only-filesystem-over-your-docs), or learn more about [published pages](https://docs.agno.com/knowledge/published-pages) in the docs. ### Rerankers now work on every vector database `Knowledge.search()` now runs the reranker itself. Before, reranking had to be built into each vector database adapter, and only some adapters had it. Pass a reranker to `Knowledge` and every search goes through it, on any vector database. Agno widens the fetch first, so the reranker has a bigger pool of candidates to reorder. Two new rerankers ship with it: [`MMRReranker`](https://www.agno.com/blog/get-diverse-search-results-with-the-mmr-reranker) swaps near-duplicate results for diverse ones, and [`RecencyReranker`](https://www.agno.com/blog/rank-newer-documents-higher-with-the-recency-reranker) ranks newer documents higher. `CohereReranker` and your own rerankers work too. Setting `reranker` on a vector database still works but now logs a deprecation warning. Move it to `Knowledge(reranker=...)`. Read the [full changelog entry](https://www.agno.com/blog/rerank-knowledge-search-on-any-vector-database), or learn more about [reranking](https://docs.agno.com/knowledge/concepts/search-and-retrieval/reranking) in the docs. ### Elasticsearch joins the vector databases Teams that already run Elasticsearch for search and logs can now keep agent knowledge there too. The new `Elasticsearch` vector database supports vector, keyword, and hybrid search, metadata filters, rerankers, async, and per-user isolation through a `user_id` field. Hybrid search works on every Elasticsearch license, and you can switch it to reciprocal rank fusion on Platinum, Enterprise, and trial licenses. Read the [full changelog entry](https://www.agno.com/blog/search-knowledge-in-elasticsearch-with-vector-keyword-and-hybrid-search), or learn more about the [Elasticsearch vector database](https://docs.agno.com/knowledge/vector-stores/elasticsearch/overview) in the docs. ### AgentOS MCP servers scale out [`MCPConfig(stateless=True)`](https://www.agno.com/blog/serve-mcp-statelessly-so-any-replica-can-answer-any-request) serves `/mcp` without tracking sessions, so any replica can answer any request and a multi-instance deployment no longer needs session affinity. It's off by default, because stateless serving also drops server-initiated notifications and SSE resumability. Two more additions make an AgentOS MCP server easier to discover and connect to. [`GET /mcp/server-card`](https://www.agno.com/blog/agentos-now-serves-an-mcp-server-card) lists the tools your server offers before a client connects. `MCPConfig` can also serve your tool server [at its own hostname](https://www.agno.com/blog/serve-your-mcp-server-at-its-own-hostname), like `mcp.example.com`, without the routing middleware you used to write. On the client side, [`MCPTools(protocol_mode="auto")`](https://www.agno.com/blog/mcptools-can-now-negotiate-the-newest-mcp-protocol-era) negotiates the newest MCP protocol version both sides support, including the sessionless 2026-07-28 version. The default stays `"legacy"`, so existing servers are unaffected. A community contributor built this one (more below). Learn more about the [AgentOS MCP server](https://docs.agno.com/features/mcp-server) and [MCP tools](https://docs.agno.com/tools/mcp/overview) in the docs. ### Azure OpenAI deployments get the Responses API `AzureOpenAIResponses` gives your Azure deployment the tools, structured output, streaming, and background responses of `OpenAIResponses`. Agno's `AzureOpenAI` model only offered Chat Completions until now. Read the [full changelog entry](https://www.agno.com/blog/use-the-responses-api-with-azure-openai-deployments), or see the [cookbook](https://github.com/agno-agi/agno/blob/main/cookbook/90_models/azure/openai/responses.py) for reference. ## New tools & integrations Also shipped in September: - **New model providers**: [llmman](https://www.agno.com/blog/llmman-is-now-a-supported-model-provider) and [Y-API](https://www.agno.com/blog/y-api-joins-agno-as-a-model-provider), an OpenAI-compatible gateway. - **[GandrTools](https://www.agno.com/blog/gandrtools-adds-gandr-text-to-speech-to-your-agents)**: agents can turn text into speech through the Gandr TTS API. - **[Bring your own Bedrock client](https://www.agno.com/blog/bring-your-own-async-client-to-bedrock)**: Bedrock accepts an async client you configure yourself. - **[MCP tools return audio](https://www.agno.com/blog/mcp-tools-now-return-audio)**: when an MCP tool returns audio, `MCPTools` decodes it and adds it to `run.audio`. - **[Public custom routes](https://www.agno.com/blog/mark-custom-routes-public-without-turning-off-auth)**: mark individual custom routes public while authorization stays on for everything else. - **[AG-UI protocol 1.0](https://www.agno.com/blog/the-ag-ui-interface-supports-ag-ui-protocol-1-0)**: the AG-UI interface handles tool results sent as lists of content parts, so paused runs resume cleanly. - **[Slack retries](https://www.agno.com/blog/slack-now-answers-messages-whose-first-delivery-was-lost)**: the Slack interface now answers a message whose first delivery never reached AgentOS. It used to drop the retry. - **[Cancelled runs say where they stopped](https://www.agno.com/blog/cancelled-runs-now-say-where-they-stopped)**: `cancellation_stage` tells you whether a run never started, stopped mid-run, or was waiting on a human. - **[Dependencies can read the run](https://www.agno.com/blog/dependency-callables-can-now-read-the-run-input-and-session)**: callables in an agent's `dependencies` can read the run input and the session. ## Breaking changes A few September releases changed behavior. The ones most likely to affect you: - Knowledge ingestion now reports embedding failures. Content that used to show `completed` may now show `failed` or `partial`, and embedders raise `EmbeddingError` where they used to return an empty vector. - `Knowledge` constructor arguments are keyword-only, so `Knowledge("docs")` becomes `Knowledge(name="docs")`. - `CodingTools` makes `run_shell` opt-in with `enable_run_shell=True`. - With `authorization=True` and `PublicSurface(mcp=True)`, MCP accepts only `localhost` by default. Add your domain to `MCPConfig(allowed_hosts=[...])`. Read the [release notes](https://github.com/agno-agi/agno/releases) before you upgrade. ## Community projects & showcases A few of the things people built with Agno in September: ### Workspace Council: a governed multi-agent council for your workspace by Anshul Raj, Mohamed Tahir, and Mujtaba Mohimtulay Built at the AI Tinkerers Dubai hackathon, Workspace Council puts six specialized Agno agents to work across the web, Slack, and the Ambiguous workspace app. They pull documents and email context, research with Exa, draft decision-ready artifacts, and run an adversarial critic loop on every draft. Every write waits for human approval, and a CopilotKit Mission Control view shows each handoff as it happens. Read more on [LinkedIn](https://www.linkedin.com/posts/anshul-raj-372740202_agentseverywhere-aiagents-copilotkit-ugcPost-7504510433589071872-uHlP). ### Vega: voice trading inside OpenAlgo by Marketcalls (@marketcallsHQ) OpenAlgo is an open-source trading platform for Indian markets that works with 35+ brokers. Its new assistant, Vega, lets you talk to the platform and place trades by voice. Agno runs the agents, and LiteLLM keeps it model-agnostic. Check it out on [X](https://x.com/marketcallsHQ/status/2099579349460750708). ### An agent council for pressure-testing ideas by Tarun Jain Pick a room for your niche in a pixelated world, pitch an idea, and six Agno agents with their own personas interview you, research with Exa, debate each other, and land on a collective opinion. Tarun built it to test agent-to-agent communication, comparing coordinator and routing orchestration with an A2A branch. The code will be open-sourced alongside a video walkthrough. Read more on [LinkedIn](https://www.linkedin.com/feed/update/urn:li:activity:7507055553433677824). ## Contributor shoutouts ### Community MVPs - **@basnijholt**: Fixes across the 3.x line. `SqliteDb` bulk upserts now apply the session owner check, empty Anthropic tool arguments survive replay, and nullable document titles in Claude citations no longer break ([#9937](https://github.com/agno-agi/agno/pull/9937), [#8970](https://github.com/agno-agi/agno/pull/8970), [#10147](https://github.com/agno-agi/agno/pull/10147), [#9941](https://github.com/agno-agi/agno/pull/9941)). - **@ProgrammerPlus1998**: Migrated the MCP client and the AgentOS MCP server to `mcp` 2.x, which brought `protocol_mode` to `MCPTools` ([#9269](https://github.com/agno-agi/agno/pull/9269)). - **@hugoaimlapi** (AI/ML API): Repaired the AIMLAPI model integration, then added `AIMLAPITools` for image, video, speech, and transcription behind one key ([#9898](https://github.com/agno-agi/agno/pull/9898), [#10276](https://github.com/agno-agi/agno/pull/10276)). - **@luisnmartins**: Added `.zip` and `.eml` as AgentOS upload types, so archives and email files go straight into a run ([#9193](https://github.com/agno-agi/agno/pull/9193)). ### More great contributions - **@ericcurtin** (Docker): Added llmman as a model provider ([#9863](https://github.com/agno-agi/agno/pull/9863)). - **@rastagan-git**: Added the Azure OpenAI Responses model ([#9841](https://github.com/agno-agi/agno/pull/9841)). - **@ddellspe-vl**: Let Bedrock take an async client you provide ([#9531](https://github.com/agno-agi/agno/pull/9531)). - **@kinKingen**: Added `AuthorizationConfig.excluded_route_paths` for public custom routes ([#9295](https://github.com/agno-agi/agno/pull/9295)). - **@jiweiyeah**: Added Y-API as an OpenAI-compatible model provider ([#10326](https://github.com/agno-agi/agno/pull/10326)). - **@devansh173**: Made MCP tools return audio as audio artifacts ([#10036](https://github.com/agno-agi/agno/pull/10036)). - **@yetuge**: Four PRs, including DeepSeek thinking-model detection in `OpenAILike` and UTF-8 reads and writes in `LocalFileSystemTools` ([#10342](https://github.com/agno-agi/agno/pull/10342), [#10538](https://github.com/agno-agi/agno/pull/10538)). - **@BlueX888**: Three fixes, including real image MIME types for Gemini and keeping falsy tool results like `0` and `[]` ([#9887](https://github.com/agno-agi/agno/pull/9887), [#9948](https://github.com/agno-agi/agno/pull/9948)). - **@devYRPauli**: Stopped `RecursiveChunking` from emitting duplicate trailing chunks and added grouped-shape support to the PowerPoint readers ([#9919](https://github.com/agno-agi/agno/pull/9919), [#10037](https://github.com/agno-agi/agno/pull/10037)). - **@ericdelorefice**: Made a failed async run delete raise an error, so a dropped connection no longer looks like a missing run ([#10682](https://github.com/agno-agi/agno/pull/10682)). - **@runshouse** (Magic Hour AI) and **@DanceNitra**: Added cookbooks for the Magic Hour hosted MCP server and inspeximus memory ([#10057](https://github.com/agno-agi/agno/pull/10057), [#10146](https://github.com/agno-agi/agno/pull/10146)). - **Reader fixes**: @RaycarlLei, @Minouccc, @n1uz1, @harbinresearcher, @lakers-abing, @emme1t, @tdog54646, @daleselaji-dev, @Kyousuk1e, and @baba9811 fixed edge cases in the knowledge readers, from text streams in the Text, Markdown, and CSV readers to CR line endings and scalar JSON roots. - **Docs and cookbook cleanup**: @Shxiao101, @Theater-ahyeon, @simpleqt, and @xizhuomengcontin fixed dead links, broken imports, and docstrings across the cookbook. Every one of you made Agno better. Thanks for building with us. ## Get involved Want to contribute to Agno? - ⭐ [Star Agno on GitHub](https://github.com/agno-agi/agno) - 💬 [Join our Discord](https://agno.link/discord) - 📖 [Read the docs](https://docs.agno.com/) - 🛠️ Check out [open issues](https://github.com/agno-agi/agno/issues) - 🚀 Share what you're building. We want to feature your project next month. **_— Team Agno_** --- # Agent evals are the new unit tests (and most teams skip them) > Agent evals verify what an AI agent actually did. Why prompt changes cause regressions, and how to build a minimum viable eval loop in CI. - Published: 2026-09-30 - Author: Cosette Cressler - Categories: Engineering, Perspectives - Canonical: https://www.agno.com/blog/agent-evals-are-the-new-unit-tests - Markdown: https://www.agno.com/blog/agent-evals-are-the-new-unit-tests.md Most teams test an agent change by trying a handful of familiar questions, reading the answers, and shipping. The problem is that an agent can pass every question you thought to ask and still break somewhere you didn't look. If you want to know whether a change actually made your agent better, you need to define what good behavior looks like and check it every time something changes. That's an eval. It does for agent behavior what unit tests do for code. Teams skip evals for much the same reason many still skip unit tests: the demo works, and writing tests feels slower than shipping, at least until something breaks in production. ## Why do agents regress when you change the prompt? Agents regress when a change to the prompt, model, or tools shifts which steps the agent takes. No code has to change for that to happen, which is why it often goes unnoticed until someone downstream spots it. Take a support agent for a subscription business. It answers billing questions, looks up accounts, and handles refunds with two tools: `request_refund_approval` to get finance's sign-off and `issue_refund` to send the money. It's been in production for two months without problems. A product manager asks for friendlier replies, so an engineer adds a line to the instructions: be warm, be concise, resolve the issue in as few steps as possible. The test questions come back warmer, and the change ships on Friday. On Tuesday, finance notices refunds under $50 going out without approval. The agent had read "as few steps as possible" as permission to skip `request_refund_approval` and call `issue_refund` directly when the amount was small. ![The same refund request, before and after the prompt change. Before, the agent calls lookup_account, then request_refund_approval, then issue_refund, and the refund waits for approval. After, it calls lookup_account and then issue_refund, skipping request_refund_approval, and the refund goes out unapproved.](https://www.agno.com/images/agent-evals-refund-trace.svg) The refund code and both tools were untouched, and every call succeeded. None of the engineer's test questions involved a refund, so there was nothing to notice. The prompt edit changed how the agent behaved, and nothing in the team's process was set up to catch it. ## Why don't unit tests catch agent regressions? Unit tests verify that code returns the right result, and most agent regressions happen in the agent's decisions rather than in its code. The team had unit tests, which already put them ahead of plenty of agent codebases, and they all passed. The refund tool validated its inputs, the approval endpoint returned the right status codes, and account lookup handled missing users. Those tests check code, and the code was fine. What went wrong was the agent's decision about which code to run. ![Two layers. The top layer is what the agent decides, covered by evals: instructions, edited on Friday, plus the model, tool descriptions, and context. It decides which code runs. The bottom layer is what the code does, covered by unit tests: the refund tool, the approval endpoint, and account lookup, all passing.](https://www.agno.com/images/agent-evals-unit-tests-vs-evals.svg) That decision depends on inputs unit tests don't cover: the instructions, the model, the tool descriptions, and whatever context gets pulled in. Changing any of them can shift behavior while every function still returns what it returned yesterday. Agents also aren't deterministic. The same input can take a different path on the next run, so trying a question once shows you one outcome, not the typical one. Catching this takes a test that runs the agent end to end and checks what it did. ## What are agent evals, and how are they different from unit tests? Agent evals are repeatable checks that run an agent end to end and verify its answers, its tool calls, and its performance. If you already write unit tests, most of the ideas carry over. The difference is what you assert on. | Unit testing | Eval equivalent | What it checks in an agent | | ----------------------------- | ------------------- | --------------------------------------------------------------------- | | A golden-file test | Accuracy eval | How closely does the answer match a reviewed expected answer? | | A test for a rule or contract | Agent-as-judge eval | Does the response meet your criteria: tone, policy, escalation rules? | | Checking a mock was called | Reliability eval | Did the agent call the right tools with the right arguments? | | Benchmarks | Performance eval | How long does it take, and how much memory does it use? | | A test suite in CI | Eval suite | Do all of the above pass together on every change? | The refund bug is a reliability failure, and a single check would have caught it: when a customer asks for a refund, the agent calls the approval tool. No model has to grade that check. Someone just has to write it. Many agent regressions look like this. The model reasons fine and still skips a step because nothing written down says the step is required. ## How do you evaluate an AI agent? To evaluate an AI agent, choose the five to ten behaviors that would do the most damage if they broke, write one test case for each, and run them on every change to the prompt, model, or tools. You don't need a benchmark or a big labeled dataset to start. The loop looks like this: 1. **List the behaviors that would cause real damage if they broke,** rather than everything the agent does. For the support agent, that means refunds go through approval, cancellations offer a retention option, and prices come from a lookup instead of the model's memory. 2. **Write one case per behavior,** with one input each, so a failure points at a specific cause. 3. **Pick the cheapest check that proves the behavior.** If the behavior is "calls the approval tool," check the tool call and save agent-as-judge evals for things like tone or policy compliance. 4. **Run the cases whenever the prompt, model, tools, or context change.** That includes model version upgrades you didn't choose. 5. **When a bug reaches production, add a case for it the same day.** Over time, the suite comes to reflect what actually breaks. ![The eval loop: list the riskiest behaviors, write one case each, pick the cheapest check, run on every change, turn bugs into cases. A return path leads from the last step back to the first, because every production bug becomes a new case.](https://www.agno.com/images/agent-evals-loop.svg) Here's what that looks like with Agno's eval suites. Each `Case` sends one input to your agent and applies an agent-as-judge check (a model grading the response against your criteria), a tool-call check, or both. For checks on tool arguments, use `ReliabilityEval` directly. Save the cases as `evals.py`: ```python evals.py import sys from agno.eval import Case, JudgeMode, cli from app.agents import support_agent CASES = ( Case( name="refund_requires_approval", agent=support_agent, input="I was charged $30 twice this month. Can I get one refunded?", tags=("smoke", "billing"), expected_tool_calls=("lookup_account", "request_refund_approval"), ), Case( name="cancellation_offers_retention", agent=support_agent, input="I want to cancel my subscription.", tags=("smoke",), criteria="Offers the pause or downgrade option before confirming cancellation.", ), Case( name="tone_stays_on_brand", agent=support_agent, input="This is the third time your app has double-charged me.", criteria="Acknowledges the frustration, apologizes once, and gives a concrete next step.", judge_mode=JudgeMode.NUMERIC, judge_threshold=7, ), ) if __name__ == "__main__": sys.exit(cli(CASES)) ``` The first case is the refund bug, checked through the tool calls with no model grading, so it adds no judge call. The check itself is deterministic: either the expected tools were called or they weren't. The second uses a pass/fail judge for a clear rule. The third uses a 1–10 score, since tone varies by degree and the score is worth tracking over time. Three cases won't cover everything the agent does, but they cover the failures that would be most expensive to ship. ## How do you run agent evals in CI? To run agent evals in CI, use a runner that fails the build when a case fails and run it on every pull request. Agno's `cli()` runner exits with a non-zero code when a selected case fails, so it can gate a CI job directly. Tags let you separate quick checks from slow ones. ```yaml - name: Run agent evals run: python evals.py --tag smoke --json-output tmp/evals.json ```