Skip to content

Changelog

Release notes

This changelog is curated from the Git history of the `gateway/` repository and grouped into human-readable release notes.

How to read this page:

  • released version sections follow Git tags from newest to oldest
  • an unreleased section tracks the next planned release before its tag exists
  • dates below match the tagged release date in the gateway/ repository

v0.4.0

Released 2026-09-04.

API compatibility and error handling

  • preserved complete native OpenAI-compatible request and response envelopes for Chat Completions, Responses, and Embeddings, including additive fields that LunarGate does not need to interpret
  • added field-specific compatibility errors and fail-closed validation whenever a request must be translated to a provider contract that cannot represent one of its controls
  • preserved upstream OpenAI-compatible error envelopes, status codes, request IDs, rate-limit headers, and the final retry or fallback failure without forwarding cookies or hop-by-hop transport headers
  • returned stable pre-upstream provider_not_found and model_not_found errors for unavailable explicit targets while keeping a true no-route failure distinct as 502 routing_error
  • added support for max_completion_tokens while rejecting ambiguous or lossy combinations instead of silently choosing one
  • preserved JSON integer precision through translated tool schemas, tool inputs, and exact-match cache keys
  • rejected request bodies containing a second JSON document

Responses and Conversations

  • expanded /v1/responses with bounded local retrieve, delete, and input-item lifecycle behavior, including 204 No Content deletion; local cancellation is explicitly unsupported because local snapshots are terminal
  • added native proxying for Responses lifecycle, cancellation, compaction, and input-token operations behind explicit provider capabilities
  • added local Conversations CRUD and item APIs, plus native Conversations proxying with provider-owner bindings
  • pinned native objects to the provider account that created them and rejected stale bindings after credentials, organization, or base URL changes
  • kept colliding upstream object IDs fail-closed with provider_binding_conflict, explicit-provider recovery, and conflict tombstones that concurrent cleanup cannot erase
  • discarded orphaned local Responses snapshots when their bounded owner binding was no longer available, preventing continuation on a different provider
  • preserved native continuation IDs, Conversations associations, cancellation state, incomplete terminal states, refusals, strict function schemas, and hosted-tool capability checks
  • treated resource, cursor, and tool-correlation IDs as exact opaque values, rejecting surrounding whitespace while preserving significant internal whitespace
  • preserved significant whitespace, newlines, indentation, and protocol-native refusals through Chat/Responses translation, and mapped max_messages incompleteness to finish_reason: length
  • replayed every retained output item during local Responses continuation, including reasoning, computer/program/tool items and their additive fields instead of reducing history to messages and function calls
  • rejected translated continuation history containing incomplete or unknown message, function-call, or function-output lifecycle status instead of replaying a lossy partial item
  • pinned a native Conversation association to its owner provider and the Responses upstream protocol while preserving the current request's route and model selection
  • made Responses creation single-attempt and single-target so a retry cannot create duplicate stateful objects
  • bounded local response, conversation, owner-binding, streaming, and WebSocket state with documented TTL, entry, item, and byte limits

Stored Chat Completions

  • added native list, retrieve, metadata update, delete, and message-list routes for stored Chat Completions
  • made stored lifecycle support opt-in per OpenAI-compatible provider with capabilities.chat_completions_lifecycle
  • retained a bounded provider-account binding only after a successful store: true Chat-to-Chat request, including completed streams
  • required exact upstream stored Chat object kinds and one unchanged opaque ID before retaining that provider-account binding
  • disabled replay and fallback for stored Chat creation and kept follow-up lifecycle calls pinned to the creating account

Streaming reliability

  • made Chat-to-Responses streaming stateful enough to preserve text, reasoning, tool-call deltas, terminal status, and usage
  • parsed complete SSE records, normalized named events, and required a valid terminal event instead of treating an interrupted upstream as success
  • delayed downstream success headers until the first complete provider record and returned a regular JSON error when a stream failed before it became usable
  • emitted exactly one protocol-correct failure terminal when an OpenAI, Anthropic, or Ollama stream broke after delivery had started
  • preserved streamed usage trailers and cache-token categories while saturating malformed negative or overflowing counters
  • propagated downstream write and flush failures and committed terminal state only after the terminal event was written successfully
  • bounded upstream SSE and NDJSON records, upstream error bodies, Responses translation state, and WebSocket continuation state
  • rejected duplicate terminal events and oversized generated Responses frames without retaining a false completed state
  • required exact HTTP 200 for native Responses SSE, bounded leading empty/comment preflight frames, rejected invalid lifecycle SSE responses before exposure, and stopped reading immediately after the first valid terminal
  • locked native Responses SSE and WebSocket streams to their first observed response ID, required IDs on creation and terminal events, and rejected any later identity change before it could be forwarded or retained
  • emitted complete stable generated Responses envelopes without a synthetic top-level output_text, preserved detailed cache-write and reasoning usage, and enforced monotonic sequence_number on every generated or accepted native event

Provider compatibility

  • preserved Anthropic developer instructions, tool results, empty tool inputs, terminal semantics, cache-token usage, and supported structured-output and reasoning controls
  • rejected unsupported Anthropic message parts, malformed image references, lossy partial refusals, and unsupported reasoning modes
  • preserved Ollama sampling controls, response formats, inline images, tool history, and streamed tool calls while rejecting controls Ollama cannot represent faithfully
  • refreshed the built-in OpenAI and Anthropic model catalogs and default examples
  • stopped forwarding unsupported top_k to OpenAI-compatible Chat Completions and Responses endpoints while retaining it for providers such as Ollama
  • made literal <think>...</think> extraction an explicit response-side provider opt-in instead of enabling it implicitly for compatibility profiles

Routing and resilience

  • validated every fallback target against the effective request contract and skipped targets that would lose requested behavior
  • rejected providers that do not implement the Embeddings API before retry or circuit-breaker execution, and removed such providers from Embeddings fallback chains
  • pinned explicit provider/model targets and each fallback's concrete model instead of reusing the primary target's model
  • isolated circuit-breaker state by effective provider account, endpoint, organization, API version, and credentials instead of sharing it between unrelated accounts with the same provider name
  • kept arbitrary custom match headers inside routing only, while observability continues to export a fixed, documented allowlist of request metadata
  • preserved first-match route policy and made bare or unavailable model selections fail closed
  • classified request, provider, timeout, and stream failures consistently and honored bounded Retry-After delays
  • applied provider timeouts to the whole upstream attempt, including connection setup, TLS, request upload, response headers, and either the first response-body byte or full body according to timeout mode
  • preserved client cancellation and client deadlines as terminal 499 client_cancelled outcomes without retry, fallback, or circuit-breaker failure accounting
  • reported retries, fallback targets, and final failures consistently in response metadata and observability
  • limited rate-limit identities to authenticated credentials or the captured socket peer instead of trusting spoofable forwarding headers

Resource and credential safety

  • disabled HTTP redirects for provider calls, model discovery, update checks, Dashboard collection, and remote-control sandbox calls so credentials are never replayed to a redirect target
  • bounded provider and model-discovery response bodies, collector queue bytes, remote-control message sizes, sandbox output, and concurrent sandbox workers
  • enforced WebSocket origin, authentication, per-message rate-limit, state, and buffering policies
  • bounded dynamic Prometheus labels while retaining the raw serving model in request metadata

Update availability

  • added a default-on, non-blocking release check against get.lunargate.ai/latest
  • limited the request payload to the running gateway version and CPU architecture
  • added update_check.enabled: false for installations that do not want outbound update checks
  • prevented redirects from forwarding the update-check payload to another host

Cache correctness

  • changed exact-match response caching to key on the complete normalized request instead of a hand-picked subset (#2)
  • prevented collisions between requests that differ in response format, stop sequences, penalties, seed, reasoning effort, continuation state, or other accepted request fields
  • added independent per-entry and total-byte limits, exact overwrite/expiry accounting, and repeated eviction until both byte and entry-count bounds are satisfied
  • returned isolated response clones from cache so caller or downstream mutation cannot change a retained value
  • added broad regression coverage for every current unified-request field, deterministic map serialization, legacy request normalization, and nil input
  • bypassed response caching for stored Chat requests and prevented replay of state-changing requests
  • included the effective target model in cache lookup and storage keys, so a successful fallback model cannot poison the primary model's cache entry

Tool-aware routing

  • treated a supplied tools catalog with an omitted or auto tool choice as potentially tool-calling for routing and complexity scoring
  • allowed only an explicit tool_choice: none to opt a new request out of tool-capable routing, while keeping tool-call and tool-result continuations on a tool-capable model

Gateway identity and hot reload

  • centralized the Dashboard API key and backend URL under top-level general.api_key and general.backend_url
  • applied shared identity changes to both observability and remote control during hot reload
  • built provider, routing, and model-selection changes as one coherent runtime generation, published it atomically, and kept the previous generation active when replacement construction failed
  • pinned each HTTP request and Responses WebSocket connection to one runtime generation so in-flight work cannot mix old credentials with new routing or translator state
  • rotated process-local cache namespaces for changed provider definitions so a late write from an old in-flight request cannot poison the new provider generation
  • preserved cache entries, rate-limit buckets, provider clients, and model snapshots when a reload did not change their effective configuration
  • retained compatibility with legacy data_sharing.api_key and data_sharing.backend_url configuration

Responses and remote control compatibility

  • authenticated Dashboard sandbox loopback calls when inbound API-key security is enabled
  • preserved explicit store: false through Responses API translation to OpenAI
  • kept explicitly associated local and native Conversation mutation independent of whether the Response object uses store: false
  • retained token usage from streamed upstream response.completed events in downstream Responses events and observability
  • separated client and upstream API request types throughout remote control, analytics, and Dashboard replay
  • stopped reconnect cleanup from leaving a stale remote-control state behind

Observability and pricing

  • recorded cache hits, the actual fallback provider/model, and the last failed target consistently
  • attributed Embeddings HTTP and parse failures to the fallback provider and model that made the final attempt, including collector tags and error metrics
  • added prompt-cache read and write token categories for OpenAI and Anthropic, including Anthropic 5-minute and 1-hour cache-write pricing
  • clamped invalid negative usage and cost inputs and refreshed confirmed model pricing
  • kept metric-only errors out of request-log error fields and bounded collector memory independently of queue length

Linux installer

  • added explicit INSTALL_PATH support and automatic fallback from an unwritable /usr/local/bin to $HOME/.local/bin (#1)
  • fixed fallback diagnostics so the resolved destination remains a valid filesystem path
  • documented install, update, and uninstall commands for restricted environments

v0.3.1

Released 2026-04-12.

Configurable inference parameters

  • added config support to override temperature, top_p, and top_k
  • forwarded those inference parameters into observability payloads when data_sharing is enabled

Ollama tool-streaming fix

  • re-enabled Ollama streaming in requests that include tools

v0.3.0

Released 2026-04-10.

Inbound security

  • introduced inbound security v1 for protecting /v1/* access at the gateway edge

Better failure visibility

  • improved upstream error visibility to make provider failures easier to diagnose

v0.2.4

Released 2026-04-10.

Provider and protocol updates

  • added DeepSeek support through the OpenAI-compatible provider path
  • added WebSocket support for the Responses endpoint

Ollama reliability

  • fixed Ollama-specific request handling issues
  • improved Ollama debug logging

v0.2.3

Released 2026-04-09.

Timeout controls

  • added upstream timeout control with both total-time and time-to-first-token behavior

Docs refresh

  • refreshed README content and example comments

v0.2.2

Released 2026-04-08.

Responses API fix

  • fixed Responses API handling so response IDs are forwarded correctly

v0.2.1

Released 2026-04-08.

Gateway identity simplification

  • removed the need to configure a separate gateway_id
  • switched gateway identification to API-key-based identity only

Hot-reload and runtime cleanup

  • fixed config hot-reload behavior and cleaned up runtime config handling
  • removed the model catalog path and tightened related internals

Resilience and observability

  • finished X-LunarGate-No-Retry handling
  • improved worker shutdown behavior
  • updated circuit_breaker_state metrics
  • expanded test coverage

v0.2.0

Released 2026-03-27.

Responses API milestone

  • added the first public /v1/responses support
  • refactored the Responses pipeline after the first implementation pass
  • improved upstream translation for Responses requests
  • restored routing compatibility for /v1/responses
  • hardened stream and non-stream adapter behavior

Project baseline cleanup

  • refreshed the README and license packaging around the release

v0.1.0

Released 2026-03-25.

Embeddings support

  • added support for embeddings requests

Docs refresh

  • updated the README for the first post-bootstrap release

v0.0.x foundation releases

Released between 2026-03-16 and 2026-03-19.

These early tags established the initial runtime and release pipeline:

  • initial gateway version landed
  • added environment-variable expansion inside YAML config
  • introduced multi-architecture builds and releases
  • fixed release version display
  • fixed token counting in the OpenAI provider path
  1. Start with Quickstart if you want the current shortest path to a working gateway.
  2. Read Architecture if you want the system model behind the features listed here.
  3. Open Configuration overview if a release note mentions a knob you now want to enable in YAML.