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_foundandmodel_not_founderrors for unavailable explicit targets while keeping a true no-route failure distinct as502 routing_error - added support for
max_completion_tokenswhile 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/responseswith bounded local retrieve, delete, and input-item lifecycle behavior, including204 No Contentdeletion; 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_messagesincompleteness tofinish_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: trueChat-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
200for 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 monotonicsequence_numberon 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_kto 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-Afterdelays - 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_cancelledoutcomes 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: falsefor 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
autotool choice as potentially tool-calling for routing and complexity scoring - allowed only an explicit
tool_choice: noneto 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_keyandgeneral.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_keyanddata_sharing.backend_urlconfiguration
Responses and remote control compatibility¶
- authenticated Dashboard sandbox loopback calls when inbound API-key security is enabled
- preserved explicit
store: falsethrough 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.completedevents 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_PATHsupport and automatic fallback from an unwritable/usr/local/binto$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, andtop_k - forwarded those inference parameters into observability payloads when
data_sharingis 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-Retryhandling - improved worker shutdown behavior
- updated
circuit_breaker_statemetrics - expanded test coverage
v0.2.0¶
Released 2026-03-27.
Responses API milestone¶
- added the first public
/v1/responsessupport - 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
Related pages¶
- Start with Quickstart if you want the current shortest path to a working gateway.
- Read Architecture if you want the system model behind the features listed here.
- Open Configuration overview if a release note mentions a knob you now want to enable in YAML.