A CLI tool for defining and running multi-agent workflows with the GitHub Copilot SDK and Anthropic Claude.
Conductor makes multi-agent workflows — code review pipelines, research-then-synthesize flows, plan-then-implement loops — repeatable, deterministic, and version-controlled. You define your agents, their prompts, and the routing between them in a single YAML file:
- Repeatable — Same inputs follow the same path through the same agents.
- Deterministic — Routing uses Jinja2 templates and expression evaluation. First matching condition wins. No LLM in the orchestration loop, no tokens spent deciding what runs next.
- Source-controlled — Plain YAML files. Diff workflows in pull requests, version them with your code, run them the same way locally and in CI.
- YAML-based workflows - Define multi-agent workflows in readable YAML
- Multiple providers - GitHub Copilot or Anthropic Claude with seamless switching
- Parallel execution - Run agents concurrently (static groups or dynamic for-each)
- Sub-workflow composition - Reusable sub-workflows with templated
input_mapping, usable insidefor_eachgroups for dynamic fan-out - Script steps - Run shell commands and route on exit code or parsed JSON stdout
- Dialog mode - Agents can pause for multi-turn conversation when uncertain
- Reasoning effort - Unified
reasoning.effort(low/medium/high/xhigh) per agent or workflow-wide, translated to each provider's native API - Workspace instructions - Auto-discover and inject
AGENTS.md/CLAUDE.md/.github/copilot-instructions.mdinto every agent's prompt - Conditional routing - Route between agents based on output conditions
- Human-in-the-loop - Pause for human decisions with Markdown-rendered prompts and clickable file links
- Safety limits - Max iterations and timeout enforcement
- Web dashboard - Real-time workflow visualization with interactive DAG graph, breadcrumb navigation into sub-workflows, live streaming, and in-browser human gates
- Validation - Catches stale template references, missing inputs, and undeclared dependencies before runtime
macOS / Linux:
curl -sSfL https://aka.ms/conductor/install.sh | shWindows (PowerShell):
irm https://aka.ms/conductor/install.ps1 | iexThe installer checks for uv (installs it if missing), fetches the latest release with pinned dependencies, and verifies integrity via SHA-256 checksum.
conductor update checks for a newer release and tells you the one-line command to upgrade. Upgrades happen via the install script — the same script you used to install — because in-process self-upgrade is unreliable on Windows (the running Python interpreter sits inside the venv that needs replacing).
conductor updateTo upgrade, run the install script in a new shell (not from inside a running conductor process):
macOS / Linux:
curl -sSfL https://aka.ms/conductor/install.sh | shWindows (PowerShell):
irm https://aka.ms/conductor/install.ps1 | iexOr skip the copy-paste with --apply:
conductor update --apply--apply launches the install script automatically — on Windows it opens in a new console window so you can watch progress; on macOS/Linux it replaces the current process. Either way, the running conductor exits before the installer touches the venv, so file locks release cleanly.
The install script handles file-lock safety (process detection, stale-file cleanup, and on Windows a rename-fallback when the venv directory can't be removed), retries with backoff, and verifies the installed version after install. If your shell ever gets into a bad state from a failed update, re-running the install script is always the right next step.
Conductor periodically checks GitHub for newer releases (cached for 24 hours under ~/.conductor/update-check.json) and prints a one-line hint when one is available. To silence the hint permanently — for example when you manage upgrades through a package manager or company-mirrored install — set CONDUCTOR_NO_UPDATE_CHECK=1 in your shell environment. The check is also skipped automatically for non-TTY invocations, --silent mode, the update subcommand, and --help / --version.
# Install from GitHub
uv tool install git+https://github.com/microsoft/conductor.git
# Run the CLI
conductor run workflow.yaml
# Or run directly without installing
uvx --from git+https://github.com/microsoft/conductor.git conductor run workflow.yaml
# Install a specific branch, tag, or commit
uv tool install git+https://github.com/microsoft/conductor.git@branch-name
uv tool install git+https://github.com/microsoft/conductor.git@v1.0.0
uv tool install git+https://github.com/microsoft/conductor.git@abc1234pipx install git+https://github.com/microsoft/conductor.git
conductor run workflow.yaml
# Install a specific branch or tag
pipx install git+https://github.com/microsoft/conductor.git@branch-namepip install git+https://github.com/microsoft/conductor.git
conductor run workflow.yaml
# Install a specific tag or commit
pip install git+https://github.com/microsoft/conductor.git@v1.0.0This repo doubles as a single-plugin marketplace that ships the conductor
skill from plugins/conductor/skills/conductor/. The skill teaches the
assistant the workflow YAML schema, CLI commands, and execution model.
Claude Code:
/plugin marketplace add microsoft/conductor
/plugin install conductor@conductor
GitHub Copilot CLI (gh skill requires GitHub CLI 2.91+, public preview):
gh skill install microsoft/conductor conductorThe plugin ships only markdown — no executables, hooks, or MCP servers — so trust verification is straightforward.
# my-workflow.yaml
workflow:
name: simple-qa
description: A simple question-answering workflow
entry_point: answerer
agents:
- name: answerer
model: gpt-5.2
prompt: |
Answer the following question:
{{ workflow.input.question }}
output:
answer:
type: string
routes:
- to: $end
output:
answer: "{{ answerer.output.answer }}"conductor run my-workflow.yaml --input question="What is Python?"{
"answer": "Python is a high-level, interpreted programming language..."
}Conductor includes a built-in real-time web dashboard that lets you visualize and interact with your workflows as they run. Launch it with --web:
conductor run workflow.yaml --web --input question="What is Python?"Key features:
- Interactive DAG graph — Zoomable, draggable workflow graph with animated edges showing execution flow and conditional routing
- Live agent streaming — Watch agent reasoning, tool calls, and outputs stream in real-time as each step executes
- Three-pane layout — Resizable panels for the graph, agent detail, and a tabbed output pane (Log, Activity, Output)
- In-browser human gates — Respond to human-in-the-loop decision points directly in the dashboard, no terminal needed
- Per-node detail — Click any node to see its prompt, metadata (model, tokens, cost), activity stream, and output
- Background mode — Run with
--web-bgto start the dashboard in the background, print the URL, and exit. Useconductor stopto shut it down later.
# Run in background — prints dashboard URL and exits
conductor run workflow.yaml --web-bg --input topic="AI in healthcare"
# Stop a background workflow
conductor stopConductor supports multiple AI providers. Choose based on your needs:
| Feature | Copilot | Claude |
|---|---|---|
| Pricing | Subscription ($10-39/mo) | Pay-per-token |
| Context Window | 8K-128K tokens | 200K tokens |
| Tool Support (MCP) | Yes | Planned |
| Streaming | Yes | Planned |
| Best For | Heavy usage, tools | Large context, pay-per-use |
workflow:
runtime:
provider: claude
default_model: claude-sonnet-4.5Set your API key: export ANTHROPIC_API_KEY=sk-ant-...
See also: Claude Documentation | Provider Comparison | Migration Guide
Execute a workflow from a YAML file.
conductor run <workflow.yaml> [OPTIONS]| Option | Description |
|---|---|
-i, --input NAME=VALUE |
Workflow input (repeatable) |
-m, --metadata KEY=VALUE |
Workflow metadata (repeatable; surfaced in workflow_started) |
--workspace-instructions |
Auto-discover AGENTS.md / CLAUDE.md / .github/copilot-instructions.md and prepend to every agent prompt |
--instructions PATH |
Explicit instructions file (repeatable) |
-p, --provider PROVIDER |
Override provider |
--dry-run |
Preview execution plan |
--skip-gates |
Auto-select at human gates |
--web |
Start real-time web dashboard |
--web-bg |
Run in background, print dashboard URL, exit |
--web-port PORT |
Port for web dashboard (0 = auto) |
-q, --quiet |
Suppress progress output |
-s, --silent |
Suppress all output except errors |
-l, --log-file PATH |
Write logs to file |
Validate a workflow file without executing.
conductor validate <workflow.yaml>Full CLI documentation: docs/cli-reference.md
Conductor supports named workflow registries — GitHub repos or local directories containing shared workflows. Configure a registry once, then run workflows by short name.
# Add a registry
conductor registry add official myorg/conductor-workflows --default
# List available workflows
conductor registry list official
# Run a workflow from the registry
conductor run qa-bot # latest from default registry
conductor run 'qa-bot@official#v1.2.3' # specific tag (quote the #)
conductor run 'qa-bot@official#main' # branch HEAD (re-resolved on fetch)See docs/design/registry.md for the full design.
See the examples/ directory for complete workflows:
| Example | Description |
|---|---|
| simple-qa.yaml | Basic single-agent Q&A |
| for-each-simple.yaml | Dynamic parallel processing |
| parallel-research.yaml | Static parallel execution |
| design-review.yaml | Human gate with loop pattern |
| script-step.yaml | Script step with exit_code routing |
More examples and running instructions: examples/README.md
| Document | Description |
|---|---|
| Workflow Syntax | Complete YAML schema reference |
| CLI Reference | Full command-line documentation |
| Parallel Execution | Static parallel groups |
| Dynamic Parallel | For-each groups and array processing |
| Claude Provider | Claude setup and configuration |
| Provider Comparison | Copilot vs Claude decision guide |
- Python 3.12+
- uv for dependency management
git clone https://github.com/microsoft/conductor.git
cd conductor
make devOn Windows, use uv directly instead of make:
uv sync --all-extras # instead of make dev
uv run pytest tests/ # instead of make test
uv run ruff check . # instead of make lint
uv run ruff format . # instead of make formatCopilot CLI path: Windows subprocess cannot resolve .bat/.ps1 wrappers by name alone. If you see [WinError 2] The system cannot find the file specified when running workflows, set the full path to the Copilot CLI:
# Find your copilot CLI
Get-Command copilot* | Format-Table Name, Source
# Set the path (use the .cmd variant from npm)
$env:COPILOT_CLI_PATH = "C:\Users\<you>\AppData\Roaming\npm\copilot.cmd"make test # Run tests
make test-cov # Run tests with coverage
make lint # Check linting
make format # Auto-fix and format code
make typecheck # Type check
make check # Run all checks (lint + typecheck)
make validate-examples # Validate all example workflowsThis project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit Contributor License Agreements.
When you submit a pull request, a CLA bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.
This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.
To submit a pull request, follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests and checks (
make test && make check) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft's Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.
MIT License - see LICENSE for details.
