shaw
db3bd9971e
refactor(repository): 纯移动拆分 usage_log_repo.go(4701→212行)
2026-07-08 08:49:21 +08:00
shaw
4d23ad4bac
refactor(service): 纯移动拆分 openai_gateway_service.go(4872→1095行)
2026-07-08 08:49:21 +08:00
shaw
50043b1176
refactor(service): 纯移动拆分 setting_service.go(5471→263行)
2026-07-08 08:49:20 +08:00
shaw
084d26cbd2
refactor(service): 纯移动拆分 gateway_service.go(7294→1289行)
2026-07-08 08:49:20 +08:00
jjaw
6ae5fc31b3
fix(admin): gate scheduler score calculation
2026-07-08 06:58:35 +08:00
zhengshan and Claude Opus 4.8
3866da508f
fix(ratelimit): Anthropic 无 reset 头的 429 也进入兜底冷却
...
此前 Anthropic 429 若响应头无窗口重置时间(如 Extra usage required),
被视为"非真实限流"直接跳过标记。后果:账号永不冷却,调度器让每个
请求反复撞同一批持续 429 的账号——failover 预算烧尽后客户端稳定
收到 429(生产实测:一次请求 1.3s 内连换 4 账号全 429,而 DB 中
这些账号的限流状态毫无更新)。
改为与其他平台一致走 apply429FallbackRateLimit 秒级兜底回避:
- 默认 5s,管理端 RateLimit429CooldownSettings 可调 1~7200s
- 管理端关闭该设置即恢复旧行为(不标记)
- 日志 reason 标记为 anthropic_no_reset_time 便于运营区分
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-07 23:19:23 +08:00
shaw
d754be0d8e
refactor(gateway): 抽取 CC forwarder 公共管线并拆分两大 service 文件
...
PR #3802 遗留项:三个 CC forwarder(raw 直转 / responses 回退 / messages
回退)间约 85% 重复的 HTTP 管线与 SSE 循环骨架收敛到新文件
openai_gateway_cc_pipeline.go,messages / chat_completions 两条主路径中
逐字相同的错误处理块一并接入。各路径有意保留的行为差异(GLM effort
归一化、fast policy 适用范围、ClientDisconnect 语义、Grok 分支等)留在
调用方,未强行统一。
同时对两个最臃肿的网关文件做纯移动拆分(零语义变化,逐字节校验):
- openai_gateway_service.go 7821→4872 行:
调度 → openai_gateway_scheduling.go
passthrough → openai_gateway_passthrough.go
用量/计费/codex 快照 → openai_gateway_usage.go
- gateway_service.go 10912→7294 行:
调度 → gateway_scheduling.go
Anthropic APIKey 直通 → gateway_anthropic_passthrough.go
Bedrock → gateway_bedrock.go
回归保障:全部搬迁块与 HEAD 逐字节 diff 一致;留存文件经"HEAD 减去搬迁
范围"重构比对,差异仅为 goimports 移除的孤儿 import;定向单测
(fallback/raw/cyber/grok/transport/调度/用量/广域 Forward-Handle 扫描)
全绿;另经独立对抗审计确认零行为差异。
2026-07-07 22:14:46 +08:00
li
2dd2be9922
fix(compact): 识别 /v1/responses body 中的 compaction_trigger 信号
...
Codex remote compact v2 可以把 compact 触发器作为 input item
(type=compaction_trigger)嵌入普通 POST /v1/responses 请求体,
而非直接调用 /v1/responses/compact。此前 isCompactRequest 仅检查
URL path 后缀,导致 body-signal 形式的 compact 请求被当作普通
Responses 处理——上游路径、模型映射、body 归一化全部错误,Codex
收到非 compact 响应后报 "expected exactly one compaction output
item, got 0",长会话无法继续。
新增 hasCompactionTriggerInInput 检测 input 中的 compaction_trigger
item,命中后提升为 compact 请求并改写 URL path,使后续所有
isCompactRequest 分支(模型映射、body 归一化、上游 URL 构建)
自动生效。
Fixes #3777 (part 1: body-signal routing)
2026-07-07 21:23:02 +08:00
shaw
dad92488e5
fix(messages): 修复 /v1/messages CC 回退的错误处理旁路并补齐流式测试
...
针对 #3795 合并后审计发现的问题:
- 非 failover 上游错误分支改走共享 handleAnthropicErrorResponse:恢复
ops 上游错误记录、错误透传规则、cyber_policy 检测与按状态码映射的
错误 type(400→invalid_request_error 等);删除随之失效的
mapUpstreamStatusToAnthropicStatus
- 流式读错误对齐 forwardResponsesViaRawChatCompletions:scanner 出错时
不再 finalize(不再补发 message_stop 把截断伪装成正常完成),返回
stream usage incomplete 错误
- sawDone 由死变量改为与兄弟一致的无 [DONE] 哨兵 debug 日志
- 补充 fast policy 在本路径有意省略的说明注释
- 新增 8 个单测:流式收尾闭块、tool_call 分片聚合、length→max_tokens、
空流补帧、非 failover 400 走共享处理器、读错误不伪造收尾、
Responses 账号门控回归、非流式转换
2026-07-07 20:59:41 +08:00
Wesley Liddick
4bcb13f77f
Merge pull request #3786 from creamtea47/codex/openai-fast-force-priority
...
add force priority fast policy action
2026-07-07 20:45:45 +08:00
Wesley Liddick
9643382bd3
Merge pull request #3795 from fengshao1227/fix/messages-inbound-chat-completions-fallback
...
fix(messages): /v1/messages 入站支持不兼容 Responses API 的 OpenAI 上游
2026-07-07 20:45:14 +08:00
Wesley Liddick
af4b75a77c
Merge pull request #3794 from fengshao1227/fix/image-gen-namespace-permission-bypass
...
fix(image): 识别 Codex namespace image_gen 工具声明以拦截生图请求
2026-07-07 20:42:43 +08:00
Wesley Liddick
c7249a54ac
Merge pull request #3793 from heathermhuang/codex/grok-video-text-fallback
...
fix: route text-only Grok video 1.5 requests
2026-07-07 20:22:44 +08:00
shaw
b5604afd3d
test(batch-image): 集成测试适配 ReplaceBatchImageItemsForJob 的 indexing 状态守卫
...
守卫要求 job 处于 indexing 状态才允许重建 item 表;原测试在 created
状态下直接调用被 409 拒绝。改为先断言非 indexing 状态的冲突行为,
再经 created→submitted→indexing 合法链推进后执行原有断言。
2026-07-07 20:13:28 +08:00
CHOS1N
2fd3539527
Merge remote-tracking branch 'upstream/main' into codex/add-response-format-compat
2026-07-07 20:05:50 +08:00
liminge and Claude Fable 5
13e773ef5e
feat: Codex 客户端模型清单(manifest)透传接口
...
背景:Codex CLI / Codex App 会从 provider 的 GET {base_url}/models?client_version=...
(自定义 provider 模式)或 GET /backend-api/codex/models(chatgpt_base_url 模式)
刷新模型选单,期望 ChatGPT Codex manifest 格式({"models":[{slug,...}]})。
sub2api 此前只提供 OpenAI 兼容格式的 /v1/models,Codex 客户端解析失败后静默
回落到本地缓存,导致指向 sub2api 的 Codex 客户端模型选单永久冻结在切换
provider 当天的状态,新模型(如 gpt-5.6 系列)永远不会出现。
方案:新增 manifest 透传——用组内可调度 OAuth 账号的凭据向
chatgpt.com/backend-api/codex/models 实时转发请求,响应体与 ETag 原样透传。
不在网关侧解析或维护模型清单:manifest schema 随 Codex 客户端版本演进,
透传保证网关无需跟进 schema 变化,且返回的始终是账号真实的模型权限
(区别于静态 DefaultModels 的"理论列表")。
路由:
- GET /backend-api/codex/models(新增)
- GET /v1/models 带 client_version 查询参数且组平台为 openai 时分发到
manifest 透传(client_version 是 Codex 客户端的天然指纹,普通 OpenAI
客户端不携带);其余请求保持原有 OpenAI 格式行为不变。
上游失败时按 fast-fail 返回错误,不伪造列表;Codex 客户端自身会回落缓存。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-07 19:49:40 +08:00
xlplbo
27e29f0562
feat(apicompat): 添加 tool_search 支持,增强工具调用处理逻辑
2026-07-07 19:19:35 +08:00
shaw
80a229bce5
fix(batch-image): 修复审计发现的计费死锁、状态机与队列原子性缺陷
...
修复 PR #3768 批量图像 MVP 合并后审计报告中的全部问题:
结算与计费(高危):
- 所有 SETTLEMENT_* 失败(超冻结/计数非法/manifest 冲突/定价缺失/扣费失败)
统一计入 retry_count 并在耗尽时释放冻结转 failed,消灭 settling 无限
requeue 导致的冻结余额永久锁死
- 耗尽出口的释放指纹统一为 RequestHash,与 processor/Cancel/recovery 一致;
release 遇同 request id 指纹冲突视为幂等成功,治愈历史毒消息
- 管理端校验 hold_multiplier >= discount_multiplier,定价快照对存量脏数据钳制
- 释放前校验 per-job hold claim(dedup+归档表),杜绝幻影释放
索引对账(高危):
- provider 输出与提交 custom_id 集对账:未知条目丢弃并记事件,
漏项补 PROVIDER_RESULT_MISSING 失败行,保证 success+fail == item_count
提交与恢复(高危):
- 提交前转 uploading 并在 provider.Submit 期间心跳刷新 updated_at;
恢复扫描改为原子复核(FailStaleUnsubmittedBatchImageJob),
消灭慢提交被误杀退款而上游任务照常计费的孤儿场景
- 上游任务创建成功但本地状态推进失败时,尽力取消上游并清理输入
- recovery 释放失败时入队交由 worker releaseTerminalHold 兜底重试
队列与并发(中危):
- Enqueue(SetNX+LPush)与 Reserve(BRPop+ZAdd)均改为 Lua 原子脚本,
消灭崩溃窗口导致 job 脱离队列、被 7 天 inflight 键锁死
- 锁冲突按 LockConflictDelay 重新入队(原直接丢弃需等 10 分钟 stale 恢复)
- 处理期间心跳:active zset 续期(ZAddXX 防幽灵成员)+ 锁 TTL 续期
- ReplaceBatchImageItemsForJob 增加 indexing 状态守卫,防掉队 worker 重写账目
存量回归(中危):
- image-only 定价条目(仅图片价无 token 价)恢复 token 计费 fail-closed,
不再按 $0 计费;图片计费路径不受影响
- 鉴权余额门槛恢复 balance <= 0 语义,MinimumBalanceReserve 不再作硬 403
加固:
- ZIP max_items 钳制到管理员上限;Submit 补齐 Platform==Gemini 校验;
gemini downloadUri 跟随前做 host 白名单校验
- 批量客户端改用共享 httpclient(拨号/TLS/响应头超时有界)
- 审计点名的忽略错误(MarkDownloaded/SettlementFailed/AppendEvent 等)改为记日志
2026-07-07 18:53:56 +08:00
li
69d02d2036
fix: 补齐 failover 路径的 appendOpsUpstreamError 日志
...
审查发现 error 路径缺少 appendOpsUpstreamError 和 upstreamDetail
记录,与 forwardResponsesViaRawChatCompletions 不对称。
2026-07-07 17:35:09 +08:00
li
5c0e580fbe
fix(messages): /v1/messages 入站支持不兼容 Responses API 的 OpenAI 上游
...
ForwardAsAnthropic 此前无条件把 Anthropic Messages 转为 Responses
格式发往 /v1/responses,导致只支持 /v1/chat/completions 的第三方
OpenAI 兼容上游(京东云、DeepSeek、Kimi、GLM 等)全部 400。
在入口增加与 ForwardAsChatCompletions 对称的 ShouldUseResponsesAPI
分流:APIKey 账号 + 上游不支持 Responses 时,改走新建的
forwardAnthropicViaRawChatCompletions,链式复用全部已有转换桥
(Anthropic→Responses→CC 请求,CC→Responses→Anthropic 响应),
不新建转换函数。
Fixes #3735
2026-07-07 17:23:18 +08:00
li
a02700c16f
fix(image): 识别 Codex namespace image_gen 工具声明以拦截生图请求
...
分组 allow_image_generation=false 时,Codex /image 技能通过
namespace 工具声明(type=namespace, name=image_gen)和 Responses
Lite 的 input additional_tools 绕过了现有生图意图检测——现有逻辑
只识别 tools[].type == "image_generation" 这一种形式。
在 gjson 版(openAIJSONToolsContainImageGeneration)和 map 版
(hasOpenAIImageGenerationTool)检测中增加 namespace image_gen
识别;同时扫描 input[].type == "additional_tools" 中嵌套的工具
声明,覆盖 Responses Lite 格式。
Fixes #3608
2026-07-07 16:58:48 +08:00
Heatherm Huang
3b2099350e
fix: route text-only grok video requests
2026-07-07 16:44:20 +08:00
Wesley Liddick
44ab690a01
Merge pull request #3768 from Turtle-Li/feature/batch-image-foundation
...
feat: add batch image generation MVP
2026-07-07 16:32:45 +08:00
xlplbo
75fb3c41c2
fix(apicompat): responses→chat 桥支持 custom 工具,修复 Codex exec 丢失
...
Codex 0.14x 的核心执行工具 exec 是 type=custom(freeform)工具,
responsesToolsToChatTools 丢弃所有非 function 工具,导致模型工具列表中
没有 exec、无法执行任何命令;SSE 序列化层 responsesItemWire 也缺少
custom_tool_call 分支,即使产出该类型 item,call_id/name/input 也会被
白名单剥离。
- custom 工具降级为单一 input:string 参数的 function 工具
- 回程(非流式+流式)按名字还原 custom_tool_call 项/事件
- 历史 custom_tool_call / custom_tool_call_output 项转换(此前被跳过)
- responsesItemWire 补 custom_tool_call 分支
- tools 全部被丢弃时不再转发 tool_choice(修复上游 400
"'tool_choice' is only allowed when 'tools' are specified")
feat(apicompat): chat 桥补齐 tool_search/namespace/字符串工具声明
对齐参考实现(cc-switch transform_codex_chat.rs)的工具类型覆盖:
- tool_search → 固定 function 代理工具(query 必填/limit 可选),
历史项 tool_search_call/tool_search_output 一并转换
- namespace → 子 function 工具摊平为 <namespace>__<name>,
超 64 字符截断加 sha256 短哈希;历史项带 namespace 字段时同规则摊平
- tools: ["name"] 字符串简写按 custom 工具解析
fix(apicompat): 工具调用宣告延迟到类型可判定,兼容 name 迟到的上游
output_item.added 的 custom/function 判定依赖工具名。名字晚于首个分片
到达时,此前会按 function_call 宣告造成 added/done 项类型不一致。
改为存在 custom 工具且名字未到时延迟宣告,宣告时补发已累积的参数增量;
请求无 custom 工具时行为不变。
PR 标题与正文(可直接粘贴)
标题:fix(apicompat): responses→chat 桥丢弃 custom 工具导致 Codex 无法执行命令
正文:
## 问题
OpenAI APIKey 账号接入仅支持 /v1/chat/completions 的第三方上游
(DeepSeek/GLM/Kimi 等)时,Codex 0.14x 客户端文本对话正常,但无法执行
任何命令:exec 调用全部 "aborted",spawn_agent 派出的子智能体永远卡在
running,多轮后模型自述"环境无法执行文件系统命令"放弃。
## 根因
Codex 0.14x 的核心执行工具 exec 是 Responses API 的 custom(freeform)
工具,而非普通 function:
{"type": "custom", "name": "exec", "format": {"type": "grammar", ...}}
两处缺陷叠加:
1. `responsesToolsToChatTools` 丢弃所有非 function 工具
(chatcompletions_responses_bridge.go),模型工具列表中从未出现 exec;
2. SSE 序列化 `responsesItemWire` 按 item 类型白名单重组字段,无
custom_tool_call 分支,call_id/name/input 会被剥离
(responses_stream_event_wire.go)。
次生缺陷:工具全部被丢弃时 tool_choice 仍被转发,部分上游报 400
"'tool_choice' is only allowed when 'tools' are specified"。
## 改动
(三个提交的要点清单,见各提交说明)
设计与 cc-switch 的 Codex chat 转换层(transform_codex_chat.rs /
streaming_codex_chat.rs)对齐:custom 工具降级为 {"input": string}
function 工具;custom 调用的参数增量不可流式还原为自由文本,缓冲至
收尾一次性下发 custom_tool_call_input.delta/done。
## 测试
- 新增 17 个单元测试:请求工具转换、tool_choice 兜底、历史项转换、
非流式/流式回程还原、wire 序列化字段完整性、name 迟到宣告、命名摊平
- `go test ./internal/pkg/apicompat/...` 与 service 相关测试全绿
- 真机验证:Codex CLI 0.142.5 → 本桥 → GLM/DeepSeek 系 chat-only 上游,
exec 实际执行命令并多轮续作正常
## 影响面
仅影响 "APIKey 账号 + 判定不支持 Responses" 的 chat 直转路径:
- OAuth 账号与透传路径不经过本桥(透传为字节级原文转发)
- CC→Responses 反方向仅构造 ResponsesRequest,新增字段带 omitempty
且不赋值,序列化输出不变
- 探测逻辑未动,路由判定不变
- 共享类型改动均为增量容错(新字段 omitempty;UnmarshalJSON 只新增
字符串工具的解析成功路径)
2026-07-07 16:23:44 +08:00
li
fd64d07e61
fix(codex): 剥离续链 function_call item 的非法 item_* id
...
OpenAI OAuth 转发续链请求时,function_call 等 call-input 类 item 的
id 被客户端以 item_* 形式回放,但上游要求以 fc 开头,返回 400
"Expected an ID that begins with 'fc'",导致工具续链反复失败。
filterCodexInputWithOptions 在 PreserveReferences=true 路径下对
call-input 类 item(function_call/tool_call/local_shell_call 等)
增加 id 前缀检查:非 fc 开头即删除。output 类(function_call_output
等)的 id 无此约束,不动。
Fixes #3785
2026-07-07 15:54:55 +08:00
NellPoi
e979990bf9
add force priority fast policy action
2026-07-07 15:27:23 +08:00
Turtle_Li
a6023840f7
Merge remote-tracking branch 'origin/main' into feature/batch-image-foundation
...
# Conflicts:
# deploy/Dockerfile
2026-07-07 15:14:37 +08:00
Wesley Liddick
b5b0ea3460
Merge pull request #3708 from sweetcornna/fix/antigravity-401-self-heal
...
fix(antigravity): 网关转发默认走生产端点(修复一请求就 401/502、账号被 benched)
2026-07-07 15:12:29 +08:00
li
fa01aec80d
fix: 前缀全部加连字符,与 thinking_protocol.go 风格对齐
...
deepseek → deepseek-、moonshot → moonshot-、qwen → qwen-/qwen2-/qwen3-/qwen4-、
minimax → minimax-、llama → llama-/llama2-/llama3-、mistral → mistral-、
mixtral → mixtral-。避免无连字符前缀误伤假想的连写模型名。
2026-07-07 15:00:00 +08:00
Wesley Liddick
87bdaf8e60
Merge pull request #3780 from fengshao1227/fix/gateway-parse-error-observability
...
fix(gateway): 记录请求体解析失败的真实原因,不再吞错
2026-07-07 14:37:46 +08:00
Wesley Liddick
a98397adbb
Merge pull request #3778 from fengshao1227/fix/websearch-emulation-history-blocks
...
fix(websearch): 剥离历史消息中上游不接受的 web search 块
2026-07-07 14:33:16 +08:00
Wesley Liddick
aff87d9497
Merge pull request #3776 from alfadb/fix/openai-compact-usage-sse-detection
...
fix(openai): 避免 JSON 响应被 SSE 文本误判导致用量丢失
2026-07-07 14:31:52 +08:00
li
9b75c7b76c
fix(scheduler): 改用异族厂商前缀黑名单,兼容渠道级模型映射
...
自审发现白名单守卫有误伤面:渠道级模型映射在账号选定之后才改写
请求体模型名,调度过滤看到的是改写前的原始别名。若按 Codex 白名单
判定,「渠道映射自定义别名 → gpt-5.x + 空映射 OAuth 账号」的既有
部署会被误判为 model_not_found。
改为保守 fail-open 黑名单:空映射默认仍允许,仅排除 deepseek/glm/
kimi/qwen/gemini/grok 等明确异族厂商前缀(Codex 上游绝无可能服务,
透传必然换来不可重试 400)。前缀分类先例见 ResolveThinkingProtocol。
2026-07-07 14:19:58 +08:00
Wesley Liddick
571e0b8132
Merge pull request #3774 from heathermhuang/codex/grok-composer-image-bridge
...
fix: bridge Grok Composer image inputs
2026-07-07 14:13:28 +08:00
li
2a3dcb499f
fix(scheduler): 空 model_mapping 的 OpenAI OAuth 账号不再吸收全部模型
...
空映射此前一律视为「允许所有」,导致混合部署下请求非 OpenAI 模型
别名(deepseek-v4 等)时,OAuth 账号可能被调度选中;转发阶段对未知
模型原样透传,Codex 上游返回不可重试的 400,请求无法 failover 到
真正支持该模型的 API Key 账号。
IsModelSupported 对空映射的 OpenAI OAuth(未开透传)账号改为与转发
归一化对齐的判定 isOpenAIOAuthServableModel:可归一到已知 Codex 模型
集合(含 gpt-image-*、推理后缀、别名拼写)或 claude-* dispatch 系列
才视为可服务。API Key/显式映射/透传/其他平台语义不变。
Fixes #3662
2026-07-07 14:06:21 +08:00
li
40c563c4ae
fix(gateway): 记录请求体解析失败的真实原因,不再吞错
...
400 "Failed to parse request body" 此前丢弃底层错误,无法区分
JSON 真非法、还是 body 被截断/被中间件提前消费。
- 服务层 invalid json 错误增补 len/offset/非法字符信息
(仅诊断元数据,不含 body 内容,可安全 wrap);
- handler 层新增 logRequestBodyParseFailure,向服务端日志输出
底层错误 + body 长度 + 转义后的 head/tail 片段(各 256B),
客户端响应文案保持不变;
- 接入全部 9 处入站解析点(messages/count_tokens/responses/
chat_completions/embeddings,Anthropic 与 OpenAI 网关)。
Fixes #3715
2026-07-07 13:53:39 +08:00
li
867616fca8
fix(websearch): 剥离历史消息中上游不接受的 web search 块
...
Web Search 模拟合成的 server_tool_use / web_search_tool_result 块
(srvtoolu_ws_ 前缀)被客户端回传到后续 /v1/messages 历史后,
上游一律 400(GLM 等第三方兼容上游只接受
text/thinking/image/tool_use/tool_result),会话从此卡死。
新增 FilterWebSearchHistoryBlocks 预过滤:
- 模拟伪造块对所有上游无条件剥离;
- 真实 web search 块仅对 passback-required 协议族剥离
(复用 ResolveThinkingProtocol),不误伤官方 Anthropic 会话;
- 接入 Anthropic 通用转发与 API Key 透传两条路径的既有 pre-filter 区。
Fixes #3677
2026-07-07 13:41:40 +08:00
alfadb
438f17be5e
fix(openai): avoid compact usage loss from json sse heuristic
...
Replace the substring-based data:/event: SSE heuristic in
handleNonStreamingResponse with bodyHasSSEFraming, a line-level check
that only matches when a physical line starts with the SSE data:/
event: field names. This prevents OAuth compact JSON responses whose
output text merely contains the literal substrings "data:" or
"event:" from being misrouted into handleSSEToJSON, which was
causing usage to be recorded as zero even though the JSON body itself
carries a valid top-level usage object. Content-Type: text/event-stream
detection and genuine SSE body handling are unaffected.
2026-07-07 13:04:28 +08:00
Turtle_Li
83d7b0e440
fix: isolate duplicate item integration test
2026-07-07 11:24:04 +08:00
Heatherm Huang
c34db70a88
fix: bridge grok composer image inputs
2026-07-07 10:55:07 +08:00
Turtle_Li
5494261902
Merge remote-tracking branch 'origin/main' into feature/batch-image-foundation
...
# Conflicts:
# .github/audit-exceptions.yml
2026-07-07 10:53:17 +08:00
Turtle_Li
aff148167c
fix: address batch image ci failures
2026-07-07 10:50:36 +08:00
Wesley Liddick
baadb22682
Merge pull request #3761 from alfadb/fix/responses-alias-normalization
...
修复 OpenAI Responses compact 端点归一化
2026-07-07 10:37:08 +08:00
alfadb
ddd63a8402
test: cover endpoint wildcard edge cases
2026-07-07 10:20:23 +08:00
alfadb
75e3089496
fix: normalize inbound endpoints from raw request path
2026-07-07 10:20:23 +08:00
alfadb
2fb212b7d6
fix(openai): 区分 responses compact 入站端点
...
/v1/responses/compact 及其别名路径(/responses/compact、/openai/v1/responses/compact、
/backend-api/codex/responses/compact 等,含嵌套子路径)是独立的客户端端点,
新增 EndpointResponsesCompact 常量并单独归一化,不再与根 /v1/responses 混同。
根 Responses 别名(/responses、/backend-api/codex/responses 等)仍归一到
EndpointResponses。NormalizeInboundEndpoint 优先匹配 compact 分支,避免根路径
前缀提前命中。DeriveUpstreamEndpoint 在 inbound 已为 compact 但原始路径无法
派生后缀时,回退到 compact 而非根 upstream。
2026-07-07 10:20:23 +08:00
shaw
7650cce5a4
fix(redis-index): harden index-driven cleanup introduced in #3762
...
- 启动清理覆盖 score 已过期的索引成员,并新增 marker 门控的一次性
遗留 wait 键清扫,消除重启后幻影等待计数挤占 maxWait 的问题
- UMQ 争锁失败路径回填观测到的持有者锁索引(PTTL=-1 异常锁以已到期
候选入索引),恢复被 SCAN 删除后丢失的孤儿锁兜底完整性
- 后台清理同时回收 account 与 user 两个活跃索引的到期候选,修复
user 索引过期成员无回收路径导致的无界增长
- acquire/incrementWait Lua 脚本返回 {result, now},索引写复用脚本
内 Redis 时间,热路径每次操作减少一次 TIME 往返;清理循环外提
now 并批量写索引
- 删除无生产调用方的 GetActiveAccountLoadMap 及配套死代码
- 索引维护失败增加 warn 日志,不再静默丢弃
- 移除根目录工单文档 REDIS_SCAN_ARCHITECTURE_OPTIMIZATION.md
2026-07-07 10:04:38 +08:00
shaw
7c8e13208b
style: replace interface{} with any per golangci-lint gofmt rewrite rules
2026-07-07 09:32:15 +08:00
shaw
d37d216f9d
Merge remote-tracking branch 'origin/main' into pr-3762
...
# Conflicts:
# backend/internal/repository/concurrency_cache.go
# backend/internal/repository/concurrency_cache_integration_test.go
2026-07-07 09:22:44 +08:00
Wesley Liddick
a862eac1d8
Merge pull request #3758 from catoncat/fix/test-oauth-codex-headers
...
fix: add missing Codex CLI headers for OAuth account test
2026-07-07 08:34:18 +08:00