Skip to content

sentry01/agentcouncil

v2.0.0MIT

Multi-model council for Copilot CLI. Three subagents on different model families (Anthropic, OpenAI, Google) answer independently, then build on each other or attack the leading answer before an orchestrator writes the final result. Ships the agentcouncil skill and the AgentCouncil agent.

AgentCouncil

AgentCouncil: three models, one orchestrated answer

AgentCouncil is a plugin for GitHub Copilot CLI that puts a hard question to three models from different families at the same time. The models either build on each other's work or attack the strongest answer, and an orchestrator writes the final result.

  • Collaborative mode (default): each seat drafts, reads the other drafts, and improves its own. The orchestrator writes a synthesis.
  • Adversarial mode: each seat drafts, the orchestrator picks the leading answer, the other two attack it, and the orchestrator rules on it.
  • Light or full effort: simple questions get a quick 4-call pass. Hard ones get the full 5 to 7-call protocol.

Why three model families

A single model sounds confident even when it is wrong, and it rarely questions its own assumptions. Models from different vendors are trained differently and fail differently. Running one model from each family in parallel, then making them interact once, catches mistakes that any one of them would miss.

The orchestrator only sees anonymized, reordered responses (Response A, B, C), so it cannot favor the seat that shares its model family.

Install

Requirements: GitHub Copilot CLI, signed in, with access to models from at least two of the families in the roster.

copilot plugin marketplace add Sentry01/AgentCouncil
copilot plugin install agentcouncil@agentcouncil

Update to the latest release (release notes):

copilot plugin marketplace update agentcouncil
copilot plugin update agentcouncil@agentcouncil

Remove:

copilot plugin uninstall agentcouncil@agentcouncil

You can also install straight from the repository with copilot plugin install Sentry01/AgentCouncil and update it with copilot plugin update agentcouncil. The marketplace route above makes new versions easier to discover.

Upgrading from 1.x

Version 2.0.0 renames the plugin to agentcouncil and changes the agent ID. Remove the old copies first so they do not load twice:

copilot plugin uninstall agent-council                          # if you installed 1.x as a plugin
rm -rf ~/.copilot/skills/agent-council ~/.copilot/agents/AgentCouncil.agent.md   # if you copied files by hand

See the changelog for everything that changed.

Usage

Start your message with a prefix:

You typeModeEffort
council: ...collaborativechosen by task
brainstorm: ...collaborativechosen by task
debate: ...adversarialchosen by task
stress-test: ...adversarialchosen by task
quick council: ...collaborativelight
full council: ...collaborativefull
collaborative council: ...collaborativechosen by task
adversarial council: ...adversarialchosen by task

Put verbose in front of any prefix to see each phase, or raw to see every seat's full output:

verbose debate: Sidekiq with Redis, or GoodJob on our existing Postgres?

Without a prefix, Copilot can still load the skill when you ask for a second opinion from other models or when a task clearly benefits from one. In that case the mode follows your intent: choosing between options, validating a proposal or asking for a go/no-go goes adversarial. Asking for ideas, a design or a plan goes collaborative. Trivial requests (arithmetic, command syntax, one-line edits) are answered directly unless you use a prefix.

As an agent

copilot --agent agentcouncil:agentcouncil -p "Kafka, NATS or Pulsar for 200 services? Latency matters more than retention."

In an interactive session, run /agent and pick AgentCouncil. Every message sent to the agent convenes a council.

Choosing models

Name the models in your request to override the defaults for one council. The three seats must still come from different families:

council with sonnet, gpt-5.5 and gemini flash: how should we shard our events table?

A lower-cost roster that works well for everyday questions is claude-sonnet-5.5, gpt-5.5 and gemini-3.8-flash.

How it works

Before dispatching anything, the coordinator writes a short context brief (goal, constraints, relevant code or text, decisions already made) so every seat works from the same facts. Every seat and the orchestrator are instructed to work read-only: they may read files and search the web, but not edit anything. If you want the result applied, the coordinator does that after the council, through your normal tool approvals.

Collaborative (full)

flowchart TD
    A1["Alpha drafts: explores deeply"] & B1["Beta drafts: grounds in practice"] & C1["Gamma drafts: finds the simplest path"]
    A1 & B1 & C1 --> X["Each seat reads the other two drafts"]
    X --> A2["Alpha improves"] & B2["Beta improves"] & C2["Gamma improves"]
    A2 & B2 & C2 --> D["Orchestrator synthesizes from anonymized versions"]
  1. Draft: Alpha, Beta and Gamma answer independently from their angle.
  2. Improve: each seat reads the other two drafts, adopts the best ideas and lists any unresolved tensions.
  3. Synthesize: the orchestrator resolves the tensions and writes the final answer. First-draft ideas that nobody kept are passed along as well, so minority views are not lost.

Adversarial (full)

flowchart TD
    A1["Alpha: draft and self-critique"] & B1["Beta: independent answer and fact-check"] & C1["Gamma: simplest answer and devil's advocate"]
    A1 & B1 & C1 --> T{"Orchestrator triage on anonymized drafts"}
    T -- "full consensus" --> V
    T -- "leader selected" --> K1["Non-leader seat attacks"] & K2["Non-leader seat attacks"]
    K1 & K2 --> V["Orchestrator verdict: SURVIVED, MODIFIED or OVERTURNED"]
  1. Draft: each seat answers independently and critiques the obvious approach.
  2. Triage: the orchestrator reads the anonymized drafts, rates consensus and picks the leading answer. On full consensus it skips straight to the verdict.
  3. Attack: the two other seats try to break the leading answer. On partial consensus they attack only the contested points.
  4. Verdict: the orchestrator rules SURVIVED, MODIFIED or OVERTURNED and notes what remains uncertain.

Light

Each seat gives one concise answer from its angle, and the orchestrator merges them into one short answer. In adversarial mode, each seat also argues briefly against the obvious answer.

Focus by domain

The coordinator classifies each task and gives every seat a focus line:

DomainAlphaBetaGamma
CodeImplementation and security self-reviewAPI and version correctness, edge casesPerformance, readability, alternatives
ArchitectureSystem design and failure modesTechnology claims, benchmarks, scaling limitsSimplicity, operability, alternatives
ResearchAnalysis and bias checkSource verification and citationsActionability, counter-arguments
WritingContent and toneFactual accuracy and consistencyFlow, concision, formatting

Models

SeatFamilyDefaultFallbacks
AlphaAnthropicclaude-opus-5.5claude-sonnet-5.5
BetaOpenAIgpt-6.1-solgpt-5.5
GammaGooglegemini-4-argongrok-4.7 (xAI), gemini-3.8-flash
Orchestratoranyclaude-opus-5.5claude-sonnet-5.5, then the session model

The roster in skills/agentcouncil/SKILL.md is the source of truth. CI fails if any other file names a model that is not in it.

  • One seat per family. If a model is unavailable, the seat moves to its next fallback, then to any family that is not already seated. If only two families are available, the council runs with two seats.
  • Nothing is substituted silently. Every answer ends with a footer that lists the models that actually ran, and any fallbacks.
  • The AgentCouncil agent itself runs on claude-sonnet-5.5. It only routes and relays; the judgment happens in the orchestrator seat.

Model availability changes often. See Supported AI models in GitHub Copilot.

Cost and speed

PathSubagent callsSequential rounds
Light42
Full collaborative73
Full adversarial7, or 5 on full consensus4, or 3 on full consensus

Calls within a round run in parallel, so wall-clock time grows with the number of rounds, not the number of calls. Each call uses model capacity, so a full council costs several times a single answer, and more when Opus-class models are seated. A light council on a short question took about 75 seconds in testing, and a full adversarial council about 5 minutes. Use quick council: or the lower-cost roster when cost matters, and skip the council for simple questions.

Where it works

AgentCouncil is built for Copilot CLI, whose task tool lets each subagent run on a different model. Other clients that load Agent Skills may run the skill without per-subagent model selection. In that case all seats can end up on the same model and you lose the main benefit.

Troubleshooting

SymptomCause and fix
Footer shows a fallback model, or "Ran with 2 seats"Your plan or organization policy disables a model or family. Ask an admin to enable it, or name other models in your request.
No such agent: AgentCouncilPlugin agents are namespaced. Use --agent agentcouncil:agentcouncil.
The council runs on a trivial questionYou used a prefix or the agent, which always convenes (light effort). Ask without a prefix for a direct answer.
The council does not startUse an explicit prefix such as council:. Check that copilot plugin list shows agentcouncil.
Old behavior or duplicate skillsRemove 1.x copies (see Upgrading from 1.x).

Example

Phase 1 dispatching all three seats in parallel. This screenshot is from version 1, so it shows the older default models.

Council Phase 1: three agents dispatched in parallel

Development

copilot --plugin-dir .                       # load your working copy without installing it
node scripts/validate.mjs                    # manifest, frontmatter, roster, links and style checks (runs in CI)
node scripts/eval-routing.mjs --runs 2       # routing evals, needs Copilot CLI and gh auth

See CONTRIBUTING.md for the release process.

Inspiration

Inspired by Andrej Karpathy's llm-council, including its anonymized peer review, adapted as a Copilot CLI skill and agent with collaborative and adversarial modes.

License

MIT. See LICENSE.