Run CompanyOS Products, Tasks and a Product Manager inside AgentOS
October 16, 20262 min read
Agno's AgentOS(db=db, company=CompanyConfig()) turns on CompanyOS and mounts its routes under /company, with tables created on the first write. Leave company out and AgentOS adds no Company route, table or permission scope.
from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.models.openai import OpenAIResponses
from agno.os import AgentOS, CompanyConfig
db = SqliteDb(db_file="company.db")
writer = Agent(id="docs-writer", model=OpenAIResponses(id="gpt-5.6-luna"), db=db)
agent_os = AgentOS(
db=db,
agents=[writer],
company=CompanyConfig(model=OpenAIResponses(id="gpt-5.6-luna")),
)
app = agent_os.get_app()A Product is a named area of responsibility with a purpose. Projects inside it move from proposed to active to done. Tasks start in backlog and move through ready, in_progress and in_review to done, and either record can be cancelled before it finishes. Every move goes through POST /company/tasks/{id}/transitions (or the Projects twin) with a target and a reason, and the record keeps that history. A person makes a Task Ready by naming a registered agent, team or workflow as its executor, and AgentOS checks that the caller may run it. From then on the Task's scope is frozen until someone returns it to Backlog.
Each Product also gets a playbook wiki with brief.md for human direction and status.md for current work, and the company shares one more at /company/wiki. A write must carry the version it read, so a stale edit gets a 409. Decisions go to /company/decisions as an append-only log.
The Product Manager is a reserved agent, product-manager-internal, served at /agents/product-manager-internal/runs or as an OS Manager member when OS Manager is on. Its tools read Products, Projects, Tasks and the wiki, propose and edit Backlog work, update status.md and log decisions. None of them can accept or finish a Task, change an owner or schedule a run, and AgentOS injects the caller's identity outside the model's tool arguments.
We drove the whole loop over HTTP on SQLite. A scripted stand-in model, built like the offline planner in the release's own tests, played the Product Manager's model.

CompanyManager and AsyncCompanyManager expose the same records from Python, and CompanyTools can be published to MCP clients with MCPConfig(tools=[...]).
See the cookbook, and learn more about AgentOS in the documentation.
Frequently asked questions
Pass company=CompanyConfig() to AgentOS. Company data uses the AgentOS database unless you pass CompanyConfig(db=...). Without the company argument, AgentOS mounts no Company routes and advertises no Company scopes.
No. Its tools list and propose Projects and Backlog Tasks, edit proposals, read the wiki, update status.md and log decisions. A person moves a Task to Ready and picks the agent, team or workflow that runs it.
The model passed as CompanyConfig(model=...), or the first model declared in the AgentOS registry. With neither, diagnostics report the Product Manager as unavailable and the manual Company APIs keep working.
SQLite and PostgreSQL, through both the sync and async adapters. Other adapters answer 503 over HTTP and raise NotImplementedError from CompanyManager.


