发布说明
本页汇总 AISIX 网关、控制面、控制台和部署包中面向用户的变更,按版本从新到旧排列。
如果一次升级跳过了若干版本,其间每个版本的升级说明依然适用。请按从旧到新的顺序阅读——从你当前版本的下一个版本开始,一直读到目标版本。支持的升级路径和升级顺序参见升级 AISIX。
发布产物包括 docker.io/api7/aisix 网关镜像、docker.io/api7/aisix-cp-* 下的控制面镜像、aisix-cp Helm Chart 和离线安装包。
1.10.0
发布日期: 2026 年 11 月 12 日
本版本把语义路由扩展到 /v1/messages、/v1/messages/count_tokens 和 /v1/responses,允许以模型组作为路由目标,并可以把会话固定在其第一个命中请求所走的路由上。限流可以使用滑动窗口。成本分析可以按行、按请求显示每笔费用的构成,并能翻页查看所有分组。OpenAI 风格的提示缓存写入按缓存写入价计费,并单独提供 12 小时价格。费用和价格字段名不再包含币种,网关的默认日志级别改为 warn。AISIX Enterprise 现在支持 Podman。
完整的 AISIX Cloud Admin API 端点和 Schema 对比,请参阅 1.9.0 到 1.10.0 的变更(英文)。
行为变化
以下变化可能需要更新看板、告警、用量记录和导出内容的使用方,以及读取费用或价格字段名的脚本。
费用和预算字段名不再包含币种
组织现在可以使用 CNY 或 USD 定价,因此原先暗示美元的名称已经更改。
- 网关预算
429:OpenAI 格式的错误体中,error.limit_usd改名为error.limit,error.spent_usd改名 为error.spent。值和格式不变,旧名称不再发送。Anthropic 格式的错误体从未携带这些字段。 - 网关预算指标:
aisix_budget_limit_usd、aisix_budget_spent_usd和aisix_budget_remaining_usd改名为aisix_budget_limit、aisix_budget_spent和aisix_budget_remaining。标签不变。请为使用旧名称的看板和告警改名。如果observability.metrics.labels仍列出旧名称,网关照常启动,输出一条指明新名称的警告,并在该条目改名之前忽略它。 - 导出的用量事件不再携带费用。SLS 列、对象存储 NDJSON、Datadog(
aisix.cost_usd)、OTLP,以及网关发送给控制面的遥测中都移除了cost_usd。费用以控制面的用量数据为准。网关此前在这里发送的值,除 Realtime 会话和已完成的批处理任务外都是0。 - 用量事件 CSV 导出:
cost_usd列在原位置改名为cost。按表头读取列的脚本必须把cost_usd改为cost。新增的列追加在 1.9.0 的列之后(参见 API 变化)。 - AISIX Cloud Admin API:新增名称
cost以及prompt_per_1m、completion_per_1m、cache_read_per_1m、cache_write_per_1m、cache_write_1h_per_1m、reasoning_per_1m。旧的cost_usd和*_usd_per_1m名称作为已弃用的别名保留,值相同。用量响应(usage_events、usage_summary、usage_analysis、usage_analysis/breakdown)新增顶层currency(USD或CNY)。会破坏调用方的部分参见 API 变化。
升级说明
以下变化在升级后生效,或在网关与控制面运行不同版本期间需要注意。大多数无需修改配置,但可能改变日志、账单、限流计数、指标和脱敏结果。
网关默认日志级别为 warn,访问日志不再依赖日志级别
observability.log_level 的默认值从 info 改为 warn。既未设置 log_level 也未设置 RUST_LOG 的网关只输出 WARN 及以上级别的日志和访问日志。默认不再显示的 INFO 日志包括 provider call completed、生命周期日志(aisix listening、etcd connected、排空进度),以及安全护栏拦截和监控模式的诊断日志。如需保留原有输出,请设置 log_level: info。等待其中某一行日志的脚本必须设置 info,或改为轮询 /readyz。aisix Helm Chart 的默认值也相应更改。
访问日志不再依赖日志级别。只要 observability.access_log 处于开启状态,在任何 log_level 或 RUST_LOG 下都会写入访问日志。此前以 warn/error 运行且没有访问日志的网关,现在会开始写入访问日志。关闭它的唯一方式是 access_log: false:设置 aisix_obs::access_log=off 的 RUST_LOG 不再生效。
OpenAI 缓存写入按缓存写入价计费
配置了缓存写入价的模型,其 OpenAI 风格的缓存写入现在按该价格计费,12 小时写入按 12 小时价格计费(参见新功能)。内置目录为 OpenAI 的 GPT-5.6 和 gpt-6 系列配置了缓存写入价。1.9.0 把这些 Token 按普通输入计费。这适用于任何上报 cache_write_tokens 的网关版本产生的新事件。只有 1.10.0 网关会上报 30 分钟与 12 小时的拆分;使用旧版网关时,整个写入按缓存写入价计费。升级前已经入库的事件不会重新计价,因此历史费用和汇总不变。没有配置缓存写入价的模型费用不变。预算同样按新的费用计算。无需修改配置。Anthropic 风格的缓存创建计费不变。
非 OpenAI 密钥上的 Codex Lite 模式请求改走 Chat 桥接
在 additional_tools 输入项中声明工具的 /v1/responses 请求(Codex 的 Lite 模式),在部分密钥上现在会经过 Responses → Chat Completions 桥接。条件是派发到的密钥的服务提供方不是 OpenAI、Azure OpenAI 或自带端点,即使该密钥声明了原生 Responses(apis.responses)。此前这类请求会转发到原生 Responses 端点,上游忽略这些输入项,模型收不到工具,只能把工具调用写成文字。DeepSeek 的目录密钥是常见情况。是否桥接按每次上游尝试、根据实际派发的密钥决定,因此模型组可以把第一次尝试原生发送给 OpenAI 成员,把回退经桥接发送给 DeepSeek 成员。用量事件、访问日志、指标和 OTLP Span 会把这样的尝试报告为桥接。不带 additional_tools 的请求,以及 OpenAI、Azure OpenAI 和自带端点密钥上的所有请求都不变。改走桥接的请求不会解析 previous_response_id,这只影响依赖已存储响应的客户端(Codex 每一轮都发送 store: false 和完整输入)。控制台中服务提供方密钥 Responses 入口的提示说明了这一点。无需修改配置。
限流按层统计模型组的尝试
经过模型组的请求,现在在每个路由端点上都以相同方式统计各个限流层:
- API Key 自身的限额、被寻址条目自身的限额、请求级策略和 MCP 限额,每个请求计一次。这一点不变。
- 成员自身的限额(其内联
rate_limit、作用于它的经典model作用域策略,以及由其自身model/model_name满足的条件策略)每次上游尝试计一次,包括对同一目标的重试。/v1/messages/count_tokens、completions、embeddings、rerank、images、audio、videos 和 decisions 此前对每个目标只计一次成员,现在按每次尝试计数,因此发生重试时成员的限额会更快用尽。 - 通过被寻址的模型组本身匹配、与派发到哪个成员无关、且
group_by不按model或provider拆分的条件策略,每个请求计一次。它此前按每次尝试计数,故障转移时可能提前耗尽。匹配取决于成员的策略(例如model == G AND NOT provider == X或model ~= M)按每次尝试计数。 - 网关自身的限流器拒绝请求时,该请求已经占用的计数会退还。例如,模型的限额拒绝请求时,不再消耗 Key 的
rpm。尝试一旦到达上游,无论上游如何响应,都不会退还。
直接派发(非模型组)不变。完整的计数规则见 Admin API 参考中 RateLimitPolicy 的说明。
视频和 Realtime 路由按模型统计失败指标
失败的 GET /v1/videos/{id} 和 GET /v1/videos/{id}/content 请求,以及在找到模型后被拒绝的 /v1/realtime 握手,现在标注为配置的模型,而不是 model="unresolved"。选定目标后被拒绝的 Realtime 请求还会带上 provider、upstream_model 和服务提供方密钥标签。因此,升级后这些路由按模型统计的错误率可能上升,model="unresolved" 会相应减少。在通配符条目(model_name: "*")上,Realtime 请求指标族现在把 upstream_model 报告为条目的模板,而不是调用方传入的后缀。
HTTP 200 中的 MCP 和 A2A 失败记录为失败
部分 /mcp 失败仍以 HTTP 200 响应调用方。这些失败现在会在用量事件和访问日志行上记录 error_class 和固定的 error_message,包括:工具调用返回 isError: true、上游 HTTP 错误、超时或连接失败、JSON-RPC 错误、无法解码的响应、凭据失败、ACL 拒绝,以及未知的 OpenAPI 工具。200 响应中的 A2A JSON-RPC 错误(message/send 和流式请求上)记录为 upstream_in_band。tool_error 请求在请求计数器上携带 error_source="upstream",status 仍为 200。设置了 error_class 时(499 除外),OTLP CLIENT Span 现在为 ERROR;输出安全护栏在 200 响应头之后拒绝的流式响应同样如此。控制台的日志列表、日志详情和概览页的最近请求现在把这些行显示为 工具错误(MCP)或 智能体错误(A2A)。成功率和 失败(4xx/5xx) 状态筛选仍把它们计为 2xx。
PII 检测会脱敏分组书写的卡号和紧邻中日韩文字的号码
内置的 bank_card 检测器现在可以 匹配以空格或连字符分组书写的卡号,支持 4-4-4-4、4-4-4-4-3、4-6-5 和 4-6-4 分组。号码仍须以卡号前缀开头并通过 Luhn 校验。所有内置检测器现在也能匹配直接紧邻中文、日文或韩文书写的值(例如 卡號4111111111111111 或 手机号13812345678)。因此,升级后会有更多文本被脱敏或拦截。另一方面,完全用全角或其他非 ASCII 数字书写的 us_ssn 和 ip_address 不再匹配。
语义路由对 Chat 请求的分类方式变化
对于 /v1/chat/completions 上已有的语义路由,最新一条用户消息只有图片或只有提醒内容时,请求此前会被发往 default(empty_prompt)。路由现在会对更早的、含有文字的最近一轮用户消息进行分类。<system-reminder> 块不再计入分类文本。同一消息的多个文本部分现在以空格连接,而不是直接拼接。对于 Codex 调用方,Codex 注入的上下文块(<environment_context>、<user_instructions>、# AGENTS.md instructions for … 等)也会在分类前移除。