Repository navigation
整合官方 Sub2API v0.2.16 并保留本站契约 - #286
Merged
Merged
Conversation
… accounts The hosted image_generation tool is OpenAI-only. With the global switch or a channel's openai bridge flag enabled, isCodexImageGenerationBridgeEnabled also returned true for Kimi / DeepSeek / MiniMax accounts that forward natively over Responses, so their upstream requests carried the tool, tool_choice and the bridge instructions and were rejected with 400. Return false for nil and non-OpenAI accounts before evaluating the account / channel / global settings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 规则新增 scope 字段:account 命中后暂停整个账号,model 只冷却本次请求的模型; 字段缺省时保持现有语义(模型已知且非 401 走模型级,否则账号级),显式取值由运营人员决定,401 也不例外 - 模型未知的路径按账号级兜底;状态 JSON 记录 scope/model 便于排查 - 创建/编辑账号弹窗的规则编辑器新增作用范围单选卡片,新规则默认模型级; 未设置 scope 的存量规则按后端缺省语义回显(401 账号级、其余模型级),打开再保存不改变行为
- 后端:scope 解析归一化、缺省/显式账号级/显式模型级/模型未知兜底的分流判定, 以及显式账号级、显式模型级 401、模型未知三种命中的落库位置与状态 JSON - 前端:未设置 scope 的存量规则按 401 账号级、其余模型级回显并原样保存, 显式 scope 回显与切换后提交,新增规则默认模型级
Closes Wei-Shaw#7919. Wire claude-haiku-5-5 (released 2026-10-07) across model registry, effort catalog, pricing, billing, validation and Codex descriptors, following the opus-5-5/sonnet-5-5 template and the official migration guide + overview specs. - registry: DefaultModels entry (fixed ID, no date suffix per guide) - effort: full low/medium/high/xhigh/max family + IsHaiku55 + claude-haiku-5.5 dotted normalization (official default: medium) - pricing catalog: 1M/128k limits, base (<=100k) prices and *_above_100k_tokens absolute prices; the existing ladder derivation yields threshold=100000 with uniform 5x multipliers, matching the official two-tier table exactly (cache tiers follow input x5) - billing/pricing fallbacks carry the same tier so a missing catalog entry can never silently bill >100k prompts at base rate - validation: adaptive-only thinking (enabled always 400; disabled 400 at xhigh/max), sonnet-style sampling locks, temp+top_p combo rejected, forced tool_choice explicitly allowed (differs from opus/sonnet) - oauth mimicry: skip temperature:1 top-up when top_p is present on sampling-locked models (sonnet-5-5 included), otherwise the gateway manufactures the temp+top_p 400 itself - toolset beta filter + Codex 1M context cover haiku-5-5 - Bedrock/Antigravity mappings intentionally left out (no 5.5 entries exist there at all, same as opus-5-5); Vertex passes the fixed ID through untouched
- groups 新增 i18n JSONB 列(迁移 242):语言代码 -> {name, description},只存译文;
name/description 原列语义不变,仍用于唯一性校验、搜索与各类日志
- 用户侧接口由后端按请求语言输出:取 Accept-Language 中权重最高的一项,先按完整
语言代码、再按主语言匹配;该语言有译文的字段换成译文,否则保持原字段,且不再带出
译文表。覆盖密钥、可用分组、订阅(含进度与汇总)、兑换、使用记录、可用渠道、
模型广场、套餐列表
- 管理端接口一律返回原字段;分组管理接口额外带 i18n 供编辑
- 创建/编辑分组:名称、描述的标题行右侧新增语言下拉,同一个输入框在默认内容与各语言
版本之间切换;语种跟随前端 availableLocales
- 管理端写入:创建/更新接受 i18n(更新时缺省不修改,传入则整体替换),校验语言代码
形态与名称长度并丢弃空译文;简易模式同样放行;复制分组只带走描述译文
- 切换界面语言后整页刷新,让已加载的数据换成新语言;模型广场响应加
Vary: Accept-Language
- 网关路径,以及只带 group_name 字符串的统计、错误记录出口不做本地化
上游对不存在、已过期、已删除或不属于当前项目的 cachedContent 一律返回 403 "CachedContent not found (or permission denied)"。原生转发路径在错误 策略之前识别该响应,原样返回客户端,不标记账号错误、不临时停调度、 不重试、不换号;其余 403 处理不变。
新增 /v1beta/cachedContents 的创建、列表、查询、更新有效期与删除接口。 参与账号:官方地址的 AI Studio API Key 账号、Vertex service account 账号, 以及开启"上游支持显式缓存"的自定义地址 API Key 账号。 - 网关自发缓存 ID,绑定上游资源名、持有账号与创建它的 API Key (迁移 243 gemini_cached_contents);list/get 只读本地记录 - 引用缓存的 generateContent / streamGenerateContent / countTokens 改写为上游资源名,只发往持有缓存的账号,不参与会话粘性、不换号; 拒绝重复键与 snake_case 写法;在持有账号上重试耗尽后, 上游 429 / 5xx 原样透传,401 / 403 映射为 502 - 计费:创建时一次性收取缓存 token 输入费与整个有效期的存储费; 延长按库中实际推进的时长收费,纯存储费不算一次请求;缩短与删除不退费 - 存储单价随计费模型取价,来自定价覆盖文件字段 cache_storage_cost_per_token_per_hour,未配置的模型拒绝创建; 存储费同时计入账号统计成本,渠道按 token 重算成本时叠加且不重复计入 - 扣费前校验:创建在上游建成后按确定金额校验余额 / 订阅额度 / API Key 额度并登记不封顶的在途预留,不足时删除上游缓存、只收输入费; 延长在调用上游前按增量时长校验 - 有效期上限 gateway.gemini_cached_content_max_ttl_seconds,默认 86400, 有效期向上取整到秒;创建请求保留数字原文、兼容 snake_case 元数据字段 - 上游调用与落库同客户端连接脱钩;2xx 不可用响应不换号并删除已建缓存 - 缓存不存在:AI Studio 的 403、Vertex 生成请求的 400 与缓存资源接口的 404 统一识别;原生转发(含流式)不重试、不换号、不改账号状态, 向客户端返回标准 403,不暴露上游缓存资源 ID,上游原始错误登记到 ops; PATCH 遇上游 404 移除本地记录并返回 403,DELETE 视为成功 - 自建网关上游:账号开关 explicit_cache_upstream,缓存接口发往账号自身 base_url;可选 explicit_cache_upstream_max_ttl_seconds 对齐上游 TTL 上限, 显式 TTL 超限时创建跳过该账号(全部超限返回 400),未显式时按上限创建, PATCH 取本站与账号上限的较小值;绑定缓存的请求在网关账号上收到 429 / 5xx 时不重试、不限流该账号;前端创建 / 编辑账号弹窗新增开关与上限输入框 - 用量与 ops 端点统计:带缓存 ID 的路径归一化为 /v1beta/cachedContents, 缓存操作的上游端点记为 /v1beta/cachedContents
…tion-long-context fix(billing): 取消 GPT-6.1 Sol 订阅长上下文附加费
同一缓存的并发 PATCH 可能以与上游提交不同的顺序写回本地到期时间; 确定金额的存储费只预留用户余额,并发续期可越过 API Key 总额度与订阅额度; 上游已修改而本地写回失败时没有可恢复的状态。 - 新增迁移 245:缓存记录增加修改意图(mutation_token / mutation_lease_until)。 PATCH 在调用上游前登记意图并取得 2 分钟租约,条件为没有进行中的修改且到期时间 未变;上游修改、本地写回与计费均由持有者完成,并发的修改返回 409 ABORTED - 上游结果未知、本地写回失败或进程退出时修改意图保留且不计费;租约过期后由下一次 修改或后台每分钟的恢复流程把上游有效期回滚到修改前的到期时间(已到期则删除上游 缓存与本地记录)。上游明确拒绝或请求未发出时直接清除意图 - 修改 / 删除上游缓存的单次调用超时改为 30 秒;请求发出前的失败包装为 ErrGeminiCachedContentRequestNotSent - CheckChargeAffordable 与 ReserveInflightCharge 合并为 ReserveFixedCharge:在途预留 新增订阅、API Key 两个维度(Redis billing:inflight_scope:*),先登记本笔预留再读取 库中权威用量(Key quota_used 与限速窗口、订阅日 / 周 / 月用量)叠加同维度在途合计 校验;预留随计费任务交接,落库后释放 - GetRateLimitData 一并读取 quota_used
…ontext fix(codex): raise GPT-6.1 Sol generated context default to 500k
OpenAI 转发 fastpath、HandleUpstreamError 及两处池模式分支对 401 一律跳过
临时不可调度规则,显式 scope=model 的 401 规则在 API Key 账号上仍落到
handleAuthError 整号置 error。
- 新增 tempUnschedRulesApply:401 仅在首条命中规则按模型级生效时交给规则,
其余保持认证错误处理
- 凭据级 401(OAuth 账号与 Spark 影子、OpenAI token_invalidated/token_revoked、
{"detail":"Unauthorized"})不受规则作用范围影响,各入口沿用原有处理
- 模型级命中不参与重复 401 升级;fastpath 不再因模型级命中封整号
- 模型广场以追加方式写入 Vary: Accept-Language,保留 CORS 中间件为具体来源 写入的 Vary: Origin - 管理端写入分组译文时语言代码统一为 BCP 47 惯用大小写(en、zh-TW), 统一后重复的语言代码(如 en 与 EN)返回 400 INVALID_GROUP_I18N - 用户侧按语言取译文时规范写法的键优先,仅大小写不同的多个键按字节序取最小者, 同一请求语言的结果固定
feat(groups): 分组名称与描述支持多语言
OpenAI 与 Anthropic 的 count_tokens / input_tokens 入口、Bedrock 故障转移入口 以及 OAuth 403 重试耗尽入口调 HandleUpstreamError 时没有传入实际发往上游的模型, 显式 scope=model 的 401 规则在这些入口看到空模型,仍落到 handleAuthError 整号置 error。 - 四处计数入口传入映射后的上游模型;Anthropic 透传计数函数新增 upstreamModel 参数 - handleRetryExhaustedSideEffects / handleRetryExhaustedError 增加模型变参, Forward、Anthropic 透传与 Bedrock 三处调用方传入实际模型 - Bedrock 入口传调度器的模型键(account.GetMappedModel),不是发往上游的 Bedrock 模型 ID,模型级冷却才会被调度器读取 - 这些入口的 404 模型未找到与缺省 scope 的非 401 规则随之按主转发路径语义处理 (模型已知走模型级)
后台回滚在持有账号返回 nil 时把修改意图当作已回滚清除:账号临时关闭显式缓存能力后 意图丢失,重新开启也无法补偿。 - boundAccount 区分两种情形:账号已删除返回 nil,账号存在但不支持显式缓存返回 errGeminiCachedContentAccountUnsupported;BoundAccount 对外行为不变 - 账号暂不支持缓存时不改动上游、保留意图,租约过期后重试(期间同一缓存的修改返回 409); 账号已删除时没有凭据可回滚上游,软删本地记录 - 修改前到期时间加上单次最长有效期与 1 小时容忍都已过去时上游缓存必已自行过期: 账号不支持缓存或上游回滚持续失败的意图不再重试,直接作废本地记录 - 测试夹具 GetForOwner 过滤已软删记录
ResponsesToAnthropicRequest only recognized opus/sonnet 5.5, so Haiku requests fell into the generic enabled+budget_tokens path (upstream 400) and lost signed thinking history (preserveThinking=false). Mirror the Messages-side rules: adaptive+medium default, none->disabled+low, temp/top_p/combo guards, forced tool_choice allowed. Also preserve Haiku55 thinking signatures in AnthropicToResponsesResponse and streaming state, and name the model correctly in the between_tools rejection.
feat(gateway): adapt Claude Haiku 5.5
feat(gemini): 支持显式上下文缓存,并完善 Vertex 与第三方 API Key 账号
完整保留临时不可调度规则作用范围测试与 Gemini 显式缓存测试;保留双方生产代码改动。
…cope feat(account): 临时不可调度规则新增作用范围 scope 选项
…ity-image-rate-limit Isolate Antigravity image model rate limits
…ool-result-images Preserve images from tool results
…ional-quota fix(quota): recognize international coding endpoints
…s-chat-fallback fix(gateway): retry rejected structured input through chat endpoint
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
将官方正式版 v0.2.16(01842576b3d5c1e2545b5a99ad555d36e28ed306)整合到本站下游,新增 Haiku 5.5、Gemini 显式缓存与 Vertex 能力、账号/模型冷却范围和分组译文,并采用官方 Sol 订阅长上下文计费修复及结构化输入安全回退。
17 处冲突已逐项审查。保留本站 Codex 身份与严格 STATE 借用、鹈鹕后台任务、提示词绑定、管理员原文、账号模型映射和控制台适配;容量继续由来源绑定的证据解析器决定,不写入 Sol 500k 或 Claude 的生成默认值。Haiku 纳入官方容量证据与 adaptive effort 目录。四个新增迁移保持上游字节,历史 SQL/checksum 不改写;源码 VERSION 修正为 0.2.16。Ent/Wire 已按合并后的定义生成。
验证:冲突相关的合成网关、计费、容量与 effort 用例通过;前端五个定向文件的 280 个用例、类型检查和冲突组件 ESLint 通过。隔离 PostgreSQL 18.1 验证升级、首次安装和重复启动,359 个历史迁移 checksum 与已有分组/用户/账号/普通 Key 夹具保持,新增四个迁移;缓存仓库生命周期通过。新上游原生 Responses 用例按本站终态元数据验证禁止重试和账号处罚。正常 PR 必需检查保留;未发真实模型请求。
整合复核与下游例外见
.downstream/upstream-review-v0.2.16.md,风险报告为review_required。通过正常检查后由既有 Reviewed Promotion 发布 v0.2.16-codexrip.1 并部署美国原服务器,生产状态由运维工作区交付证据单独记录。最终候选
89165c84185468decc3dcf0a1affbff92ca96ca9的 push/PR 正常必需检查与候选镜像均通过。普通 HTTP 401 作用范围用例使用生产策略标记,计数/探测入口在既有认证快速路径前处理显式模型级 401,并保留管理员原文记录。容量缺失/null 用例继续核对来源证据解析前的未知状态。Reviewed Promotion 已发起,发布与美国生产完成状态由运维交付证据单独记录。