Skip to main content
The Starter template gives you AgentOS, Postgres, Docker, and Railway as scaffolding. The sections below cover the most common moves for turning it into your own product: adding agents, swapping models, wiring up tools and knowledge, exposing it through Slack.

Add your own agent

Create agents/my_agent.py:
from agno.agent import Agent
from agno.models.openai import OpenAIResponses

from db import get_postgres_db

my_agent = Agent(
    id="my-agent",
    name="My Agent",
    model=OpenAIResponses(id="gpt-5.2"),
    db=get_postgres_db(),
    instructions="You are a helpful assistant.",
)
Register it in app/main.py:
from agents.my_agent import my_agent

agent_os = AgentOS(
    name="AgentOS",
    agents=[knowledge_agent, mcp_agent, my_agent],
    ...
)
Restart:
docker compose restart
The agent shows up in the AgentOS UI and at /agents/my-agent in the API.

Add tools to an agent

Agno ships 100+ tool integrations. See the full toolkit reference.
from agno.tools.slack import SlackTools
from agno.tools.googlesheets import GoogleSheetsTools

my_agent = Agent(
    ...
    tools=[
        SlackTools(),
        GoogleSheetsTools(),
    ],
)
Each toolkit reads its credentials from environment variables. Add them to .env for local dev and to the Railway service for production.

Use a different model provider

To switch to Anthropic:
  1. Set ANTHROPIC_API_KEY in .env.
  2. Add anthropic to pyproject.toml.
  3. Update the agent’s model= to use Claude.
  4. Run ./scripts/generate_requirements.sh && docker compose up -d --build.
from agno.models.anthropic import Claude

my_agent = Agent(
    ...
    model=Claude(id="claude-sonnet-4-5"),
)
The same pattern works for Google (google-genai), Mistral (mistralai), and the other supported providers.

Add a Slack interface

The Starter template doesn’t ship a Slack manifest, but Agno does ship a Slack interface. Wire it up by setting SLACK_BOT_TOKEN and SLACK_SIGNING_SECRET, then:
from agno.os.interfaces.slack import Slack

agent_os = AgentOS(
    ...
    interfaces=[Slack(agent=my_agent)],
)
Full setup, including the manifest, scopes, and tunnel-vs-Railway choice: Slack interface.

Add more knowledge sources

Edit load_default_documents() in agents/knowledge_agent.py:
def load_default_documents() -> None:
    knowledge.insert(
        name="Engineering Handbook",
        url="https://internal.example.com/handbook.md",
        skip_if_exists=True,
    )
    knowledge.insert(
        name="Onboarding Doc",
        path="./docs/onboarding.pdf",
        skip_if_exists=True,
    )
Reload:
# Local
docker exec -it agentos-api python -m agents.knowledge_agent

# Railway
railway run python -m agents.knowledge_agent
skip_if_exists=True makes the loader idempotent across reruns.

Schedule background work

AgentOS includes a scheduler. Register a function in app/main.py and it runs on the cadence you set:
from app.tasks import morning_digest

agent_os = AgentOS(
    ...
    scheduled_tasks=[
        ("0 9 * * *", morning_digest),
    ],
)
The Coda template uses this pattern for daily digests, issue triage, and repo sync. See Scheduling for the API and Coda’s tasks/ for a worked example.

Other knobs

TaskWhere
Add a new Python dependencyEdit pyproject.toml, run ./scripts/generate_requirements.sh, rebuild
Change the database passwordEdit .env, restart docker compose
Run without Docker./scripts/venv_setup.sh then python -m app.main
Customize AgentOS configEdit app/config.yaml

Going deeper

To learnSee
The full AgentOS feature setDemo OS
How knowledge and Agentic RAG workKnowledge
How MCP integrates with AgnoMCP
Comparable templatesScout, Dash, Coda
Building a fully custom AgentOS appBuild a Product