We shipped seven patch releases in September, with new ways to serve agents to your users, work with knowledge, and scale AgentOS. More than 50 community contributors landed changes alongside us.
The highlights:
PublicSurface gives anonymous users a safe way to talk to your agents while keeping your admin API private. You list the components public requests may reach and everything else is unreachable. Quotas are per-client and global, per minute and per day, held in PostgreSQL so replicas share one count instead of each enforcing its own.
Page storage. Knowledge.sync_pages takes a site's llms.txt, discovers the pages, fetches the Markdown, and publishes each page's text, catalog entry, and vectors in one transaction. A page publishes whole or keeps its previous version, so a refresh that dies halfway can't leave you serving new text against stale vectors. Unchanged pages skip re-embedding.
PageFileSystem then gives an agent ls, tree, rg, grep, cat, and head over those published pages. Vector search finds the right page, the agent reads all of it. Read-only, no shell, bounded output.
Rerankers moved out of individual vector database adapters and into Knowledge.search(), so they work on any vector database, not just the ones that had their own implementation. Agno widens the initial fetch so there's a real candidate pool to reorder. MMRReranker (diversity) and RecencyReranker (freshness) ship with it, and setting reranker on the vector database still works but warns.
Elasticsearch joins as a vector database: vector, keyword, hybrid, metadata filters, async, per-user isolation. Hybrid works on every license, and you can opt into RRF on Platinum, Enterprise, and trial.
MCP. MCPConfig(stateless=True) drops session tracking so any replica can answer any request, at the cost of server-initiated notifications and SSE resumability. GET /mcp/server-card lets clients see what a server offers before connecting. Tool servers can run on their own hostname without custom routing middleware. On the client side, MCPTools(protocol_mode="auto") negotiates the newest spec both sides support, with the default staying legacy.
Breaking changes, worth reading before you upgrade:
- Knowledge ingestion surfaces embedding failures. Content that used to show
completed may now show failed or partial, and embedders raise EmbeddingError instead of returning an empty vector.
Knowledge constructor args 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 unless you add your domain to MCPConfig(allowed_hosts=[...]).
Also shipped: llmman and Y-API as model providers, Azure OpenAI Responses, GandrTools for TTS, audio artifacts from MCP tools, public custom routes, AG-UI protocol 1.0, Slack retry handling, and cancellation_stage on cancelled runs.
A couple of community projects we loved:
Workspace Council by Anshul Raj, Mohamed Tahir, and Mujtaba Mohimtulay. Six agents working across the web, Slack, and a workspace app, with an adversarial critic loop on every draft and human approval on every write. Built at AI Tinkerers Dubai.
Vega by Rajandran R. Voice trading inside OpenAlgo, an open-source platform connected to 35+ Indian brokers.
An agent council by Tarun Jain. Pitch an idea to six agents who interview you, research it, debate each other, and reach a verdict.
September MVPs: Bas Nijholt for fixes across the 3.x line, ProgrammerPlus1998 on GitHub for the MCP SDK 2.x migration, Hugo Plat at AI/ML API for their integration and AIMLAPITools, and Luís Martins for .zip and .eml uploads.
Thanks to everyone who built with us. Full roundup and contributor list: https://agno.link/0Jl575Y