Registry for Non-Serializable Components

Register tools, models, dbs, and Pydantic schemas in a Registry so saved agents can be rehydrated from Postgres.

Demonstrates using Registry to restore tools, models, and schemas when loading components from the database.

The preserved source only saves until its final two calls are uncommented. Add a stable ID so that the shown lookup can find the saved agent.

registry.py
"""
Registry for Non-Serializable Components
========================================

Demonstrates using Registry to restore tools, models, and schemas when loading
components from the database.
"""

from agno.agent.agent import Agent, get_agent_by_id  # noqa: F401
from agno.db.postgres import PostgresDb
from agno.models.openai import OpenAIChat
from agno.registry import Registry
from agno.tools.duckduckgo import DuckDuckGoTools
from pydantic import BaseModel

# ---------------------------------------------------------------------------
# Setup
# ---------------------------------------------------------------------------
db = PostgresDb(db_url="postgresql+psycopg://ai:ai@localhost:5532/ai")


# ---------------------------------------------------------------------------
# Create Registry Schemas and Tools
# ---------------------------------------------------------------------------
class BasicInputSchema(BaseModel):
    message: str


class BasicOutputSchema(BaseModel):
    message: str


class ComplexInputSchema(BaseModel):
    message: str
    name: str
    age: int


def sample_tool():
    return "Hello, world!"


# ---------------------------------------------------------------------------
# Create Registry
# ---------------------------------------------------------------------------
registry = Registry(
    name="Agno Registry",
    description="Registry for Agno",
    tools=[DuckDuckGoTools(), sample_tool],
    models=[OpenAIChat(id="gpt-5-mini")],
    dbs=[db],
    schemas=[BasicInputSchema, BasicOutputSchema, ComplexInputSchema],
)

# ---------------------------------------------------------------------------
# Run Registry Example
# ---------------------------------------------------------------------------
if __name__ == "__main__":
    # Uncomment this during your first run to save the agent to the database
    agent = Agent(
        model=OpenAIChat(id="gpt-5.6-luna"),
        db=db,
        tools=[DuckDuckGoTools(), sample_tool],
        output_schema=BasicOutputSchema,
    )
    agent.save()

    # agent = get_agent_by_id(db=db, id="registry-agent", registry=registry)
    # agent.print_response("Call the sample tool")

Run the Example

Set up your virtual environment

uv venv --python 3.12
source .venv/bin/activate

Install dependencies

uv pip install -U agno "psycopg[binary]" ddgs openai sqlalchemy

Export your OpenAI API key

export OPENAI_API_KEY="your_openai_api_key_here"

Run PgVector

docker run -d \
  -e POSTGRES_DB=ai \
  -e POSTGRES_USER=ai \
  -e POSTGRES_PASSWORD=ai \
  -e PGDATA=/var/lib/postgresql \
  -v pgvolume:/var/lib/postgresql \
  -p 5532:5432 \
  --name pgvector \
  agnohq/pgvector:18

Save and load the same ID

Add id="registry-agent" to the Agent(...) constructor. Uncomment both final lines that call get_agent_by_id(...) and agent.print_response(...). Run the script to save that ID, reload it with the registry, and call the sample tool. The final response requires your OpenAI key.

Run the example

Save the code above as registry.py, then run:

python registry.py

Full source: cookbook/93_components/registry.py