MySQL for Team

Store team sessions and run history in MySQL with MySQLDb.

MySQLDb stores a Team's sessions and run history in MySQL.

Usage

Start in a virtual environment.

Install the agno, sqlalchemy, pymysql, openai, and ddgs packages:

uv pip install agno sqlalchemy "pymysql[rsa]" openai ddgs

Run MySQL

Install Docker Desktop, then start MySQL on port 3306:

docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=ai \
  -e MYSQL_DATABASE=ai \
  -e MYSQL_USER=ai \
  -e MYSQL_PASSWORD=ai \
  -p 3306:3306 \
  mysql:8

Set your OpenAI API key:

Set OpenAI Key

Set your OPENAI_API_KEY as an environment variable. You can get one from OpenAI.

export OPENAI_API_KEY=sk-***
mysql_for_team.py
from typing import List

from agno.agent import Agent
from agno.db.mysql import MySQLDb
from agno.models.openai import OpenAIResponses
from agno.team import Team
from agno.tools.hackernews import HackerNewsTools
from agno.tools.websearch import WebSearchTools
from pydantic import BaseModel

db_url = "mysql+pymysql://ai:ai@localhost:3306/ai"
db = MySQLDb(db_url=db_url)


class Article(BaseModel):
    title: str
    summary: str
    reference_links: List[str]


hn_researcher = Agent(
    name="HackerNews Researcher",
    model=OpenAIResponses(id="gpt-5.2"),
    role="Gets top stories from HackerNews.",
    tools=[HackerNewsTools()],
)

web_searcher = Agent(
    name="Web Searcher",
    model=OpenAIResponses(id="gpt-5.2"),
    role="Searches the web for information on a topic",
    tools=[WebSearchTools()],
    add_datetime_to_context=True,
)

hn_team = Team(
    name="HackerNews Team",
    model=OpenAIResponses(id="gpt-5.2"),
    members=[hn_researcher, web_searcher],
    db=db,
    instructions=[
        "First, search HackerNews for what the user is asking about.",
        "Then, ask the web searcher to search for each story to get more information.",
        "Finally, summarize each story and include its reference links.",
    ],
    output_schema=Article,
    markdown=True,
    show_members_responses=True,
    add_member_tools_to_context=False,
)

hn_team.print_response("Write an article about the top 2 stories on HackerNews")

Run the example

Save the code as mysql_for_team.py, start the database described above, and run:

python mysql_for_team.py

Parameters

ParameterTypeDefaultDescription
idOptional[str]NoneDatabase ID. Derived from the connection and schema when omitted.
db_engineOptional[Engine]NoneSQLAlchemy database engine. Provide this or db_url.
db_schemaOptional[str]NoneDatabase schema. Uses "ai" when omitted.
db_urlOptional[str]NoneDatabase URL. Provide this or db_engine.
session_tableOptional[str]NoneTable for Agent, Team, and Workflow sessions. Uses "agno_sessions" when omitted.
runs_tableOptional[str]NoneTable for session runs. Uses "agno_runs" with the default session table, or <session_table>_runs when session_table is customized.
memory_tableOptional[str]NoneTable for memories. Uses "agno_memories" when omitted.
metrics_tableOptional[str]NoneTable for metrics. Uses "agno_metrics" when omitted.
eval_tableOptional[str]NoneTable for evaluation run data. Uses "agno_eval_runs" when omitted.
knowledge_tableOptional[str]NoneTable for knowledge content. Uses "agno_knowledge" when omitted.
traces_tableOptional[str]NoneTable for traces. Uses "agno_traces" when omitted.
spans_tableOptional[str]NoneTable for spans. Uses "agno_spans" when omitted.
versions_tableOptional[str]NoneTable for schema versions. Uses "agno_schema_versions" when omitted.
create_schemaboolTrueCreate the database schema when it does not exist. Set to False when migrations manage it.