Agno
Verified 2026-08-19 — PASS, 9s. Session persistence: native SqliteDb.
The shortest integration of the ten. Agno owns persistence entirely — hand it a session_id and it
rehydrates history itself.
The runner
Section titled “The runner”import sys, ossys.path.insert(0, os.path.expanduser("~/agenttests"))import azcfg, hetoolfrom agno.agent import Agentfrom agno.models.openai import OpenAIChatfrom agno.db.sqlite import SqliteDb
DB = os.path.expanduser("~/agenttests/agno/agno.db")
def get_working_folder() -> str: """Return the agent's current working folder (absolute path).""" return hetool.get_working_folder()
def run_shell(command: str) -> str: """Run a shell command in the working folder and return its output.""" return hetool.run_shell(command)
def invoke(sid, message): c = azcfg.load() agent = Agent( model=OpenAIChat(id=c["model"], base_url=c["base_url"], api_key=c["api_key"]), db=SqliteDb(db_file=DB), session_id=sid, add_history_to_context=True, tools=[get_working_folder, run_shell], instructions="Be concise. Use tools for operational questions.", ) return str(agent.run(message).content).strip()That is the entire runner — no load, no save, no transcript handling.
Engine definition
Section titled “Engine definition”{ "type": "process", "file": "/home/you/agno/.venv/bin/python3", "nativeSession": true, "argsNew": ["/home/you/he_adapter.py", "/home/you/agno_session.py", "", "{message}"], "argsResume": ["/home/you/he_adapter.py", "/home/you/agno_session.py", "{sessionId}", "{message}"], "replyField": "result", "sessionIdField": "session_id", "approve": false, "workdir": "/home/you/work", "proxy": { "shape": "openai", "baseUrlEnv": "OPENAI_BASE_URL", "keyEnv": "OPENAI_API_KEY", "modelEnv": "OPENAI_MODEL", "model": "<route>|<provider model>" }}Adoption
Section titled “Adoption”- Keep your agent definition as it is.
- Pass HBIA’s
sidstraight through as Agno’ssession_id. - Add
db=SqliteDb(...)andadd_history_to_context=True. - Build
OpenAIChatfromazcfg.load(). - Seal the engine, point
external.engineat it, restart.
Gotchas
Section titled “Gotchas”add_history_to_context=True is not the default. Without it Agno stores the session but does not
feed prior turns to the model — persistence that looks like it works and produces an agent with no
memory. This is the single most likely thing to get wrong here.
OpenAIChat(id=...), not model=.... The keyword is id.
One SQLite file, many sessions. Keyed by session_id, so a swarm sharing a filesystem shares
history correctly — but SQLite over NFS is a known hazard. Keep the db on local disk.
Plain callables as tools, with real docstrings — Agno reads the signature and docstring.