Repository navigation
Releases
v0.14.1
Fixes
Failover when an OpenAI-protocol provider returns HTML instead of a stream
A provider configured with protocol: "openai" could answer HTTP 200 with a small HTML body — a gateway, WAF, or quota page intercepting the call. The SSE translator received no data: lines, emitted zero events, and closed the stream, which surfaced in Claude Code as:
Streaming response ended before any complete data was received.
API Error: API returned an empty or malformed response (HTTP 200) — ... no_events
The proxy now inspects the response content-type before translating. A non-stream body is drained, the provider is marked down with the real reason (including the intercepted HTML), and the request fails over to the next provider. When no provider can serve the request, the error names the actual content-type and body instead of reporting an empty stream.
Two pre-existing bugs fixed along the way:
usageTap.flush()parsed a trailing JSON buffer for usage but forwarded nothing, dropping the entire response body for any JSON reply without a trailing newline.- JSON replies were reshaped into an SSE event stream unconditionally, including for non-streaming requests. Now gated on the client's own
streamflag, and non-streaming OpenAI replies are translated to Anthropic JSON.
Tests
224 passing, including new coverage for the HTML-intercept case: it asserts the intercept body never reaches the client, the request fails over to a healthy provider, and the fault is logged with its content-type.
switchXprovider v0.14.0 — Keyless Free-Lane Providers
Adds two keyless free model providers that require no signup or API keys:
Kilo Channel (working end-to-end): Routes Anthropic-shaped requests through api.kilo.ai/api/gateway as OpenAI chat completions, translating back to Anthropic SSE for Claude Code. Uses the kilo-auto/free model which auto-selects the cheapest working free model.
OpenCode Free Lane (experimental): Module wired into the proxy with v2 OpenCode client fingerprint synthesis (session id minting, tool definition injection, pooled credential). The public lane at opencode.ai now requires the official OpenCode client's TLS identity, so a standalone proxy receives 403 — the module is ready for runs inside the OpenCode process.
Files changed:
server/lib/freelane.mjs(new) — free-lane fingerprint: session ID minting, tool injection, header synthesisserver/lib/proxy.mjs—protocol=freelanebranch in attempt(), authStyle=none handlingserver/lib/api.mjs— accept authStyle=none and protocol=freelane in provider CRUDserver/catalog.json— opencode-free + kilo-free entriesserver/ensure.mjs— hash freelane.mjs for watchdog restart detection
v0.13.0
fix: auto-mode classifier bypass to Anthropic verbatim
Full Changelog: v0.12.0...v0.13.0
switchXprovider v0.12.0
Provider disable/enable toggle
One-click disable a provider from the dashboard, re-enable anytime — no need to delete and re-add.
Changes
- New API actions
POST /api/providers/:id/disableand/enableflip the provider'senabledflag. Ties into the existingenabledSorted()routing filter in proxy.mjs, so a disabled provider is immediately excluded from failover, health probes, and model-slot selection — no proxy code changes. - Dashboard provider card: dedicated disable (yellow) / enable (green) button alongside test/edit/delete. Disable prompts for confirmation; enable is instant.
- State persists across proxy restarts.
What's already released
- v0.11.4: SSE chunk reassembly fix for upstream gateways (VyceAI / APInex) that fragment
data:lines across TCP chunks.
switchXprovider v0.11.4
Fix: SSE chunk reassembly prevents 'malformed stream' on VyceAI and other gateways. Chore: version bump to 0.11.4.
v0.11.3
Hide the auto-mode classifier-billing notice.
Claude Code shows a startup notice when auto-mode server-side classifier checks cannot traverse a gateway (the proxy reshapes the safeguards/safeguard_results contract), and its fallback classifier bills against your quota.
- Settings toggle now controls both startup notices (connectors-disabled + auto-mode billing)
- enableRouting/disableRouting manage CLAUDE_CODE_AUTO_MODE_SERVER=0 alongside the connectors opt-out
- Installer seeds CLAUDE_CODE_AUTO_MODE_SERVER=0 for fresh setups
- /api/status reports autoModeServerDisabled
Restart Claude Code after toggling to apply.
v0.11.2: swap 4 dead providers for xKiro and TokenForge
- Remove TabiToken, BlueSminds, B.AI, TokenRouter (unreachable/limited-time free)
- Add xKiro: 55 free models across 16 providers, 500K tokens/day (1M with Telegram)
- Add TokenForge: Anthropic-compatible gateway with Claude Opus 5.5, GPT-Astra, GLM-5.3, Kimi K3
v0.11.1
fix: DeepSeek V4.1 cacheRead rates corrected
- deepseek-v4-pro cacheRead: 0.022 → 0.044 (0.033x, not 0.02x)
- deepseek-flash cacheRead: 0.006 (0.02x confirmed)
- New entries: deepseek-flash, deepseek-v4-pro
- Legacy aliases: deepseek-chat, deepseek-v4-flash, deepseek-v4-flash-vision-exp
- Source: https://api-docs.deepseek.com/quick_start/pricing/
v0.11.0 — Token Saver
Token Saver — compress oversized tool outputs
- Token Saver (9router/RTK-inspired): compresses oversized tool outputs before they're sent upstream, cutting prompt tokens on long agentic sessions
- Deterministic compression — identical input always produces identical output (safe for prompt caching)
- Configurable byte threshold, server-side clamped to a 1000-byte minimum
- Live stats: inputs compressed, bytes saved, compression ratio
- Dashboard settings UI: on/off toggle, threshold editor
- Stats correctly accumulate once per request even across failover retries (no double-counting)
Provider catalog updates
- Added: Groq (console.groq.com), LLM7, Agnes AI
- Marked dead: TabiToken, BlueSminds
v0.10.0 — Live traffic flow widget
Traffic flow widget upgrade
- Live traffic particles flow along edges, spawn rate scaled by real-time req/s
- Cooldown countdown rings drain over the full backoff window on down providers
- Model slot chips (S/O/H) inside provider bubbles
- tok/s sparklines per provider + edge thickness scales with traffic share
- Hover stat card: status, requests, tokens, cost, model slots
- Particle engine uses delta-time stepping — correct at any refresh rate or throttled tab
Fixes baked in:
toks is not definedReferenceError in flowTrackUsage broke all dashboard rendering- Cooldown ring never drained (total was re-anchored to shrinking downForMs each poll)
- Frame-rate dependent particle animation (fixed /60 stepping)