1 Home
Xena Rathon edited this page 2026-07-12 21:45:38 -04:00

Salyut — Setup & Usage

Salyut is a small MCP server that asks several free LLMs the same question and returns their answers side by side. This is the step-by-step manual; the README covers what it is and why.

1. Prerequisites

  • Docker (to run the server) or Python 3.10+ (to run it directly / use the CLI).
  • At least one free API key from the providers below. Any key you don't set simply drops that model from the panel — nothing breaks, so start with whichever one or two you have.
Where to get each free key
Env var Provider Sign-up
CEREBRAS_API_KEY Cerebras cloud.cerebras.ai
ZAI_API_KEY Z.ai (Zhipu GLM) z.ai / open.bigmodel.cn
GROQ_API_KEY Groq console.groq.com
GEMINI_API_KEY Google AI Studio aistudio.google.com
MISTRAL_API_KEY Mistral console.mistral.ai
OPENROUTER_API_KEY OpenRouter openrouter.ai

⚠️ Mistral's free tier trains on the data you send it. Salyut therefore keeps Mistral out of the default panel — it's only called if a caller explicitly asks for it. Leave MISTRAL_API_KEY unset if you'd rather not use it at all.

2. Configure

Copy .env.example to .env and fill in the keys you have:

cp .env.example .env
$EDITOR .env

3. Run it

Docker (recommended)
docker build -t salyut:latest .
docker run -d --name salyut --restart unless-stopped \
  --env-file .env -p 8140:8000 salyut:latest
# native MCP over streamable-http is now at http://<your-host>:8140/mcp

If your platform can't build images (e.g. a stack manager that only deploys), build the image on any host first and reference the salyut:latest tag in your compose/stack.

Directly with Python
pip install -r requirements.txt
set -a; source .env; set +a
CONSULT_PORT=8140 python -m consult.server   # serves /mcp on :8140

4. Use it from an MCP client (e.g. Claude Code)

claude mcp add salyut --scope user --transport http http://<your-host>:8140/mcp

Then in a session: "Use salyut's consult tool: is a class or plain functions better here? Ask the default panel." You'll get one answer per model, each attributed.

  • consult(question, models=None) — leave models empty for the default panel; pass e.g. ["cerebras","glm"] to pick specific ones (this is also the only way to include mistral).
  • listmodels() — shows the configured providers and their current models.

5. Use the CLI (scripting / model bake-offs)

# talks to a running server by default (shares its rate-guard)
python -m consult.cli --prompt "Is Rust memory-safe? One sentence." --output result.md
python -m consult.cli --prompt "..." --models cerebras,groq
# offline / no server:
python -m consult.cli --prompt "..." --direct

A handy use: A/B one prompt across models — e.g. testing which model best judges a tricky classification.

6. Tuning

Roster, models, and rate limits

All in consult/core.py:

  • DEFAULT_ROSTER / FULL_ROSTER — which providers are called.
  • Per-model overrides via env (e.g. CONSULT_CEREBRAS_MODEL, CONSULT_GLM_MODEL).
  • GUARD_MIN_INTERVAL / GUARD_DAILY_CAP — the shared rate-guard, set from each provider's real free-tier limits. The guard fails open for any provider with no limit configured, and closed once a configured cap is hit, so nothing crashes and no bucket gets drained.

Free-model slugs rotate — if a default starts returning errors, check the provider's current model list and update the slug.

Troubleshooting

  • A model returns ERROR: HTTP 429 — that provider's free bucket is spent (or you're calling faster than its per-second limit). The others still answer; try again later.
  • A model returns ERROR: no api key — its key isn't set; that's fine, it just sits out.
  • "Only N of M models answered" in the digest — Salyut says so plainly rather than pretending a consensus exists.

Built with Claude (Opus 4.8). GPL-3.0-or-later.