Skip to main content

Agno

Cache Agno agent responses -- sync and async -- including team workflows, tool-level caching, and multi-turn context management.

pip install 'omnicache-ai[agno]'

6.1 Single agent with sync caching​

Wrap an Agno agent so that identical prompts return the cached response.

from agno.agent import Agent
from agno.models.openai import OpenAIChat
from omnicache_ai import CacheManager, InMemoryBackend, CacheKeyBuilder
from omnicache_ai.adapters.agno_adapter import AgnoCacheAdapter

manager = CacheManager(
backend=InMemoryBackend(),
key_builder=CacheKeyBuilder(namespace="agno"),
)

agent = Agent(
model=OpenAIChat(id="gpt-4o-mini"),
description="You are a helpful assistant.",
markdown=True,
)
cached = AgnoCacheAdapter(agent, manager)

# First call — hits the model
response1 = cached.run("Explain vector embeddings in 2 sentences.")
# Second call — instant cache hit
response2 = cached.run("Explain vector embeddings in 2 sentences.")

print(response1.content)

6.2 Async agent​

Use the async interface for non-blocking agent calls.

import asyncio
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from omnicache_ai import CacheManager, InMemoryBackend, CacheKeyBuilder
from omnicache_ai.adapters.agno_adapter import AgnoCacheAdapter

manager = CacheManager(
backend=InMemoryBackend(),
key_builder=CacheKeyBuilder(namespace="agno"),
)
agent = Agent(model=OpenAIChat(id="gpt-4o"), markdown=True)
cached = AgnoCacheAdapter(agent, manager)

async def main():
r1 = await cached.arun("What year was Python created?")
r2 = await cached.arun("What year was Python created?") # cache hit
print(r1.content)

asyncio.run(main())

6.3 Team of cached agents​

Cache each agent in a team independently. Repeated runs with the same input skip the model entirely.

import asyncio
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.team import Team
from omnicache_ai import CacheManager, DiskBackend, CacheKeyBuilder
from omnicache_ai.adapters.agno_adapter import AgnoCacheAdapter

manager = CacheManager(
backend=DiskBackend(directory="/var/cache/agno"),
key_builder=CacheKeyBuilder(namespace="agno"),
)

coder = AgnoCacheAdapter(Agent(model=OpenAIChat(id="gpt-4o"), role="Write Python code"), manager)
tester = AgnoCacheAdapter(Agent(model=OpenAIChat(id="gpt-4o-mini"), role="Write tests"), manager)

async def main():
code = await coder.arun("Write a function that computes Fibonacci numbers.")
tests = await tester.arun(f"Write pytest tests for:\n{code.content}")
print("Code:\n", code.content)
print("Tests:\n", tests.content)

asyncio.run(main())

6.4 Agno agent with tool calls -- cache at tool level​

Cache search results at the tool level so repeated queries skip the web call.

from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.duckduckgo import DuckDuckGoTools
from omnicache_ai import CacheManager, InMemoryBackend, CacheKeyBuilder, RetrievalCache
from omnicache_ai.adapters.agno_adapter import AgnoCacheAdapter

manager = CacheManager(backend=InMemoryBackend(), key_builder=CacheKeyBuilder())
ret_cache = RetrievalCache(manager)

# Cache search results so repeated queries skip the web call
def cached_search(query: str) -> list[str]:
def do_search(q: str) -> list[str]:
return DuckDuckGoTools().search(q)

return ret_cache.get_or_retrieve(
query=query,
retrieve_fn=do_search,
retriever_id="duckduckgo",
top_k=5,
)

agent = Agent(model=OpenAIChat(id="gpt-4o-mini"), tools=[DuckDuckGoTools()])
cached_agent = AgnoCacheAdapter(agent, manager)

response = cached_agent.run("Latest news about AI regulation in 2025")
print(response.content)

6.5 Context cache for multi-turn sessions​

Store and retrieve per-session conversation history, then invalidate it when done.

from agno.agent import Agent
from agno.models.openai import OpenAIChat
from omnicache_ai import (
CacheManager, InMemoryBackend, CacheKeyBuilder,
ContextCache, InvalidationEngine,
)
from omnicache_ai.adapters.agno_adapter import AgnoCacheAdapter

tag_store = InMemoryBackend()
manager = CacheManager(
backend=InMemoryBackend(),
key_builder=CacheKeyBuilder(namespace="agno"),
invalidation_engine=InvalidationEngine(tag_store),
)
ctx_cache = ContextCache(manager)
agent = Agent(model=OpenAIChat(id="gpt-4o-mini"))
cached = AgnoCacheAdapter(agent, manager)

SESSION = "user-42"

# Store turns in context cache
ctx_cache.set(SESSION, 0, [{"role": "user", "content": "My name is Alice."}])
ctx_cache.set(SESSION, 1, [{"role": "assistant", "content": "Hello Alice!"}])

# Retrieve history
history = ctx_cache.get(SESSION, 0)
print("History:", history)

# End of session — clear context
ctx_cache.invalidate_session(SESSION)