AISIX 0.8.1
This is a maintenance release.
Release date: August 7, 2026
This is a maintenance release. It corrects how the gateway decides that an upstream speaks the Anthropic protocol, so a model pointed at a self-managed Anthropic endpoint is served on the whole /v1/messages family with its request body passed through unchanged. It also gives authentication denials enough context to investigate, carries tool grants through an MCP server rename, and fixes several control-plane admission paths that had no workable request shape or no actionable error.
Behavior Changes
- Enabling
auto_prompt_cachingnow requires a model whose provider key speaks the Anthropic protocol, eitherprovider: anthropicor a BYO key whose adapter is Anthropic. The setting is implemented by injecting Anthropiccache_controlmarkers, so on any other upstream it was stored but never took effect, and nothing told the operator that their prompt caching was off. Enabling it elsewhere now returns400. Disabling remains valid on every provider, so a model configured before this release can still be cleaned up, and a key whose adapter cannot be determined is allowed rather than rejected on a guess. See Prompt Caching. - A model configured as
provider: byowith the Anthropic adapter is now served on/v1/messagesby passing its request body through unchanged, instead of re-encoding it through the cross-provider bridge. Acache_controlmarker set by the client reaches the upstream as written; it was previously dropped, or rewritten to the model's configured TTL whenauto_prompt_cachingwas enabled. This also changes which upstream cache-write price applies, since a one-hour write costs twice the base input price and a five-minute write costs 1.25 times. Authentication is unchanged.
Improvements
- Authentication denials now carry the request context needed to act on them: the caller address resolved through the trusted-proxy configuration, the HTTP method and path, and the request id. Denials for a disabled or expired key also carry the key id. A
401is refused before any handler runs and therefore never reaches the access log, which left the denial counter as the only record and it cannot say who, when, or against which route. Log levels are unchanged, so scanner traffic stays at debug and the default-level output is exactly as before. See Metrics and Logs. - The AISIX Cloud Admin API reference now describes provider request headers and conditional rate-limit counter semantics correctly. It previously said that changing a policy's
conditionsresets the current windows; counter keys are built from the policy id and the selectedgroup_byvalues, so changing onlyconditionsorlimitspreserves existing keys and their counts, while changing the grouping dimensions moves requests to different keys.
Fixes
/v1/messages/count_tokensnow serves a model whose provider key speaks Anthropic through an adapter rather than by vendor id. Aprovider: byomodel pointed at an Anthropic-protocol endpoint was rejected with400on this endpoint while the sibling/v1/messagesserved it normally.- Renaming an MCP server now carries the tool grants with it. Tool names are
<server>__<tool>, so every grant references the server by name; the per-key rate limit entries already followed a rename but the access control did not, which silently revoked access to the whole server and made its tools disappear fromtools/listwith no explanation. The caller key'sallowed_toolsandmcp_access, and the environment- and team-level access policies, are all rewritten. Wildcards that match a shape rather than one server, such as a bare*, are left alone. See MCP Access Control. - Provider keys for Amazon Bedrock and Google Vertex can now be created by supplying
configalone. Their credentials do not fit in a singleapi_keystring, butapi_keywas required by the schema and a non-empty value was rejected by the handler, so the only accepted request was an empty string that no documentation mentioned. A request missing its credential now names the field that provider actually accepts. See Provider Keys. PATCHwith"tls": nullnow clears a provider key's TLS settings, matching howrate_limitand the other optional blocks behave. It previously returned400and the setting could only be cleared with an empty object.- The usage feed and its CSV export now include
audio_duration_seconds. A transcription priced by duration showed a cost whose basis could not be read back from the API. The field is omitted for requests that carry no audio. See Audio. - The offline package no longer lets two installations become one. The Compose project name came from the directory the package was unpacked into, so unpacking a second copy elsewhere and running
run.shtook over the running installation, rebuilding its containers against the second copy's configuration while keeping the original data volume. The project name is now fixed to the package, and starting it while another directory holds the same stack is refused with both paths and the ways forward. Upgrading in place is unaffected, and a second independent installation can still be started with an explicitCOMPOSE_PROJECT_NAME. See On-Premises Quickstart. - The Dashboard container in the offline package now has a writable Next.js cache directory, matching the Helm chart.
- Trusted-proxy CIDRs and the User-Agent client-type rules can now be set from the environment.
proxy.real_ip.trusted_proxiesandobservability.metrics.client_type_rulescould only be supplied in a configuration file; setting either through itsAISIX_*variable failed to start the gateway. Deployments configured purely through environment variables — the Helm chart and the Dashboard'sdocker runsnippet — therefore could not declare their load balancer as a trusted proxy, so every request appeared to come from it. See Metrics and Logs. - Two admission errors now say what to change. A
weighton a target in a group that is notweightednames the field and the strategy instead of reporting a generic invalid-fields error, and an unrecognizedprovidernames the rejected value and explains that the catalog route needs a Dashboard session rather than an admin token. - The Dashboard now lets one API key allow several model groups. Checking one group greyed out the rest, so a key could only ever reference one, although the API always accepted a longer list and the edit dialog never enforced the limit. The two dialogs now share one picker, which also fixes model groups, ensembles, embedding models, and semantic routers rendering with an empty arrow in the edit dialog.