Every session has a unique identifier (session_id) that tracks conversations across multiple runs:
Auto-generated: If not provided, Agno generates a UUID automatically
Manual: You can provide your own session IDs for custom tracking
Per-user: Combine with user_id to track multiple users’ sessions
from agno.agent import Agentfrom agno.models.openai import OpenAIResponsesfrom agno.db.sqlite import SqliteDbagent = Agent( model=OpenAIResponses(id="gpt-5.2"), db=SqliteDb(db_file="tmp/agent.db"),)# Use your own session IDagent.run("Hello", session_id="user_123_session_456")
from agno.team import Teamfrom agno.models.openai import OpenAIResponsesfrom agno.db.sqlite import SqliteDbteam = Team( model=OpenAIResponses(id="gpt-5.2"), members=[...], db=SqliteDb(db_file="tmp/team.db"),)# Use your own session IDteam.run("Hello", session_id="user_123_session_789")
By default, get_messages() skips paused, cancelled, and error runs plus messages already tagged as history. Agent sessions also skip regenerated runs. Team sessions skip member messages. Pass skip_statuses=[], skip_history_messages=False, and, for teams, skip_member_messages=False to include those records.For a simpler list of only user and assistant messages, you can use the get_chat_history method:
Session names are human-readable labels that make it easier to identify and manage conversations. Use them for inbox-style UIs, support queues, or linking a conversation back to an external ticket.
Let the AI generate meaningful names from conversation content:
session = agent.set_session_name( session_id="session_123", autogenerate=True,)# Access the generated namename = agent.get_session_name(session_id="session_123")print(name) # e.g. "E-commerce API Planning"
session = team.set_session_name( session_id="session_456", autogenerate=True,)# Access the generated namename = team.get_session_name(session_id="session_456")print(name) # e.g. "Product Launch Strategy"
Calling set_session_name(autogenerate=True) asks the model to read the messages in the session and generate a short (5 words max) label. The method returns the updated session object. Use get_session_name() to retrieve the generated name.Best Practices:
Delay generation until the conversation has meaningful context (e.g., after 2–3 messages)
Provide a fallback: wrap the call in your own helper that falls back to a human-entered name or a ticket ID if the generation fails
Batch jobs: loop over session IDs from your database and call set_session_name(..., autogenerate=True) once for each. Use aset_session_name in async code
Costs: Each generation is an extra call to the agent’s or team’s model. Run it out-of-band if you’re cost sensitive
Session caching stores the session object in memory to improve performance. cache_session=True keeps the hydrated session object in memory after the first database read, avoiding extra queries for subsequent runs.
from agno.agent import Agentfrom agno.models.openai import OpenAIResponsesfrom agno.db.sqlite import SqliteDbagent = Agent( model=OpenAIResponses(id="gpt-5.2"), db=SqliteDb(db_file="tmp/agent.db"), session_id="my_session", cache_session=True, # Enable in-memory caching)# First run loads from database and cachesagent.run("First message")# Subsequent runs use cached session (faster)agent.run("Second message")
from agno.team import Teamfrom agno.models.openai import OpenAIResponsesfrom agno.db.sqlite import SqliteDbteam = Team( model=OpenAIResponses(id="gpt-5.2"), members=[...], db=SqliteDb(db_file="tmp/team.db"), session_id="team_session", cache_session=True, # Enable in-memory caching)# First run loads from database and cachesteam.run("First message")# Subsequent runs use cached session (faster)team.run("Second message")
Many sequential turns in the same session (support chats, copilots, etc.)
Latency-sensitive deployments where every DB round trip matters
Resource-heavy databases (remote Postgres, serverless drivers) where connection setup dominates
The cache belongs to one Agent or Team instance. Other workers and processes do not share it, and external session updates are not visible through the cached object. Use cache_session only when one long-lived instance owns the session. Leave it disabled for horizontally scaled or shared-session deployments.