# Claude Code and Codex join Agno teams and workflows

> An Agno Team leader delegates to a ClaudeAgent or CodexAgent member with delegate_task_to_member, and a Workflow runs either one as a step, including inside Parallel, Loop, Condition and Router.

- Published: 2026-10-27
- Author: Kaustubh Shukla
- Categories: Changelog
- Canonical: https://www.agno.com/blog/claude-code-and-codex-join-agno-teams-and-workflows
- Markdown: https://www.agno.com/blog/claude-code-and-codex-join-agno-teams-and-workflows.md

Agno keeps each `ClaudeAgent` or `CodexAgent` member's own conversation (the Claude session id or the Codex thread id) in a session named `<team session id>:<member id>`, while the team stores the member's runs in the team session with every other member's. Two harness members of one team never share a conversation, and the team's session row stays the team's.

Say your leader plans a change. Claude Code writes and runs the test in the repo, Codex reviews it read-only, and an Agno agent writes the summary. Each harness works with its own model, tools and workspace, and `role` tells the leader what it is for.

![Diagram of an Agno team where the leader delegates with delegate_task_to_member to an Agno agent and a ClaudeAgent member, and a workflow where a ClaudeAgent step feeds a Parallel of ClaudeAgent and CodexAgent reviewers, followed by an Agno agent summary step](https://www.agno.com/images/v3-1-11-harness-teams-workflows.png)

```python
from agno.agents.claude import ClaudeAgent
from agno.agents.codex import CodexAgent
from agno.team import Team
from agno.workflow import Parallel, Step, Workflow

engineer = ClaudeAgent(id="claude-engineer", name="Claude Engineer", role="Writes and runs code", cwd=project, db=db)
reviewer = CodexAgent(id="codex-reviewer", name="Codex Reviewer", role="Reviews code read-only", cwd=project, sandbox_mode="read-only", db=db)

team = Team(model=leader_model, members=[engineer, reviewer, writer], add_history_to_context=True, db=db)
team.run("Add a test for the 100 dollar boundary, run it and review it", session_id="review")

workflow = Workflow(
    steps=[Step(name="build", agent=engineer), Parallel(claude_reviewer, codex_reviewer), Step(name="summary", agent=writer)],
    db=db,
)
```

A later turn of the same team session resumes the member's conversation, so a follow-up can ask Claude about the file it wrote. Keep `add_history_to_context=True` on the team as well, or the leader may forget earlier turns and answer the follow-up itself.

We ran a two-turn team offline with two stand-ins. The leader is a scripted model that calls `delegate_task_to_member`, and Claude Code is the fake Claude Agent SDK client built from this release's own tests, which replies `answer from <session>`. The second turn resumed `sdk-1`, and the member session holds the Claude session id with no runs of its own:

```text
team run: COMPLETED; member claude-engineer: 'answer from sdk-1'; parent_run_id matches: True
team run: COMPLETED; member claude-engineer: 'answer from sdk-1'; parent_run_id matches: True
sdk resume per turn: [None, 'sdk-1']
member session review:claude-engineer -> sdk-1 | runs stored there: 0
```

In a workflow, a harness agent can be a step's `agent` or sit directly in `steps`, `Parallel`, `Loop`, `Condition` or `Router`. One agent keeps one conversation per workflow session, so a later `Loop` iteration or a second step with the same agent picks up where it stopped. That conversation takes one turn at a time, and the workflow refuses the same agent in two `Parallel` branches when you build it:

```text
ValueError: Harness agent 'claude-coder' is used in more than one Parallel branch. It keeps one conversation per workflow session, which takes one turn at a time; use a separate agent, with its own id, for each branch.
```

A harness agent with `sandbox=` also works as a member or a step. It runs every turn on its own computer, and files it writes carry over to its next turn.

AgentOS lists harness members on the team page. Through FastAPI's `TestClient`, `GET /teams/build-team` returned the member with its role and SDK label:

```json
[
  {
    "id": "claude-engineer",
    "name": "Claude Engineer",
    "role": "Writes and runs code",
    "metadata": { "sdk": "claude-agent-sdk" }
  }
]
```

On earlier releases the same script failed at each point. `ClaudeAgent` took no `role`, a team run stopped with `'ClaudeAgent' object has no attribute 'role'`, a workflow step retried on `'ClaudeAgent' object has no attribute 'store_media'`, `Parallel` raised `Invalid step type: ClaudeAgent`, and the team page listed no members.

See the [team cookbooks](https://github.com/agno-agi/agno/blob/main/cookbook/frameworks/harness_teams/README.md) and [workflow cookbooks](https://github.com/agno-agi/agno/blob/main/cookbook/frameworks/harness_workflows/README.md), and learn more about [agent harnesses](https://docs.agno.com/agent-os/multi-framework/overview) and [teams](https://docs.agno.com/teams/overview) in the documentation.
