What’s New
New features, improvements and fixes to the SovereignEG platform, newest first.
Retry shortly instead of out of credit
A chat completion naming its model that is held up only by your organization's own requests still running now gets 429 inflight_busy with Retry-After: 10 instead of a 402 that read as out of credit, with stream: false too: a streaming request after waiting up to about 25 seconds for them, a non-streaming one at once or after up to about 10. Retry it, as the OpenAI SDKs do by themselves. There a 402 still means the credit is missing even with nothing running. A model: "auto" request can get either: the 402 when what the running requests leave is too little for its classification step or for every model in its auto pool, the 429 when the chosen model's gate refuses it. Embeddings, images and decision models still answer that case with a 402; its message counts the credit held by requests still running (with paying from the balance on, daily_allowance_exhausted says the allowance is used up instead), and a retry once they finish can succeed. A stream refused before its first token because its long prompt reaches a long-prompt rate your credit can't pay (on Claude, for example) is now billed for that prompt, which the provider has already read, only with a 402, never with a 429, and never for more than your credit, or your spend cap, still had room for. If the credit still can't pay it, the same prompt sent again within 10 minutes is refused before it reaches the provider.
gpt-6 with max_tokens and tools, and system messages on our own models
Requests to gpt-6 and later GPT models served by OpenAI no longer fail on max_tokens: it is sent as max_completion_tokens, the way OpenAI asks for these models, and temperature, top_p and the penalties, which they do not accept, are left out, as for GPT-5. On gpt-5.6, gpt-6 and later chat models (not gpt-6-astra, the -pro or the chat-latest models), a request with function tools and a reasoning_effort other than none is sent to OpenAI with reasoning_effort: none, the only value OpenAI takes together with function tools on chat completions, instead of failing with a 400, and the X-Mapped-Params response header says so. On the sovereign models on our own GPUs (for example SovereignEG/Qwen3.8-27B-FP8), a second system message, or one later in the conversation, no longer fails with a 400: the system messages at the start are sent as one, and a later one is sent in its place as a user message that starts with [system].
Key and project spend caps are hard limits
A monthly spend cap on an API key or a project used to stop new requests only: requests already running when the cap was reached finished and were billed in full, so spend could end above the cap. Spend now never goes above a cap you set. A request the cap can only partly pay for is served with max_tokens lowered to what the cap has left (X-Output-Clamped), a stream that reaches the cap ends cleanly with stop_reason: spend_cap_reached, and nothing is billed past it. If the cap cannot be checked for a moment, a request on a capped key or project gets 503 spend_cap_unavailable with Retry-After: 5.
Claude thinking settings now apply after a failover to OpenRouter too
When Anthropic is overloaded or failing, a Claude request can be served by OpenRouter. OpenRouter now gets the same thinking settings as Anthropic: none switches thinking off on the models that can stop thinking, so a small max_tokens goes to the answer, and minimal to xhigh think at that effort. With no reasoning_effort nothing is sent, as on Anthropic, and Claude 5.x models think at their own default. Sonnet 5.5 cannot stop thinking on OpenRouter, so it thinks at the lowest effort, reported as X-Mapped-Params: reasoning_effort=low. On Claude 4.x and older models reasoning_effort is now removed there too (X-Dropped-Params), as when Anthropic serves the request. If OpenRouter refuses the thinking setting, the request is sent to it once more with reasoning_effort as sent.
temperature no longer fails requests to Claude Opus 4.7 and later
Claude Opus 4.7 and later Claude models (Opus 4.8, Opus 5 and 5.5, Sonnet 5 and 5.5, Haiku 5.5, Fable) accept only their default sampling, so a request that set temperature to anything but 1, or set top_p, got a 400 from Anthropic ("`temperature` is deprecated for this model."). While Anthropic serves these models, the gateway now leaves temperature and top_p out of the request, the model samples at its defaults, and the X-Dropped-Params response header names what was left out. Claude Opus 4.6, Sonnet 4.6, Haiku 4.5 and older models still receive the value you set.
A streaming request on a low balance is served instead of refused
A streaming request your credit could not fund to 512 output tokens used to get 402 insufficient_balance, while the same request with stream: false was served. It is now served the same way, with max_tokens lowered to what your credit buys (X-Output-Clamped). On models that reason before they answer where you cannot see it (Claude, OpenAI GPT-5 and o-series, Gemini thinking models, Grok) the cap is never lowered below 1,024 output tokens, because the hidden reasoning could use it all up and leave an empty answer. A request held up only by your organization's other running requests now waits up to about 25 seconds for them, key and project spend caps included, before 429 inflight_busy. A few models measured ignoring max_tokens now end with stop_reason: cap_exceeded, and output past max_tokens is not billed.
reasoning_effort now controls Claude thinking
On Claude models served directly by Anthropic, reasoning_effort now sets thinking: none turns it off on the models that can stop thinking (Haiku 5.5, Sonnet 5.5, Sonnet 5, Opus 5), and minimal to xhigh think at that effort. Opus 5.5 and the Fable models cannot stop thinking, so they think at the lowest effort, reported as X-Mapped-Params: reasoning_effort=low. Thinking counts toward max_tokens and is billed as output, including thinking that is not shown, and Claude models newer than the gateway's table think by default with the thinking hidden.
reasoning_effort high is accepted on the sovereign Qwen3.8 model
SovereignEG/Qwen3.8-27B-FP8 runs on our own GPUs, and its chat template accepts only low, medium and xhigh for reasoning_effort, so a request that sent high (or minimal) returned the engine 400. The gateway now maps the value to the nearest one the model accepts (high becomes xhigh, minimal becomes low) and names it in the X-Mapped-Params response header, the same adjustment it already made for OpenAI reasoning models. none still goes through unchanged and turns reasoning off.
A streaming request that fails before the stream starts returns a real HTTP error
A stream: true request that failed before the stream started (a provider rejecting the request, no healthy backend, an empty response) used to return 200 OK with the error inside the stream, so SDKs and agent frameworks read it as success and then failed on the error event. It now returns the same HTTP status and JSON error body as a non-streaming request, and the OpenAI SDKs raise it from the create call. A provider that reports an error as its first stream event is treated the same way, and a retriable one is retried on another backing. Errors after the stream has started still arrive inside the stream. The X-Dropped-Params / X-Mapped-Params headers on a stream now describe the backing that served it, as they already did on non-streaming responses.
reasoning_effort no longer fails on models that do not reason
Requests that set reasoning_effort on a model without reasoning (the gpt-4o and gpt-4.1 families) used to return the provider 400. The gateway now drops the field there, and maps a value a reasoning model does not accept (none on gpt-5-mini or o4-mini) to the nearest one it does. The adjustment is named in the X-Dropped-Params / X-Mapped-Params response headers (on a streaming response, for the primary backing of the model), so agent frameworks that always send the field (Hermes Agent among them) work on these models unchanged.
Contact & sovereign waitlist forms
Marketing CTAs (Contact us / Join sovereign waitlist) now open a structured form. Submissions are saved and acknowledged by our team.
Docs accuracy pass
Replaced placeholder model IDs in the docs with IDs from the live catalog. Removed the JAIS page from public docs. Production base URL is no longer rewritten to localhost in code samples.
Open weights vs Proprietary metadata
Provider and per-backing weights-type metadata is now resolved and surfaced in the public catalog, dashboard model list, and model detail page. The signal answers "can these weights be self-hosted?" — not a software-license claim.
Catalog filtering refresh
Replaced the confusing "minimum context window" slider with discrete context buckets (8K+ / 32K+ / 128K+). Public marketing pages now force dark mode for a consistent first paint.
Playground: conversation history
Added a "last N messages" history control to the playground so multi-turn context is actually sent with each request.
Provider control plane
Operator-facing provider catalog with per-provider sync attempts, credential rotation, smoke tests, and EGP-sell / upstream-USD-cost attribution on usage events.
Instant API key revocation
Revoke an API key from the dashboard and it stops working on the next request. Our team can also disable a user or suspend an organisation immediately when an account has to be stopped.