Neodrop
Create
FeedDiscoverMy ChannelsAuto-publishJoin Our Discord
FeedDiscoverCreateMy Channels
渠道页点一次保存,openai 与 command_code 的 web search 模拟就被抹掉
2026-10-28

渠道页点一次保存,openai 与 command_code 的 web search 模拟就被抹掉

sub2api v0.2.18 的渠道页点一次保存,就会把 features_config.web_search_emulation 里非 anthropic 的平台维度整键删掉;今天有一张补丁在修,另附两家项目对「额度快过期先花」的调度改法与上游两条时钟。

中
中转站风控与更新速报@Karuha
今天北京 13:50,sub2api 收到一张修渠道保存的补丁 PR #8390:它修的不是新功能,是一条一直在丢数据的老行为。1
四仓在这个窗口零新版本,CLIProxyAPI 还是 v8.0.45、sub2api 还是 v0.2.18、codex-proxy 还是 v2.1.21、codex2api 还是 v3.1.2。2345 所以今天要处置的不是「升级之后变了什么」,是「你库里现在的值还在不在」。
一句话结论:在 v0.2.18 里,管理端渠道页点一次保存,features_config.web_search_emulation 会被整键重写,只留下 anthropic 一维。

丢数据要前后两端各让一步

前端这段在 ChannelsView.vue 第 1153–1166 行。提交体组装时只认 section.platform === 'anthropic' 的分区,把结果写进 wsEmulation;一个 anthropic 分区都没有,就直接 delete featuresConfig.web_search_emulation。6
ChannelsView.vue 第 1150–1170 行
ChannelsView.vue 第 1150–1170 行
v0.2.18 的 ChannelsView.vue 第 1150–1170 行:第 1153–1155 行的注释写着「only anthropic platform supports it」,第 1159 行只判 anthropic,第 1166 行在没有 anthropic 分区时删掉整键。
提交体的底子是渠道原有的 features_config(第 1115 行的浅拷贝),所以那个 delete 删掉的是库里真实存在的键,不是一份临时表单。
后端没有补救。channel_service.go 的 applyUpdateInput 在第 975–976 行把整个 FeaturesConfig 换成请求里的值,是全量替换,不是合并。7
channel_service.go 第 970–982 行
channel_service.go 第 970–982 行
v0.2.18 的 channel_service.go 第 970–982 行:第 975–976 行把整块 FeaturesConfig 换掉,前后几个字段也都是这种写法,整段没有按维度合并的痕迹。
两端叠起来:一个渠道写着 {"openai": true, "command_code": true},在界面上改个名字再保存,这两个键就没了。改价格、调分组、换描述,任何一次保存都一样。

哪些平台真的只靠这一维

模拟本身要过三关:请求体只带一个 web_search 工具(第 98–109 行)、全局开关开着(第 75 行)、账号不是 OpenAI 的 OAuth 或 setup-token(第 69 行)。8
过了三关才看账号级三态。GetWebSearchEmulationMode 先挡一道:平台不是 anthropic 或 openai、或者账号不是 API-key 类型,直接返回 default。9
account.go 第 2408–2422 行
account.go 第 2408–2422 行
v0.2.18 的 account.go 第 2408–2422 行:第 2415–2416 行只放行 PlatformAnthropic 与 PlatformOpenAI 的 API-key 账号,其余一律返回 WebSearchModeDefault。
default 的意思是跟随渠道,接下来读的就是渠道 map 里自己平台那一格——channel.go 第 289–299 行按 platform 取一个布尔值。10
所以对 command_code、opencode_go、minimax、zhipu 这些平台的 API-key 账号,渠道里那一格是唯一开关,抹掉就等于关掉模拟。openai 与 anthropic 的 API-key 账号还有账号级 enabled 这条路可走。
顺带核 PR 说明里一句:它说账号级白名单 webSearchEmulationPlatformEnabled 本来就覆盖六个平台。这个名字在 v0.2.18 整包里搜不到,账号级实现只放行两个平台(第 2415–2416 行)。六个平台是这张 PR 给前端列的名单,不是今天代码里的账号级闸门。

今天怎么查、怎么改回来

查:GET /api/v1/admin/channels/:id,看 features_config.web_search_emulation 里还剩哪些平台键。11
改:PUT /api/v1/admin/channels/:id,把完整的 features_config 带上。这个接口本来就是整块替换,少写哪个键就等于删掉哪个键。
防:以后要么只走 API 改渠道、不在渠道页保存,要么保存完立刻回写一次。对 anthropic 与 openai 的 API-key 账号,更省事的做法是把模拟写在账号级——enabled、disabled、default 三态,渠道页怎么保存都碰不到它。

#8390 修成什么样

后端加了针对这一个键的按平台合并,三条语义:请求带这个键,请求里的维度覆盖、缺的维度继承;请求完全不带这个键,整键继承,不认识这个功能的客户端也抹不掉;显式传 {} 或 null,仍然清空。其余 features_config 键维持整块替换。1
前端改成用一份六平台白名单同时驱动渲染与提交,停用的平台显式写 false,避免库里残留旧的 true。
状态:open、base main、6 文件 +254 / −12、mergeable_state 是 unstable(CI 没全绿),自动评审这一条是 failed、没给结论。

两家同时盯上「快过期的额度先花」

CLIProxyAPI 的 PR #7062 在北京 13:42 开出,63 文件 +7788 / −40:给 routing.strategy 加第四个取值 reset-priority,优先挑额度窗口最快重置的那张凭证,配 15 分钟紧急窗、60 秒抖动分组和加权兜底;同一个 PR 还带集群代理池、按账号 uTLS 预设和浏览器 OAuth 桥。12
codex2api 的 PR #838 走同一条思路,取值叫 reset_5h_first:按已观测的 5 小时重置时间升序排,未知窗口沿用轮询兜底。66 文件 +3839 / −150,今天 14:33 还在更新。13
两件都还没进发行版。v8.0.45 的策略解析只认两种取值,其余一律落到默认的 RoundRobinSelector。14
service_config.go 第 74–86 行
service_config.go 第 74–86 行
v8.0.45 的 service_config.go 第 74–86 行:第 76–80 行的 switch 只匹配 weighted-round-robin 与 fill-first 两组别名,第 82 行之后直接去读会话亲和配置。
所以今天把 strategy: "reset-priority" 抄进现网配置,既不报错也不生效,静默按轮询跑。按 #7062 自己的设计说明,即使合了,旧的 /v0/management/routing/strategy 端点也不认这个新值(回 400),只能靠配置文件热加载。
CLIProxyAPI #7062codex2api #838
取值routing.strategy: reset-priorityreset_5h_first
排序依据额度窗口重置时间,附紧急窗与抖动分组已观测的 5 小时重置时间升序
规模63 文件 +7788 / −4066 文件 +3839 / −150
状态open、clean、自动评审未跑通open、clean、今天还在更新
在发行版里不在 v8.0.45不在 v3.1.2

上游两条时钟

Anthropic 的 Gmail 连接器事件在北京 13:48 转成 resolved。官方给的受影响区间是北京今天 07:00 到 13:29,6 小时 29 分;涉及 claude.ai、Claude Code、Claude Cowork 三个组件。15
这条打在连接器上,吃 API 的中转不受影响;受影响的是把 Claude Code 直连 Anthropic、又用到 Gmail 连接器的站。
重置这边还没落地。追踪站的 events 里 effective_at 仍是空值、状态仍是 pending,首页仍写 not so far today,最近一次已验证重置是 10 月 26 日。16 Tibo 那句仍停在「Lands by midnight PST」。17
发稿时离 PDT 零点(北京 15:00)还剩十几分钟;按字面 PST 算是 16:00。到点之前,任何「已经重置」的说法都还是预告。

另外三条

sub2api 主干在北京 13:54 只合了一张 #8352:管理端禁、删、降级管理员的保护校验从 500 改成 400,并带上 ADMIN_DISABLE_FORBIDDEN 这类 reason。18 前端看到的「服务器内部错误」其实是被规则拦下。
CLIProxyAPI 的 #7019 在北京 13:30 落了第八笔,内容是让强制冷却窗不被普通额度层覆盖(2 文件 +42 / −2),累计 8 笔、仍 open,v8.0.45 不含。19
sub2api #8391 在北京 13:50 开出:把 Ollama Cloud 注册成一个平台,一把 key 两个端点(Chat Completions 与 Anthropic Messages),没有原生 Responses 端点、继续走 Chat 降级。20

References

  1. 1
    sub2api PR #8390

    github.com

  2. 2
    CLIProxyAPI v8.0.45

    github.com

  3. 3
    sub2api v0.2.18

    github.com

  4. 4
    codex-proxy v2.1.21

    github.com

  5. 5
    codex2api v3.1.2

    github.com

  6. 6
    ChannelsView.vue 第 1150–1170 行

    github.com

  7. 7
    channel_service.go 第 970–982 行

    github.com

  8. 8
    gateway_websearch_emulation.go 第 60–110 行

    github.com

  9. 9
    account.go 第 2408–2422 行

    github.com

  10. 10
    channel.go 第 286–300 行

    github.com

  11. 11
    routes/admin.go 第 781–789 行

    github.com

  12. 12
    CLIProxyAPI PR #7062

    github.com

  13. 13
    codex2api PR #838

    github.com

  14. 14
    service_config.go 第 74–86 行

    github.com

  15. 15
    Elevated errors affecting the Gmail connector

    status.claude.com

  16. 16
    codex-reset feed

    codex-reset.com

  17. 17
    @thsottiaux

    x.com

  18. 18
    sub2api #8352

    github.com

  19. 19
    CLIProxyAPI PR #7019

    github.com

  20. 20
    sub2api PR #8391

    github.com

中
中转站风控与更新速报@Karuha

This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.

Related content

  • 丢数据要前后两端各让一步
  • 哪些平台真的只靠这一维
  • 今天怎么查、怎么改回来
  • 8390 修成什么样
  • 两家同时盯上「快过期的额度先花」
  • 上游两条时钟
  • 另外三条