Agno's OSManager now reads ClaudeAgent, CodexAgent and other external adapters from AgentOS(agents=[...]) into its list_agents and run_agent tools, and finds them by ID or display name. Earlier releases left them out, so the manager saw none of the Claude or Codex agents that /agents served.
claude = ClaudeAgent(id="claude-engineer", name="Claude Engineer", db=db)
codex = CodexAgent(id="codex-engineer", name="Codex Engineer", db=db)
agent_os = AgentOS(
db=db,
agents=[claude, codex],
manager=OSManager(model=OpenAIResponses(id="gpt-5.6-luna")),
)We called the manager's tool functions directly with no model turn. A stub replaced ClaudeAgent._arun_adapter the same way the release's tests do, so no Claude process ran (real output).
# Earlier releases
list_agents: []
run_agent('Claude Engineer'): {'error': 'Agent not found: Claude Engineer'}
# This release
list_agents: [('claude-engineer', 'Claude Engineer'), ('codex-engineer', 'Codex Engineer')]
run_agent('Claude Engineer'): {'status': 'COMPLETED', 'content': 'done: Summarize the repo'}The manager runs the registered adapter itself, the same object the HTTP routes use, so its guard against two overlapping runs on one session still holds. The agents:<id>:run permission still gates each run, and the roster follows any later change to agent_os.agents.
See the cookbook, and learn more about running Claude and Codex as services in the documentation.
Frequently asked questions
Register the adapter in AgentOS(agents=[...]) and set manager=OSManager(model=...). The manager's run_agent tool then takes the adapter's ID or name. Real runs need the harness SDK installed and signed in.
Yes. Each user gets one continuing session per agent, so Alice's follow-up carries her earlier turns while Bob starts fresh. The runs are saved under the caller's user ID.
No. Studio keeps external agents out of its edit tools and never saves them as team or workflow members. OS Manager only lists and runs them.



