Agent Council is a Python and Claude Code skill for examining a difficult question through several deliberately different perspectives. It builds a small council, runs the specialists concurrently, asks each specialist to review the other proposals, and produces a final synthesis.
This repository is a public prototype. It is useful for questions where disagreement and tradeoffs matter, but it does not make the output correct by consensus and it should not replace domain review for high-stakes decisions.
One session follows five stages:
- A council builder selects three to five complementary perspectives.
- The specialists answer the same question in parallel.
- Each specialist reviews the other proposals, excluding its own.
- A synthesis agent combines the strongest supported points.
- Markdown and JSON results are saved locally under
sessions/.
The runtime is a CLI. It does not require a web server or database.
- Python 3.11 or newer; CI covers Python 3.11 and 3.13.
- An OpenAI API key.
- API access to the selected GPT-5.6 preview model.
GPT-5.6 is currently available only to approved preview participants. A valid API key does not guarantee that its project can use these models. See the GPT-5.6 preview announcement and current model guidance.
Clone the repository and create an isolated environment:
git clone https://github.com/ntguion/perspective-gen-skill.git
cd perspective-gen-skill
python3.11 -m venv .venv
source .venv/bin/activate
python scripts/install.pyOn Windows PowerShell, activate the environment with:
.venv\Scripts\Activate.ps1
python scripts/install.pyThe installer:
- installs the reviewed ranges in
requirements.txt; - validates the API key with an API request;
- stores it at
~/.config/agent-council/credentials.yaml; - creates
config/limits.yamlwith the selected local spend limits.
On Unix, the installer creates the credential directory and file with user-only permissions. This reduces accidental exposure; it is not isolation from other processes running with the same user privileges.
The runner performs its own buffered spend check before loading credentials or starting a paid session:
python scripts/run_session.py \
--question "Should this service use a modular monolith or microservices?"For a sensitive or long question, keep the text out of shell history:
python scripts/run_session.py --question-file ./question.txtYou can preview the estimate without running a session:
python scripts/check_spend.py \
--estimate "Should this service use a modular monolith or microservices?"Context is limited to UTF-8 .txt, .md, .json, .yaml, .yml, and .csv files:
python scripts/run_session.py \
--question-file ./question.txt \
--files ./requirements.md ./constraints.yamlThe loader accepts at most ten files, keeps at most 5,000 characters from each file, and caps the combined context at 20,000 characters. Filenames—not absolute paths—are written to the transcript. Binary documents such as PDF and PowerPoint files are not supported.
The explicit default is gpt-5.6-sol. The CLI also supports the lower-cost Terra and Luna variants:
| Model | Role | Input / 1M tokens | Output / 1M tokens |
|---|---|---|---|
gpt-5.6-sol |
Flagship quality; default | $5.00 | $30.00 |
gpt-5.6-terra |
Balanced quality and cost | $2.50 | $15.00 |
gpt-5.6-luna |
Efficient, high-volume work | $1.00 | $6.00 |
These standard text-token rates were verified on 2026-07-10 against OpenAI's GPT-5.6 preview announcement. Pricing and availability can change.
Choose another family member with --model:
python scripts/run_session.py \
--question-file ./question.txt \
--model gpt-5.6-terraThe local estimate uses reported input and output tokens at the table's standard rates. It does not calculate web-search fees, priority processing, cache-write premiums, cached-input discounts, or any other billing modifier. Check the API dashboard for authoritative usage and cost.
The default example limits are $2 per session and $50 total. Edit the ignored, user-specific config/limits.yaml to change them.
Before a session, the runner estimates a five-member council, repeats the bounded context cost across the builder and specialists, and adds a 50% buffer. It blocks the run if that estimate exceeds either configured limit. This is a preflight guard, not a billing guarantee or a mechanism that can stop an API request already in progress.
After a successful session, the runner records the locally estimated token cost and increments the session count. The API dashboard remains the source of truth.
Each completed run creates:
sessions/YYYYMMDD_HHMMSS_microseconds/
├── results.md
└── full_transcript.json
Both files can contain the original question, specialist responses, reviews, and synthesis. The directory is ignored by Git, but the files should still be treated according to the sensitivity of the source material.
- Questions and loaded context are sent to the OpenAI API.
- Specialists with web search enabled may send derived queries to that hosted tool.
- The skill stores its API key outside the repository and never includes it in session output.
- Processes running as the same operating-system user may still be able to read the credential file.
- Local transcripts may contain confidential or personal content even when source paths are sanitized.
- Do not commit
config/limits.yaml, credentials, orsessions/output.
Install the development requirements and run the offline checks:
python -m pip install -r requirements-dev.txt
ruff check .
pytestThe tests cover GPT-5.6 pricing, spend-limit enforcement, credential-file creation, context bounds, self-review exclusion, output-path sanitization, and model construction without making a live API call.
- GPT-5.6 model access is limited preview and cannot be verified without an entitled API project.
- No live API call runs in CI, so provider behavior, model availability, latency, and response quality are not continuously verified.
- Multiple model perspectives can repeat the same misconception or converge on a weak premise.
- Peer review and synthesis improve comparison structure; they do not prove factual accuracy.
- Text context is truncated and binary document parsing is intentionally unsupported.
- Web search can add latency, tool charges, and external data dependencies.
- Cost estimates are local approximations and exclude several API billing modifiers.
- The current YAML spend ledger is designed for one local session at a time, not concurrent writers.
.
├── SKILL.md
├── core/
│ ├── agent_builder.py
│ ├── config.py
│ ├── context.py
│ ├── cost_tracking.py
│ ├── council.py
│ └── credentials.py
├── scripts/
│ ├── check_spend.py
│ ├── install.py
│ └── run_session.py
├── config/limits.yaml.example
├── references/
├── requirements.txt
├── requirements-dev.txt
└── tests/
MIT. See LICENSE.