Changelog
Behavior Changes
KnowledgeManagementToolsconstructor flags renamed,ingest_pathnow opt-in: the 2.x-styleenable_ingest/enable_removeflags are replaced by flags named after the tools they register —ingest_url,ingest_path,ingest_text,remove_content(the old names are no longer recognised and are ignored if passed).ingest_pathdefaults to off: it reads any path the server process can read, and underscope="shared"what it loads becomes readable by every agent on that knowledge base, so registering it is now an explicit choice.list_contentandingest_statusstay unflagged — they only read. (#9861)agno.tools.knowledge_managementimport path moved:KnowledgeManagementTools(introduced in 3.0.3) now lives atagno.tools.knowledge; the old module path is gone.from agno.tools.file_generation import FileGenerationToolskeeps working through a compatibility shim. (#9861)
Improvements
agno.tools.fileandagno.tools.knowledgeare packages:FileToolsandFileGenerationToolsshareagno.tools.file;KnowledgeTools(read side) andKnowledgeManagementTools(write side) shareagno.tools.knowledge, following theagno.tools.mcpandagno.tools.financelayout. Names resolve on first access, so importingFileToolsno longer pullsreportlabandpython-docxin behind it — measured at 44.8 ms with both installed, previously paid on everyFilesystemContextProviderimport. (#9861)- AtomicMail reuses its auth handshake: the resolved context (capability JWT, API URL, account and inbox ids) is cached on the instance until the token nears expiry, in both sync and async paths, and keyed to the api_key it was minted from so re-registration is picked up on the next call. Warm tool calls drop from ~35 s to 0.4–3 s. (#9825)
- AtomicMail proof-of-work parallelised: the scrypt nonce search splits across a bounded thread pool — new
pow_workersargument, defaultmin(4, cpu_count()), withpow_workers=1matching the old sequential search exactly. Measured at difficulty 10: mean solve 25.9 s → 10.4 s on 4 workers.pow_timeoutstill bounds the search, and a worker that finds a solution wins over a concurrent timeout. (#9825)
Bug Fixes
- AtomicMail
list_inboxreturned the agent's own sent mail:send_emailfiles the outgoing message in the inbox mailbox with$draftset, andlist_inboxqueried that mailbox unfiltered, so an agent could not tell its own outgoing mail from a reply. The query now filtersnotKeyword: "$draft", the parser drops any$draftentry, and a rejected query is reported as an error instead of an empty inbox. (#9825) - Caller-supplied
requires_confirmation_toolsdropped theremove_contentgate:KnowledgeManagementToolsset its confirmation list withsetdefault, so passing your own list silently removed the built-in confirmation requirement onremove_content— the one tool in the kit that destroys data. The lists now union. (#9861)