Multi-LLM council protocol SDK.
Project description
star-chamber
Multi-LLM council protocol SDK. Fan out code reviews and design questions to multiple LLM providers, then classify findings by consensus.
Installation
pip install star-chamber
Or with uv:
uv add star-chamber
Configuration
Create ~/.config/star-chamber/providers.json:
{
"providers": [
{"provider": "openai", "model": "gpt-4o", "api_key": "${OPENAI_API_KEY}"},
{"provider": "anthropic", "model": "claude-sonnet-4-20250514", "api_key": "${ANTHROPIC_API_KEY}"}
],
"timeout_seconds": 90,
"consensus_threshold": 2
}
API keys can be literal values or ${ENV_VAR} references that are resolved at runtime.
Otari gateway
Instead of managing API keys per provider, you can route all non-local providers through Otari, Mozilla AI's OpenAI-compatible LLM gateway, by adding a top-level otari object:
{
"providers": [
{"provider": "openai", "model": "openai:gpt-4o"},
{"provider": "anthropic", "model": "anthropic:claude-sonnet-4-20250514"}
],
"otari": {
"api_base": "https://your-gateway.example/v1",
"api_key": "${OTARI_API_KEY}"
},
"timeout_seconds": 90,
"consensus_threshold": 2
}
In Otari mode, Otari — not the SDK — picks the upstream provider, so the per-provider provider field becomes a label. Otari expects the model field to use a provider:model prefix such as "openai:gpt-4o"; consult Otari's documentation for its model-naming convention.
api_base and api_key may also be omitted from the config, in which case they are resolved from the OTARI_API_BASE and OTARI_API_KEY environment variables. Both fields also support ${ENV_VAR} references.
For Bearer-token auth against a hosted Otari platform, omit api_key and set the OTARI_PLATFORM_TOKEN environment variable instead — the Otari client detects it and switches to platform mode automatically.
Providers marked "local": true always bypass Otari and continue to use their own api_base.
Override the config path with the STAR_CHAMBER_CONFIG environment variable.
CLI
Code review
star-chamber review src/auth.py src/db.py
Design question
star-chamber ask "Should we use Redis or Memcached for session storage?"
Options
--provider, -p Provider to include (repeatable)
--config Path to providers.json
--timeout Per-provider timeout in seconds
--context-file File containing project context to include in the prompt
--council-context File containing prior council round feedback (debate mode)
--format Output format: text or json
--output Write JSON result to file
List providers
star-chamber list-providers
Protocol schemas
The SDK ships the council protocol specification as package data.
# List available schemas.
star-chamber schema list
# Print a specific schema.
star-chamber schema code-review-result
Python API
from star_chamber import run_council_sync, CouncilConfig, ProviderConfig
config = CouncilConfig(
providers=(
ProviderConfig(provider="openai", model="gpt-4o"),
ProviderConfig(provider="anthropic", model="claude-sonnet-4-20250514"),
),
timeout_seconds=90,
consensus_threshold=2,
)
# Code review.
result = run_council_sync(
files={"auth.py": open("auth.py").read()},
config=config,
mode="code-review",
)
print(result.summary)
for issue in result.consensus_issues:
print(f" [{issue.severity}] {issue.location}: {issue.description}")
# Design question.
result = run_council_sync(
prompt="Should we use a monorepo or polyrepo?",
config=config,
mode="design-question",
)
print(result.consensus_recommendation)
Async
import asyncio
from star_chamber import run_council
result = asyncio.run(run_council(
files={"auth.py": open("auth.py").read()},
mode="code-review",
))
Schema access
from star_chamber import get_schema, list_schemas
# List available schema names.
names = list_schemas()
# Get a specific schema as a JSON string.
schema_json = get_schema("code-review-result")
Consensus classification
Issues from multiple providers are grouped by file, line proximity (within 5 lines), and category, then classified as:
- Consensus -- all providers agree.
- Majority -- two or more providers agree, but not all.
- Individual -- flagged by a single provider.
Results are sorted by severity within each bucket.
License
Apache-2.0
Project details
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 star_chamber-0.2.0.tar.gz.
File metadata
- Download URL: star_chamber-0.2.0.tar.gz
- Upload date:
- Size: 90.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5aefec043bdd5b45031d23de85ee3615a707654d5b22cd8d31926aa371c7958b
|
|
| MD5 |
ff6ebb66552efb1e633a6c699e242d70
|
|
| BLAKE2b-256 |
5caf318d41fd04f904d2d06c809b77d13723b2486eec7aa66b9ca25a26ccab96
|
Provenance
The following attestation bundles were made for star_chamber-0.2.0.tar.gz:
Publisher:
release.yaml on peteski22/star-chamber
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
star_chamber-0.2.0.tar.gz -
Subject digest:
5aefec043bdd5b45031d23de85ee3615a707654d5b22cd8d31926aa371c7958b - Sigstore transparency entry: 1731227802
- Sigstore integration time:
-
Permalink:
peteski22/star-chamber@c273ba4d205043a10ba499a416041e0fce47c5cf -
Branch / Tag:
refs/tags/0.2.0 - Owner: https://github.com/peteski22
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@c273ba4d205043a10ba499a416041e0fce47c5cf -
Trigger Event:
release
-
Statement type:
File details
Details for the file star_chamber-0.2.0-py3-none-any.whl.
File metadata
- Download URL: star_chamber-0.2.0-py3-none-any.whl
- Upload date:
- Size: 49.2 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 |
cc259e98736f59c4dc1ab9d5f0cdebdc93beafec7ad7ffd809f8ad7098edfee7
|
|
| MD5 |
cd31c48efe87de67922feb500ccdc780
|
|
| BLAKE2b-256 |
7626091bdec1f58b2bf985dcbb6cf9e268f06338b06698a88326f9bee6e3269f
|
Provenance
The following attestation bundles were made for star_chamber-0.2.0-py3-none-any.whl:
Publisher:
release.yaml on peteski22/star-chamber
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
star_chamber-0.2.0-py3-none-any.whl -
Subject digest:
cc259e98736f59c4dc1ab9d5f0cdebdc93beafec7ad7ffd809f8ad7098edfee7 - Sigstore transparency entry: 1731227817
- Sigstore integration time:
-
Permalink:
peteski22/star-chamber@c273ba4d205043a10ba499a416041e0fce47c5cf -
Branch / Tag:
refs/tags/0.2.0 - Owner: https://github.com/peteski22
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@c273ba4d205043a10ba499a416041e0fce47c5cf -
Trigger Event:
release
-
Statement type: