Provider Integration
hex/claude-council
Adds new AI providers to claude-council, configures provider API settings, troubleshoots provider connections, and documents the provider script interface.
Build, launch, and drive shunt — the Claude Code LLM gateway (a Rust/axum Anthropic-Messages proxy).
$ npx skills add pleaseai/shunt --skill run-shunt -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install pleaseai/shunt run-shunt --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/pleaseai/shunt.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/run-shunt .claude/skills/run-shunt && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "run-shunt" agent skill from https://github.com/pleaseai/shunt/tree/main/.claude/skills/run-shunt into .claude/skills/run-shunt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-shunt", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/pleaseai/shunt/tree/main/.claude/skills/run-shuntType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add pleaseai/shunt --skill run-shunt -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install pleaseai/shunt run-shunt --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pleaseai/shunt.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/run-shunt .agents/skills/run-shunt && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "run-shunt" agent skill from https://github.com/pleaseai/shunt/tree/main/.claude/skills/run-shunt into .agents/skills/run-shunt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-shunt", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add pleaseai/shunt --skill run-shunt -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install pleaseai/shunt run-shunt --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pleaseai/shunt.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/run-shunt .cursor/skills/run-shunt && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "run-shunt" agent skill from https://github.com/pleaseai/shunt/tree/main/.claude/skills/run-shunt into .cursor/skills/run-shunt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-shunt", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/pleaseai/shunt.git --path .claude/skills/run-shunt--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add pleaseai/shunt --skill run-shunt -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install pleaseai/shunt run-shunt --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pleaseai/shunt.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/run-shunt .gemini/skills/run-shunt && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "run-shunt" agent skill from https://github.com/pleaseai/shunt/tree/main/.claude/skills/run-shunt into .gemini/skills/run-shunt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-shunt", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install pleaseai/shunt run-shuntInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add pleaseai/shunt --skill run-shunt -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/pleaseai/shunt.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/run-shunt .github/skills/run-shunt && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "run-shunt" agent skill from https://github.com/pleaseai/shunt/tree/main/.claude/skills/run-shunt into .github/skills/run-shunt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-shunt", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add pleaseai/shunt --skill run-shunt -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install pleaseai/shunt run-shunt --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/pleaseai/shunt.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/run-shunt .opencode/skills/run-shunt && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "run-shunt" agent skill from https://github.com/pleaseai/shunt/tree/main/.claude/skills/run-shunt into .opencode/skills/run-shunt/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "run-shunt", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
run-shuntBuild, launch, and drive shunt — the Claude Code LLM gateway (a Rust/axum Anthropic-Messages proxy).
Run Shunt is an agent skill from pleaseai/shunt. Build, launch, and drive shunt — the Claude Code LLM gateway (a Rust/axum Anthropic-Messages proxy). Use to run, start, smoke-test, or curl-drive the gateway, exercise /v1/models discovery and /v1/messages proxying, or connect Claude Code to a local shunt instance.
Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `smoke.sh` and `test_smoke.sh`).
It sits in Testing & QA, covering Model routing and gateways and QA and bug reports. It works with Rust, OpenAI, Google Gemini and Kimi. The repository describes itself as: Shunt Claude Code agents to any model — selective, per-agent inference-layer routing proxy. The licence is Apache-2.0.
Read from SKILL.md and the folder at commit e147f9b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (Shell), which the agent can run.
Shell commands in SKILL.md call:
cargojqcurlpython3claudeapt-getnpmFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comcode.claude.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
ANTHROPIC_AUTH_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Run Shunt loads about 2.6k tokens when it runs. Until then it costs about 69 tokens; SKILL.md has 988 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from pleaseai/shunt at commit e147f9b, republished under its Apache-2.0 licence (© pleaseai). 988 words, ~2,551 tokens.
.claude/skills/run-shunt/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.shunt is a Rust (axum) HTTP server — a Claude Code LLM gateway. It has no GUI: you drive it with curl. It listens on 127.0.0.1:3001 by default and serves an Anthropic-Messages surface (GET /v1/models, POST /v1/messages, POST /v1/messages/count_tokens, HEAD /). For each mapped model id it diverts inference to another provider (OpenAI / Codex / ChatGPT via the OpenAI Responses API); everything else passes through to Anthropic.
Primary agent path: run the committed driver .claude/skills/run-shunt/smoke.sh. It builds the binary, spins up a local mock upstream (so no real API key is needed), launches the gateway, and drives every route end to end with assertions. That is the way to confirm a change works.
All paths below are relative to the repo root (the shunt/ directory).
Everything the driver needs is already standard on macOS/Linux dev boxes:
cargo --version # Rust stable (built with 1.94); toolchain via rust-toolchain.toml if present
python3 --version # smoke.sh uses http.server as a stand-in upstream
curl --version
jq --version # smoke.sh asserts JSON responses with jq
lsof -vOn a bare Ubuntu container: apt-get install -y curl jq lsof python3 and install Rust via rustup if cargo is missing.
BIN="$(cargo build --locked --message-format=json-render-diagnostics | jq -sr '[.[] | select(.reason == "compiler-artifact" and .target.name == "shunt" and (.target.kind | index("bin"))) | .executable | select(. != null)] | last // empty')"
test -x "$BIN"BIN resolves Cargo's actual executable path, including CARGO_TARGET_DIR and a configured target triple.
This is what you run to see shunt working. It is hermetic (no network, no credentials) and exits non-zero on the first failed assertion.
.claude/skills/run-shunt/smoke.shExpected tail:
PASS shunt check -> config ok
PASS HEAD / -> 200 (server live)
PASS GET /v1/models returns configured model
PASS POST /v1/messages proxied to upstream and returned its body
PASS malformed request -> 400 invalid_request_error
PASS GET /health reports ok
PASS GET /protocol describes the anthropic-messages contract
PASS GET /routes resolves the configured route
PASS POST /v1/messages/count_tokens proxied to upstream on its own path
All smoke checks passed.What it covers: every route the server registers unconditionally. Config validation (shunt check), liveness (HEAD /), health (GET /health), the gateway contract (GET /protocol), model discovery (GET /v1/models), the resolved route table (GET /routes), both proxy forward paths (POST /v1/messages and POST /v1/messages/count_tokens, routed to a local mock that stands in for api.anthropic.com and asserted by the path it forwarded to), and the routing error path (a body with no model field → 400 invalid_request_error). Routes that only an optional config section registers (the Codex endpoint, the usage surfaces) are out of scope, since the smoke config does not enable them.
SHUNT_PORT and MOCK_PORT default to 31711 and 31712. Set either to 0 to bind an ephemeral port instead, which is the conflict-free way to run the driver beside a live gateway.
The driver has its own regression, test_smoke.sh. Run it after editing smoke.sh. It proves the driver refuses a port outside 0..65535 by name; refuses a port another listener already holds, where the real process dies at bind and the driver says which one died; and refuses a shunt listening on a port it never requested, which is the case the pid-derived readiness check catches. It then runs the normal path. The stand-in listener answers every assertion the driver makes, so a driver that trusted $SHUNT_PORT over the process it started would go green against it and get caught.
Write a config, launch, and curl it yourself:
BIN="$(cargo build --locked --message-format=json-render-diagnostics | jq -sr '[.[] | select(.reason == "compiler-artifact" and .target.name == "shunt" and (.target.kind | index("bin"))) | .executable | select(. != null)] | last // empty')"
test -x "$BIN"
"$BIN" run --config ./shunt.toml # or copy shunt.toml.example firstThen, against the running server:
curl -s "http://127.0.0.1:3001/v1/models?limit=1000" | jq .
# => {"data":[{"id":"claude-opus-via-codex","display_name":"Opus (via Codex)"}]}Validate a config without starting the server:
BIN="$(cargo build --locked --message-format=json-render-diagnostics | jq -sr '[.[] | select(.reason == "compiler-artifact" and .target.name == "shunt" and (.target.kind | index("bin"))) | .executable | select(. != null)] | last // empty')"
test -x "$BIN"
"$BIN" check --config ./shunt.toml # prints "config ok" or a precise errorCLI shape: shunt run|check [--config <path>] (also shunt --check). Default config path is ./shunt.toml; SHUNT_-prefixed env vars override (with __ for nesting).
The interesting code is the Anthropic Messages ⇄ OpenAI Responses translation (src/adapters/, src/model/) and routing (src/routing.rs). These are covered by unit + integration tests — the fastest inner loop for a PR touching them:
cargo test --workspace # all tests
cargo test --test responses_translate # the translation integration suiteFull pre-PR gate (matches CI):
cargo fmt --all --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-features --workspacePoint Claude Code at the running gateway. shunt does not validate the credential, but Claude Code still needs one set or it drops to its login wizard. Per the gateway-connect docs:
export ANTHROPIC_BASE_URL=http://127.0.0.1:3001
export ANTHROPIC_AUTH_TOKEN=local-dummy # any string; shunt ignores it
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1 # opt-in: pull /v1/models into the picker
export ANTHROPIC_CUSTOM_MODEL_OPTION=gpt-5.2-codex # add a non-claude id to /model (see Gotchas)
claude # started from the same shell; /status shows the base URLVerify the wiring without opening Claude Code (this is the docs' own check):
curl -X POST "$ANTHROPIC_BASE_URL/v1/messages" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
-H "anthropic-version: 2023-06-01" -H "content-type: application/json" \
-d '{"model":"claude-opus-via-codex","max_tokens":1,"messages":[{"role":"user","content":"."}]}'With a default (anthropic-routed) config this forwards to api.anthropic.com and needs a real Anthropic key in the header to get a 200; a mapped model routed to openai/codex needs that provider's credential instead. For a credential-free run, use smoke.sh (mock upstream) rather than this path.
npm start. It's a Rust HTTP server. "Running it" means launch + curl. The driver is the smoke script.claude/anthropic ids. Claude Code's /v1/models importer ignores any id not starting with claude or anthropic, so to route to e.g. gpt-5.2-codex you either alias it under a claude… discovery id or add it via ANTHROPIC_CUSTOM_MODEL_OPTION (the primary way). This is a Claude Code constraint, not a shunt bug.GET /v1/models reads authorization/x-api-key but discards it (src/discovery.rs), and the proxy just forwards headers upstream. So any dummy token works for local driving — the real key only matters to the upstream provider.shunt check is strict about provider shape. providers.openai.adapter and providers.codex.adapter must be "responses"; openai.auth must be api_key, codex.auth must be chatgpt_oauth — otherwise check fails with a specific error (src/config.rs). Partial TOML is fine: figment merges your file over built-in defaults, so you only need to specify what differs.[[models]] entry with no matching [[routes]] logs a WARN at startup/check but is not fatal.GET /protocol is the machine-readable gateway contract. It is unauthenticated and reports shunt's package version, Anthropic-Messages format, supported endpoints, header handling, attribution behavior, and model-discovery constraints.? (globbing) and mind noclobber on > redirects when driving by hand in this repo's shell.smoke.sh reports shunt exited during startup or mock upstream exited during startup: the dumped log says Address already in use, so a stale process holds that test port. Run lsof -nP -iTCP:${MOCK_PORT:-31712} -sTCP:LISTEN for the mock port or replace it with ${SHUNT_PORT:-31711} for the gateway port. Stop the reported PID, then re-run. SHUNT_PORT=0 MOCK_PORT=0 skips the conflict outright by binding ephemeral ports.502 Bad Gateway / api_error: error sending request for url (...) — shunt reached routing but the upstream base_url was unreachable (wrong host/port, or the mock/provider isn't up). This is the correct error mapping (src/error.rs), not a crash. Check the target base_url.400 invalid_request_error: request body must include a JSON model field — the request body isn't JSON with a model key. Routing happens before forwarding (src/routing.rs).cargo clippy fails the build — CI sets RUSTFLAGS=-D warnings; warnings are errors. Fix them before a PR (cargo clippy --all-targets --all-features -- -D warnings).© pleaseai, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files in .claude/skills/run-shunt of pleaseai/shunt.
Open the folder on GitHubat commit e147f9b
Run Shunt next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Run Shunt this skillpleaseai/shunt | 281 | — | ~2.6k | Automated safety check: Pass | Apache-2.0 | |
| Provider Integrationhex/claude-council | 851 | — | ~635 | Automated safety check: Pass | MIT | |
| Embeddings via 9Routerdecolua/9router | 30k | — | ~604 | Automated safety check: Pass | MIT | |
| Pulse Releasequnqin24/Pulse | 517 | — | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| Using Ccproxy Inspectorstarbaser/ccproxy | 350 | — | ~2.7k | Automated safety check: Pass | Custom licence | |
| Bridgic LLMsbitsky-tech/bridgic | 155 | — | ~839 | Automated safety check: Notes | MIT |
hex/claude-council
Adds new AI providers to claude-council, configures provider API settings, troubleshoots provider connections, and documents the provider script interface.
decolua/9router
Generates vector embeddings through the 9Router /v1/embeddings endpoint, using models from providers such as OpenAI, Gemini, Mistral and Voyage for RAG and semantic search.
qunqin24/Pulse
Release a new Pulse version end to end — checks, bilingual CHANGELOG entry, VERSION, tag, the release workflow, syncing main, and the issue replies that go with it.
starbaser/ccproxy
Operates the ccproxy inspector MITM system for intercepting, inspecting, and transforming LLM API traffic.
bitsky-tech/bridgic
LLM provider initialization for bridgic projects. An agent skill from bitsky-tech/bridgic.
zscole/model-hierarchy-skill
Cost-optimize AI agent operations by routing tasks to appropriate models based on complexity.
pleaseai/shunt
Launch and drive a local reference Claude apps gateway (claude gateway + Dex + Postgres) to probe, capture, or re-verify the login / managed-settings / OTLP-telemetry wire protocol that shunt's…
Works with
Categories
Build, launch, and drive shunt — the Claude Code LLM gateway (a Rust/axum Anthropic-Messages proxy). Run Shunt is an agent skill from pleaseai/shunt. Build, launch, and drive shunt — the Claude Code LLM gateway (a Rust/axum Anthropic-Messages proxy).
Run Shunt fits situations like: curl-drive the gateway; exercise /v1/models discovery and /v1/messages proxying; connect Claude Code to a local shunt instance.
Run `npx skills add pleaseai/shunt --skill run-shunt -a claude-code`. Or copy the skill folder (.claude/skills/run-shunt in pleaseai/shunt) into .claude/skills/run-shunt in your project. Claude Code loads it when a task matches its description.
Run `npx skills add pleaseai/shunt --skill run-shunt -a codex`. Or copy the skill folder (.claude/skills/run-shunt in pleaseai/shunt) into .agents/skills/run-shunt in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add pleaseai/shunt --skill run-shunt -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/run-shunt, .gemini/skills/run-shunt, .github/skills/run-shunt and .opencode/skills/run-shunt in your project.
Going by SKILL.md and its folder, Run Shunt needs a shell for the scripts in its folder, the command-line tools its instructions call (cargo, jq, curl, python3, claude and apt-get) and credentials named ANTHROPIC_AUTH_TOKEN. Our summary lists: Python 3; A Bash shell; A credential in ANTHROPIC_AUTH_TOKEN.
SKILL.md names 2 domains. As links in the text: github.com and code.claude.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Run Shunt is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Run Shunt: Provider Integration (hex/claude-council, 851 stars), Embeddings via 9Router (decolua/9router, 30k stars), Pulse Release (qunqin24/Pulse, 517 stars) and Using Ccproxy Inspector (starbaser/ccproxy, 350 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
pleaseai (a GitHub organization) maintains it in pleaseai/shunt, which has 281 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 8, 2026.
Source: pleaseai/shunt on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.