
sub2api 的指纹采集站证书已过期 13 天,采集恒为 0 且页面不提示;OpenAI 号仍绑不了指纹档位,另有两条待合补丁会把 Codex 出站身份改回 codex-tui,并给请求体与 SSE 加一组新上限。
tls.sub2api.org:8090,回给来访客户端一份 ClientHello 指纹。运维拿它对照自己出站的握手像不像真客户端。$ echo | openssl s_client -connect tls.sub2api.org:8090 -servername tls.sub2api.org 2>/dev/null \
| openssl x509 -noout -dates -subject
notBefore=Jul 22 18:05:41 2026 GMT
notAfter=Oct 20 18:05:40 2026 GMT
subject=CN=tls.sub2api.org
$ curl -s -o /dev/null -w "%{http_code} %{errormsg}\n" https://tls.sub2api.org:8090/
000 SSL certificate problem: certificate has expired$ curl -sk https://tls.sub2api.org:8090/ | head -c 400
{"alpn_protocols":[...],"cipher_suites":[...],"curves":[...],"extensions":[...],
"http2":{...},"ja3_hash":"...","ja3_raw":"...","ja4":"...","model":"...","id":"..."}ja3_raw、ja3_hash、ja4、http2、cipher_suites、curves、extensions、alpn_protocols 都在。curl -k 抓一份下来存着,别管校验。EditAccountModal.vue 第 2874 行的注释是「配额控制(Anthropic OAuth/SetupToken:亲和 + 窗口费用 + 会话 + RPM 等)」,第 2876 行的 v-if 把整块内容限定在 platform === 'anthropic' 且类型为 oauth 或 setup-token 的账号上3。
frontend/src/components/account/EditAccountModal.vue 第 2853–2902 行(sub2api v0.2.19)。第 2876 行的 v-if 开出的这一块一直延伸到下方,配额控制、会话上限和 TLS 指纹开关都装在里面,OpenAI 号整块不渲染3。account.go 第 2483 行的 IsTLSFingerprintEnabled() 第一句就判 IsAnthropicOAuthOrSetupToken(),不符合的账号直接返回 false4。ResolveTLSProfile 见到 false 就返回 nil。所以就算绕过面板,用管理接口把 enable_tls_fingerprint 和 tls_fingerprint_profile_id 写进 OpenAI 号的凭据,出站也拿不到 profile5。doOpenAIUpstream 走的是 httpUpstream.Do,签名里没有 profile 参数;带 profile 的是 useTLSFallback 那一支,只服务账号测试与计费探测6。crypto/tls 默认会报 h2,单这一个字段就足以把指纹区分开。codex_fingerprint_mode 取 off、device、session、full 四档,配 codex_fingerprint_seed,改写的是 x-codex-installation-id、session-id、thread-id 这些标识,走的是 HTTP 头,跟握手无关9。#8487 今天凌晨 00:35 开出,23 个文件,+357/−161,base 是 main,合并状态 unstable10。request.go 第 271 行写着 CodexDefaultOriginator = CodexCLIOriginator,也就是 codex_cli_rs;第 275 行起的 NormalizeCodexClientIdentityToCLI 会把任何 codex-tui 身份连同 UA 首段一起改成 CLI,顺手删掉尾部的 (name; version) 组11。#8487 新增 maxOpenAIPoolRecoveryRounds = 3 与 openAIPoolRecoveryBaseDelay = 2 * time.Second,等待按轮线性递增,受既有的 maxRequestScopedRetryDelay = 8 秒封顶13。
backend/internal/handler/failover_loop.go 第 37–87 行(PR #8487 头分支)。第 59 行 maxOpenAIPoolRecoveryRounds = 3、第 62 行 openAIPoolRecoveryBaseDelay = 2 * time.Second,第 65–78 行的注释写明恢复只覆盖请求级瞬时故障,凭证失效、429 限额与 4xx 都在范围之外13。retry-after 就优先用它的值。ErrNoAvailableAccounts,客户端拿到 503,只能自己重来14。gateway.disable_codex_identity_enforcement 设成 true,网关不再统一改写身份,退回「按最终 UA 配对 originator」。这个值在服务构造时发布成进程级快照,改完要重启进程。#8484 今天 23:17 开出,98 个文件,+4045/−261,合并状态 clean,base 也是 main15。| 配置键 | v0.2.19 现值 | 补丁默认值 |
|---|---|---|
gateway.request_body_memory_budget_bytes | 无此键 | 1 GiB16 |
gateway.request_body_read_timeout_seconds | 无此键 | 120 秒16 |
gateway.downstream_write_timeout_seconds | 无此键 | 120 秒16 |
gateway.max_line_size | 500 MiB | 40 MiB16 |
gateway.sse_queue_max_bytes | 无此键 | 8 MiB16 |
gateway.sse_event_max_bytes | 无此键 | 0,沿用单行上限16 |
gateway.sse_event_max_lines | 无此键 | 409616 |

backend/internal/config/config.go 第 2525–2574 行(PR #8484 头分支)。第 2541–2543 行是 1 GiB 请求体预算与两个 120 秒,第 2564 行把 max_line_size 从 500 MiB 改成 40 MiB,第 2565–2567 行是队列 8 MiB、单事件 0、单事件 4096 行16。Retry-After,单个请求超体积仍然回 413。压缩后的请求体另封顶 64 MiB,超了直接拒,不做截断。max_line_size 从 500 MiB 降到 40 MiB;sse_event_max_bytes 取 0 时直接沿用这个单行上限;sse_event_max_lines 用 4096 兜没有空行的短行流。data: 里,40 MiB 并不难超。| 仓库 | 最新版本 | 发版时刻(北京) | 本窗口 |
|---|---|---|---|
| CLIProxyAPI | v8.0.51 | 11 月 2 日 01:12 | 无新版17 |
| sub2api | v0.2.19 | 10 月 28 日 18:16 | 无新版18 |
| codex-proxy | v2.1.22-beta.7ae8044(预发布) | 11 月 2 日 20:24 | 窗口之前,无新版19 |
| codex2api | v3.1.2 | 10 月 28 日 04:40 | 无新版20 |
StreamID 索引,StreamID 由 next.Add(1) 自增,可猜。v8.0.51 的回调层第 66 行是 h.modelStreams.read(ctx, req.StreamID),第 87 行是 h.modelStreams.close(req.StreamID),两处都不看调用方是谁30。
internal/pluginhost/host_model_stream_callbacks.go 第 11、44–90 行(CLIProxyAPI v8.0.51)。第 66 行按 req.StreamID 取分片、第 87 行按同一个 ID 关流,两个函数体里都没有校验调用方身份的语句30。hostCallbackPluginIDFromContext(ctx) 与 instance,对不上就报 host callback ID does not belong to the calling plugin instance。tls.sub2api.org:8090 续期,把到期告警盯到 8090 这一张。今晚先用 curl -k 存一份基线指纹。codex_fingerprint_mode 与 codex_fingerprint_seed。gateway.disable_codex_identity_enforcement: true,重启进程后网关退回按最终 UA 配对。#8484 合了之后上限是 40 MiB,队列另有 8 MiB。github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.anthropic.com
status.cloud.google.com
codex-reset.com
opentherank.com
github.com
github.com
github.com
github.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.