
两件今天就能处置的事:v8.0.44 不把 previous_response_id 当会话键,只带它的续轮会换凭证;sub2api 的兼容入口把上游 410 原样透传,账号错误策略整层不跑。
previous_response_id。ExtractSessionInfo 里没有这个键。
sdk/cliproxy/session/info.go 第 782–806 行:这段读 conversation 对象(conv: 前缀,第 785–794 行)与 prompt_cache_key(pck: 前缀,第 796–806 行),pck 优先于 conversation。整份文件搜不到 previous_response_id。1* prompt_cache_key、conversation.id、metadata.session_id 这一类3。previous_response_id 的续轮,这些都没有。它掉到兜底那层:先把请求开头几条消息算成指纹,去做「最长公共前缀」匹配,再退回旧的派生哈希4。previous_response_not_found,提示「把完整对话重发一遍,不要带 previous_response_id」5。codex_executor_execute.go 第 67 行、codex_executor_stream.go 第 69 行、xai_executor_request.go 第 103 行6。prompt_cache_key。prompt_cache_key(任意稳定字符串,同一段对话保持不变)、conversation(字符串或 {"id": …})、metadata.session_id。routing.session-affinity 打开。打开之后,同一会话的后续请求才会继续走同一张凭证,session-affinity-ttl 默认 1 小时。mergeable 为 clean9。session_affinity_response_id 的元数据键;在插件执行器里从非流式 body 与 SSE 的 response.completed 抓 response.id;绑定成功时用 SetAliases 把「上一条会话键」和「response:<id>」一起指到同一张凭证;ExtractSessionInfo 里认 previous_response_id,前缀 response:10。
af04dc5 的 sdk/cliproxy/session/info.go 第 690–706 行:第 693 行注释写明这是给 Responses 续轮用的,第 694–697 行从顶层或嵌套的 request 取 previous_response_id,第 700 行拼成 response: 前缀后直接返回。这段插在「OpenAI thread」判定之后,所以带 thread_id 的请求仍先走线程那条。10* SessionCache 里,Home 那侧不知道这个 response id 属于哪个会话。response.id 出现在后一行时会被提前标成「已抓取」;插件按块投递、块内没有换行时,缓冲会一直涨。prompt_cache_key 就能把这件事按住,而且这键在 v8.0.44 里已经生效。previous_response_id 删掉却不重建上下文,18 文件 +1255/−13,10-17 开到现在仍是 open12。base_url 还指着旧域名,上游回 410 Gone,body 里写「Service moved: set your base URL to https://…」。/v1/messages 回 502,/v1/chat/completions 与 /v1/responses 把 410 和上游原文原样吐给客户端。shouldFailoverUpstreamError 只有 401、403、429、529 和 ≥500 这几种,410 不在里面13。
backend/internal/service/gateway_forward.go 第 42–58 行:第 47 行是 shouldFailoverUpstreamError 的定义,第 49 行列出 401/403/429/529 四个码,第 52 行用 statusCode >= 500 兜住 5xx。410 两条都不满足。13* 
backend/internal/service/gateway_forward_as_chat_completions.go 第 150–184 行:第 158 行判是否换号,命中才在第 159 行记 ops 事件、第 172 行调 HandleUpstreamError。没命中就直落第 181 行 writeGatewayCCError(mapUpstreamStatusCode(...)),第 182 行返回错误。这一支既不记 ops,也不调账号策略。14* mapUpstreamStatusCode 只做一件事:≥500 抬成 502,其余原样15。410 就这样出去了。/v1/responses 那条一样,同一处判断在第 193 行。/v1/messages 是另一种结果handleErrorResponse。它在判换号之前就先调一次 HandleUpstreamError,账号级规则(自定义错误码、临时不可调度)因此有机会生效。applyErrorPassthroughRule 先匹配全局透传规则,没命中再按状态码给文案,未知 4xx 一律落 502「Upstream request failed」17。base_url 改成上游给的新域名,这是根因,改完 410 就消失。reset_observed,验证状态却还停在 pending26。prompt_cache_key、conversation 或 metadata.session_id。一个都没有,就补一个稳定的,再把 routing.session-affinity 打开。base_url 还指着旧域名。有就今天改掉,这是一次性动作,改完 410 不会再回来。/v1/messages 与 /v1/chat/completions 各打一次同一个坏号,确认你现在看到的是 502 还是裸 410——两者的处置方式不一样。github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.claude.com
status.cloud.google.com
codex-reset.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.