⚠️ Breaking release. A database migration is required before v3.0 serves traffic. Read the v3 Migration Guide first, and see the full v3.0 Changelog for every change.
New Features
- Tool result offloading:
Agent(offload_tool_results=True)/Team(...)writes any tool result over 16,000 chars toAgentFSand leaves a short envelope (preview, size,result_id) in the message; the agent getsread_result/search_result(+ async) to fetch the rest. No model call on the write path. Tune viaResultStore(threshold_chars=..., ttl_seconds=...). (#9436, #9684) - Media offloading:
media_storage=S3MediaStorage(bucket=...)on an Agent/Team/Workflow uploads images, audio, video and files to local disk, S3 or GCS before persistence; the row keeps a smallMediaReferenceinstead of base64 (a 113 KB JPEG drops from ~151,000 chars to 2,897). No schema change. (#9340) Docs - CodeMode:
CodeMode(tools=[...])swaps a wide tool schema for one programmable IPython kernel that persists across a session — the model writes Python and calls tools as awaitable handles, composing them (variables, loops, helpers) without round-tripping through the transcript. - FinanceTools: One unified finance toolkit with swappable data providers.
- RampRouter model: New model provider for Ramp Router (router.com).
- SuperGrok OAuth: Device-code auth for the xAI model.
- AtomicMail Toolkit: Adds an AtomicMail toolkit (
AtomicMailTools) that gives an Agno agent its own email inbox
Database
- Runs get their own table: each run is a row in
agno_runswith real columns (session_id,run_type,agent_id,team_id,workflow_id,user_id,parent_run_id,status,run_index) + JSON payload. Takes session write amplification from O(N²) to O(N) and removes the DynamoDB/Firestore item-size ceiling.session.get_messages(),get_chat_history(),db.get_session()and AgentOS session routes are unchanged (runs re-attach on read). (#8350)- Direct run APIs:
db.get_run(),db.get_runs(session_id=..., status=..., limit=..., page=...),db.upsert_run(),db.delete_run(),db.delete_runs()(sync + async);db.get_session(runs_limit=N)anddb.get_sessions(include_runs=False). (#8350) - One-line migration:
MigrationManager(db).up()creates the runs store and copies legacy runs across, non-destructively and idempotently, on 12 sync + 4 async backends; un-migrated DBs still work (reads merge runs table with legacy blob). Schema versions tracked on every adapter. (#8350) - Typed stale-DB errors:
MigrationRequiredError/SchemaMismatchErrorname both remedies; AgentOS carrieserror_id: "migration_required_error"in the JSON body. (#9669, #9631) - Three new tables:
agno_runs,agno_jobs(durable background queue),agno_tool_results(offload index) — all auto-created.
- Direct run APIs:
Per-user isolation
- Extends beyond sessions to metrics, schedules, evals, knowledge, components, entity memory, and 17 vector databases. Metrics aggregate per user per day; unowned components/knowledge are shared (readable by all, editable by admin) so enabling isolation doesn't 404 pre-isolation building blocks. (#8245, #8262)
AgentOS & Studio
- Durable background execution:
AgentOS(queue=QueueConfig(durable=True))— accepted runs are committed rows that survive crashes/restarts/deploys, executed by any replica. Bounded concurrency (default 32,AGNO_BACKGROUND_MAX_CONCURRENCY), cancellable while queued,Idempotency-Keydedupe, 429 on full queue. Queue REST surface (GET /queue/jobs,.../{job_id},POST .../requeue,GET /queue/stats). Redis is optional coordination, never truth. (#9079, #9504) - Studio 3.0 — governed catalog:
create_*writes a DRAFT that serves nobody untilpublish_component; compare-and-set guards (typed 409s), tombstoned deletes, archive/restore, dependent-tracking. StudioTools returns a machine-readable envelope ({ok, status, data, error{...}, warnings}) across ~31 tools. (#9604)
Tools
- MiniMax video generation tools. (#9529)
- Toolkits now have a stable
idused by AgentOS to reference tools.
Model Updates
- Cerebras / CerebrasOpenAI default to
gpt-oss-120b(wasllama-4-scout-17b-16e-instruct). (#9244) - Gemini defaults updated to 3.7 Flash. (#9666)
- Groq: replaced deprecated
llama-3.3-70b-versatilewithopenai/gpt-oss-120b. (#9588) - OpenAI:
reasoning_effort,reasoning_summary,service_tier,verbosityaccept the full API value set (widened types; no call breaks). - Claude works with
anthropic1.0.0 (#9686): SDK-compat update for Claude models
⚠️ Breaking Changes
Every 2.x user must read this. A database migration is required before v3.0 serves traffic.
Storage & migrations
- Runs are no longer a JSON blob in the sessions table — they live in
agno_runs. RunMigrationManager(db).up()(or AgentOSPOST /databases/all/migrate) before serving. The v2→v3 migration preserves the legacyrunscolumn as a backup; reclaim it withdb.cleanup_legacy_runs_column()(SQL) /db.cleanup_legacy_runs_field()(document/KV) after verifying. - Stale/unmigrated databases raise typed errors instead of silently misbehaving.
- Pagination:
pagewithout alimit(orpage < 1) now raisesValueErrorinstead of returning unbounded/negative results.
AgentOS
- JWT:
secret_keyremoved fromJWTMiddlewareandauthorization_config— useverification_keys(a list). - Metadata routes:
GET /modelsremoved (model data moved toGET /configunderavailable_models);GET /returns a minimal landing response;GET /infois the single unauthenticated metadata endpoint. - MCP server config:
AgentOS(enable_mcp_server=..., mcp_config=...)removed — pass a singlemcp_server=instead. - Background execution requires a
dbon the component (returns 400 without one). External-framework agents (LangGraph, Claude, DSPy, etc.) stream inline forbackground=trueand are not resumable.
Agents
- Renamed params:
enable_user_memories→update_memory_on_runsearch_session_history→search_past_sessionsnum_history_sessions→num_past_sessions_to_searchnum_past_session_runs→num_past_session_runs_in_search
reasoning=Trueremoved — setreasoning_model=<native reasoning model>explicitly.continue_run/acontinue_run:updated_toolsremoved — passrequirements(list ofRunRequirementfrom the paused run output).- Culture feature removed:
enable_agentic_culture,add_culture_to_context,CulturalKnowledge, culture tools, and theagno_culturetable. Use Knowledge for shared cross-user info.
Teams & Workflows
- The
Workflowconstructor is keyword-only:Workflow(name=..., steps=[...]).Teamis unchanged —Team([agent_1, agent_2])still works, thoughTeam(members=[...])is preferred. - Flat HITL kwargs removed on Step/Steps/Loop/Condition/Router (
requires_confirmation,confirmation_message,on_reject,requires_user_input,user_input_message,user_input_schema,requires_output_review,output_review_message,requires_iteration_review,iteration_review_message,on_error,hitl_max_retries,hitl_timeout,on_timeout). Usehuman_review=HumanReview(...)(fromagno.workflow.types); names unchanged excepthitl_max_retries→max_retries,hitl_timeout→timeout.
Tools
MultiMCPToolsdeleted (along withallow_partial_failure) — use oneMCPToolsper server.MCPToolbox:auth_tokens/auth_headersremoved — useauth_token_getters.DuckDuckGoTools.duckduckgo_search→web_search,duckduckgo_news→search_news(now built onWebSearchTools).- Flat Google tool modules deleted (
agno.tools.gmail,googlesheets,googlecalendar,google_maps,google_drive,google_bigquery) — import fromagno.tools.google.*. - Google tools:
creds_path/auth_port→credentials_path/oauth_port; Sheetsenable_read_sheetetc. → bare method names. FileTools.check_escape→Toolkit._check_path(LocalFileSystemTools.check_escapeunaffected).SQLTools:enable_list_tables/enable_describe_table/enable_run_sql_query→ bare method names.- Seltz:
max_documents→max_results; the legacy SDK path is removed (seltz>=1.2.0required). StudioToolalias removed — useStudioTools.BrightData.get_screenshot: unusedoutput_pathremoved.PgVector.enable_prefix_matchingremoved (dead helper).
Knowledge & Vector DBs
Knowledge.add_content/add_content_async/add_contents_asyncremoved → useinsert()/ainsert()/ainsert_many().GDriveContextProviderrenamed →GoogleDriveContextProvider.- LanceDB:
use_tantivyremoved/ignored. - Searching a pre-v3 vector table with a
user_idraisesValueError(directing you to the vector DB migration) instead of returning empty results.
Scheduler
update_scheduleis now allow-listed (onlyname,description,method,endpoint,payload,cron_expr,timezone,timeout_seconds,max_retries,retry_delay_seconds,enabled,next_run_at,disabled_reason); any other key raisesValueError. Ownership/provenance/lock state are no longer writable via the generic path. New provenance columns added by the v3.0.0 migration.- The schedules unique key changes from
nameto(user_id, name). If duplicate schedule names exist across the same user, the migration aborts — deduplicate before migrating.
Evals
eval_id→run_id(#9739): eval classes no longer carryeval_id; every run gets its ownrun_id.store_result_in_filerenames theeval_idparameter torun_id, the{eval_id}placeholder infile_path_to_save_resultstemplates is no longer accepted (use{run_id}), andPOST /eval-runsreturns the id the row was actually stored under (run_id). Re-runs no longer overwrite each other.
Models & Learning
- Mistral:
mistralaiv1 compatibility layer removed —agno[mistral]requiresmistralai>=2.0.0(and is back in themodelsextra). agno.models.metricsmodule and theMetricsalias removed → import fromagno.metrics(RunMetrics).Model.classify_errorremoved → useModelProviderError.classify(error).- Entity memory under
namespace="user"is now isolated per user (row keys embed auser_iddigest); pre-v3 rows re-keyed by the v3.0.0 migration (agno.learn.migrations.rekey_user_entity_learnings);EntityMemoryStore.delete/getrequire a keyword-onlyuser_idin that namespace. - Removed learn aliases:
MemoriesConfig→UserMemoryConfig;MemoriesStore→UserMemoryStore;Decision→DecisionLog.
Deprecated (still working)
knowledge_retriever(dependencies=...)→ preferrun_context. A retriever whose signature still namesdependencieskeeps working via an explicit backward-compat branch;run_contextwins when both are present.- Scopes:
system:read/system:write→config:read/config:write. The old names remain valid aliases and existing tokens keep working. RedisDB(vector DB) →RedisDb. NoteRedisVectorDbis also still exported, to disambiguate from theagno.db.redisstorage adapter.
Migration quick-reference
Docs: Step-by-step guide, database migration, and a paste-into-your-coding-agent prompt
import asyncio
from agno.db.migrations.manager import MigrationManager
# Step 1: run before serving v3.0 traffic (up() is async)
asyncio.run(MigrationManager(db).up())
# Step 2: VERIFY the runs landed before any cleanup
assert len(db.get_runs(limit=5)) > 0, "Migration copied nothing - do NOT clean up"
# Step 3 (optional, destructive): reclaim the legacy blob column.
# The migration preserves it as a backup, so force=True is required.
db.cleanup_legacy_runs_column(force=True) # SQL adapters
# db.cleanup_legacy_runs_field(force=True) # document / KV adaptersOn AgentOS: POST /databases/all/migrate. Full details in the v3.0 changelog docs.
What's Changed
- Update Cerebras defaults and cookbook models by @ryanl-cerebras in #9244
- [fix] Repair stale cookbook links by @CRDong233 in #9590
- fix: replace the deprecated Groq
llama-3.3-70b-versatilewithopenai/gpt-oss-120bby @sannya-singal in #9588 - [cookbook] Add OpenUI client example for AgentOS AG-UI by @vishxrad in #9605
- feat: add emem cookbook example by @kumari-jaya in #9624
- chore: update gemini defaults to use 3.7 flash by @markmcd in #9666
- fix: docs clarify human-readable ID collision guarantees by @daleselaji-dev in #9665
- fix: typos in code comments and docstrings by @feizhuzheng in #9597
- [cookbook] Align Team HITL examples with cookbook standards by @Math1987 in #9671
- cookbook: add emem entry to MCP cookbook README index by @kumari-jaya in #9636
- fix: repair four imports that do not resolve in cookbooks by @tonydzi in #9498
- feat: add MiniMax video generation tools by @octo-patch in #9529
- feat: v3.0 by @kausmeows in #8210
- feat: Release v3.0.0 by @kausmeows in #9755
New Contributors
- @ryanl-cerebras made their first contribution in #9244
- @CRDong233 made their first contribution in #9590
- @vishxrad made their first contribution in #9605
- @kumari-jaya made their first contribution in #9624
- @daleselaji-dev made their first contribution in #9665
- @feizhuzheng made their first contribution in #9597
- @Math1987 made their first contribution in #9671
- @tonydzi made their first contribution in #9498
Full Changelog: v2.9.0...v3.0.0