Fast(高速)档 — 判定、存储与线路#
本文记录 fast 功能的代码摆放、数据来源与判定规则。姊妹文档:
thinking-effort.md(同为"模型能力 → UI 开关"的声明式
子系统,结构刻意对齐)。
1. Fast 是什么#
聊天输入框 + 菜单里的"高速"开关。开了之后,请求按厂商协议带上高速档参数:
| 家族 | 线上形态 | 计费事实 |
|---|---|---|
| GPT 5.4 / 5.5 / 5.6 系 | 请求体 service_tier: "priority"(OpenAI 叫 priority processing) |
Codex 订阅端把它列成每模型的档("1.5x 速度、增加用量");哪些模型有这个档直接来自 service_tiers(§2.1),不靠猜 |
| Claude Opus 4.6 / 4.7 / 4.8 | 请求体 speed: "fast" + 头 anthropic-beta: fast-mode-2026-02-01 |
同样按量计费;订阅账户没充 usage credits 时 Anthropic 返回 429 "Usage credits are required for fast mode",如实透传给界面 —— 报错是账户问题,不代表模型不支持 |
其他所有模型(Gemini / DeepSeek / Qwen / Llama / MiniMax …)没有 fast 概念。
2. 判定:supports_fast(provider, model) 三支#
入口:openprogram/webui/_model_listing/listing.py。判定前先剥
"provider:" 线格式前缀(运行时把当前模型记成 openai-codex:gpt-5.5)。
- openai-codex → 读注册表落盘的
Model.fast。这个字段不是手写的, 来自官方 codex models 端点(见 §2.1),Fetch 时随 spec 一起写进 config, 判定时get_model("openai-codex", id).fast直接读文件。gpt-5.4-mini这类没有 fast 档的会精确判 False,这是按 id 前缀猜做不到的。 - claude-code → 手写声明表
enabled_models.default_fast(model_id): id 含opus-4-6/4-7/4-8(连字符或点号写法)→ True。订阅端是否有可拉的 models 端点尚未验证,因此保持手写;确认有端点后按 codex 的方式改为端点落盘。 - 其余 provider → models.dev 全自动:该模型有
service_tier == "priority"或id == "fast"的档 → True;没有、或目录不认识 → False。
私有网关(如 frontier-intelligence)不特判 —— 目录不认识就没有 fast 按钮。 需要例外时用 config 显式覆盖(§3)。
2.1 codex 的官方数据源#
GET https://chatgpt.com/backend-api/codex/models?client_version=<ver>
(官方 codex CLI 启动时拉的同一个账户级端点),用订阅 OAuth bearer +
chatgpt-account-id 授权。每个模型带 service_tiers(有 id:"priority"
就是有 fast 档)、supported_reasoning_levels(thinking 档)、真实
context_window(订阅端 372k,不是 API 平台的 1050k)。请求 / dispatch 都用
originator: codex_cli_rs + version 身份——后端对灰度 id(如
gpt-5.6-luna)按客户端身份放行,用别的 originator 会列表有、dispatch 404。
这里不用 models.dev,是因为它跟踪的是公开 API 平台目录而不是订阅入口:它会列出
账户跑不了的 id、给出 API 平台的 context 数字,而 fast 只能靠 id 前缀猜
(gpt-5.4-mini 会被误判)。官方端点这三样都权威。
3. 存储:先读官方 → 落 config → 之后读文件#
codex 的原则:信息全从官网实时拿,不手写任何模型清单。
| 层 | 位置 | 持久化 |
|---|---|---|
| codex 官方端点 | webui/_model_listing/fetchers/codex.py::_fetch_codex_live |
远端;_browse_models 10 分钟内存缓存,无磁盘缓存 |
config spec 行(含 fast/thinking_levels/context) |
用户启用某模型时,fetch_and_normalize 归一化后的整行写进 ~/.openprogram/config.json;Fetch 按钮(fetch_models_remote)用新端点数据 heal 已启用行 |
配置文件(这就是"存文件"这一环) |
Model.fast 字段 |
_build_model_from_row 读 config 行的 fast(行有值就用,codex 行总带值);注册表构建时进 ENABLED_MODELS |
仅内存(进程内 dict,源头是 config) |
| claude-code 手写表 | providers/enabled_models.py::default_fast(仅剩 Opus 部分在判定路径上) |
源码 |
| models.dev 目录 | webui/_model_listing/sources/models_dev.py |
远端;1h 内存缓存,无磁盘缓存 |
数据流:官方端点 → 归一化 → config.json → 注册表 → supports_fast / dispatch。断网 / 没登录时端点返回 error、保留已存 config 行不覆盖——反正没 token 也 dispatch 不了这些模型,token-less 浏览拿不到列表不算回归。
4. 事件流:任何切换自适应,无需刷新#
连接建立 / 会话切换 / 模型切换 / 每轮消息 ack+结束
→ 前端 loadAgentSettings()(lib/runtime-bridge/providers.ts)
→ GET /api/agent_settings(webui/routes/runtime.py)
chat.fast = supports_fast(当前会话的 provider, model) ← 每次现算
→ zustand agentSettings.chat.fast
→ composer 订阅重渲染:显/隐 "高速" 菜单项与 chip
发送侧双保险:composer 只在 fastEnabled && fastSupported 时给消息带
service_tier: "priority"(切到不支持的模型后,残留的会话级 fast 设置
不会发出去)。
5. 线路侧(请求构建器)#
| 构建器 | 行为 |
|---|---|
providers/openai_responses / openai_completions |
opts.service_tier → 请求体 service_tier(原有行为) |
providers/openai_codex(ChatGPT 订阅) |
同上透传 opts.service_tier → 请求体;dispatch 用 originator: codex_cli_rs + version 身份(后端对灰度 id 按客户端身份放行,见 §2.1) |
providers/anthropic |
opts.service_tier 存在 且 model.fast 为真 → 请求体 extra_body={"speed":"fast"} + beta 头 _BETA_FAST(_build_client(fast=...) 追加,不覆盖其他 beta) |
| 其他线路 | 不透传,参数不出网 |
6. 文件地图#
openprogram/providers/types.py Model.fast 字段
openprogram/providers/enabled_models.py default_fast(仅 claude-code Opus)+ 配置行回填
openprogram/providers/openai_codex/{openai_codex,runtime}.py service_tier 透传;codex_cli_rs 身份 + _CODEX_CLIENT_VERSION
openprogram/providers/anthropic/{anthropic,_claude_code_direct_runtime}.py Claude fast 线路 + 注册回填
openprogram/webui/_model_listing/fetchers/codex.py 官方端点拉取 + 归一化(fast/thinking/context 来源)
openprogram/webui/_model_listing/fetchers/__init__.py 编排:透传 fetcher 的 fast/thinking,enrich 不覆盖
openprogram/webui/_model_listing/listing.py supports_fast 判定入口;list_models_for_provider 优先用 fetcher thinking
openprogram/webui/routes/runtime.py /api/agent_settings 下发 chat.fast
web/lib/session-store/types.ts AgentBadgeInfo.fast 类型
web/components/chat/composer/index.tsx 开关显隐 + 发送门控
改动指南:codex 的 fast/thinking 全自动,加/去模型什么都不用做——点 Fetch
重拉端点即可;换判定逻辑 → 只动 listing.py::supports_fast;claude-code 加/去
fast → 动 default_fast 的 Opus 部分;其他 provider 想要 fast → models.dev
认识它就自动生效。