Changelog
Release notes for the FusionKit packages.
Release notes for the RouteKit/FusionKit monorepo: @velum-labs/routekit and @velum-labs/routekit-* and
@fusionkit/* npm packages, the @velum-labs/model-fusion-protocol contract
package, and the PyPI FusionKit sidecar package set. Release tags are named
handoffkit-v* for historical reasons.
Unreleased
0.10.1 - 2026-07-26
- RouteKit now supports named remote gateways with
routekit remote add|list|show|use|remove, persistent active-target selection, and per-command--remote/--localoverrides. Coding-tool launches and model discovery use the remote HTTPS data plane, while config, account, provider, status, usage, call, telemetry, and doctor operations relay the existing typed control protocol through SSH without exposing the daemon's loopback control listener. Remote data tokens live in macOS Keychain or private0600files on other platforms and are never stored in the remote registry.
0.10.0 - 2026-07-25
-
Reasoning now survives every protocol boundary the gateway translates across. Encrypted OpenAI reasoning items were dropped when a Responses request became a Chat Completions one, Anthropic thinking signatures and Google thought signatures were lost whenever an assistant turn was replayed alongside tool calls, and
reasoning_contentandreasoningwere merged into a single channel during trajectory capture. A thread that continued a reasoning turn therefore restarted its reasoning upstream, and providers that verify signed thinking rejected the replay outright.Provider-native reasoning state now rides on a versioned
x_routekitmessage extension carrying the effort selection, Anthropic thinking blocks, OpenAI encrypted reasoning items, and Google thought signatures. The extension is stripped before a request leaves for a provider, so it is a gateway-internal contract that clients only need to echo back on the next turn. Server-side web search carries the same state across its continuation steps, Responses usage reportsreasoning_tokensandcached_tokensinstead of dropping the detail, and a mid-stream failover no longer discards reasoning already committed to the response.Requests that cannot be served losslessly now fail with an explicit
400rather than degrading silently:previous_response_idon this stateless gateway (unsupported_previous_response_id), encrypted reasoning aimed at a backend that cannot consume it (unsupported_encrypted_reasoning), and reasoning controls that contradict each other (invalid_reasoning_control).The FusionKit sidecar threads the same extension through judging and synthesis, so a fused compound answer can be continued on a reasoning model.
-
Cursor BYOK users can now select reasoning effort through model variants such as
routekit/openai/gpt-5.5:high. The/v1/cursor/modelsmirror advertises one suffixed variant per effort discovered for each model, and ingress strips the suffix before routing while applying its effort as an explicit reasoning control. Unsuffixed models retain automatic provider-default behavior.
0.9.10 - 2026-07-25
-
Fixed Anthropic egress rejecting conversations that contain a turn carrying no translatable text. The OpenAI-to-Anthropic translation only emitted a text block when a message flattened to a non-empty string, so a blank turn — or one whose only parts were images — went upstream as
content: []and Anthropic answeredmessages.N: user messages must have non-empty content. This surfaced when a client replayed history onto a Claude model, for example switching a Cursor thread fromcodex/gpt-5.6-soltoclaude-code/claude-fable-5, because the Responses path accepts turns that the Anthropic path rejects.OpenAI
image_urlparts now translate into Anthropicimageblocks, covering both base64 data URLs andhttp(s)URLs; previously every image was dropped on the floor, so vision requests reached Claude with the picture missing. Parts that still cannot be translated are reported through the usual dropped field telemetry instead of disappearing. Empty and whitespace-only text no longer produces a block, since Anthropic rejects those separately. Turns that translate to nothing are dropped, which costs nothing because Anthropic coalesces adjacent same-role turns — except for a closing turn, where a placeholder keeps the conversation ending on a user message for models that forbid assistant prefill.
0.9.9 - 2026-07-25
-
Subscription pools now re-mint an access token the provider has stopped honoring. A stored token can be rejected upstream long before its own expiry claim lapses, and the previous refresh trigger only watched that claim, so a dead token could wedge a pool for as long as the claim said it was valid. A rejected discovery and a
401/403on a served request each spend one refresh, rate limited to one per member every five minutes, before the failure is believed. -
A failed model discovery no longer darkens a subscription pool. Members kept their model set only on success and an empty set makes a member ineligible, so one upstream blip took every account in the pool out of rotation until discovery recovered. Members now keep their last known catalog, and the reasoning controls that go with it, when discovery fails.
-
Fixed
routekit statusreporting every enrolled account asrelay unavailable or coolingwhile the accounts were serving normally. The command refreshes providers and reads account state in one batch, and the refresh used to blank each member's catalog first, so the account read landed in that window.routekit accounts statuswas unaffected and always correct.Found on a gateway whose two Codex accounts had been dark for 21 hours: ChatGPT's backend answered
503 biscuit_baker_service_me_circuit_openfor both stored tokens on every endpoint, while the same account's token from a freshly logged-in CLI answered200. An OAuth refresh with the stored refresh token fixed both accounts immediately.
0.9.8 - 2026-07-25
-
The
/v1/cursormodels mirror now namespaces every advertised id underroutekit/(for exampleroutekit/claude-code/claude-fable-5). Cursor selects the BYOK provider by a case-sensitive model-name prefix:claude-*goes to the Anthropic key,gemini-*to the Google key, and everything else to the OpenAI key plus the base-URL override. Prefixing every id guarantees no advertised name trips those prefixes. Ingress stripsroutekit/and still accepts the legacy 0.9.6 dashed spelling for one release.routekit cursorinstructions print the namespaced name. ManualmodelAliasesentries are no longer required for Cursor BYOK.Established from Cursor's own
byokModelUtils.jsand pinned against a permissive probe:probe-plain-1,claudex-9,Claude-zzz-9, andvelum-claude-fable-5reached the endpoint, whileclaude-zzz-9andgemini-zzz-9were stopped in the client with no request logged. Slashes are fine; the 0.9.6 note claiming Cursor rejects them was wrong. The probe also showed Cursor's backend (not the desktop) connects to the BYOK endpoint, so the URL must be publicly reachable.
0.9.7 - 2026-07-24
-
Added
modelAliasesto the router config so a namespaced model can also be served under a second, freely chosen name, for examplevelum-fable-5: claude-code/claude-fable-5. Any name without/that does not collide with a served model id is accepted. Prefer the automaticroutekit/Cursor namespace over hand-written aliases for BYOK. -
Fixed the
/v1/cursormodels mirror to respell every/in a model id, so OpenRouter's three-segment ids produce usable dashed aliases. Superseded by the automaticroutekit/namespace.
0.9.6 - 2026-07-24
- The gateway's
/v1/cursorroutes now accept and advertise dash-separated model aliases (for exampleclaude-code-claude-fable-5). The original claim that Cursor rejects/was wrong; the real constraint is theclaude-/gemini-prefix rule. Legacy dashed spelling remains accepted on ingress for one release after theroutekit/namespace shipped.
0.9.5 - 2026-07-24
-
Codex subscription chat completions now recover final assistant text from completed SSE items in both buffered and streaming requests. A genuinely reasoning-only upstream completion returns an explicit error instead of a successful empty assistant turn.
-
Added Anthropic model capability discovery so Codex exposes only the provider-advertised effort levels for Claude Code subscription models.
0.9.4 - 2026-07-24
- Fixed normalized Codex
nonerequests from emitting unsupported explicit disabled-thinking controls to Claude Code models such as Fable.
0.9.3 - 2026-07-24
- Fixed Codex gateway launches to honor the configured RouteKit default model
and to treat Codex's synthetic
nonereasoning effort as disabled only for models without discovered reasoning controls.
0.9.2 - 2026-07-24
- Fixed non-streaming Codex subscription completions returning empty assistant
content when the upstream SSE terminal response omitted output already
delivered through
response.output_item.done.
0.9.0 - 2026-07-23
- Enforced RouteKit's first-launch public support allowlist across help, onboarding, completion, docs, examples, and default setup. Additional neutral registry backends, connectors, and tool integrations remain internal and non-contractual.
- Added provider-discovered, per-model reasoning capabilities with opaque effort IDs, declarative overrides, route-aware validation, and capability-driven OpenAI, OpenRouter, Anthropic, and Codex egress. The retained internal Google backend propagates the same metadata but remains outside RouteKit's public support contract. RouteKit tool selectors and harness drivers now forward the same validated selection; unknown models no longer receive fabricated effort tiers.
- Fixed the Codex
/modelpicker dropping non-Codex (e.g. Anthropic) gateway models: every launcher catalog entry now serializes thesupported_reasoning_levelsfield Codex requires (empty when undiscovered). Codex-native models pass their real stock ModelInfo through verbatim (tuned prompt, reasoning tiers, tool mode), while foreign models get neutral entries — stock behavior fields (tool_mode,use_responses_lite, service/speed tiers, and the stockbase_instructionsprompt that told every routed model it was GPT-5) no longer leak across models. When Codex retains its startup model's GPT-5 identity after an in-session/modelswitch, RouteKit now drops that contradictory identity only at a cross-provider boundary while preserving native Codex instructions. - Subscription pools now recover from a persistent account-local transient throttle by trying one other eligible account after the same-account retry; provider-wide bursts are still capped instead of being sent through the entire pool.
- Isolated the Codex SDK driver's
CODEX_HOMEfor gateway-routed sessions so the user's personal Codex config (model, reasoning effort) cannot leak into panel requests and codex cannot overwrite the user's real models cache. - Split the neutral routing foundation into
@velum-labs/routekitand@velum-labs/routekit-*packages and the independentroutekitCLI. RouteKit now owns explicit provider configuration, live namespaced model catalogs, credentials, multi-subscription account pooling, proxies, provider egress, and direct coding-tool launches. - Added
routekit accounts loginfor isolated, provider-supported Claude Code and Codex authentication that enrolls directly into RouteKit's native pool without replacing the user's normal official-CLI login. - Simplified native model pickers: Claude Code presents
claude-code/*and Codex presentscodex/*under bare provider-native names, while both resolve through RouteKit's canonical catalog and managed account pool. - Made
@fusionkit/clia Fusion-only front door over live namespaced RouteKit model IDs. Removed Fusion forwarding surfaces for account/proxy management, install/uninstall, provider/model/key flags, and direct/single-model mode. - Reduced the PyPI
fusionkitdistribution to the internalfusionkit-sidecarcommand. The sidecar has no public chat/model routes or provider implementation; the separately installedfusionkit-evalsdistribution ownsfusionkit-bench. - Moved durable Fusion sessions, aggregate budgets, trajectories, and the public
Fusion front door to
@fusionkit/gateway; neutral per-call routing, provenance, and metering remain in@velum-labs/routekit-gateway. - Added clean-install and OOTB command-shape gates for both CLIs, explicit npm and PyPI release dependency order, complete package/binary/version metadata, and Trusted Publisher validation for both npm scopes and all FusionKit PyPI projects.
- Hardened
@fusionkit/cliobservability releases by asserting the staged Scope standalone server exists and survives the strict package/install smoke. - Made Anthropic thinking lossless through translated provider routes: adaptive/manual controls, signed and redacted blocks, streamed signature deltas, stop reasons, and server-tool continuations now round-trip without leaking thinking into answer text.
- Updated canonical docs, generated API/behavior references, package metadata, and testkit fixtures for the completed RouteKit/FusionKit boundary.
0.8.0 - 2026-06-29
- Added failover, durable sessions, unified configuration, and turnkey Cursor IDE support for fused harness runs.
- Switched
@fusionkit/*package publishing to npm OIDC trusted publishing with provenance.
0.7.4 - 2026-06-25
- Emitted per-candidate observability trace events from tool harnesses.
0.7.3 - 2026-06-24
- Reconstructed trajectories for Cursor-backed fusion panel runs.
- Removed unused candidate-summary diff artifact plumbing from the ensemble package.
0.7.2 - 2026-06-23
- Reconstructed trajectories from streamed SSE response bodies so streamed panel runs keep their evidence.
0.7.1 - 2026-06-23
- Preserved failed panel candidates in fusion results instead of silently dropping them.
- Corrected stale
trajectory:stependpoint labels and comments totrajectories:fuse.
0.7.0 - 2026-06-23
- Adopted
@velum-labs/model-fusion-protocol0.5.0 with OpenAI Responses item support. - Released the matching PyPI
fusionkit0.7.0 package set.
0.6.0 - 2026-06-23
- Adopted
@velum-labs/model-fusion-protocol0.4.0 and the matching PyPIfusionkit0.6.0 package set. - Pointed the gateway and ensemble packages at the unified fuse endpoint.
0.5.4 - 2026-06-22
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
0.5.3 - 2026-06-22
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
0.5.2 - 2026-06-22
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
0.5.1 - 2026-06-22
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
0.5.0 - 2026-06-22
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
0.4.1 - 2026-06-22
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
0.4.0 - 2026-06-22
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
0.3.0 - 2026-06-22
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
0.2.0 - 2026-06-22
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
0.1.8 - 2026-06-21
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
0.1.7 - 2026-06-21
- Release cut via the cross-repo coordinator (
scripts/release.mjs).
Older entries are preserved as historical release-coordinator cuts. See docs/releasing.md for the plan/apply workflow.