New Features
- User Management / Authorization (RBAC): a new
agno.os.authzpackage adds role-based access control to AgentOS — a role store, scope policy, audit log, user directory and an admin router, with pluggable authorization engines (a native engine plus a fine-grainedfgaengine). Scopes and auth middleware were extended to enforce it. - AgentOS Filesystem: a new
agno.fsfilesystem (DbFileSystem) with dedicated/filesystemroutes (list/read/manage files) backed by anagno_fstable. - MCP config / auth updates: refreshed MCP server config and built-in MCP auth handling.
- AIMLAPITools: new toolkit for image, video, speech and transcription via the AI/ML API.
⚠️ Breaking Changes
- Filesystem table re-key (
agno_fs): v3.1 keys the filesystem table by(namespace, user_id, path), whereuser_idis the user partition (""for the shared/no-user partition). A table created by an earlier release is refused withSchemaOutdatedErroruntil upgraded — the re-key never runs automatically. Upgrade once, with the application stopped, using the script for your database (#10530):
This affects you only if you use DbFileSystem. The table is managed by DbFileSystem (its own schema, buildable from a bare db_url), so it is deliberately not part of MigrationManager.
python libs/agno/migrations/migrate_filesystem_postgres.py # PostgreSQL
python libs/agno/migrations/migrate_filesystem_sqlite.py # SQLite- MCP default & lifecycle tools are now opt-in:
MCPConfig(tools=[...])now publishes exactly the tools you list — bothdefault_toolsandlifecycle_toolsdefault toFalse. Previously atools=[...]config also served the built-in default tools (and the lifecyclecontinue_run / cancel_run).
Bug Fixes
- HITL: continuing a paused run with
background+streamno longer duplicates the paused run in its own history. - OpenAIResponses: recover requests when the chained (previous) response is gone.
- DB: an async delete that failed is no longer reported as a run that wasn't there — the two cases are distinguished.
- Structured output: don't crash when a JSON fragment provides a scalar before a list.
- Python tool results: distinguish
Nonevalued results from missing variables. - Chunking: reject an overlap that is not smaller than the chunk size.
- CSV readers: handle CR (
\r) record endings. - CsvTools: honor explicit zero row limits.
- Shell / workspace command tools: honor an explicit zero
tail. - GeminiTools: store raw video bytes in the
generate_videoartifact. - GithubTools: build branch links from the repository web URL (#10509);
get_file_contentpreserves valid non-ASCII UTF-8 text - LocalFileSystemTools: read and write local files as UTF-8.
- PubMed: preserve metadata for short abstracts.
- Claude citations: preserve nullable document titles.
What's Changed
- [fix] Honor explicit zero row limits in CsvTools by @hfg369 in #10492
- [fix] GithubTools.get_file_content: preserve valid non-ASCII UTF-8 text by @indexGin in #10480
- fix: recover OpenAIResponses requests when the chained response is gone by @ysolanky in #10395
- [feat] Add AIMLAPITools: image, video, speech and transcription via AI/ML API by @hugoaimlapi in #10276
- test: abort the create name prompt with Ctrl-D instead of SIGINT by @ysolanky in #10541
- fix: Add GPT 6 series to reasoning list and Add GPT-6 Astra reasoning cookbook example by @RayST3 in #10542
- fix: make
test_encoded_sse_cannot_bypass_public_error_inspectiontest more robust by @sannya-singal in #10533 - [fix] Read and write local files as UTF-8 in LocalFileSystemTools by @yetuge in #10538
- [fix] Build GithubTools branch links from repository web URL by @jiangjiang248 in #10509
- fix: reject an overlap that is not smaller than the chunk size by @sclfcz in #10321
- fix: store raw video bytes in GeminiTools.generate_video artifact by @BlueX888 in #10554
- [fix] Honor explicit zero tail in shell and workspace command tools by @yetuge in #10593
- chore: move Docling knowledge tests into their own CI job by @sannya-singal in #10499
- [fix] Preserve nullable document titles in Claude citations by @basnijholt in #10147
- [fix] Preserve PubMed metadata for short abstracts by @zyouekiri in #10640
- [fix] Distinguish None-valued Python tool results from missing variables by @icearia0219 in #10637
- [fix] Handle CR record endings in CSV readers by @lakers-abing in #10657
- fix: HITL continue with background and stream duplicates the paused run in its own history by @kausmeows in #10597
- [fix] db: an async delete that failed is not a run that was not there by @ericdelorefice in #10682
- [fix] Don't crash when a JSON fragment provides a scalar before a list by @inchang-ing in #10654
- feat: v3.1 by @kausmeows in #10530
- feat: make MCPConfig default and lifecycle tools opt-in by @ashpreetbedi in #10285
- feat: Release v3.1.0 by @kausmeows in #10702
New Contributors
- @hfg369 made their first contribution in #10492
- @indexGin made their first contribution in #10480
- @jiangjiang248 made their first contribution in #10509
- @sclfcz made their first contribution in #10321
- @zyouekiri made their first contribution in #10640
- @icearia0219 made their first contribution in #10637
- @lakers-abing made their first contribution in #10657
- @ericdelorefice made their first contribution in #10682
- @inchang-ing made their first contribution in #10654
Full Changelog: v3.0.11...v3.1.0