LLM Gateway
sickn33/agentic-awesome-skills
Deploy an API gateway for LLM traffic with load balancing, rate limiting, key management, semantic caching, fallback routing, and cost tracking.
Local test harness for the Weave router: a docker compose stack plus codex exec runs that confirm how Codex requests are routed, translated and marked.
$ npx skills add weave-os/router --skill test-codex-locally -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install weave-os/router test-codex-locally --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/weave-os/router.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/test-codex-locally .claude/skills/test-codex-locally && 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 "test-codex-locally" agent skill from https://github.com/weave-os/router/tree/main/.agents/skills/test-codex-locally into .claude/skills/test-codex-locally/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-codex-locally", 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/weave-os/router/tree/main/.agents/skills/test-codex-locallyType 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 weave-os/router --skill test-codex-locally -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install weave-os/router test-codex-locally --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/weave-os/router.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/test-codex-locally .agents/skills/test-codex-locally && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "test-codex-locally" agent skill from https://github.com/weave-os/router/tree/main/.agents/skills/test-codex-locally into .agents/skills/test-codex-locally/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-codex-locally", 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 weave-os/router --skill test-codex-locally -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install weave-os/router test-codex-locally --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/weave-os/router.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/test-codex-locally .cursor/skills/test-codex-locally && 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 "test-codex-locally" agent skill from https://github.com/weave-os/router/tree/main/.agents/skills/test-codex-locally into .cursor/skills/test-codex-locally/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-codex-locally", 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/weave-os/router.git --path .agents/skills/test-codex-locally--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 weave-os/router --skill test-codex-locally -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install weave-os/router test-codex-locally --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/weave-os/router.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/test-codex-locally .gemini/skills/test-codex-locally && 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 "test-codex-locally" agent skill from https://github.com/weave-os/router/tree/main/.agents/skills/test-codex-locally into .gemini/skills/test-codex-locally/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-codex-locally", 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 weave-os/router test-codex-locallyInstalls 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 weave-os/router --skill test-codex-locally -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/weave-os/router.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/test-codex-locally .github/skills/test-codex-locally && 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 "test-codex-locally" agent skill from https://github.com/weave-os/router/tree/main/.agents/skills/test-codex-locally into .github/skills/test-codex-locally/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-codex-locally", 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 weave-os/router --skill test-codex-locally -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install weave-os/router test-codex-locally --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/weave-os/router.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/test-codex-locally .opencode/skills/test-codex-locally && 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 "test-codex-locally" agent skill from https://github.com/weave-os/router/tree/main/.agents/skills/test-codex-locally into .opencode/skills/test-codex-locally/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-codex-locally", 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.
test-codex-locallyLocal test harness for the Weave router: a docker compose stack plus codex exec runs that confirm how Codex requests are routed, translated and marked.
The agent stands up the router in docker compose, points a one-off codex exec at it through a throwaway CODEX_HOME directory, and reads the local server logs to confirm behavior. The user's real Codex config and auth files are never edited; the temporary directory gets its own config and, when ChatGPT OAuth is needed, a copy of the auth file.
Two upstream modes exist: the real provider API, which needs a working key and credits plus a ChatGPT login for native GPT models, or a bundled mock upstream script that emits an exact SSE shape deterministically without credits. Gotchas include requires_openai_auth needing to be true, Codex always sending a ChatGPT token so the router treats it as a subscription, and a flag that forces the prepaid translation path instead. It is the interactive counterpart to an automated smoke test and to a sibling skill for Claude Code.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 8e8ebe6. 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 1 file in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
codexdockercurlpython3makeclaudegitFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
chatgpt.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
OPENAI_API_KEYFIREWORKS_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Test Weave Router with Codex loads about 4.7k tokens when it runs. Until then it costs about 111 tokens; SKILL.md has 1,989 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 noted patterns worth knowing about, such as sudo or a known installer.
al provider** — set the provider key in `.env.local` (e.g. `OPENAI_API_KEY=...`, `FIREWORKS_API_KEY=...`) and restart `dcomes from `ROUTER_CLUSTER_VERSION` in `.env.local`; it may differ from prod, which is why `/force-model` (not the scorAutomated 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); the scripts in this folder are not scanned.
The full file from weave-os/router at commit 8e8ebe6, republished under its Apache-2.0 licence (© weave-os). 1,989 words, ~4,687 tokens.
.claude/skills/test-codex-locally/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.For an automated pre-merge regression net (fixture-driven, asserts caching/streaming/decision-headers against real Anthropic), run
make smoke— see docs/SMOKE.md. This skill is the interactive counterpart for the Codex CLI (codex exec): stand the stack up by hand and drive it via a throwawayCODEX_HOMEso~/.codex/config.tomlis never edited.
Stand up the router in docker compose, point a one-off codex exec at it via CODEX_HOME, and read the local server logs to confirm behavior. Two upstream modes: the real provider API (needs a working key + credits, and for native GPT models a ChatGPT OAuth login) or a mock upstream that emits an exact SSE shape (deterministic, no credits).
The sibling skill test-claude-locally is the Claude Code (claude -p) counterpart. Stack bring-up and seeding are identical; only the client driver differs.
~/.codex/config.toml or ~/.codex/auth.json. Those are the user's live Codex install (prod Weave Router + ChatGPT OAuth). Redirect with a throwaway CODEX_HOME directory that contains its own config.toml (and a copy of auth.json when ChatGPT OAuth is required). CODEX_HOME is how Codex finds config; there is no --settings flag equivalent to Claude Code.requires_openai_auth = true is required. Codex 0.149 hangs or never issues a /v1/responses request if the custom provider uses requires_openai_auth = false or env_key. Copy ~/.codex/auth.json into the throwaway CODEX_HOME so Codex can attach the ChatGPT JWT + ChatGPT-Account-ID. The mock-router experiment that dropped OAuth never even hit the mock.ChatGPT-Account-ID. The local router will classify that as a Codex subscription (codexResponsesRequest → native Responses passthrough for OpenAI decisions). That is the path this skill is usually exercising (routing markers on verbatim GPT frames). To force the prepaid/BYOK translation path instead, flip subscription_routing_disabled=true on the seeded installation (see step 3).codex exec is one-shot. A standalone /force-model call does not persist to the next codex exec (new session id every time, unless you codex exec resume). Put /force-model <model> as the first line of the SAME prompt. The leading space is load-bearing — Codex consumes unknown slash tokens as local commands; a leading space makes it a normal user message the router can parse.config.toml, not codex -c. On Codex 0.149.1, -c 'model_providers.weave-local.http_headers."x-weave-force-model"="…"' did not merge into the outgoing request (no x-weave-force-model applied in server logs; the scorer served something else). Put "x-weave-force-model" = "<id>" on the same http_headers table in the throwaway config.toml (step 4). Confirm with docker compose logs server | grep 'x-weave-force-model applied' before drawing conclusions.model field for routing (cluster scorer / pins win). Codex's -m gpt-5.5 only changes what Codex requests; /force-model or x-weave-force-model is the only way to pin a specific routed model. Native GPT family (gpt-5.6-sol / terra / luna, plus whatever -m Codex defaulted to) still goes through the scorer unless forced.timeout on macOS. Drive codex exec directly. If a run hangs (Reading additional input from stdin... with no banner), Codex is waiting on a TTY/stdin — do not pipe into it, and make sure -s read-only (or --dangerously-bypass-approvals-and-sandbox) is set.docker compose fails with a unix://…/.docker/run/docker.sock connect error if Desktop is stopped. open -a Docker and wait for docker info before step 1.docker compose down and delete /tmp scratch. If health suddenly 404s or CODEX_HOME vanishes mid-run, re-up the stack and reseed — do not reuse a key you can no longer /validate.apiKeyID + first user message. Reusing the same curl/prompt body on the same key reuses the pin slot. routingMarkerFor then returns empty when PriorServedModel == ServedIdentity() (sticky same-model). For first-turn marker tests, seed a new key or change the first user text. Isolated /validate first: curl -sS -o /dev/null -w '%{http_code}\n' -H "X-Weave-Router-Key: $KEY" http://localhost:8080/validate must be 200.SetPassthroughBadge rewrites existing response.output_text.* events and, when a ChatGPT-subscription turn has no assistant text, inserts a leading assistant message item before native tool/reasoning output. Verify the badge in the Responses SSE/JSON; the Codex TUI can bury the first-turn line under tool chatter.GET /v1/models 501 from a mock is fine. Codex probes <base_url>/models first, logs an HTML 501, then continues to POST /v1/responses. The real local router implements GET /v1/models as Anthropic passthrough, so this only shows up against a Python mock.docker-compose.override.yml (see workflow). The server still reaches the emulator over the compose network.- [ ] 1. Bring up the stack (handle port 8085)
- [ ] 2. Seed an API key
- [ ] 3. Choose upstream + subscription vs prepaid path
- [ ] 4. Write a throwaway CODEX_HOME (copy auth.json)
- [ ] 5. Drive with `CODEX_HOME=... codex exec`, forcing the target model
- [ ] 6. Read local logs to verify behavior
- [ ] 7. Clean upcd <router-repo>
# Drop the pubsub host-port binding to avoid an 8085 conflict:
cat > docker-compose.override.yml <<'EOF'
services:
pubsub-emulator:
ports: !reset []
EOF
docker compose up -d --build server # --build picks up code changes
until curl -sf http://localhost:8080/health >/dev/null; do sleep 2; doneThe override file is gitignored-by-intent scaffolding — delete it in cleanup.
docker compose run --rm seedCopy the rk_... key it prints — only the line under Weave Router key (shown once — store it now):. Seed stdout repeats the same token in curl examples and installer snippets; grep -oE 'rk_[A-Za-z0-9]+' can grab a stale key from an earlier seed in the same log. Always /validate before driving Codex:
curl -sS -o /dev/null -w '%{http_code}\n' \
-H "X-Weave-Router-Key: rk_REPLACE_ME" http://localhost:8080/validate
# expect 200A 401 mid-session usually means the stack was torn down and reseeded (new installation, old token dead).
Real provider — set the provider key in .env.local (e.g. OPENAI_API_KEY=..., FIREWORKS_API_KEY=...) and restart docker compose up -d server. Confirm the boot log shows <Provider> provider enabled with the real base_url. Use this to confirm a model genuinely produces the behavior.
For an actual Codex subscription response, do not set ROUTER_CODEX_BASE_URL
and do not run either mock. Remove that environment entry from
docker-compose.override.yml, then rebuild the server:
unset ROUTER_CODEX_BASE_URL # also remove it from docker-compose.override.yml
docker compose up -d --build serverUse a throwaway CODEX_HOME containing a copy of the real
~/.codex/auth.json, with requires_openai_auth = true and X-App = "codex".
The router detects the OAuth bearer plus ChatGPT-Account-ID and calls the
real https://chatgpt.com/backend-api/codex/responses endpoint. This consumes
the user's ChatGPT quota and requires a valid login; the mock is only for
repeatable tests when that endpoint is unavailable or too expensive.
Mock upstream — for a deterministic, credit-free repro of a precise SSE shape. Point the provider's base URL at a local mock and restart. Codex talks to the router (POST /v1/responses); the mock sits behind the router as the upstream the router dispatches to:
python3 .claude/skills/test-claude-locally/scripts/mock_openai_upstream.py >/tmp/mock.log 2>&1 & # serves :8099
# In docker-compose.override.yml under `server:`, add:
# environment:
# FIREWORKS_BASE_URL: http://host.docker.internal:8099/v1
# FIREWORKS_API_KEY: sk-mock
# extra_hosts: ["host.docker.internal:host-gateway"]
docker compose up -d serverTo exercise the production-equivalent native Codex subscription path, use a native Responses mock instead of the Chat Completions mock:
python3 .claude/skills/test-codex-locally/scripts/mock_codex_upstream.py >/tmp/mock-codex.log 2>&1 &Add this to the server service in docker-compose.override.yml:
environment:
ROUTER_CODEX_BASE_URL: http://host.docker.internal:8099/v1
extra_hosts: ["host.docker.internal:host-gateway"]This preserves real Codex subscription detection (OAuth bearer plus
ChatGPT-Account-ID) and native Responses passthrough, while replacing only
the outbound ChatGPT backend with a deterministic tool-only stream. The mock
emits a function call, so the expected result is a synthetic marker message at
output_index: 0, followed by the native tool at output_index: 1.
Edit the mock's emitted chunks to match the upstream shape you're reproducing. Provider→env-var names live in internal/providers/provider.go; base-URL overrides are read in cmd/router/main.go (<PROVIDER>_BASE_URL). For local testing, ROUTER_CODEX_BASE_URL overrides only the subscription backend; the default remains https://chatgpt.com/backend-api/codex.
Subscription vs prepaid (important for marker / passthrough tests):
Codex will attach a ChatGPT JWT. The local router then treats the turn as a Codex subscription:
SetPassthrough / SetPassthroughBadge) to the Codex backend (or ROUTER_CODEX_BASE_URL in the native mock setup). This is the path the routing-marker-on-Codex work exercises.ResponsesWriter.SetBadgeText.To force the prepaid/BYOK translation path (no ChatGPT backend, uses OPENAI_API_KEY / other provider keys):
docker compose exec postgres psql -U router -d router -c \
"SET search_path TO router; UPDATE model_router_installations SET subscription_routing_disabled=true WHERE external_id='__router_admin__';"Revert with subscription_routing_disabled=false when done.
Do not point this at ~/.codex. A unique temp dir keeps the user's prod Weave + ChatGPT login intact.
export CODEX_HOME=/tmp/weave-codex-local
rm -rf "$CODEX_HOME"
mkdir -p "$CODEX_HOME"
cp ~/.codex/auth.json "$CODEX_HOME/auth.json" # required; see gotchas
cat > "$CODEX_HOME/config.toml" <<EOF
model_provider = "weave-local"
[model_providers.weave-local]
name = "Weave Router (local)"
base_url = "http://localhost:8080/v1"
wire_api = "responses"
requires_openai_auth = true
http_headers = { "X-Weave-Router-Key" = "rk_REPLACE_ME", "X-App" = "codex" }
EOFOptional headers on the same http_headers table:
| Header | Purpose |
|---|---|
"X-Weave-User-Email" = "dev@localhost" | Attribution in local logs |
"x-weave-force-model" = "z-ai/glm-5.1" | Preferred pin. Put it here — do not rely on codex -c (see gotchas). |
"X-Weave-Routing-Marker" = "off" | Suppress the in-band routing marker |
Do not set X-Weave-Router-Strategy unless you are deliberately pinning a strategy — omitting it uses the local deployment default (same rationale as install/install.sh --codex --local).
cd <scratch-dir-with-files-to-act-on>
CODEX_HOME=/tmp/weave-codex-local \
codex exec --skip-git-repo-check -s read-only -C "$(pwd)" \
' First send exactly: /force-model z-ai/glm-5.1
Then <task that requires tool use>, then stop.'Notes:
--skip-git-repo-check lets you run against /tmp or any non-git scratch dir.-s read-only (or --dangerously-bypass-approvals-and-sandbox in a throwaway dir) avoids the interactive approval TUI, which codex exec otherwise cannot answer./force-model is required (Codex otherwise treats it as an unknown local slash command and never sends it to the router).codex exec prints provider: weave-local in its session banner when the throwaway config took; if it prints provider: weave it is still reading ~/.codex — CODEX_HOME was not exported.docker compose logs server --since=1m should show a POST /v1/responses (and ProxyOpenAIChatCompletion start).Headless pin, no slash command — bake the header into the throwaway config.toml (step 4), then:
CODEX_HOME=/tmp/weave-codex-local \
codex exec --skip-git-repo-check -s read-only -C "$(pwd)" \
"say hi and stop"Do not use codex exec -c 'model_providers.weave-local.http_headers."x-weave-force-model"=…' as the pin. On 0.149.1 that override is silently dropped. After the run, grep 'x-weave-force-model applied' in server logs must fire; if it doesn't, Codex never sent the header.
Codex ingress is ProxyOpenAIResponses → ProxyOpenAIChatCompletion. The decision + completion log per action is ProxyOpenAIChatCompletion complete. Strip ANSI first:
docker compose logs server --since=3m 2>&1 | sed -E 's/\x1b\[[0-9;]*m//g' \
| grep 'ProxyOpenAIChatCompletion complete' | grep 'decision_model=z-ai/glm-5.1'Useful fields: decision_model, decision_provider, decision_reason, routing_marker, hard_pinned, cross_format, turn_type, proxy_err, upstream_status. Also grep for recovery nudge, tool-call loop, no-progress. SetBadgeText is not logged — look at the Codex transcript / codex output for the ✦ **Weave Router** → <model> (or **Weave Router** — <model> legacy) line.
Confirm the model was actually served before drawing conclusions:
docker compose logs server --since=3m 2>&1 | sed -E 's/\x1b\[[0-9;]*m//g' \
| grep 'ProxyOpenAIChatCompletion complete' | grep -oE 'decision_model=[^ ]+' | sort | uniq -cIf you only see other models, the pin didn't take. Recheck: (1) x-weave-force-model is in CODEX_HOME/config.toml (not only a -c flag), (2) server log has x-weave-force-model applied, (3) leading space on in-prompt /force-model if you used that path. Codex's session banner model: gpt-5.6-sol is what Codex requested, not what the router served.
Routing-marker specific checks (the usual reason to use this skill):
✦ **Weave Router** → <model> · <reason>. Log field routing_marker is non-empty.SetPassthroughBadge). Log still has routing_marker.X-Weave-Routing-Marker: off (and not subscription-only warning): no badge. Subscription-only depleted-credits warning still wins over the opt-out.prior_served_model equals decision_model): routing_marker="". Expected. Seed a new key (or change the first user text) to re-see a first-turn badge.output_item (output_index 0) ahead of the function call — including stream:false JSON. Confirm in the SSE / JSON, not only in codex exec stdout (the TUI can bury the first-turn line under tool chatter).X-App unset) on a translated decision still gets the ✦ **Weave Router** → … text badge today; native OpenAI passthrough without X-App: codex stays byte-identical (SetPassthrough with no badge rewrite).POST /v1/responses with X-Weave-Router-Key + X-App: codex is enough. Isolate first-turn cases with a freshly seeded key.pkill -f mock_openai_upstream.py 2>/dev/null
pkill -f mock_codex_upstream.py 2>/dev/null
rm -rf /tmp/weave-codex-local
rm -f docker-compose.override.yml
# `docker compose down` if you want to stop the stack
# do NOT touch ~/.codexROUTER_CLUSTER_VERSION in .env.local; it may differ from prod, which is why /force-model (not the scorer) is the reliable way to hit one model.gpt-5.6-sol, gpt-5.6-terra, and gpt-5.6-luna use the caller's ChatGPT OAuth plan when subscription routing is on. Other OpenAI / Anthropic / Gemini / OpenAI-compatible models use WorkWeave deployment or BYOK credentials, same as Claude Code.git ls-tree <monorepo-commit> router-internal/router shows the pinned router submodule SHA.codex exec --ignore-user-config is not a substitute for CODEX_HOME: it skips $CODEX_HOME/config.toml entirely (so you'd have no weave-local provider) while auth still uses CODEX_HOME. Always write a full throwaway config.$CODEX_HOME/sessions/<yyyy>/<mm>/<dd>/rollout-*.jsonl. Grep those for Weave Router when codex exec stdout is noisy.docker-compose.override.yml is gitignored. If you add a mock *_BASE_URL there, remember to rewrite the file back to the pubsub-only ports: !reset [] (or delete it) before a real-provider Codex run — a leftover mock URL will serve sk-mock against production-looking model names.© weave-os, 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 1 other file (scripts) in .agents/skills/test-codex-locally of weave-os/router.
Open the folder on GitHubat commit 8e8ebe6
Test Weave Router with Codex 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 |
|---|---|---|---|---|---|---|
| Test Weave Router with Codex this skillweave-os/router | 5.6k | — | ~4.7k | Automated safety check: Notes | Apache-2.0 | |
| LLM Gatewaysickn33/agentic-awesome-skills | 47k | 1 repos | ~2.1k | Automated safety check: Pass | MIT | |
| LLM GatewayBagelHole/DevOps-Security-Agent-Skills | 1.1k | — | ~2k | Automated safety check: Pass | MIT | |
| Integration Tests for pRESTprest/prest | 4.6k | — | ~1.1k | Automated safety check: Pass | MIT | |
| Testcontainers Guide Migratordocker/docs | 4.7k | — | ~5k | Automated safety check: Pass | Apache-2.0 | |
| Remote Executor Integration Testsopeninterpreter/openinterpreter | 69k | 2 repos | ~842 | Automated safety check: Pass | Apache-2.0 |
sickn33/agentic-awesome-skills
Deploy an API gateway for LLM traffic with load balancing, rate limiting, key management, semantic caching, fallback routing, and cost tracking.
BagelHole/DevOps-Security-Agent-Skills
Deploy an API gateway for LLM traffic with load balancing, rate limiting, key management, semantic caching, fallback routing, and cost tracking.
prest/prest
Guides writing and reviewing pREST Docker-based integration tests so every HTTP request is explained by step comments or table-driven descriptions.
docker/docs
Migrate a Testcontainers guide from testcontainers.com into the Docker docs site (docs.docker.com).
openinterpreter/openinterpreter
Explains how to run agent integration tests against remote executors, using Docker for Linux or Wine for Windows, and how to opt tests in or skip them.
airbytehq/airbyte
Starts a throwaway MongoDB 7.0 replica set and runs the Airbyte spec, check, discover and read commands against source-mongodb-v2 images for local end-to-end testing.
weave-os/router
Stands up the Weave model router in Docker Compose and drives it with claude -p against a real or mocked upstream to reproduce and verify routing and streaming behavior.
weave-os/router
Works through every review comment on a pull request in one pass, fixes what it can, escalates human decisions and keeps CI churn to a single push.
weave-os/router
Correlates a Claude Code session's local transcript with a model router's production cloud logs to explain why a specific response rendered the way it did.
weave-os/router
Installs a language server such as gopls, typescript-language-server, pyright or rust-analyzer and, with explicit confirmation, its underlying toolchain so the lsp tool can use it.
weave-os/router
Correlates a Codex CLI session's local transcript with a model router's production logs to explain why a reply rendered the way it did.
weave-os/router
Shows when to answer a code question through a real language server instead of grep, covering definitions, references, hover, outlines, and errors.
Categories
Local test harness for the Weave router: a docker compose stack plus codex exec runs that confirm how Codex requests are routed, translated and marked. The agent stands up the router in docker compose, points a one-off codex exec at it through a throwaway CODEX_HOME directory, and reads the local server logs to confirm behavior. The user's real Codex config and auth files are never edited; the temporary directory gets its own config and, when ChatGPT OAuth is needed, a copy of the auth file.
Test Weave Router with Codex fits situations like: verifying a router fix end to end for Codex's Responses API path; reproducing a production Codex routing bug locally; checking routing markers, force-model or subscription passthrough behavior; testing a force-model route without touching the global Codex config.
Run `npx skills add weave-os/router --skill test-codex-locally -a claude-code`. Or copy the skill folder (.agents/skills/test-codex-locally in weave-os/router) into .claude/skills/test-codex-locally in your project. Claude Code loads it when a task matches its description.
Run `npx skills add weave-os/router --skill test-codex-locally -a codex`. Or copy the skill folder (.agents/skills/test-codex-locally in weave-os/router) into .agents/skills/test-codex-locally 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 weave-os/router --skill test-codex-locally -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/test-codex-locally, .gemini/skills/test-codex-locally, .github/skills/test-codex-locally and .opencode/skills/test-codex-locally in your project.
Going by SKILL.md and its folder, Test Weave Router with Codex needs Python for the scripts in its folder, the command-line tools its instructions call (codex, docker, curl, python3, make and claude) and credentials named OPENAI_API_KEY and FIREWORKS_API_KEY. Our summary lists: docker compose; The Codex CLI; A provider key and credits, or the bundled mock upstream.
SKILL.md names 1 domain. In commands or code: chatgpt.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Test Weave Router with Codex 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 4.7k tokens (SKILL.md is roughly 19k 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 Test Weave Router with Codex: LLM Gateway (sickn33/agentic-awesome-skills, 47k stars), LLM Gateway (BagelHole/DevOps-Security-Agent-Skills, 1.1k stars), Integration Tests for pREST (prest/prest, 4.6k stars) and Testcontainers Guide Migrator (docker/docs, 4.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
weave-os (a GitHub organization) maintains it in weave-os/router, which has 5,576 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 8, 2026.
Source: weave-os/router on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.