Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ Thumbs.db
src/conductor/web/frontend/node_modules/
src/conductor/designer/frontend/node_modules/

# Pi SDK runner dependencies
src/conductor/providers/_pi/node_modules/

.playwright-mcp/

# Scratch / temporary working files
Expand Down
54 changes: 46 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -347,14 +347,14 @@ See [docs/fleet.md](docs/fleet.md) for every screen, key binding, the status voc

Conductor supports multiple AI providers. Choose based on your needs:

| Feature | Copilot | OpenAI | Claude | Claude Agent SDK | Hermes | ACA |
|---------|---------|--------|--------|------------------|--------|-----|
| **Tier** | Stable | Stable | Stable | Experimental | Experimental | Experimental |
| **Pricing** | Subscription | Pay-per-token | Pay-per-token | Subscription | Pay-per-token (via hermes) | Subscription + ACA compute |
| **Context Window** | Per-model | Per-model | Per-model | Per-model | Per-model | Per-model (inner Copilot) |
| **Tool Support (MCP)** | Yes | Yes (stdio) | Yes (stdio) | Yes (built-in) | No (hermes internal tools) | Yes (always forwarded, not allowlisted) |
| **Streaming** | Yes | Yes | Yes | Yes | No | Yes |
| **Best For** | Heavy usage, tools | OpenAI ecosystem, pay-per-use | Large context, pay-per-use | Full Claude Code toolset | Multi-provider model access | Untrusted/isolation-sensitive agents |
| Feature | Copilot | OpenAI | Claude | Claude Agent SDK | Hermes | ACA | Pi SDK |
|---------|---------|--------|--------|------------------|--------|-----|--------|
| **Tier** | Stable | Stable | Stable | Experimental | Experimental | Experimental | Experimental |
| **Pricing** | Subscription | Pay-per-token | Pay-per-token | Subscription | Pay-per-token (via hermes) | Subscription + ACA compute | Depends on Pi model provider |
| **Context Window** | Per-model | Per-model | Per-model | Per-model | Per-model | Per-model (inner Copilot) | Per-model |
| **Tool Support (MCP)** | Yes | Yes (stdio) | Yes (stdio) | Yes (built-in) | No (hermes internal tools) | Yes (always forwarded, not allowlisted) | No |
| **Streaming** | Yes | Yes | Yes | Yes | No | Yes | Yes |
| **Best For** | Heavy usage, tools | OpenAI ecosystem, pay-per-use | Large context, pay-per-use | Full Claude Code toolset | Multi-provider model access | Untrusted/isolation-sensitive agents | Pi tools, skills, extensions |

### Using Copilot

Expand Down Expand Up @@ -402,6 +402,44 @@ Requires the `claude` CLI to be installed and authenticated. Install the SDK: `u

> **Note:** `runtime.mcp_servers` is supported — servers are translated into the SDK's own MCP config and attach alongside the built-in `claude_code` preset (a narrowing per-server `tools:` filter is refused, since the SDK cannot enforce one). Per-agent tool allowlists are not bridged: a workflow-level `tools:` block is rejected at `conductor validate` for any agent that omits `tools:` (it would otherwise inherit a list the CLI can't map). Omit `tools:` to grant the full `claude_code` preset; an agent's `tools: []` disables the built-in tools, though declared MCP servers still attach.

### Using Pi SDK (Experimental)

Requires Node.js 22.19.0 or newer and npm. From a source checkout, install the
runner's locked dependencies:

```bash
npm --prefix src/conductor/providers/_pi ci
```

The runner and its Node manifests live alongside the Python provider in
`src/conductor/providers/_pi/`. Python installation includes these files but does
not install Node dependencies. For an installed Python package, run the following
with the Python interpreter from Conductor's environment to locate that directory,
then run `npm --prefix "<printed-directory>" ci`:

```bash
python -c "from pathlib import Path; import conductor.providers.pi as p; print(Path(p.__file__).parent / '_pi')"
```

Repeat the npm setup after upgrading Conductor if its lockfile changes.

```yaml
workflow:
runtime:
provider: pi
# Omit default_model to use Pi configured default model.
# To pin one, use Pi id: provider/model-id.
```

Conductor starts one Node runner and persisted Pi `AgentSession` per agent step.
Pi project/user skills and extensions load normally. Pi sessions are checkpointed and
restored by `conductor resume`; malformed structured output gets same-session recovery.
`max_session_seconds` and `max_agent_iterations` are enforced. Inspect authenticated
model ids with `conductor doctor providers --models --provider pi`.

`runtime.mcp_servers`, per-agent `tools:`, `temperature`, and `max_tokens` are not
bridged. See [`examples/pi-research-pipeline.yaml`](examples/pi-research-pipeline.yaml).

### Using Hermes (Experimental)

```yaml
Expand Down
32 changes: 32 additions & 0 deletions examples/pi-research-pipeline.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
workflow:
name: pi-research-pipeline
entry_point: research
runtime:
provider: pi
# Omit default_model to use Pi configured default model.
# To pin model, use Pi id: provider/model-id.
working_dir: .

agents:
- name: research
prompt: |
Research this request: {{ workflow.input.question }}
Return JSON only with fields `findings` and `risks`.
output:
findings:
type: array
risks:
type: array
routes:
- to: synthesize

- name: synthesize
prompt: |
Turn this research into an implementation brief.
Findings: {{ research.output.findings }}
Risks: {{ research.output.risks }}
routes:
- to: $end

output:
answer: "{{ synthesize.output.response }}"
5 changes: 5 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,15 @@ conductor = "conductor.cli.app:app"
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.sdist]
# Ship the Pi runner and manifests, never its locally installed dependencies.
exclude = ["**/node_modules"]

[tool.hatch.build.targets.wheel]
packages = ["src/conductor"]
exclude = [
"src/conductor/web/frontend",
"**/node_modules",
]

[tool.hatch.build.targets.wheel.force-include]
Expand Down
2 changes: 1 addition & 1 deletion src/conductor/config/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -1163,7 +1163,7 @@ def _validate_skill_entries(entries: list[str]) -> list[str]:
return entries


ProviderName = Literal["copilot", "openai", "claude", "claude-agent-sdk", "hermes", "aca"]
ProviderName = Literal["copilot", "openai", "claude", "claude-agent-sdk", "hermes", "aca", "pi"]
"""Canonical set of supported agent provider names.

Used by :attr:`AgentDef.provider` and :attr:`ProviderSettings.name` so the
Expand Down
Loading