v3.0.7
agno-agi/agnov3.0.7Sep 8, 2026by ysolanky
AI Summary
This release introduces a new Page storage system for knowledge management and a PublicSurface for serving Agents and Teams. It also fixes critical integration issues with Meta Llama and AIMLAPI, improves workflow error handling, and resolves frame pinning in cached tool wrappers.
Key Highlights
- New Page storage system (agno.knowledge.page) with atomic publishing, versioning, and search APIs.
- PublicSurface feature to serve Agents, Teams, and Workflows with shared quotas and authentication.
- Workflow error handling improvements: failed runs are finalized before streaming events.
- Fixed crashes in Meta Llama and AIMLAPI integrations.
Breaking Changes
- Knowledge constructor arguments are now keyword-only; positional calls like Knowledge("docs") must become Knowledge(name="docs").
- Page search now honors the configured PgVector HNSW ef_search setting instead of forcing a default of 200.
New Features
- Page storage in agno.knowledge.page with filesystem text and vectors.
- PublicSurface for public serving of Agents and Teams.
- PageFileSystem toolkit for bounded read-only access.
- Agent dependency callables can receive run_input and session.
- AIMLAPI integration with analytics-only attribution headers.
Full Release Notes
# Changelog
## New Features
- **Page storage in `agno.knowledge.page`.** Knowledge atomically publishes catalog metadata, filesystem text and vectors, preserves previous revisions when a refresh fails, and exposes bounded sync and async setup, source synchronization, search, read, list and grep APIs. Installed through the new `agno[pages]` extra. (#9963)
- `Knowledge(page_search=PageSearchConfig(...))` provides typed, transaction-local planner controls. Unset scan preferences, costs, worker counts and thresholds inherit the PostgreSQL settings.
- **`PublicSurface` for public serving**: serves selected Agents, native stateless MCP and authenticated durable-sync Workflows, with shared quotas, request and output bounds, CORS and internal-service authentication. (#9963)
- Explicitly selected **Teams** are now servable too, with REST and gzip support. They share the Agent admission, execution and output limits; the roster is reduced and member routes stay private unless independently selected. (#9996)
- **`PageFileSystem(knowledge=...)`**: a bounded read-only page filesystem toolkit with sync and async execution, exposed explicitly through `files.tools()`. Commands read pages lazily against pinned revisions, list scoped metadata and run bounded literal grep; they cannot execute a shell or write files. (#9997)
- **Agent dependency callables can receive `run_input` and `session`**, alongside the existing `agent` and `run_context`. Resolution runs before pre-hooks and reuses successful values on model retries. `add_dependencies_to_context` still defaults to False. (#9963)
- **AIMLAPI**: requests carry a fixed, analytics-only attribution header set, inspectable as `agno.models.aimlapi.AIMLAPI_HEADERS` and overridable per model via `default_headers`, where caller-supplied keys win. The headers carry no user data and do not affect routing, model selection or billing. The default model also moves from the retired `gpt-4o-mini` to `gpt-5.6-terra`. (#9898)
## Improvements
- **Workflows report failed steps as `StepError`** for both raised executor failures and explicitly failed outputs, carrying the current step's identity. Function reports are still preserved as `StepOutput`, and Agent, Team and nested Workflow content keeps its existing executor stream. Both console streaming printers render `StepError` explicitly, showing the original failure and clearing stale progress output. (#10001)
## Bug Fixes
- **Failed workflow runs are finalized before their terminal streaming event.** A workflow that paused during a background stream could fail during a non-streaming continuation, save `ERROR` to the database and leave its tracked stream stuck at `PAUSED`; fresh streaming failures yielded `WorkflowError` before the failed run was saved, so a consumer closing at that event could lose the run entirely. (#10001)
- Nested workflow guardrail rejections are no longer retried, which previously replayed earlier child side effects. Explicit `skip_on_failure` is honored through the existing final-attempt policy and ordinary executor retries are preserved.
- **Meta Llama and AIMLAPI: every run crashed.** Both providers' `_format_message` overrides had drifted from `OpenAIChat`, which passes `compress_tool_results` positionally, so each call raised `TypeError: _format_message() takes 2 positional arguments but 3 were given`. (#10031, #9898, fixes #9034)
- **Anthropic: empty tool arguments are preserved.** A zero-argument Claude tool call is an empty input object, which the adapter treated as falsy and omitted `function.arguments` for. Streaming and non-streaming parsing now serialize every tool input, so empty input becomes `"{}"`. (#8970, fixes #8971)
- **Cached tool wrappers no longer pin the caller's frame.** `validate_call` stores the caller's `f_locals` on the wrapper it builds and `Function` caches those wrappers for the life of the process, so on Python 3.13 every cached tool kept the wrapping frame alive along with the Agent, session and run state on the stack. The namespace resolver is cleared once the validators are built. (#9941, fixes #9940)
- **Anonymous native Agent JSON no longer leaks diagnostics**: a failed run returned HTTP 200 carrying status `ERROR` and nested model diagnostics, and is now a safe `503 run_failed`, matching the streaming error protection. Authenticated operator diagnostics are unaffected. (#9963)
- **Page serving corrections** across source retries, canonical-link deduplication, publication-time source binding, bounded page checkout and Agent continuation dependency ordering. (#9996)
## Breaking Changes
- **`Knowledge` constructor arguments are keyword-only.** Positional calls such as `Knowledge("docs")` must become `Knowledge(name="docs")`. `content_db` is now the preferred spelling; `contents_db` remains a supported read/write alias sharing the same dataclass field, so serialization, copy and `dataclasses.replace(..., contents_db=...)` are unchanged. Passing both keywords requires the same object. (#9963)
- **Page search honours the configured `PgVector` HNSW `ef_search`** instead of silently forcing 200, so deployments that relied on the implicit 200 should set it explicitly. Page indexes built from interim main builds can carry an implicit `ef_construction=64` and need an operator-managed rebuild; setup reports an actionable error rather than rebuilding automatically. (#9963)
## What's Changed
* feat: add coordinated pages and public docs serving by @ashpreetbedi in https://github.com/agno-agi/agno/pull/9963
* fix: correct page serving and add selected public teams by @ashpreetbedi in https://github.com/agno-agi/agno/pull/9996
* feat: extract bounded read-only page filesystem by @ashpreetbedi in https://github.com/agno-agi/agno/pull/9997
* [fix] agno 3.x: drop the caller-frame namespace pydantic keeps on cached tool wrappers by @basnijholt in https://github.com/agno-agi/agno/pull/9941
* [fix] Preserve empty Anthropic tool arguments by @basnijholt in https://github.com/agno-agi/agno/pull/8970
* [fix] AIMLAPI: repair broken integration, add revenue attribution headers by @hugoaimlapi in https://github.com/agno-agi/agno/pull/9898
* fix: forward compress_tool_results in LlamaOpenAI._format_message by @kausmeows in https://github.com/agno-agi/agno/pull/10031
* fix: finalize failed workflow runs before streaming errors by @ashpreetbedi in https://github.com/agno-agi/agno/pull/10001
* chore: release 3.0.7 by @ysolanky in https://github.com/agno-agi/agno/pull/10055
## New Contributors
* @hugoaimlapi made their first contribution in https://github.com/agno-agi/agno/pull/9898
**Full Changelog**: https://github.com/agno-agi/agno/compare/v3.0.6...v3.0.7