contents_db: every tool here reads or writes content rows, and construction raises a ValueError without one.
Prerequisites
The following example requires theagno, openai, and qdrant-client libraries, and sqlalchemy for the SQLite contents database (agno[sqlite]). It connects to Qdrant on localhost:6333.
Example
The following operator agent loads a website into the knowledge base and reports what is loaded:cookbook/91_tools/knowledge_management_tools.py
Content Ownership
scope decides who can read what the operator loads. With scope="shared" (the default), ingested rows are readable by every agent on the knowledge base. With scope="user", rows belong to the run’s user_id — and a run without a user_id gets an error back instead of silently writing to the shared bucket, where the content would be readable and deletable by everyone.
Toolkit Params
list_content and ingest_status are always registered — they only read.
Toolkit Functions
Every tool returns JSON with an
ok field; failures come back as {"ok": false, "error": ...} instead of raising to the model. Each tool also has an async variant registered under the same name, so the async versions are used automatically with arun and aprint_response.