fusionkit

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 / --local overrides. 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 private 0600 files 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_content and reasoning were 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_routekit message 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 reports reasoning_tokens and cached_tokens instead 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 400 rather than degrading silently: previous_response_id on 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/models mirror 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 answered messages.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 from codex/gpt-5.6-sol to claude-code/claude-fable-5, because the Responses path accepts turns that the Anthropic path rejects.

    OpenAI image_url parts now translate into Anthropic image blocks, covering both base64 data URLs and http(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/403 on 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 status reporting every enrolled account as relay unavailable or cooling while 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 status was 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_open for both stored tokens on every endpoint, while the same account's token from a freshly logged-in CLI answered 200. An OAuth refresh with the stored refresh token fixed both accounts immediately.

0.9.8 - 2026-07-25

  • The /v1/cursor models mirror now namespaces every advertised id under routekit/ (for example routekit/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 strips routekit/ and still accepts the legacy 0.9.6 dashed spelling for one release. routekit cursor instructions print the namespaced name. Manual modelAliases entries are no longer required for Cursor BYOK.

    Established from Cursor's own byokModelUtils.js and pinned against a permissive probe: probe-plain-1, claudex-9, Claude-zzz-9, and velum-claude-fable-5 reached the endpoint, while claude-zzz-9 and gemini-zzz-9 were 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 modelAliases to the router config so a namespaced model can also be served under a second, freely chosen name, for example velum-fable-5: claude-code/claude-fable-5. Any name without / that does not collide with a served model id is accepted. Prefer the automatic routekit/ Cursor namespace over hand-written aliases for BYOK.

  • Fixed the /v1/cursor models mirror to respell every / in a model id, so OpenRouter's three-segment ids produce usable dashed aliases. Superseded by the automatic routekit/ namespace.

0.9.6 - 2026-07-24

  • The gateway's /v1/cursor routes now accept and advertise dash-separated model aliases (for example claude-code-claude-fable-5). The original claim that Cursor rejects / was wrong; the real constraint is the claude- / gemini- prefix rule. Legacy dashed spelling remains accepted on ingress for one release after the routekit/ 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 none requests 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 none reasoning 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 /model picker dropping non-Codex (e.g. Anthropic) gateway models: every launcher catalog entry now serializes the supported_reasoning_levels field 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 stock base_instructions prompt 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 /model switch, 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_HOME for 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/routekit and @velum-labs/routekit-* packages and the independent routekit CLI. 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 login for 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 presents codex/* under bare provider-native names, while both resolve through RouteKit's canonical catalog and managed account pool.
  • Made @fusionkit/cli a 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 fusionkit distribution to the internal fusionkit-sidecar command. The sidecar has no public chat/model routes or provider implementation; the separately installed fusionkit-evals distribution owns fusionkit-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/cli observability 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:step endpoint labels and comments to trajectories:fuse.

0.7.0 - 2026-06-23

  • Adopted @velum-labs/model-fusion-protocol 0.5.0 with OpenAI Responses item support.
  • Released the matching PyPI fusionkit 0.7.0 package set.

0.6.0 - 2026-06-23

  • Adopted @velum-labs/model-fusion-protocol 0.4.0 and the matching PyPI fusionkit 0.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.