4.8 KiB
REPORT: LiteLLM proxy deployed + RCEO pilot wired
Date: 2026-08-28 (turn TASK-20260828-1716-litellm) Operator: RCEO-Work Status: COMPLETE (one deviation, pre-approved — see "DB deviation")
Containers
| name | image | status | port |
|---|---|---|---|
| litellm | ghcr.io/berriai/litellm-database:main-stable | Up, restart unless-stopped | 192.168.3.78:4001 -> 4000 |
| litellm-db | postgres:alpine | Up, restart unless-stopped | none (docker-internal only) |
Port note: host 4000 is taken (kneldevstack-supportstack-demo-homepage) -> used 4001 per task instruction. No existing container was stopped/restarted/touched.
DB deviation (pre-approved fallback)
v2.2 specified "embedded SQLite". Upstream fact: LiteLLM has NEVER supported SQLite for virtual keys/spend — Prisma schema is postgresql-pinned in every release tag I checked (v1.53.7 Apr 2025, v1.63.14, v1.67.0, main); current main-stable fails fast: "database features ... require PostgreSQL". No sqlite code path exists in the installed package. Deployed the fallback PMO pre-approved in STATE-SNAPSHOT-20260828-1720.md: "dedicated litellm-db postgres container (standard minimal deploy, not overbuild)". Everything else per spec. Full recipe was validated with throwaway containers first, then deployed.
Virtual keys (8) — NAMES only, values are secrets
Values: /home/_crossfeed/tooling/credentials/litellm-virtual-keys.md (mode 600, gitignored). Budgets are USD per 30d window, enforced at the proxy.
| key_alias | budget | scope |
|---|---|---|
| rceo | $50 / 30d | onstage pilot (this host, crush) — ACTIVE |
| bod | $30 / 30d | onstage BOD |
| cco | $30 / 30d | onstage CCO |
| cto | $30 / 30d | onstage CTO |
| coo | $30 / 30d | onstage COO |
| offstage-1 | $15 / 30d | offstage (capped lower per v2.2) |
| offstage-2 | $15 / 30d | offstage |
| offstage-3 | $15 / 30d | offstage |
All keys allow all 12 z.ai models (glm-5.3, 5.2, 5.1, 5-turbo, 5, 4.7, 4.7-flash, 4.6, 4.6v, 4.5, 4.5-air, 4.5v). Global hard cap: 3 concurrent (config.yaml max_parallel_requests). Offstage hosts reach the proxy at http://192.168.3.78:4001/v1 (OpenAI-compatible).
Config / secrets layout
- /home/_crossfeed/tooling/litellm/config.yaml — 12 z.ai models via https://api.z.ai/api/coding/paas/v4 (OpenAI-compatible), master_key from env, per-token USD pricing mirrored from the crush catalog, drop_params on.
- /home/_crossfeed/tooling/credentials/litellm-secrets.env (600, gitignored) — LITELLM_MASTER_KEY, ZAI_API_KEY (real key; only place outside crush state), DATABASE_URL. Passed via --env-file, never in config or logs.
- /home/_crossfeed/tooling/credentials/litellm-db.env (600, gitignored) — postgres creds for litellm-db.
- /home/_crossfeed/tooling/litellm/data/pg — postgres data (persists across container recreation).
RCEO pilot wiring
- Backups: /home/reachableceo/.local/share/crush/providers.json.pre-litellm.bak (task-required) and crush.json.pre-litellm.bak (companion; holds the direct z.ai key override).
- Actual wiring lives in /home/reachableceo/.config/crush/crush.json (600): custom provider "litellm" -> base_url http://192.168.3.78:4001/v1 with the rceo virtual key; models large=glm-5.2, small=glm-5-turbo.
- WHY not providers.json: crush auto-regenerates providers.json from its bundled catalog on startup (verified — my endpoint edit there was silently reverted, which caused a transient 401 during wiring). ~/.local/share/crush/ is machine state; the durable override point is the config file.
Verification (all redacted, no key values)
- Headless crush via proxy:
crush run --quiet -m litellm/glm-5.2 "Reply with exactly: PROXY-OK..."-> PROXY-OK; flagless default run -> "READY"; proxy access log shows the correspondingPOST /v1/chat/completions 200. - Usage/key-info API sample (GET /key/info, master auth):
{"key_alias":"rceo","spend_usd":2.035e-05,"max_budget_usd":50.0, "budget_duration":"30d","budget_reset_at":"2026-09-01T00:00:00+00:00"}GET /global/spend/logs:[{"date":"2026-08-28","spend":2.035e-05}]-> per-key attribution + dollar spend recording confirmed end-to-end.
Emergency fallback (restore direct z.ai)
- cp -p ~/.local/share/crush/providers.json.pre-litellm.bak ~/.local/share/crush/providers.json
- rm ~/.config/crush/crush.json (removes proxy wiring; model reverts to zai) (crush.json.pre-litellm.bak also restorable if state was touched)
- Optional teardown: docker rm -f litellm litellm-db Direct z.ai key remains intact in crush state the whole time.
Notes / caveats
- glm-5.2 is priced 0/0 in the crush catalog (coding-plan included), so its proxy spend tracks $0 by design; other models track real USD.
- Test artifacts from validation (throwaway containers/network/envs) fully removed; no residue. Images kept locally for fast redeploys.
- credentials/.gitignore extended with the three litellm secret filenames.