- Session runs are stored one row per run in a dedicated runs table.
user_idscoping extends to metrics, schedules, evals, knowledge and vector databases.background=Trueon AgentOS is backed by a durable job queue that survives crashes and deploys.- Database migrations run through the built-in
MigrationManager, with schema versions tracked on every adapter.
Storage
Denormalized session storage
Denormalized session storage
- Runs are no longer stored as a JSON blob in the sessions table. Each run is
a row in the runs table (
agno_runsby default) withrun_id,session_id,run_type,run_index,user_id,statusandrun_data. - Saving a run writes one row instead of rewriting the whole session history. This removes the quadratic write amplification and unbounded row growth of the blob design.
session.runsis still populated on read: sessions merge the runs table with any legacy blob, so un-migrated sessions keep working.- New direct accessors:
db.get_run(run_id)anddb.get_runs(session_id=..., user_id=..., status=..., limit=...). - The v2 -> v3 migration preserves the legacy
runscolumn as a backup. Reclaim it withdb.cleanup_legacy_runs_column()(SQL) ordb.cleanup_legacy_runs_field()(document/KV adapters) after verifying the migration.
Built-in migrations and schema versioning
Built-in migrations and schema versioning
MigrationManager(db).up()walks all registered migrations for every table and stamps the resulting schema version.- Schema versions are tracked on every adapter, including the document and key-value stores (MongoDB, Redis, Valkey, Firestore, DynamoDB, SurrealDB, JSON, GCS JSON, in-memory). An unstamped database is treated as pre-v3 and migrated.
- Migrations are idempotent and non-destructive. Failures raise and abort before any version stamp is written.
User Isolation
Per-user scoping across the platform
Per-user scoping across the platform
user_idcolumns added to the schedules, schedule-runs and evals tables. All user-facing read and write methods acceptuser_id.- Metrics aggregate per user. The unique key changed from
(date, aggregation_period)to(user_id, date, aggregation_period). Sessions without auser_idaggregate into a shared bucket thatget_metricsmaps back toNone. - Knowledge and vector database contents are scoped per user when isolation
is enabled. Searching a pre-v3 vector table with a
user_idraises aValueErrordirecting you to the vector database migration, instead of silently returning empty results. - Schedule polling (
claim_due_schedule/release_schedule) stays unscoped so background execution fires across all users; each schedule run records the owner denormalized from its parent schedule.
AgentOS
Durable background execution
Durable background execution
- Accepted
background=Truerequests are committed job rows that survive crashes, restarts and deploys. Any replica’s worker can claim and execute them. - Concurrency is bounded. Excess submissions wait in
pendingstatus instead of overloading the process. - Runs can be tailed (
stream=true), resumed after a disconnect (/resume) and cancelled from any replica. Idempotency-Keyheaders deduplicate resubmissions.- Redis is optional coordination (live event streams, cross-replica cancellation), never truth. A Redis fault degrades the live view; it cannot lose or corrupt a run.
- Background execution requires a
dbon the component and returns a 400 without one. - External framework agents (LangGraph, Claude, DSPy, etc.) stream inline
when
background=trueis requested; their runs are not resumable.
JWT middleware
JWT middleware
secret_keyremoved fromJWTMiddlewareandauthorization_config. Useverification_keys, which takes a list of keys.
Metadata route consolidation
Metadata route consolidation
GET /modelsremoved. Model data moved intoGET /configunderavailable_models.GET /returns a minimal landing response linking to/docs,/infoand/health.GET /infois the single unauthenticated metadata endpoint.
Agents
Removed parameters
Removed parameters
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_searchreasoning=Trueremoved. Setreasoning_model=<native reasoning model>explicitly.continue_run/acontinue_run:updated_toolsremoved. Passrequirements(a list ofRunRequirementfrom the paused run output).
Async tools in sync runs
Async tools in sync runs
agent.run()executes async tools automatically. The v2 guard that raised and requiredarun()is removed.
Culture feature removed
Culture feature removed
- The experimental culture feature is removed:
enable_agentic_culture,add_culture_to_context,CulturalKnowledge, the culture tools and theagno_culturetable. - Use Knowledge for shared cross-user information.
Teams & Workflows
Keyword-only constructors
Keyword-only constructors
TeamandWorkflowconstructors no longer accept positional arguments:Team(members=[...]),Workflow(name=..., steps=[...]).
HITL configuration unified into HumanReview
HITL configuration unified into HumanReview
- Flat HITL kwargs on
Step,Steps,Loop,ConditionandRouterare removed: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. - Pass
human_review=HumanReview(...)instead (import fromagno.workflow.types). Field names are unchanged excepthitl_max_retries->max_retriesandhitl_timeout->timeout.
Tools
Toolkit updates
Toolkit updates
- Toolkit constructor parameters drop the
enable_prefix (e.g.SlackTools(send_message=True)). The old names still work and log a deprecation warning. MCPToolbox:auth_tokensandauth_headersremoved. Useauth_token_getters.- Toolkits have an
id, used by AgentOS to reference tools stably.