Second Opinion: a cross-referencing debate CLI where two frontier models debate, a cheaper judge rules, orchestrates, and synthesizes.
Project description
Second Opinion
A cross-referencing debate CLI. Two frontier debater models (e.g. Opus 4.8, GPT 5.2) independently answer your question, then debate it — critiquing and rebutting each other with evidence and live web search. A separate, cheaper judge model (e.g. Sonnet 4.6) rules on each round, asks clarifying questions when needed, and synthesizes the final answer with a stated confidence and any unresolved disagreement.
Every question debates by default. For a simple lookup where you don't need a
second opinion, prefix it with ! (or pass --direct) to get a single direct
answer from the judge — one cheap call, no debate.
Agreement is the stop condition, not a correctness proof. Two models can be confidently and identically wrong, and the judge is a single point of bias — so every ruling is rationale-backed and the final answer states its confidence.
Install
Requires Python 3.12+.
uv tool install 2nd-opinion-cli # recommended — isolated, global `2op`
pipx install 2nd-opinion-cli # same idea, via pipx
uvx --from 2nd-opinion-cli 2op # run once without installing
Set your keys (ANTHROPIC_API_KEY / OPENAI_API_KEY) in the environment, or run
2op apikey to store them.
Usage
Run 2op to open an interactive session. Type a question to run a full debate,
prefix it with ! for a direct single-judge answer (no debate), or use a slash
command — type / for an autocompleting palette:
| Command | Description |
|---|---|
/help |
List commands |
/models |
Choose the debater/judge models and save them |
/apikey |
View (masked) and add/update API keys |
/status |
Show current models, keys, and flags |
/clear |
Clear the screen |
/exit |
Leave the session (or Ctrl-D) |
For scripting, 2op -q "your question" runs a single debate and exits (as does
any piped/non-TTY run). Set slots inline:
2op --debater-a opus-4.8 --debater-b gpt-5.2 --judge sonnet-4.6 -v -q "…"
Configuration
Model selection is saved after the first run to ~/.config/secondop/config.json
and reused silently. Re-choose with /models (or -m at launch), or override a
single slot with --debater-a / --debater-b / --judge.
API keys are read from the environment or a .env file first, then from the
config file (set via /apikey). Environment/.env values take precedence.
Develop
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
cp .env.example .env # then add your keys
pytest
Pricing note
Model rates live in src/secondop/config.py and are verified against the 2026
catalog captured in pricing/*.json. Provider prices change — re-confirm
against the live pricing pages before relying on cost figures.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file 2nd_opinion_cli-0.1.0.tar.gz.
File metadata
- Download URL: 2nd_opinion_cli-0.1.0.tar.gz
- Upload date:
- Size: 64.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ff9b409ada3361d1117b8214e50ab7ac0e6ea3e074248b9b05fc22ae6fd7d4d
|
|
| MD5 |
d04aa76084064e2c715b185077ff91f7
|
|
| BLAKE2b-256 |
3b4542b2bc770a84e52aa74a2c24530a98cc3f25fe802631100a5e6c4d85944c
|
Provenance
The following attestation bundles were made for 2nd_opinion_cli-0.1.0.tar.gz:
Publisher:
workflow.yml on Meaetin/2nd-opinion
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
2nd_opinion_cli-0.1.0.tar.gz -
Subject digest:
0ff9b409ada3361d1117b8214e50ab7ac0e6ea3e074248b9b05fc22ae6fd7d4d - Sigstore transparency entry: 1849345798
- Sigstore integration time:
-
Permalink:
Meaetin/2nd-opinion@55735fab5d3ad247364ed90722210407a2f0ac92 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Meaetin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@55735fab5d3ad247364ed90722210407a2f0ac92 -
Trigger Event:
push
-
Statement type:
File details
Details for the file 2nd_opinion_cli-0.1.0-py3-none-any.whl.
File metadata
- Download URL: 2nd_opinion_cli-0.1.0-py3-none-any.whl
- Upload date:
- Size: 41.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64e7e79d9361d7a9343f2aff8cdaa6fc293fb8547306a4ef7f287994c038679d
|
|
| MD5 |
af60b69ca5e5de59b2905ac242481579
|
|
| BLAKE2b-256 |
fd355f6399d6e8fb8d24bbe165c65ff13a6b81969b9242d63cbff7481f7ff719
|
Provenance
The following attestation bundles were made for 2nd_opinion_cli-0.1.0-py3-none-any.whl:
Publisher:
workflow.yml on Meaetin/2nd-opinion
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
2nd_opinion_cli-0.1.0-py3-none-any.whl -
Subject digest:
64e7e79d9361d7a9343f2aff8cdaa6fc293fb8547306a4ef7f287994c038679d - Sigstore transparency entry: 1849345900
- Sigstore integration time:
-
Permalink:
Meaetin/2nd-opinion@55735fab5d3ad247364ed90722210407a2f0ac92 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Meaetin
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@55735fab5d3ad247364ed90722210407a2f0ac92 -
Trigger Event:
push
-
Statement type: