发布说明
本页汇总 AISIX 网关、控制面、控制台和部署包中面向用户的变更,按版本从新到旧排列。
如果一次升级跳过了若干版本,其间每个版本的升级说明依然适用。请按从旧到新的顺序阅读——从你当前版本的下一个版本开始,一直读到目标版本。支持的升级路径和升级顺序参见升级 AISIX。
发布产物包括 docker.io/api7/aisix 网关镜像、docker.io/api7/aisix-cp-* 下的控制面镜像、aisix-cp Helm Chart 和离线安装包。
1.7.0
发布日期: 2026 年 10 月 22 日
组织现在可以按部门、业务组或子公司归因成本:为 API Key、团队和成员设置标签后,每一行用量都会 带上请求解析出的标签。标签可用于预算、限流,以及新的组织级成本分析页面。定价新增组织币种(USD 或 CNY)、按输入长度分档的价格、模型组价格、模型组低峰折扣、按上游服务档位的价格,以及 1 小时缓存写入费率,Claude 模型默认按输入费率的 2 倍为其计费。网关提供两个决策端点 /v1/systemone 和 /v1/decisions,可由 TypeSafe、Microsoft Foundry、OpenRouter 和 OpenAI 提供服务。OTLP Span 现在遵循已发布的 OpenTelemetry GenAI 语义约定,OTLP、Datadog 和阿里云 SLS 导出器会携带包含推理和工具调用的结构化消息。每个导出器现在各自选择要记录的请求头和上游响应头。控制台的语言依次取浏览器内的选择、组织设置或浏览器语言,概览和用量页面改为从按小时汇总的数据加载。Amazon Bedrock 和 Vertex AI 上的 Claude 在 /v1/messages 和 /v1/messages/count_tokens 上原生提供服务,提示词缓存(包括 auto_prompt_caching)也在这些平台上生效。Bedrock 模型服务提供方凭证和 Bedrock 安全护栏可以使用 Bedrock API Key、AWS 默认凭证链或扮演的 IAM 角色进行认证。聊天请求中的图像、音频和文件现在会送达 Vertex Gemini、Anthropic、Vertex AI 上的 Claude 和 Bedrock,而不再被丢弃;经路由模型组的 /v1/responses 对话会留在产生其上下文的目标上。Bedrock 和 Realtime 流量现在遵循网关的代理环境变量,网关和控制面代调用方访问 URL 时由统一的 SSRF 防护设置管控。
行为变化
可观测性
- OTLP Span 遵循 OpenTelemetry GenAI 语义约定(v1.41.1)。 基于旧名称的已保存查询和看板必须更新:
gen_ai.system已移除,请改用gen_ai.provider.name(托管平台优先,因此 Bedrock 上的 Claude 为aws.bedrock)。gen_ai.request.model现在是发往上游的模型名。调用方发送的模型或模型组名称移到aisix.requested_model。- 对于 Anthropic 形态的用量(Anthropic、Bedrock Converse,以及上报
cache_*_input_tokens的透传路由),gen_ai.usage.input_tokens现在包含缓存 Token。OpenAI 形态的用量不变。Datadog 导出器的gen_ai.usage.input_tokens也有同样变化,其aisix.*计数不变。 - Span 名称变化:操作 Span 为
{operation} {上游模型}(例如chat gpt-4o),而不再是chat.completions;SERVER Span 为POST /v1/chat/completions等;MCP Span 为tools/call {tool}。 - 成功的 Span 不再设置状态,而不是设为
OK。4xx不再把 SERVER Span 标记为错误,调用方挂断(499)在任何 Span 上都不算错误。 - OTLP Span 上移除了
gen_ai.prompt/gen_ai.completion。设置content_mode: full时,内容以gen_ai.input.messages、gen_ai.output.messages、gen_ai.system_instructions和gen_ai.tool.definitions导出;不是消息列表、或被采集上限截断的内容仍放在aisix.content.prompt/aisix.content.response下。 aisix.client_source_ip/aisix.client_user_agent改为client.address/user_agent.original,它们与http.request.header.*一起移到 SERVER Span 上。- 只有尝试 Span 携带
gen_ai.operation.name/gen_ai.request.model,因此统计 GenAI Span 的追踪系统对每次尝试只计一次,而不是三次。 - 资源属性
service.name取observability.service_name(默认aisix),而不再是固定的aisix-dp。
- Datadog 和阿里云 SLS 导出器携带结构化内容(
content_mode: full)。 在 SLS 上,prompt被input_messages(存在时还有system_instructions和tool_definitions)取代,response被output_messages取代,每个都是 JSON 字符串。在 Datadog 上,gen_ai.prompt被gen_ai.input.messages(以及gen_ai.system_instructions和gen_ai.tool.definitions)取代,gen_ai.completion被gen_ai.output.messages取代。输出消息按顺序包含text、reasoning和tool_call部分,finish_reason使用约定中的取值(stop、length、tool_call、content_filter、error)。被截断或不是消息列表的一侧(Embeddings、图像、音频、任务、A2A、MCP)仍放在旧的扁平字段中并带有content_truncated,因此一条记录可能两种形态并存。对象存储导出器不变。 observability.usage_event.request_headers不再起作用。 请求头采集移到了各个导出器(见新功能)。仍设置该键的网关可以启动,会记录一条警告,并且在其导出器列出这些请求头之前不再记录它们。- 用量事件的
model_id只指向自己执行派发的模型。 对于在选定目标之前就失败的模型组(routing 或 semantic)或 ensemble(护栏拦截、预算、入口级限流、模型被禁止、语义解析失败),以及 routing 或 semantic 模型组的响应缓存命中,/v1/chat/completions和/v1/messages上的model_id现在为空,而不再是模型组的 ID;requested_model_id仍指向该模型组。直接模型在/v1/responses、/v1/embeddings及其他单次调用端点上派发前的失败,现在带有该模型自己的 ID,而不再为空。1.6.x 及更早版本的网关保持旧的上报方式。用量事件查询见 API 变化。 - 透传路由按其承载的协议计量用量。 被识别为 chat、Anthropic Messages、Responses、Completions、Embeddings、图像或 Rerank 的透传交换,会用该端点自己的用量解析器读取,并在 LLM 请求层(
aisix_llm_requests_total、aisix_llm_request_duration_seconds、aisix_llm_*Token 指标族以及首 Token 时间 / 端到端延迟)中只计一次,endpoint="/passthrough_route",model为请求体中的模型(未注册的名称归为unresolved)。不再读取未识别流上的用量对象。智能体后端的token_usage帧不再把缓存读取计两次。同时带有 Chat 和 Anthropic 信封的缓冲响应,现在会被失败即拦截的输出护栏拒绝。透传访问日志的total_tokens现在与类型化端点一样包含缓存 Token。 /v1/responses的用量事件携带finish_reason(stop、tool_calls、length、content_filter,失败或取消的响应为空),由调用方收到的结果推导。- 只要模型服务提供方发送了请求 ID,就会记录
provider_request_id。 失败的上游尝试、/v1/messages/count_tokens调用,以及响应本身没有 ID 的成功调用(Bedrock Converse 和 InvokeModel、Embeddings、音频、图像、Rerank),现在会在用量事件和访问日志中记录服务提供方的请求 ID 响应头(x-amzn-requestid、x-request-id、request-id、x-ms-request-id、apim-request-id、x-goog-request-id或cf-ray);响应对象自己的 ID 仍然优先。因此在失败的尝试上,它可能出现为 OTLP / Datadog 的gen_ai.response.id。每次重试的尝试都带有自己的 ID。此前为空的 Bedrock Converse 响应id现在是该请求 ID。失败请求的访问日志行会写出请求实际发往的服务提供方,而不再是unknown(在/v1/chat/completions上则是没有服务提供方);multipart 图像编辑和音频路由会写出请求的模型。 - 服务提供方拒绝请求形态时归类为
invalid_request_error。 网关无法为目标服务提供方转换请求,或下载的媒体使请求超过proxy.request_body_limit_bytes时,用量事件、访问日志和导出器(OTLPaisix.error_class、Datadog、SLS)记录的error_class/error_kind为invalid_request_error,而不再是invalid_config。调用方收到的错误不变。 - 所有上报
total_tokens的端点族都会记录它。 Embeddings、Rerank、音频转录与翻译、图像生成与编辑、Realtime、批次完成归因,以及按这些族计量的透传路由,其用量事件现在带有上游上报的total_tokens,此前为null。Realtime 会话和batch_completion事件记录各次上报总数之和;只要有一次计入 Token 的调用没有上报总数,该字段就为null。客户端响应、限流和 Prometheus 计数不变。
端点与模型服务提供方
-
图像、音频和文件会送达原生协议的上游。
/v1/chat/completions中的image_url、input_audio、file等媒体部分(以及转换为 chat 的/v1/messages//v1/responses中的媒体部分),现在会被转换为上游自己的媒体块,发往 Vertex Gemini、Anthropic、Vertex AI 上的 Claude 和 Bedrock(Claude InvokeModel 和 Converse),流式与非流式均适用;此前它们会被丢弃,调用方从一个根本没看到媒体的模型那里得到200。上游无法接收的媒体(例如发给 Claude 的音频)现在会返回400,并指出messages[i].content[j]。Anthropic(https://)和 Vertex Gemini(https:///gs://且媒体类型已知)仍直接接收 URL。其他http(s)媒体 URL 由网关下载后内联发送;其他协议或无法下载的 URL 返回400并指出该部分,消息中会去掉 URL 的查询字符串和片段。下载:- 拒绝解析到非公网地址的主机(回环、私有和 CGNAT 地址段、链路本地地址包括
169.254.169.254、IPv6 唯一本地地址等),每一跳重定向都会检查,除非该主机列在outbound.ssrf_protection.allowed_hosts中,或通过outbound.ssrf_protection.enabled: false关闭检查。检查开启时, 即使由代理承载下载,主机也必须能从网关解析; - 与其他上游调用一样经过
HTTP_PROXY/HTTPS_PROXY/ALL_PROXY/NO_PROXY,按upstream.tls(verify、ca_file)校验证书,并且从不转发调用方的请求头; - 每个 URL 的上限为
upstream.media_fetch.max_bytes(默认 50 MiB),与请求共享上游超时时间,并与请求体一起计入proxy.request_body_limit_bytes(超出时同样返回413 request_too_large)。
网关新增的静态配置
upstream.media_fetch(enabled,默认true;max_bytes)控制下载。设置enabled: false时,发往无法自行读取 URL 的上游的 URL 部分返回400。地址检查由新增的顶层网关配置outbound.ssrf_protection负责(enabled,默认true;allowed_hosts,默认为空,取值为host、host:port或[v6]:port;环境变量为AISIX_OUTBOUND__SSRF_PROTECTION__ENABLED和AISIX_OUTBOUND__SSRF_PROTECTION__ALLOWED_HOSTS)。它管控网关代调用方访问的每一个由调用方提供的 URL,目前即这些媒体下载;运维人员配置的 URL 不受影响。两者都已在 1.7.0 的aisixHelm Chart values 中声明。使用兼容 OpenAI 端点的服务提供方仍和以前一样原样转发媒体部分。 - 拒绝解析到非公网地址的主机(回环、私有和 CGNAT 地址段、链路本地地址包括
-
上游的错误信息会送达调用方。 来自所有 Amazon Bedrock 操作、Azure OpenAI 和 Vertex AI 的错误,以及来自所有服务提供方的
5xx错误,现在携带上游自己的错误信息,而不再是固定的状态短语或upstream returned <status>。这些文本可能包含账号 ID、ARN、部署或项目 名称。没有错误信息的错误仍以其状态码命名。 -
Amazon Bedrock 和 Vertex AI 上的 Claude 原生应答
/v1/messages。 发往 Bedrock 上 Claude 模型(anthropic.模型 ID,带或不带区域或推理配置文件前缀,或指向它的 ARN)或 Vertex AI 上 Claude 模型(claude-*)的/v1/messages,会发往平台自己的 Anthropic Messages 路由(Bedrock InvokeModel / InvokeModelWithResponseStream,Vertex AI:rawPredict/:streamRawPredict),而不再经过转换,调用方收到的是平台的应答:带签名的思考和signature_delta、redacted_thinking、上游消息 ID、原生停止原因、带缓存计数的流式message_start用量,以及 Bedrock 在message_stop上的amazon-bedrock-invocationMetrics。metadata.user_id、context_management、tool_result中的图像以及受支持的anthropic-beta值现在会送达模型。Bedrock 在流中途抛出的异常会变成带 Anthropic 错误类型的 Anthropicerror事件(throttlingException→rate_limit_error等)。发往 Bedrock 的流式请求现在使用 InvokeModelWithResponseStream 而不是 ConverseStream,两者都需要bedrock:InvokeModelWithResponseStream权限。/v1/chat/completions和/v1/responses不变,Bedrock 应用推理配置文件 ARN 也不变,发往 4.5 之前 Claude 系列的结构化输出请求仍走转换路径。 -
发往 Amazon Bedrock 和 Vertex AI 上 Claude 的
anthropic-beta会按平台支持的值过滤。 在 Bedrock 上,beta 值总是放在请求体的anthropic_beta中发送,从不作为请求头发送,这包括来自服务提供方凭证default_headers的值, 以及forward_client_headers放行的请求头中的值;在 Vertex AI 上,它们仍留在请求头中。平台不支持的值会被丢弃,advanced-tool-use-2025-11-20会被重命名为tool-search-tool-2025-10-19。在发往 Bedrock 上 Claude 的/v1/chat/completions和/v1/responses上,请求体中不在该集合内的anthropic_beta值现在会被移除,而不再转发。在 Bedrock 上,interleaved-thinking-2025-05-14、claude-code-20250219、output-128k-2025-02-19、structured-outputs-2025-11-13、token-efficient-tools-2025-02-19、tool-examples-2025-10-29和thinking-token-count-2026-05-13会被转发,因此 Bedrock 上的 Claude 4.x 现在会在 Claude Code 的工具调用之间进行思考。在/v1/messages上,服务提供方凭证default_headers中的 beta 值会与调用方的值以及请求体隐含的 beta 值合并后再过滤;在/v1/chat/completions和/v1/responses上,default_headers与其他请求头一样优先于转发的值。 -
Amazon Bedrock 上的 GPT 5.6 及更新版本和 Grok 使用 Bedrock 的 Chat Completions 端点。 通过跨区域推理配置文件(
global.、us.等)访问的openai.gpt-5.6及更新版本(gpt-oss 除外)或xai.grok-*模型,会发往 Bedrock 兼容 OpenAI 的/openai/v1/chat/completions,而不是 Converse,并使用同一服务提供方凭证签名。AWS 在该端点上拒绝的参数会被丢弃,而不是导致失败(n、stop;Grok 上的惩罚参数和reasoning_effort: "none";GPT 推理时的temperature、top_p、惩罚参数和logprobs)。需要 Converse 专有功能的请求(Bedrock 安全护栏、性能或服务档位配置、top_k、既不是text、也不是带 schema 的json_schema的response_format、推理型 GPT 模型上的函数工具)仍走 Converse。远程图像 URL 会内联发送,按位置编号的工具调用 ID 会替换为唯一的call_…ID。 -
Bedrock Converse 请求按调用方发送的内容构造。 在所有 Bedrock 发布方上:同一角色的连续轮次会被合并(此前工具结果之后紧跟用户消息会被 Bedrock 拒绝);
stop转为stopSequences;max_completion_tokens优先于max_tokens;带 schema 的response_format会为所有发布方转为工具,包括此前忽略它的 Titan、AI21、gpt-oss 和未分类的发布方;reasoning_effort按发布方映射(gpt-oss 和 DeepSeek V3、GPT 5.x / 6、Nova 2,其中 low、medium、high 以外的取值返回400,其他发布方丢弃);top_k会送达 Claude 和 Nova;parallel_tool_calls会送达 Claude 4.5 及以上;guardrailConfig、performanceConfig、serviceTier和requestMetadata会进入请求,OpenAI 的service_tier会映射为serviceTier。不属于 Chat Completions 参数的顶层字段,现在会作为additionalModelRequestFields送达非 Claude 的 Converse 模型,而不再被丢弃。工具结果可以携带图像、文档和视频。没有工具可发送时,工具调用历史会以文本形式发送,而不再被拒绝。 -
Bedrock 错误与其他上游一样分类。 网关无法识别的 Bedrock 模型 ID 是不可重试的配置错误,因此模型组会在此停止,而不再故障转移到下一个目标。
ModelErrorException是可重试的上游错误(向调用方返回502),ModelTimeoutException是超时,上下文窗口溢出会带有code: context_length_exceeded。 -
Amazon Bedrock 调用遵循代理环境变量。 Bedrock 运行时调用、Bedrock 安全护栏和 STS 调用现在与其他所有上游一样,经过
HTTP_PROXY/HTTPS_PROXY/ALL_PROXY,除非NO_PROXY覆盖该主机;此前它们直接连接。发往 AWS 凭证端点(实例元数据、ECS 和 EKS Pod Identity、本地回环地址上的凭证代理、配置的元数据端点)的请求始终直连。 -
Realtime 会话遵循代理环境变量。
/v1/realtime现在通过HTTPS_PROXY连接wss://服务提供方(通过HTTP_PROXY连接ws://服务提供方),回退到ALL_PROXY,除非NO_PROXY覆盖该主机;此前它直接连接。不支持 SOCKS 代理:会话会以一个error帧和关闭代码1011失败(访问日志中为502)。 -
Realtime 会话会正常完成关闭。
/v1/realtime现在会完成 WebSocket 关闭握手。正常关闭的客户端会收到自己的关闭代码和原因,而不再是1006,上游也会收到客户端的代码和原因。上游关闭时,客户端会收到上游的代码和原因,原因不做脱敏、截断为 123 字节后转发。无法在 Close 帧中发送的关闭代码,在两个方向上都会变为1011。恰好为1002 "Protocol violation"的 Close 帧也会变为1011,因为网关无法把它与无效代码区分开;原因不同的1002会照常转发。除正常关闭(1000)外,任何结束之前都会先发送一个类型为server_error的 Realtimeerror事件,说明发生了什么:上游的关闭代码和原因、网关无法转发的 Close 帧、不带状态码的关闭、连接失败及其原因,或者没有 Close 帧就结束的连接。关闭过程中到达的用量仍会计入。访问日志状态不变。 -
Responses 对话会留在产生它的模型组目标上。 在经路由模型组的
/v1/responses上,携带加密推理(encrypted_content)或previous_response_id的后续轮次,会先发往产生它的目标,然后是同一服务提供方凭证上的其他目标,最后是其余目标。此前,当模型组的策略选中另一个部署或凭证时,它可能以400 invalid_encrypted_content或404失败。在其他目标上,推理条目会去掉加密内容后发送,并保留可读的摘要。为此,经路由模型组提供服务的响应,其响应id是一个不同于上游的resp_…值,非流式响应体和流式事件都是如此。客户端必须把收到的值原样发回。用量事件、访问日志和 OTLP 仍记录上游自己的响应 ID。直接模型不受影响。该行为始终开启。 -
聊天用量按上游上报的原样携带 Token 明细。 在
/v1/chat/completions的流式和非流式响应中,usage.prompt_tokens_details和usage.completion_tokens_details现在带有上游上报的每个计数及其值,上报为0的也包括在内。这些计数包括cached_tokens、reasoning_tokens、audio_tokens、image_tokens、text_tokens、accepted_prediction_tokens和rejected_prediction_tokens。上游没有上报的计数会省略,什么都没上报的明细对象也会省略。此前,为0的计数会被丢弃,所有计数都为0的 对象不会出现,text_tokens、image_tokens和预测计数从不转发。由响应缓存返回的响应仍只报告非零的cached_tokens和reasoning_tokens。用量事件、指标和计费不变。 -
流式聊天的用量在单独的分片中返回。 设置
stream_options.include_usage: true时,流式/v1/chat/completions现在会在结束分片之后以一个仅含用量的分片结束。它的choices为[],并且是唯一携带usage的分片,与 OpenAI 的发送方式一致。此前:- 来自 OpenAI 协议上游和 Bedrock Converse 时,该分片带有
[{"index":0,"delta":{}}]; - 来自 Anthropic、Vertex AI 上的 Claude 和 Vertex AI 上的 Gemini 时,没有这样的分片,
usage跟随在结束分片上,Gemini 还可能在更早的分片上报告累计数。
每个分片都读取
choices[0]、或从结束分片读取用量的客户端必须调整。不设置include_usage时没有任何变化:Anthropic 和 Vertex AI 的桥接仍在结束分片上报告用量,Bedrock Converse 仍不向客户端发送用量。用量事件和限流计量不变,提前结束的流也是如此。 - 来自 OpenAI 协议上游和 Bedrock Converse 时,该分片带有
-
上游以
stop结束的工具调用轮次报告为tool_calls。 在所有 OpenAI 协议上游(OpenAI、Azure OpenAI、兼容 OpenAI 的服务提供方、Vertex OpenAI 端点)上,至少发出一个工具调用且以stop结束的轮次,现在在/v1/chat/completions上报告为tool_calls,在/v1/messages上报告为tool_use,流式与非流式均适用。这也包括tool_choice指定函数时 OpenAI 自己的回复。其他结束原因原样传递。 -
Bedrock 聊天在所有模式下都返回推理内容。 流式 Bedrock 聊天现在会返回推理内容(
delta.reasoning_content、/v1/responses上的reasoning条目,以及在/v1/messages上发往非 Claude 发布方时不带签名的thinking块;/v1/messages上的 Claude 返回 Bedrock 自己的带签名思考,见上文),发往非 Anthropic 的 Bedrock 发布方的非流式聊天也是如此。 -
只含系统消息的请求。 发往任意 Bedrock 模型、只含 system 或 developer 消息的请求,现在会在
/v1/chat/completions、/v1/messages和/v1/responses上被网关以400 invalid_request_error拒绝,流式与非流式均适用,且不会向 Bedrock 发送任何内容。此前它会以500 config_error失败;对于发往 Bedrock 上 Claude 的非流式请求,则会到达 Bedrock 并以400返回,信息为upstream returned 400(在 chat 和 responses 上为upstream_error)。旧的500可重试,因此路由模型组会故障转移到下一个目标;新的400会结束故障转移链,即使模型组的fallback_on_statuses列出了400也是如此,该请求也不再计为健康检查失败。只含系统消息的 Vertex Gemini 请求现在会成功。 -
不带
tool_call_id的工具消息。 在 Anthropic、Bedrock/invoke和 Vertex Claude 桥接上,400信息不再带有invalid upstream configuration:前缀。Bedrock Converse 会把这样的消息作为工具结果转发,而不再静默丢弃。 -
响应中的
service_tier。 由 OpenAI 形态上游提供服务的/v1/chat/completions现在会把上游的service_tier传给客户端(此前会被丢弃)。桥接到非 Responses 上游的/v1/responses现在报告上游实际提供服务的档位,或"default",而不再回显调用方请求的档位。 -
ensemble 会为离开的调用方已产生的工作计费。 调用方放弃 ensemble 请求时,已经返回的 panel 成员和 judge 会在
499行之前记录为用量行,已应答成员的 Token 会计入 Key、团队和成员的 Token 限额。 -
失败的 ensemble 子调用有自己的用量行。 失败的 panel 成员或 judge 调用现在会记录一行零 Token 的用量(
attempt_kind为panel或judge,带有其模型、状态、error_class和error_message);此前不会留下任何记录。行按 panel 槽位编号,因此某个成员失败时,它之后的每一行(后面的成员、judge 以及失败请求的最终行)的attempt_index会按失败成员数依次后移。Token 总数、计费和请求数不变。
安全护栏
- 语义安全护栏把不可用的向量化响应报告为
semantic_embed_upstream。 当向量模型返回的向量与请求不符(长度错误、返回 base64 而不是浮点数、向量数少于输入数)时,失败即拦截的422信息、护栏命中记录、guardrail_bypassed_reason和aisix_guardrail_bypasses_total{reason}现在为semantic_embed_upstream,而不再是semantic_embed_unresolved;custom护栏脚本中的aisix.embed会抛出Upstream,而不再是Unresolved。 - 护栏日志行以
guardrail_name命名护栏。 每一条关于某个护栏的网关日志行都会在guardrail_name下携带其配置名称,它取代了row(以及掩码不一致警告中的member、无效配置警告中的name),不保留别名。在 Amazon Bedrock 护栏的日志行上,AWS 护栏标识记录为bedrock_guardrail_id,而不再是guardrail_id。所有端点上的「guardrail blocked …」警告现在也带有guardrail_name;语义护栏的向量化失败会写出护栏名称和向量模型的显示名称,而不再是guardrail="semantic"和模型 ID;在on_buffer_exceeded: fail_open下未经扫描就放行的流式输出现在会记录日志。基于row=或 Bedrock 日志行guardrail_id=的日志查询必须更新。用量事件、指标和 Span 不变。 - Amazon Bedrock 护栏的失败标签。 ApplyGuardrail 返回的非
429的4xx(AccessDeniedException、ValidationException、ResourceNotFoundException等),以及在调用前就缺失或被拒绝的凭证,现在标记为bedrock_config_error,而不再是bedrock_5xx;每个429都标记为bedrock_throttled。该标签出现在guardrail_bypassed_reason、aisix_guardrail_bypasses_total{reason}、aisix_guardrail_latency_seconds的error_type标签以及失败即拦截的拒绝信息中。5xx和传输失败仍为bedrock_5xx。
定价、用量与控制台
- Claude 的 1 小时提示词缓存写入按输入费率的 2 倍计费。 对于 Anthropic、Amazon Bedrock 和 Google Vertex AI 提供的 Claude 模型,有效期为 1 小时的缓存写入现在按当前生效输入费率的 2 倍计费,包括长上下文档位和服务档位。此前按缓存写入费率计费。组织价格可以在 Admin API 中设置
cache_write_1h_usd_per_1m,或在定价对话框的「1 小时缓存写入」字段中设置。它只作用于基础费率,长上下文档位和服务档位仍按各自输入费率的 2 倍计费。路由模型组价格、经 Azure AI Foundry 或转售商提供的 Claude,以及名称中不含claude的模型(例如 Bedrock 应用推理配置文件 ARN),1 小时写入仍按缓存写入费率计费。 - 目录价格包含 models.dev 的长上下文分档。 models.dev 条目带有上下文长度分档的模型(例如 Bedrock
global.openai.gpt-6-sol:272K 输入 Token 以内为 $2 / $10,以上为 $4 / $15),会在升级后的首次价格同步中把这些分档纳入目录价格。输入(含缓存读取和写入)超过某档阈值的请求,会整体按该档计费,因此费用比以前高,预算消耗更快。组织自己的价格不受影响。 - 响应缓存命中不计费。 每个
cache_status: hit的用量事件都按0计价,因此不再计入花费或预算。此前直接模型的缓存命中按模型的费率计价。回放的 Token 数和cache_hit_saved_*不变。 - 概览和用量数据由按小时汇总的数据计算。 时间窗口按完整的 UTC 小时读取,一个请求只在其首次尝试所在的小时计一次,延迟分位数为近似值,数据比实时用量滞后约 五秒。字段级细节见 API 变化。
- 定价页面默认打开「使用中」。 完整目录移到「目录」标签页。
- 预算告警 Webhook 携带
currency字段,位于固定载荷的末尾,模板中也可以通过{{ .currency }}使用。 - 对已不存在资源的引用显示为短 ID 和状态徽标(已删除、已移除或名称不可用),而不再显示完整 ID;完整 ID 在徽标的弹出框中。
- 不提供 chat 服务的模型服务提供方的模型不能作为 chat 目标。 见 API 变化。
部署
- 打开的 Realtime 会话会让排空中的网关等待。 关闭时,网关现在会像对待流一样,等待打开的
/v1/realtime会话关闭,以便记录其用量。请按最长的会话时长设置终止宽限期。 - 排空后期到达的请求只服务一次。 在排空结束之后、经由排空结束前已接受的连接到达的请求,现在会以
Connection: close应答,并且只向上游发送一次;此前它可能被发送两到三次(thread-per-core 模式),或在没有响应的情况下被关闭。已完成 TLS 握手但尚未发送请求的连接,现在会让排空一直等待,直到它发送请求、downstream.idle_timeout_secs到期或客户端关闭连接。
AISIX Enterprise:
- 控制面自身的出向调用使用统一的 SSRF 设置。
outbound.ssrf_protection(enabled;allowed_hosts:host、host:port或[v6]:port)现在管控 Playground 调用(包括语义路由测试和护栏试运行)、通知投递、MCPspec_url获取以及 Azure AI Content Safety 测试连接。未设置时跟随部署模式(On-Premises 上关闭)。环境变量为AISIX_CLOUD_SSRF_PROTECTION_ENABLED/AISIX_CLOUD_SSRF_PROTECTION_ALLOWED_HOSTS;Chart 中为api.outbound.ssrfProtection.enabled/.allowedHosts。无效的allowed_hosts条目会让 cp-api 无法启动。它取代了outbound.notify_allow_private_urls、outbound.playground_allow_private_ips、outbound.mcp_spec_allow_private_urls和outbound.guardrail_test_connection_allow_insecure(以及它们的环境变量和 Chart 中的api.notifyAllowPrivateURLs、api.playgroundAllowPrivateIPs、api.mcpSpecAllowPrivateURLs、api.guardrailTestConnectionAllowInsecure),这些设置现在会被忽略,并在启动时记录警告。注意含义相反:旧设置为true表示允许私有地址;新设置enabled: true表示拒绝它们。防护开启时,会拒绝更多非公网地址段(例如 Azure 的168.63.129.16),公网的 IPv4 映射 IPv6 地址不再被拒绝,并且连接只会发往经过检查的地址。Playground 调用和通知投递现在遵循HTTPS_PROXY/HTTP_PROXY/NO_PROXY。
新功能
成本归因
- 成本归因标签。 每个组织最多声明 32 个标签键(设 置 → 标签键,
/tag_keys),然后在 API Key、团队和成员上设置key=value标签。网关按键解析请求的标签——优先取 API Key 自己的值,其次是其团队的,再其次是其成员的——并连同 Key 的team_id一起写入每一行用量。导出器会携带它们:OTLP 为aisix.tags.<key>和aisix.team_id,Datadog 为aisix.tags,SLS 每个标签一个tags.<key>字段,对象存储为tags。用量日志及其 CSV / JSON 导出携带team_id和tags。标签从不作为 Prometheus 标签,也从不从请求中读取。 - 标签预算。 预算的作用范围可以是
tag,scope_ref为<key>=<value>;它统计组织所有环境中的花费,并与其他作用范围一样以hard_stop执行。 - 标签限流。 条件限流策略接受
tag:<key>作为条件维度(==、~=、in、~~、~*)以及group_by维度,例如每个部门一个计数器。不带该标签的请求既不匹配该条件,也不匹配其否定条件,并且不受基于它的group_by约束。 - 成本分析页面和
GET /usage_analysis。 组织级视图,展示一段时间内的成本、Token 和请求数,可按任意标签键、团队、成员、API Key、模型、环境或日期分组,支持筛选、下钻、「未设置」分组,并在按团队和标签分组时显示预算列。此后被删除的标签键,只要在该时间窗口的用量中出现,仍会显示并标记为已删除。
定价
- 组织币种。 设置 → 币种可为组织中的所有金额(价格、用量成本和预算)选择
USD(默认)或CNY。修改时不做任何换算。在CNY组织中,models.dev 目录(USD)不用于计费或least_cost路由,只使用组织自己的价格。Admin API 字段名保持不变(*_usd_per_1m、cost_usd、limit_cents);名称中含usd的网关数值和指标使用组织币种。 - 使用中价格视图。
GET /model_pricing?view=in_use和定价页面的默认标签页会列出各环境实际使用的模型,标出未定价的模型,并提供「设置价格」操作。 - 分档价格。 价格可以按输入 Token(含缓存读取和写入)携带
tiers。整个请求按其能放入的第一个max_input_tokens档位计费。 - 模型组价格和低峰折扣。 路由模型可以携带自己的
price(可分档),对发往该模型组的请求取代实际提供服务的成员的价格;还可以携带off_peak时间表(IANA 时区、按星期的时间窗口、介于 0 与 1 之间的系数),为这些请求打折。两者都只影响控制面计费,不改变路由。 - 按服务档位定价。 网关会记录上游实际处理请求的档位(用量事件中的
service_tier,OTLP / Datadog 的aisix.service_tier,SLS 的service_tier):OpenAI 及兼容上游的service_tier、Anthropic 的usage.speed/service_tier、Bedrock 的serviceTier、Gemini 的usageMetadata.serviceTier。价格可以携带service_tier_prices条目,按不区分大小写的档位名称 匹配,并应用各自的费率和分档。目录价格会从 models.dev 导入服务档位模式;组织为某个模型设置的价格会取代目录中的该行,包括档位条目。用量日志详情会显示档位。
端点
- 决策端点
/v1/systemone和/v1/decisions。/v1/systemone接受 TypeSafe 的 System One 格式,/v1/decisions接受 OpenAI 的 Decisions 格式。两者都可以由typesafe、azure(Microsoft Foundry)、openrouter或openai服务提供方凭证提供服务,格式一致时原样转发,不一致时转换问题和答案。支持直接模型、路由模型和通配别名,并具备故障转移、预算、限流、模型访问控制、用量事件(operation为systemone/decisions)和指标。这两个端点不运行安全护栏。TypeSafe 服务提供方凭证现在可以支撑直接模型,但不能在其上开启后台模型检查。价格中可选的decisions费率会在这两个端点上取代基础费率。
模型服务提供方
- Amazon Bedrock 和 Vertex AI 上的 Claude:
/v1/messages/count_tokens和提示词缓存。/v1/messages/count_tokens现在在两个平台上都可用于 Claude(此前返回400):Bedrock 使用 CountTokens(权限bedrock:CountTokens),对 CountTokens 拒绝的模型(例如仅支持跨区域的 模型)回退到 Bedrock Mantle;Vertex AI 使用其 count-tokens 路由。网关新增的静态配置upstream.bedrock.mantle_endpoint(默认为公共的区域 Mantle 主机)用于为 VPC 端点或 GovCloud 部署设置 Mantle URL,并已在 1.7.0 的aisixHelm Chart values 中声明。提示词缓存现在在 Bedrock 和 Vertex AI 上的 Claude 的所有入口都生效:cache_control标记在发往这些目标的 chat 转换中会被保留,并在 Converse 上变为cachePoint块(Claude 在 system、messages 和 tools 中;Amazon Nova 在 system 和 messages 中,不带ttl)。发往 Bedrock 时,标记只保留type和ttl;发往 Vertex AI 时会去掉scope。auto_prompt_caching现在可以设置在 Bedrock(anthropic.模型 ID,包括带区域前缀的 ID 和 ARN)和 Vertex AI(claude-*)上的 Claude 模型上,并与在 Anthropic API 上一样生效;其他模型仍以400拒绝。Bedrock 上的部分 Claude 模型只接受 5 分钟缓存,请求1h时 Bedrock 会拒绝。 - Bedrock 认证模式。 Bedrock 服务提供方凭证的密钥接受
auth_type:access_key(默认,与以前相同,可选session_token)、api_key(Bedrock API Key,以 bearer Token 发送)或default_chain(网关自身的 AWS 环境:环境变量、Web Identity / IRSA、ECS 任务角色或实例配置文件)。使用access_key或default_chain时,role_arn(可选external_id、role_session_name)用于扮演 IAM 角色。Bedrock 安全护栏的aws_credentials新增kind: api_key和kind: default_chain,static新增session_token和角色字段。每次 Bedrock 调用都使用所 选模式。缺失或被拒绝的凭证是不可重试的401 authentication_error,并写出所用模式;STS 或元数据端点失败则可重试。控制台中的服务提供方凭证和安全护栏表单提供该模式及其字段,服务提供方凭证详情显示bedrock_auth_type。 - Amazon Bedrock 上的 Cohere Embeddings 接受调用方的
input_type、embedding_types(或encoding_format),在 Embed v4 上还接受dimensions,并按 Cohere 的计费单位报告用量。
可观测性
- 按导出器采集请求头。 每个可观测性导出器都接受
request_headers和upstream_response_headers(小写请求头名称;两个列表都拒绝凭证类请求头,upstream_response_headers还拒绝set-cookie)。每个导出器只记录自己的列表:OTLP 记录为http.request.header.<name>,以及每次尝试的http.response.header.<name>;Datadog、SLS 和对象存储记录为request_headers/upstream_response_headers映射。可在导出器表单或 Admin API 中配置。 - 更多请求遥测。 用量事件和导出器新增
requested_model_id(调用方所访问模型条目的 ID,与实际提供服务的model_id并列)、api_key_name、gateway_overhead_ms(在网关内花费的时间,不含等待上游的时间)、upstream_tpot_ms(流上每个输出 Token 的时间),以及上游上报的音频和图像 Token 数(OTLP 上为gen_ai.usage.{audio,image}.{input,output}_tokens)。上游上报拆分时,提示词缓存写入按缓存有效期拆分为cache_creation_5m_tokens和cache_creation_1h_tokens(OTLP 为aisix.cache_creation_5m_tokens/aisix.cache_creation_1h_tokens);cache_creation_tokens仍为总数。Claude 模型上的 1 小时写入按行为变化 → 定价、用量与控制台中所述计费;其他缓存写入无论有效期多长,都按缓存写入费率计费。Admin API 的用量事件(GET /environments/{env_id}/usage_events)、用量导出和日志详情也会显示该拆分;在 CSV 中,这两列追加在最后。gen_ai.tool.definitions现在携带每个工具的描述和参数。
控制台
-
选择控制台语言。 管理员可以设置组织语言(设置 → 语言:英文、中文或不设置),登录页面和顶栏中的语言选择器会保存每个浏览器的选择。在组织内,语言依次取选择器的选择、组织语言、浏览器语言,最后是部署默认值(
i18n.default_locale、环境变量AISIX_CLOUD_DEFAULT_LOCALE、Chart 值ui.defaultLocale)。从邀请、设置密码或 SSO 链接打开的页面跟随所链接组织的语言。管理员发送的邀请和设置密码邮件跟随组织语言,未设置时使用部署默认值。AISIX Enterprise: 未设置选择器时,唯一组织的语言也适用于登录页面以及验证和重置密码邮件。
AISIX Cloud: 登录页面以及验证和重置密码邮件只跟随选择器和浏览器。切换组织时,除非选择器有选择,否则语言会切换为该组织的设置。
改进
- 概览和用量页面从按小时汇总的数据加载,而不再扫描每一行用量,在大型环境中把 7 天和 30 天页面的加载时间从数秒缩短到约一百毫秒。Top API Key 显示 Key 名称。
- Admin API 的拒绝信息会说明拒绝了什么以及原因。
422 DP_INCOMPATIBLE会写出每个无法加载该设置的网关所在的环境,而不再是「在此环境中」。此前显示为Doesn't match schema "not"、或只引用了允许形态之一的 schema 拒绝信息,现在会写出取值和原因:导出器凭证类请求头、含__的 MCP 服务器名称、自定义角色权限、OIDC 绑定声明、限流时间表、维度(包括tag:<key>)和条件取值。API Key 未知的user_id或team_id,或不在所指定团队中的成员,会单独报告,而不再合并为一条信息。状态码和错误码不变。DP_INCOMPATIBLE信息现在说明网关在最后一次心跳后 5 分钟内仍会被计入,因此刚升级或停止的网关可能在这段时间内仍被列出。 - 网关配置错误会写出键名。 网关无法读取的配置值现在会以完整的点分键名使启动失败,例如
upstream.media_fetch.allowed_hosts。如果该键由AISIX_*环境变量设置,错误还会写出该变量。此前错误只是解析器的原始信息。 - Bedrock 服务提供方凭证不再需要端点。 未设置时,控制面会保存凭证
region对应的运行时端点(https://bedrock-runtime.<region>.amazonaws.com,中国区为.amazonaws.com.cn);清空端点会重新推导,推导出的端点 会随凭证轮换到新区域。 - 登出按钮在登出成功后才离开页面,否则会显示错误供重试。
- 对图像和不透明载荷的提示词估算更符合实际。 上游未报告用量时,图像按 OpenAI 的视觉分块公式估算,加密推理、签名、文件和音频不再作为文本计算 Token。携带截图或推理条目的已放弃请求,不再记录数十万个虚假的提示词 Token。
AISIX Cloud:
- 当前组织按浏览器标签页保存。 在一个标签页中切换组织,不再改变其他已打开的标签页(此前它们的下一次写操作会落到新组织中);这些标签页会显示提示,让你选择切换或保持。
修复
- 在没有原生结构化输出的 Claude 模型(Anthropic、Bedrock
/invoke、Vertex Claude)上开启思考的结构化输出请求,现在在流式时也会返回其非流式时返回的推理内容。 - 以嵌套
error事件失败的 Responses 流,现在会在用量事件和访问日志中记录上游的错误信息,而不再是全为null的信封。 - 每个请求恰好产生一个
attempt_index为0的用量事件:重试退避期间的取消、/v1/videos在某次尝试成功后的失败以及 ensemble 的失败退出,不再写入第二个,随之产生的重复 Span 也已消除。 - 定价对话框会在对话框内显示被拒绝的保存或重置,写出字段及其上限(例如「Completion price for tier 2 must be less than 100,000 USD per 1M tokens.」),而不再在对话框后面显示原始的校验文本。每个按 1M Token 计的价格输入框(定价对话框、模型组价格和模型自己的价格)都会说明其范围:不小于 0、小于 100,000、最多 10 位小数,并在保存前标出超出范围的值。
- 网关重启后、或由另一个副本重新发送的批次归因用量行只保存一次,因此该批次不再在预算、用量和导出中被计算两次。
- 控制台生成的网关 Helm 命令不再固定
image.tag,因此之后升级 Chart 时会运行 Chart 自己的网关版本。 - 组织正在删除期间到达的写操作会被以
404 ORG_NOT_FOUND拒绝,而不再以500失败或写入被删除的组织。 - 某个查询被取消后紧接着复用同一数据库连接的控制面查询,可能在几毫秒内以
i/o timeout失败,并在控制台请求上表现为503。控制面的 PostgreSQL 驱动现已包含该修复。 - 路径中把
/编码为%2F的请求,现在与使用普通路径的同一请求一样按 Admin API schema 校验。 - 在所有 Claude 上游(Anthropic API、Vertex AI 上的 Claude、Bedrock 上的 Claude)上,与聊天消息
content并列的cache_control、role: "tool"消息上的cache_control,以及tool_calls[]条目上的cache_control,现在会应用到该消息的最后一个块、工具结果或工具调用上;此前会被丢弃。 - Bedrock 上的 Claude 不再拒绝
thinking.display: "updates"(由 Claude Code 发送,此前会话中的第一个请求会以400失败);summarized或omitted以外的 display 会被丢弃。携带dangerous-tool-use-2026-09-03、thinking-binding-controls-2026-08-01或thinking-display-updates-2026-08-18的请求 (此前被 Bedrock 以400拒绝)现在会去掉这些值后成功。 - 服务提供方凭证的
anthropic-beta请求头中带有 Vertex AI 不支持的值时,发往 Vertex AI 上 Claude 的聊天请求不再以400失败;该值会被丢弃。 - 发往 Claude 的聊天请求接受
stream_options、max_completion_tokens和stop。此前它们会以400(「… Extra inputs are not permitted」)失败。这影响 Anthropic 及兼容 Anthropic 的服务提供方、Vertex AI 上的 Claude,以及 Amazon Bedrock 上 Claude 的非流式请求。stream_options不再发往上游。max_completion_tokens作为输出上限,同时发送时优先于max_tokens,reasoning_effort的思考预算也按它确定。stop转为stop_sequences,字符串作为只有一个元素的数组发送。调用方自己发送的stop_sequences优先于stop,这在所有 Claude 路径上都成立,包括 Bedrock 上 Claude 的流式请求。Bedrock 上 Claude 的非流式请求发送的内容与 Anthropic 路径完全一致,上游不接受的取值会送达上游并被其拒绝。 - 来自音频输出模型(例如
modalities: ["text","audio"])的流式 Chat Completions 现在会转发delta.audio,以用量分片和[DONE]结束,并报告音频 Token。此前流会丢弃音频,并以upstream_decode_error结束。这影响 OpenAI 及兼容 OpenAI 的上游、Azure OpenAI,以及 Bedrock 和 Vertex AI 的兼容 OpenAI 路由。聊天输出安全护栏不会检查生成的音频及其转录文本。 - 上游上报
"cached_tokens": null或"reasoning_tokens": null时,请求现在会成功,该计数视为未上报。此前聊天补 全会以502失败,透传路由上则不记录任何 Token。 - 自定义角色:产品不提供的权限,现在在创建或更新角色时会被以
400 INVALID_REQUEST(「permission resource … is not available in this product」)拒绝。在 AISIX Enterprise 上是billing,在 AISIX Cloud 上是data_export。这取代了 1.6.0 中POST和PATCH /roles仍接受这些权限的行为。创建和更新的响应会省略此前保存的此类权限,与角色列表已有的行为一致。 - 控制台的 Docker 安装片段改为用
docker logs -f ... 2>&1 | grep -m1 'etcd connected'验证网关;此前它只读取标准输出,并等待一条网关从不打印的日志。 - 未选择服务器时打开 MCP 工具页面,会重定向到 MCP 服务器页面,而不再一直加载。
- 开启 SSRF 防护时,Azure AI Content Safety 测试连接现在会在连接时拒绝名称解析到私有地址的主机,从而关闭 DNS 重绑定窗口;MCP 服务器的
spec_url获取也是如此。无法解析的主机会报告为不可达(200且ok: false),而不再是400(见 API 变化)。 - 通知投递的错误信息不再显示被拦截主机解析到的内部地址。
AISIX Enterprise:
- 唯一所属组织已被删除(例如因组织合并)的成员,会看到一个说明其不属于任何组织的页面以及登出按钮,而不再是环境加载错误。记住了已删除组织的浏览器会被引导到组织选择页面。
- 修改由 Chart 管理的 Secret 值(主密钥、退役密钥、SMTP 或计费密钥、外部数据库密码)后,
helm upgrade现在会滚动更新 cp-api 和 dp-manager 的 Pod。 - 离线安装包的
run.sh只加载当前安装包的镜像,而不再加载images/中残留的每个版本(见升级说明)。 - 离线安装包的数据库密码可以包含任意字符,包括
@ % : / ? # + = '和空格。它不再被写入 cp-api 和 dp-manager 的数据库 URL,因此包含 URL 保留字符的密码不再导致它们无法连接。你仍然只需设置POSTGRES_PASSWORD,现有.env文件无需修改。在.env中,包含空格、#、$或引号的密码需要加引号。 - 未设置组织语言时,读取公共配置不再在每次请求时记录错误。
AISIX Cloud:
- 不属于任何组织的用户会进入创建组织表单,并有登出按钮,而不再是环境加载错误。
- 在组织解析完成之前,预算横幅不再在标签页首次加载时发送一个以
400 MISSING_ORG失败的请求。 GET /data_export和POST /data_import以标准的{"error": {...}}信封返回404。此前返回的404没有响应体。
API 变化
以下 Cloud Admin API 变化会破坏现有调用方。
format: date-time查询参数会在处理程序之前校验。 这涵盖GET /environments/{env_id}/usage_events、/usage_events/export、/usage_metrics、/usage_summary和GET /usage_analysis上的from/to,以及 AISIX Enterprise 上GET /data_export的audit_since/usage_since。状态码和错误码仍为400 INVALID_REQUEST,但信息文本有变化。用逗号书写小数秒(2026-10-01T00:00:00,5Z)现在会被拒绝,请使用.。带空的audit_since=或usage_since=的GET /data_export现在返回400,而不再使用默认时间窗口;请改为省略该参数。GET /environments/{env_id}/usage_summary和/usage_metrics的含义变化。from向下取整、to向上取整到完整的 UTC 小时,因此不在整点上的时间窗口会覆盖两端的不完整小时。一个请求只在其首次尝试所在的小时计一次,成功则计在成功尝试所在的小时,因此按日分桶之和等于总数。latency_p50_ms/latency_p99_ms是误差在 5% 以内的近似值。success_count不再计入 ensemble 的 panel 成员,且不超过request_count。estimated_request_count统计估算的尝试,因此每个被估算的 ensemble 成员和 judge 各计一次。- 用量事件上
model_id对模型组的含义变化。 对于 1.7.0 网关,GET /environments/{env_id}/usage_events?model_id=<模型组 ID>不再返回该模型组派发前的失败或其响应缓存命中,它们的model_id现在为空。请改为按requested_model并设置requested_model_exact=true进行筛选。 - 模型的创建和更新会拒绝把不提供 chat 的服务提供方的模型作为 chat 目标。 不提供 Chat Completions 的服务提供方(Jina、RunwayML、TypeSafe)上的直接模型,不能再被添加为 ensemble 成员或 judge,或语义路由的路由、默认或失败时目标;在这些位置被引用的模型也不能被移到此类服务提供方凭证上。两者都返回
400 INVALID_REQUEST。升级前 保存的引用可以原样重新提交。 - 限流策略会拒绝不指向任何资源的 ID。
POST /environments/{env_id}/rate_limits现在会检查scope_ref以及每个team、member、api_key和model条件取值:API Key 和模型必须存在于该环境中,团队和成员必须存在于该组织中(member取GET /members返回的成员关系 ID,而不是账号的user_id)。未知 ID、或来自其他组织或环境的 ID,会返回400 INVALID_REQUEST并写出字段;此前它会被保存且永远不会匹配。PATCH /environments/{env_id}/rate_limits/{rate_limit_id}只在此类 ID 新加入conditions时才拒绝;已保存的 ID(例如已删除模型的 ID)仍可保存。升级前保存的策略不会被修改。 - Amazon Bedrock 服务提供方凭证的密钥按认证模式校验。
POST /provider_keys和PATCH /provider_keys/{provider_key_id}现在会对以下 Bedrock 密钥返回400:带有其他模式字段的(例如与访问密钥并存的api_key)、session_token或角色字段为空的,或者设置了external_id/role_session_name却没有role_arn的;此前它们会被保存。以纯字符串提交的目录amazon-bedrock凭证,在创建或轮换时也按同样方式检查。请移除多余或为空的字段。access_key_id/secret_access_key的必填要求现在只适用于auth_type: access_key(默认值)。 - Azure AI Content Safety 测试连接把无法解析的主机报告为不可达。 开启 SSRF 防护时(这是 AISIX Cloud 的默认设置),对于无法解析的端点主机,
POST /environments/{env_id}/guardrails/test-connection返回200和{"ok": false, "message": "Could not reach the Azure AI Content Safety endpoint."},而不再是400 INVALID_ENDPOINT(「could not resolve the endpoint host」)。依据400分支处理的调用方必须改为读取ok。
升级说明
从早于 1.7.0 的版本升级时,均需遵循本节说明,包括跳过 1.7.0 升级到更新版本的情况。
- 按新的 OTLP Span 形态更新追踪查询和看板(见行为变化),并更新 Datadog 中针对 Anthropic 形态流量、基于
gen_ai.usage.input_tokens的查询。 - 把 SLS 索引和 Datadog facet 迁移到结构化内容字段。 在 SLS 上,为
input_messages、system_instructions、tool_definitions和output_messages创建字段索引,并把已保存的查询从prompt/response上迁走;在 Datadog 上,把 facet 和监控从gen_ai.prompt/gen_ai.completion迁到gen_ai.*.messages。 - 在导出器上重新配置请求头采集。 如果你的网关设置了
observability.usage_event.request_headers,请在升级后把同样的请求头列入每个导出器的request_headers。1.7.0 的aisixChart 不再携带该值。 - 从新的用量事件字段读取缓存写入拆分。 来自 1.7.0 网关的用量事件在
GET /environments/{env_id}/usage_events和用量导出中携带cache_creation_5m_tokens和cache_creation_1h_tokens。在 CSV 导 出中,它们是最后两列,因此按位置读取列的解析器仍可正常工作,但期望固定列数的解析器必须允许这两列。 - 控制台跟随浏览器语言。 升级后没有任何组织设置了语言,因此浏览器偏好英文或中文的用户会看到该语言的控制台,并收到该语言的验证、重置密码和 SSO 邮件,而不是部署默认语言。如需为所有人固定一种语言,请在设置 → 语言中设置组织语言。
- 升级后,概览和用量页面会显示为零,并提示「正在回填历史数据」,直到新的用量索引构建完成、现有用量汇总完毕。在用量表较大时这可能需要一段时间,期间流量仍会被正常记录。
- 更新护栏日志查询和告警。 在护栏日志行上,
row=、member=和name=变为guardrail_name=,Bedrock 护栏日志行的guardrail_id=变为bedrock_guardrail_id=。 - 更新基于已重命名失败分类的告警。 针对 Bedrock 护栏配置错误、基于
bedrock_5xx的告警和查询要改为bedrock_config_error;针对服务提供方转换拒绝的请求、基于invalid_config的告警和查询要改为invalid_request_error。 - 错误信息现在携带上游的文本。 如果你的网关所服务的调用方不应看到服务提供方账号的细节,请注意:来自 Amazon Bedrock、Azure OpenAI 和 Vertex AI 的错误,以及来自所有服务提供方的
5xx错误,现在包含服务提供方自己的信息,其中可能写出账号 ID、ARN、部署或项目名称。 - 带长上下文分档的目录定价模型,在超过阈值时费用更高。 首次价格同步后,此类模型超过某档阈值的请求会按 该档计费,因此预算消耗更快。组织自己的价格不受影响。
- Claude 的 1 小时缓存写入费用更高。 升级后,Anthropic、Amazon Bedrock 或 Google Vertex AI 提供的 Claude 模型上有效期为 1 小时的缓存写入,按输入费率的 2 倍计费,而不再按缓存写入费率(约为输入的 1.25 倍)计费,因此覆盖它们的预算消耗更快。只影响升级后记录的事件,历史数据不会重新计算。
- 把内部媒体主机列入
outbound.ssrf_protection.allowed_hosts。 发往 Bedrock、Vertex AI 上 Claude 的聊天媒体 URL,以及发往 Anthropic 或 Gemini 的http://URL,现在由网关下载,网关会拒绝非公网地址。如果调用方发送的媒体 URL 由内部主机提供,请把这些主机列入aisixChart 的config.outbound.ssrf_protection.allowed_hosts,或设置outbound.ssrf_protection.enabled: false。被 fake-IP 或透明代理解析到198.18.0.0/15的公网域名也会被拒绝;请列出这些主机或关闭检查。设置了proxy.request_body_limit_bytes时,下载的媒体会计入其中,因此此前因媒体被丢弃而通过的请求现在可能得到413。 - Bedrock 和 Realtime 流量现在经过网关的代理。 在设置了
HTTP_PROXY、HTTPS_PROXY或ALL_PROXY的网关上,Bedrock 运行时、Bedrock 安全护栏、STS 和/v1/realtime的上游连接现在会使用该代理。如需保持直连,例如连接 Bedrock VPC 端点,请把主机加入NO_PROXY。Realtime 不能使用 SOCKS 代理:如果为其上游配置了 SOCKS 代理,Realtime 会话会一直失败,直到该主机被排除或改用 HTTP 代理。 - 按最长的 Realtime 会话设置网关的终止宽限期。 排空中的网关现在会等待打开的
/v1/realtime会话关闭。 - 经路由模型组的 Responses 对话可能在不同网关版本之间失败。 在滚动升级或网关回滚期间,经路由模型组的
/v1/responses后续轮次,如果延续的是在 1.7.0 网关上开始的对话、却落到较旧的网关上,就会失败。OpenAI 会以400(string too long)拒绝,其他上游可能返回404。开启新对话即可恢复。 - 用控制台生成的 Helm 命令安装的网关固定了
image.tag。helm upgrade --reuse-values会保留该 tag,因此新的 Chart 仍会运行旧的网关。升级网关 Chart 时请清除它(例如--set image.tag=)。 - 对于无法解析的主机,Azure AI Content Safety 测试连接返回
200且ok: false,而不再是400 INVALID_ENDPOINT。请更新依据400分支处理的自动化脚本。
AISIX Enterprise:
- 从四个已移除的出向开关迁移到
outbound.ssrf_protection。 为加固而把outbound.notify_allow_private_urls、outbound.playground_allow_private_ips、outbound.mcp_spec_allow_private_urls或outbound.guardrail_test_connection_allow_insecure设为false的安装,现在会允许私有地址,除非设置api.outbound.ssrfProtection.enabled=true(或AISIX_CLOUD_SSRF_PROTECTION_ENABLED=true)。这包括从 Chart 1.5.0 以helm upgrade --reuse-values沿用下来的 Chart 发布,其api.playgroundAllowPrivateIPs和api.notifyAllowPrivateURLs默认为false。如果此前只放开了部分地址,请把具体主机列入allowed_hosts。 - 离线安装包:旧的镜像压缩包会被删除。 升级后首次成功运行
./run.sh时,会删除images/中旧的镜像压缩包(启动失败时会保留),你自己放在那里的镜像压缩包也不再自动加载。 - 自行设置的数据库 URL 必须携带经 URL 编码的密码。 如果你通过 Chart 的
extraEnvVars设置了数据库 URL(例如postgres://…:$(PGPASSWORD)@…),这一条适用。控制面的 PostgreSQL 驱动现在按 libpq 的方式解析连接 URL:用户名和密码在第一个@处结束(此前是最后一个),无效的百分号编码会报错,查询参数中的+不再被视为空格。此前可用的、包含@、%或其他保留字符的密码,可能在升级后导致 cp-api 和 dp-manager 无法连接。请不要在数据库 URL 中放密码:Chart 已经在 cp-api 和 dp-manager 中把PGPASSWORD设为数据库密码,URL 不带密码时驱动会原样读取它。或者,在 URL 中对密码进行 URL 编码。Chart 的默认配置不会把密码放进 URL,不受影响。
在 1.7.0 控制面仍连接着早于 1.7.0 的网关期间,以下说明适用:
- 0.12.0 至 1.3.x 的网关会拒绝本版本投影的新资源类型。 它们会在
aisix_config_rejected_resources{kind=…}中计数,并在升级之前一直把aisix_config_last_reload_successful保持为0。从 1.4.0 起,网关只会在aisix_config_unknown_kind_resources中计数。两种情况下控制面都不会显示任何信息。升级网关即可消除。 - 只要组织的任意环境中注册有 1.6.x 或更早版本的网关,标签预算就会被以
422 DP_INCOMPATIBLE拒绝;只要该环境中有这样的网关,tag:限流策略也会被拒绝。 这些网关加载带tags的 API Key、团队和成员时会忽略该字段(控制台会显示部分兼容提示),因此它们的用量不带标签。 - 较旧的网关会忽略导出器的
request_headers/upstream_response_headers;保存时会返回field_ignored警告。 - 决策端点需要 1.7.0 网关。较旧的网关不上报
service_tier,因此其请求按基础费率计价,也不上报requested_model_id。 - 只要密钥所允许的某个环境中有 1.6.x 或更早版本的网关,
auth_type为api_key或default_chain、或带有角色字段的 Bedrock 服务提供方凭证就会被以422 DP_INCOMPATIBLE拒绝;使用kind: api_key/default_chain,或在static上使用session_token或角色字段的 Bedrock 安全护栏也是如此。 - Bedrock 或 Vertex AI 上 Claude 模型的
auto_prompt_caching可以不经检查保存,但 1.6.x 及更早版本的网关在升级之前不会在这些模型上注入标记。 - 1.6.x 及更早版本的网关不上报 1 小时缓存写入拆分,因此在升级之前,其 1 小时写入按缓存写入费率计费。
- 1.5.0 至 1.6.x 的网关只在 Chat Completions、Completions、
/v1/messages、/v1/responses和透传路由事件上记录total_tokens;在升级之前,其 Embeddings、Rerank、音频、图像、Realtime 和批次事件的total_tokens保持为null。早于 1.5.0 的网关从不记录该字段。
已知问题
- 标签限 流和标签预算可能漏掉之后加入或回滚的网关。 兼容性检查只看保存策略或预算时已注册的网关。之后注册的 1.6.x 网关、或回滚到 1.6.x 的网关,不会执行
tag:限流,其用量也不会计入标签预算。开发版构建和心跳已过期的网关也不会被检查。控制面的被拒绝资源报告会显示这样的网关。
1.6.0
发布日期: 2026 年 10 月 12 日
On-Premises 控制面现在可以发送邮件。SMTP 中继负责投递邀请、找回密码链接和管理员签发的登录链接,组织也可以通过自己的 SAML 身份提供方让成员登录。控制台登录移入 cp-api,cp-api 现在以静态页面提供控制台,因此控制面不再运行单独的 UI 组件。语义路由可以用 TypeSafe 的 jev 决策模型而不是向量相似度来选择路由。Prometheus 指标可以在 ID 旁携带可读的 API Key、团队、成员、模型服务提供方凭证和策略名称,用量事件也可以记录你选定的请求头。流式响应在结束时按其结束时的状态计入请求指标。预算改为增量计算,审计日志会在可配置的保留期之后被清理。删除环境现在会从网关撤回其配置。透传路由会校验其目标和查询参数,对整条流执行并发限制,并在输出护栏无法评估响应时失败即拦截。
行为变化
-
流式响应在流结束时按其结束时的状态计入请求指标。 这涵盖
/v1/chat/completions、/v1/messages和/v1/responses流、转录和翻译事件流、/v1/audio/speech以及流式/a2a调用。完整送达的流记为200,调用方中途离开的记为499,上游中断或流内错误记为502,读取超时记为504,流内的4xx保留其状态码。此前这类流在响应开始时就被计为200成功。受影响的指标族有aisix_requests_total、aisix_request_duration_seconds、aisix_proxy_requests_total、aisix_proxy_failed_requests_total、aisix_proxy_request_duration_seconds、aisix_llm_requests_total和aisix_llm_request_duration_seconds。对于流式流量,成功率会降到实际发生的水平,耗时直方图衡量整条流,因此其分位数会大幅上升。首 Token 时间仍由 TTFT 指标记录。一批长流出现时,rate()信号会滞后约一条流的时长,Chart 中基于aisix_llm_requests_total的 KEDA 示例也是如此。在响应头发出之前离开的调用方仍只计入aisix_proxy_client_cancelled_requests_total。aisix_request_e2e_latency_seconds和aisix_request_ttft_seconds现在携带该流真实的status_class,而不再是固定的200。 -
访问日志的
error_kind和用量事件的error_class共用一套词表。 非流式访问日志行,以及不带尝试记录的失败请求的最终用量事件,其以下取值发生变化:upstream_error→upstream_status、transport_error→transport、upstream_decode_error→upstream_decode、upstream_in_band_error→upstream_in_band、config_error→config、invalid_request_error→invalid_config(无效的上游配置),以及authentication_error→invalid_credentials。逐次尝试的事件和流式日志行此前就已使用新名称。客户端收到的错误响应中的error.type不变。流式透传日志行现在会携带error_kind,此前该字段为空。 -
设置了
on_embedding_failure: fail的语义路由在向量化失败时以自己的错误码应答。 此前它应答503和type: provider_unavailable("no bridge registered for provider"),指向一个并不存在的配置错误。现在它仍应答503,但改为type: api_error、code: semantic_routing_failed,消息为semantic router '<model>' could not pick a route (<reason>),其中原因为embedding_timeout、embedding_upstream或embedding_unavailable。针对这种情况匹配error.type == "provider_unavailable"的客户端必须改为匹配error.code == "semantic_routing_failed"。访问日志和用量事件的error_kind/error_class为semantic_decision_failed。新增的 jev 分类器在on_failure: fail时以同样的方式应答,原因为classifier_*。 -
网关拒绝会在用量事件中携带其原因。 网关自行拒绝的请求,现在会把访问日志中的文本记录到最终用量事件的
error_message以及 OTLP 的aisix.error_message中。这涵盖未知或被禁止的模型、IP 限制、限流或预算拒绝、护栏拦截、语义决策失败以及请求过大。文本可能引用请求或上游应答内容的错误会让error_message留空。/v1/chat/completions、/v1/responses、/v1/completions、音频路由和/v1/realtime上输出侧和结束会话的护栏拒绝现在还会携带error_class: content_filter,此前它们只有guardrail_blocked: true。在200响应头之后被拒绝的流式回答保留状态码200,并带有error_class: content_filter。在调用方离开前一刻被拒绝的透传路由流不再记为499 client_disconnected。/a2a和/mcp的护栏拦截和额度拒绝也会携带error_class和消息。在这些/a2a和/mcp拒绝上,以及/v1/responses、/v1/completions和音频路由上缓冲模式的输出护栏拒绝上,访问日志行现在携带error_kind和error,1.5.0 中这两者为空。对于每一种网关拒绝,它们现在都等于用量事件的error_class和error_message。 -
护栏不再扫描工具调用 ID。 护栏此前会连同每个工具调用的名称和参数一起读取它的 ID,把消息文本发送给审核服务或自定义脚本的护栏也会收到它。工具调用的
id、call_id、tool_use_id和tool_call_id取值现在在所有接口和透传路由上都会被排除,因此护栏不再因为只出现在 ID 内部的文本而拦截。在透传的 Responses 请求体上,条目句柄、approval_request_id和推理的encrypted_content也会被排除,因此该路由扫描的文本与/v1/responses相同。函数名称和参数仍照常扫描。不透明请求体的透传扫描仍会读取每个解码后的字符串。 -
Vertex AI Gemini 模型上的函数调用会拒绝它无法承载的内容。 此前靠把工具扁平化为文本而成功的请求,现在应答
400 invalid_request_error