提供方配置
提供者用于告诉 opencodex 模型位于哪里、使用哪种线协议适配器,以及请求如何进行身份验证。
自定义渠道的上下文窗口
Section titled “自定义渠道的上下文窗口”自定义渠道未报告或配置模型窗口时,OpenCodex 依次使用 Azure 元数据、按模型 ID 查询的内置厂商/聚合元数据、已启用的 Context cap,最后回退到 128k。已有发现值与配置值取较小者,Context cap 仍会向下限制窗口,内置渠道行为不变。精确 ID 优先,大小写或点号/短横线变体仅在无冲突时匹配;未知或浮动别名不猜测。推断会影响 Codex 压缩预算和其他客户端目录(含 Claude 长上下文选择),但不作为中转实测能力供路由使用。同名模型不保证中转支持官方窗口;请用 modelContextWindows 或 Context cap 设置中转实际上限。不会自动开启 cap,也不会调用模型探测。OpenAI API 窗口不代表 Codex 订阅窗口。
该推断默认关闭,需要按渠道设置 inferContextWindow: true 开启。未开启时,缺少窗口的模型使用已启用的 Context cap,否则回退到 128k。
GPT-6.1 Terra
Section titled “GPT-6.1 Terra”GPT-6.1 Terra 于 2026年10月26日发布,是 GPT-5.6 Terra 的后继型号。gpt-6.1-terra 与 gpt-5.6-terra 并列提供,不修改默认模型或子代理列表。GitHub Copilot 使用 Responses;OpenRouter ID 为 openai/gpt-6.1-terra,上下文为 1,050,000,每百万 token 输入 $1.00、输出 $5.00。
原生 Codex:默认上下文 500,000,长上下文上限 872,000,默认 effort 为 low,级别为 low、medium、high、xhigh、max、ultra。原生 ultra 在传输时映射为 max。原生条目仅提供 Fast 高速模式。
OpenAI API:上下文 1,050,000,最大输出 128,000;支持文本和图像输入、文本输出;知识截止日期为 2026-06-01。effort 为 none、low、medium(默认)、high、xhigh、max。端点为 v1/responses 和 v1/chat/completions;工具调用必须使用 Responses。
每百万 token:输入 $1.00、缓存输入 $0.05、缓存写入 $1.25(30分钟)、输出 $5.00。输入超过 272,000 token 时,整个请求按输入和缓存 2×、输出 1.5×计费,依次为 $2.00 / $0.10 / $2.50 / $7.50。Fast 模式价格为 2×。
首次注册时的模型选择
Section titled “首次注册时的模型选择”新的非 OAuth 连接会等待可靠的模型列表,再公开模型。如果 Models 标签页中去重后的模型行达到20个,所有模型开关初始为 OFF,但提供者本身保持 ACTIVE。实际认证方式为 OAuth 或 ChatGPT 登录的连接保留默认设置。
仅在首次注册提供者时应用;更新、重新登录和更换密钥不会重置已有选择。初始化后,可在 Models 或使用以下 CLI 命令启用所需模型。后续新增模型的独立策略不变。请将 <model-id> 替换为列表中的 ID。
ocx models live --provider openrouterocx models enable '<model-id>'ocx models disable '<model-id>'ocx models provider openrouter on在界面中完成注册或 OAuth 登录后,提示框可打开 Models 页面。CLI 会输出模型管理命令,JSON 也包含后续步骤。--no-wait 表示登录仍在等待中,并非已完成。使用实时模型命令前,请先运行 ocx start 启动代理。
提供者相关顶级字段
Section titled “提供者相关顶级字段”| 字段 | 类型 | 默认值 | 含义 |
|---|---|---|---|
providers |
Record<string, OcxProviderConfig> |
— | 提供者名称到提供者配置的映射。 |
openaiProviderTierVersion? |
2 |
由迁移设置 | 标记单一、可感知选项的 OpenAI 投影已完成。 |
disabledModels? |
string[] |
— | 从 Codex catalog 和 /v1/models 中隐藏、但不阻止直接 proxy 调用的 model。routed id 会从列表中移除。account-qualified native id 只隐藏对应 selector row;bare native GPT id 会隐藏 bare row 以及该 model 的所有 account-selector row。Models 页面只显示裸原生行和路由行;若只隐藏一个 selector-qualified 行,请直接设置此配置字段。 |
omitDisabledNativeModels? |
boolean |
false |
默认值为 false。在 config.json 中设置 "omitDisabledNativeModels": true 并运行 ocx sync,即可从目录、缓存和 Codex 格式的 HTTP 模型列表中移除已禁用的 native 行。移除前经过验证的继承模板会单独保留,因此 routed 行的元数据不变,直接请求的路由也不变。 |
providerContextCaps? |
Record<string, number> |
{} |
按提供商设置的有效上下文上限。普通窗口只能缩小;支持长窗口的原生模型可以扩展到该模型支持的上限。 |
providerContextCapValues? |
Record<string, number> |
{} |
各提供商最后选择的上限,关闭后仍保留。仅保存这些值不会启用上限。有效值优先于保存的选择值。 |
contextCapValue? |
number |
350000 |
首次开启时使用的默认值。再次开启时恢复该提供商的选择值。修改全局值时附带 setAll: true 只会更新已开启的上限;不带值的 setAll: true 会按当前全局值开启所有已配置提供商的上限。 |
codexAccounts? |
CodexAccount[] |
[] |
由 Codex Auth 管理的 ChatGPT/Codex 池账户元数据。密钥单独存放在 codex-accounts.json 中。 |
pausedCodexAccountIds? |
string[] |
[] |
在恢复之前从 Pool 选择中排除的账户,包括被暂停时的主 __main__ 账户。 手动暂停或恢复会同步更新同一账号、同一工作区的主登录与池内已有入口。 |
codexAccountNamespaces? |
Record<string, string> |
— | 将任意公开 model selector 映射到已保存 Codex account target 的可选配置。启用账户限定的选择器行后,target 存在的每个 selector 都会在 Codex picker 中添加独立的 <selector>/<native-openai-model> row,且每个 row 只使用对应账户。只要有 selector 生效,bare native row 就会在 picker 中隐藏;但除非显式禁用,其 id 仍可路由,并继续列在 raw /v1/models 中。 |
codexAccountPickerEnabled? |
boolean |
映射为空时关闭 | 控制是否根据有效的 codexAccountNamespaces 映射生成账户限定的 Codex 选择器行。true 允许显示映射行。在非空映射中省略此字段时,为保持向后兼容会视为已启用;映射为空时则关闭。false 会隐藏生成行并恢复选择器中的裸原生行,但不会删除映射,也不会禁用精确的 <selector>/<native-openai-model> 路由。 |
activeCodexAccountId? |
string |
— | 为下一次请求手动选定的 Pool 账户。选择会清除线程亲和性;进行中的请求会保留捕获到的凭据。 |
codexAccountPriorities? |
Record<string,number> |
— | Codex pool 各账号的选择顺序:账号 ID → -100 到 100 的整数,数值越大越先使用,未设置即为 0。这是顺序边界而非资格边界:选择会把已经合格的账号收窄到仍有 quota 余量的最高 tier,再由 accountPoolStrategy 在该 tier 内挑选。只有当某个 tier 的所有成员都达到各自非零的有效阈值(账号覆盖值,未设置则使用全局值)、处于 cooldown、被 soft-avoid、已暂停或需要重新认证时,该 tier 才会被跳过;usage 未知不会让 tier 耗尽。顺序不会让不合格的账号变得可选,也不会重新绑定已经绑定账号的 thread。主账号 __main__ 同样参与排序,因此可以让 Codex Desktop 登录账号最后才被用到。没有任何条目时,行为与以往完全一致。映射格式非法时会打印警告并关闭排序(不会触发 config 修复)。可通过 ocx account priority 和 Codex Auth 页面管理。 |
autoSwitchThreshold? |
number |
80 |
基于用量的主动切换阈值。quota 可在下一次请求中重新评估未绑定任务。已绑定任务默认(pool.cacheAffinity)在越过阈值后仍保留账号,直到该账号耗尽或无法继续服务,并且只改绑到确有额度余量且 usage 严格更低的账号。将 pool.cacheAffinity 设为 false 才会在该阈值重新评估已绑定任务。fill-first 仅把它用作未绑定分配的耗尽点;正常 round-robin 不使用它。分数取已知 5 小时、周或 30 天 quota window 的最高值。0 只关闭基于用量的主动切换,不关闭未绑定任务分配或故障恢复。 |
codexAccountAutoSwitchThresholds? |
Record<string,number> |
— | 各账号对 autoSwitchThreshold 的覆盖:账号 ID → 0–100 的整数。没有条目时继承全局值;0 只关闭从该账号发起的基于用量的切换。支持主账号 __main__。可在 Codex Auth 的账号卡片中管理。 启用覆盖时,会将当前全局阈值复制为固定的账号值。覆盖值(包括 0)在之后修改全局阈值时仍优先。禁用时发送 threshold: null,删除条目,并恢复继承当前全局阈值及其未来的更改。 |
accountPoolStrategy? |
"quota" | "round-robin" | "fill-first" | "reset-first" |
"quota" |
新建/未绑定 Codex 请求的分配策略。没有 live (parent thread id, quota scope) affinity 的请求属于未绑定;代理重启或 affinity 重置后,已有可见任务也可能未绑定。quota 在没有活跃账号时选择已知 usage 最低的合格账号;活跃账号合格且低于 autoSwitchThreshold 时继续使用;达到阈值后,可把未绑定请求切换到 usage 更低的合格账号。已绑定任务默认会保留到账号耗尽(已知 usage 为 100%)或无法继续服务,改绑时只前往确有额度余量且 usage 严格更低的账号。关闭该标志后,也可在该阈值把已绑定任务的下一次请求改绑到确有额度余量且 usage 严格更低的账号。round-robin 均匀分配未绑定请求;fill-first 在 cooldown、不可用或耗尽阈值前持续分配给活跃账号。 reset-first: 在低于用量阈值的账号中,优先选择下次5小时或周额度重置最早的账号。已绑定任务遵循配置的亲和策略。独立模型额度按用量排序。 此排序不使用月额度重置时间。 |
pool.cacheAffinity? |
boolean |
true |
已绑定 Codex 线程的 cache-affinity 排序,独立于 pool.kernel。默认开启;省略该键或设为 true 即为开启,非法值视为开启。live 绑定优先于 quota 余量:quota 不会仅因用量越过 autoSwitchThreshold 就移动线程。账号暂停、不可用或真正耗尽(已知 usage 为 100%)时仍会离开,且只改绑到确有额度余量且 usage 严格更低的账号。用量未知的账号不会作为已绑定任务的改绑目标。设为 false 可恢复按阈值改绑。affinity 是重排而非钉死。 |
accountPoolStickyLimit? |
number |
1 |
一次 round-robin 选择在推进前保留的新建/未绑定任务分配数。计数在任务绑定时增加,而不是在上游成功后增加。范围 1–100;仅当 accountPoolStrategy 为 round-robin 时生效。 |
upstreamFailoverThreshold? |
number |
3 |
连续发生多少次瞬态故障后,后续新会话会切换到备用上游。设为 0 可禁用。对于常规 Responses 和原生 compact 发送,已证明的连接前 DNS/TCP 不可达故障按 provider-host 粒度记录,不影响账户健康、账户冷却、线程/会话亲和性、活动账户选择或 Pool 路由,也不会计入此阈值。 |
codexFailureWindow? |
boolean |
true |
60 秒滑动失败率,与连续计数一起使用。至少 20 次且失败率 ≥25% 时账号降级,新线程避开它;比率 ≤10% 并持续 30 秒后恢复。已绑定线程不切换。false 只使用连续计数。 |
codexPinnedTransientPolicy? |
"hold" | "detour-new-threads" |
"hold" |
手动固定的账号降级时,hold 继续使用并记录警告;detour-new-threads 只把新线程放到其他账号。不会改派进行中的请求,也不会在已发送后重发。 |
codexWsReuseAcrossTurns? |
boolean |
false |
可选:同一账号和线程的 Codex WebSocket 跨回合复用。开启后忙套接字最多等待 750ms,模型或服务层级变化时最多保留 2 个套接字,回合状态头只出现在每条消息上。 |
upstreamHostCircuitThreshold? |
number |
0 |
原生 OpenAI forward Responses 与 compact 发送的可选断路器阈值,仅统计已证明的连接前 DNS/TCP 故障。0 表示禁用;1–20 表示在这么多个终止逻辑请求失败后,对 provider-origin 冷却 30 秒。断路期间会在账户选择和上游发送之前返回带 Retry-After 的 503;冷却结束后只允许一个半开请求。超时和 HTTP 响应不计数,任意 HTTP 响应都会关闭断路器。 仅适用于未固定账户的 Codex Pool 路由;在 codexAccountMode: "direct" 或使用账户限定选择器时不会启用。 |
maxInboundBodyBytes? |
number |
0 |
单个入站 JSON 请求体解码后大小的字节上限。省略或设为 0 会保留 256 MiB 默认值;配置值限制在 1 至 512 MiB。修改后需要重启。超限会返回本地 HTTP 413,错误代码为 inbound_body_too_large。生效上限大于 256 MiB 时,还会启用 maxConcurrentInboundBodyBytes 共享门槛;仅提高单请求上限不会提高共享预算。受约束的路径与详情见入站请求体准入。 |
maxConcurrentInboundBodyBytes? |
number |
536870912 (512 MiB) |
可选的顶层共享准入预算,单位为字节,仅在生效的 maxInboundBodyBytes 大于 256 MiB 时启用。省略、0 或无效值均使用不变的 512 MiB 默认值。有效的正整数在使用时限制在 512 MiB 至 2 GiB(536870912 至 2147483648)范围内。修改后需要重启;同一进程内的所有监听器共享一个预算。这是准入计量,并非预先分配的内存、RSS 上限或按 RAM 自动调整的容量。2 GiB 必须由运营者明确选择。配置示例、队列及响应生命周期的取舍,以及默认预算为何在解析前只允许一个完整 512 MiB 上传,见入站请求体准入。 |
modelCacheTtlMs? |
number |
300000 |
每个提供者 /models 缓存的新鲜度窗口。 |
cacheRetention? |
"none" | "short" | "long" |
Anthropic 官方端点:"long";其他 Anthropic 兼容端点:"short" |
Anthropic 提示缓存策略:禁用、5 分钟临时缓存,或 1 小时扩展缓存。未设置时,发往 api.anthropic.com(API 密钥或 OAuth 账号池)的请求使用 1 小时 TTL,兼容网关和厂商端点保持 5 分钟 TTL。显式设置的值始终优先。 |
tokenGuardian? |
OcxTokenGuardianConfig |
关闭 | 可选的主动 OAuth 刷新与 Codex 账户预热策略。 |
这些策略均使用各账户的有效阈值:存在 codexAccountAutoSwitchThresholds 条目时使用该值,否则继承全局 autoSwitchThreshold。覆盖值为 0 仅关闭基于用量的主动切换;启动绑定、硬锁、冷却、模型使用资格检查和故障恢复仍然生效。
selector 名称是用户自定的公开 label;opencodex 不会为其赋予账户角色语义。
codexAccountNamespaces 的 key 长度为 1–64 个字符,首尾必须是 ASCII 字母或数字,
中间可使用字母、数字、.、_ 或 -;保留的 JavaScript object 名称会被拒绝。value 必须是有效的
pool account id(不能是内部 __main__),或用 "@main" 表示 Codex Desktop 账号。与 provider 及
保留的 openai / combo / policy 冲突时不区分大小写;带 namespace 的 combo 或 routing-profile alias 不能把 selector 复用为
其 namespace prefix,已配置的 pool id 和其他 selector target 也不能复用为 selector。raw account id
与 email 应保持私密,selector 才是公开名称。明确选择的行为和优先级见
路由配置。
Codex Auth 仪表盘控件只管理显式包含 codexAccountPickerEnabled 字段的映射。启用空的受管
映射时会创建保护隐私的 selector;之后添加账号时,即使 picker 行处于隐藏状态,也会扩展该
映射且不会重命名已有 selector。省略此字段的手写映射保持手动管理,绝不会自动扩展。删除账号
会保留其映射,使精确路由在账号缺失时 fail closed;以后添加相同账号 id 时会恢复已有公开
selector,而不是分配一个新名称。
保留的 OpenAI 提供者
Section titled “保留的 OpenAI 提供者”openai 和 openai-apikey 是固定的保留 id。openai.codexAccountMode 默认是 "pool",会在主账户和新增账户之间选择;"direct" 只使用当前调用者/主登录态。API 只使用其配置的 API key 或 key 池。请使用裸模型名或 openai-apikey/<model>;不存在跨路由凭据回退。API 的 GPT-5.6 行携带 1,050,000 上下文 / 922,000 最大输入元数据,而 Pro 虚拟 id 会重写为基础线协议模型并带上 reasoning.mode: "pro"。
openaiProviderTierVersion: 2 标记当前的单提供者投影。对已发布的 v1 配置进行迁移之前,opencodex 会创建 config.json.pre-openai-tiers-v2.bak,且不会覆盖不同的备份文件,并会把已知的旧式命名空间选择 id 重写为裸 id。
提供者命名空间别名
Section titled “提供者命名空间别名”提供者可以有内置缩写,例如 google-antigravity 的 agy。如果已配置的提供者名称或显式别名占用了该缩写(不区分大小写),另一个提供者的内置缩写就会在目录名称和别名路由中同时禁用。例如,配置名为 agy 的提供者后,Google 模型会显示为 google-antigravity/<model>,而 agy/<model> 会选择已配置的提供者。规范提供者名称仍要求大小写完全一致;无法识别的前缀继续沿用现有的模型路由回退行为。
提供者条目(OcxProviderConfig)
Section titled “提供者条目(OcxProviderConfig)”| 字段 | 类型 | 含义 |
|---|---|---|
adapter |
string |
openai-chat、openai-responses、anthropic、google、kiro、cursor、ollama-native、azure-openai(或别名 azure)之一。 |
baseUrl |
string |
上游 API 基础 URL。大多数内置固定端点会忽略不匹配的值;具备冲突安全键的预设会保留一个更早、同名的自定义目标。 |
requestPacing? |
{ enabled, requestsPerMinute?, minIntervalMs?, maxConcurrentRequests?, models?, keySelection?, keys? } |
可选的客户端出站请求启动节流,与上游用量、计费和限流指标相互独立。maxConcurrentRequests 是限制进行中请求数的正整数,提供商或模型规则都可以只配置此项。提供商限制适用于所有模型,models 按上游模型精确 ID 匹配,并可增加延迟或收紧并发限制。排队等待不计入响应头超时。覆盖 HTTP 以及显式适配器 fetchResponse/runTurn 调用。配置并发上限时,标准 Responses WebSocket 请求改用 HTTP/SSE,以便在响应体完成、出错或取消时释放并发名额。 对包括 Cursor 在内的 runTurn 适配器,并发上限计算进行中的回合数,而非物理发送数:同一回合内的 RunSSE 和 BidiAppend 可以重叠,其他回合仍须等待。后续发送仍遵守启动间隔。 |
requestPacing.keySelection? |
"active", "round-robin" |
正常请求的密钥选择:默认 active 保留已保存密钥和现有错误切换;round-robin 按顺序分配可用池密钥,不修改已保存的选择。均衡的是分配次数,不是令牌或费用。 |
requestPacing.keys? |
{ requestsPerMinute?, minIntervalMs?, maxConcurrentRequests? } |
按密钥引用设置统一 RPM、最小启动间隔和并发上限,跨模型共享,并同时受提供商和模型上限约束。相同引用共享容量;同一上游项目的不同引用不代表独立配额。不管理 TPM 或每日配额。 |
responsesPath? |
string |
用于 key-auth openai-responses 请求的相对资源路径。必须以 / 开头,且不能包含 scheme、query 或 fragment。 |
chatCompletionsPath? |
string |
用于 openai-chat 请求的相对资源路径,是 responsesPath 的对应项,适用相同的路径规则。当同一上游以不同前缀提供 Chat Completions 和 Responses 时需要此配置:按模型的 wire override 只更换适配器而不改动 baseUrl,否则已启用的 Chat 请求会被发送到 Responses base。随附示例为 Z.AI。 |
projectResponsesLiteHostedSearchHistory? |
boolean |
默认关闭。仅实际布尔值 true 可为此 provider 显式启用有损 hosted-search 历史投影,且只作用于最终目的地精确为标准 ChatGPT Codex /responses、明确选择 Responses Lite 的普通请求及原生 v2 compaction_trigger 压缩请求。省略或设为 false 时保留结构化历史;字符串和数字无效。不会启用 Lite、改变传输,也不影响原生 v1 /responses/compact、公开 OpenAI API/其他目的地或既有 portable/routed compaction 投影。详见Lite 搜索历史。 |
upstreamWebsocket? |
boolean |
为 openai-responses 请求选择性启用上游 Responses WebSocket 传输(默认 false)。仅对第一方 https://api.openai.com/v1 上游生效;自定义提供者端点始终使用有界 HTTP/SSE,因为 Bun 无法在分配完整消息之前对入站 WebSocket 消息实施大小限制。对于规范 ChatGPT openai 提供商,省略该字段会在符合条件的轮次使用上游 WebSocket,false 通过 HTTP/SSE 发送流式轮次,true 会被拒绝;设为 false 时,原生轮次中操控与注入不可用。该字段独立于客户端侧的 websockets 设置,且不改变端点或凭据。普通 HTTP 仍使用 SSE;非 Responses 路径和 openai-chat 请求仍使用 HTTP。 |
supportsServiceTier? |
boolean |
service_tier 能力的三态。true:fast 模式可以注入,调用方提供的值也会被保留。false:剥离该字段且绝不注入(已明确不支持的上游不会收到它)。未设置:未分类——调用方提供的值原样保留,fast 模式绝不注入。注册表已对官方 OpenAI(true)、DeepSeek 和 Volcengine Ark(false)分类;仅对真正支持分层的自定义网关显式设置。 |
responseTierAuthoritative? |
boolean |
响应等级是否足以确认或否定 Fast。对响应元数据不具权威性的链路显式设为 false;未设置时保持原有行为。不会启用 Fast 或修改出站参数。详见响应服务等级的可信度。 |
preserveResponsesReasoningContent? |
boolean |
在重放的 Responses reasoning 项中保留明文 reasoning 内容,而不是清空(清空是 ChatGPT 后端的规则)。对接受 reasoning 重放的上游(如 DeepSeek)启用。代理生成的 ocxr1 信封始终会被剥离。 |
disabled? |
boolean |
将提供者保留在磁盘上,但从路由和模型/目录列表中排除。 |
apiKey? |
string |
API key,或在请求时解析的 ${ENV_VAR} / $ENV_VAR 引用。 |
apiKeyTransport? |
"x-api-key" | "bearer" |
Anthropic key 头部样式。默认使用原生 x-api-key;仅对 key-auth anthropic 提供者有效。 |
apiKeyPool? |
ApiKeyPoolEntry[] |
多 key 池。apiKey 会镜像当前激活条目;每个条目都有 id、key、可选 label,以及可选的数值 addedAt。 |
defaultModel? |
string |
当选择该提供者但未显式指定模型时使用的模型。 |
models? |
string[] |
初始/回退模型列表。liveModels: false 时,非空 models 后接 retainModels;若 models 为空或省略,则按已配置的 defaultModel、retainModels 顺序构建初始列表,重复 ID 仅保留首次出现的位置。 |
liveModels? |
boolean |
启动/同步时获取实时目录(默认 true)。自定义提供者使用 ${baseUrl}/models;内置项可能使用注册表 URL 并进行过滤。 |
selectedModels? |
string[] |
发现之后的目录允许列表。非空时只暴露这些 id;为空或省略时则暴露全部发现到的模型。 |
modelDisplayNames? |
Record<string, string> |
持久的仅显示名称,以此提供者的精确原生模型 id 为键。键区分大小写。名称优先于提供者目录元数据,并且不会改变身份验证、适配器、路由、计费或上游请求。例外:当直接的 provider/model 选择器不匹配任何已知 id、别名或 retainModels(例如实时目录尚未获取时),编码形式相同的键会作为原生 id 发送。该映射最多可包含 2,000 个条目,与发现上限相同。 |
contextWindow? |
number |
上游缺少元数据时使用的提供者级上下文数值;有元数据时作为上限,保留更小的实时数值。Models 面板中与 providerContextCaps 分开设置。 |
modelContextWindows? |
Record<string, number> |
按模型设置的上下文数值与上限。优先于 contextWindow:窗口未知时采用所配置的数值,而更小的实时元数据仍然优先。 |
inferContextWindow? |
boolean |
仅限自定义渠道,默认关闭。设为 true 时用内置模型元数据补全缺失窗口;这是估计值,不代表中转的实测容量。 |
modelInputModalities? |
Record<string, string[]> |
按模型设置的输入提示,例如 ["text"] 或 ["text", "image"]。 |
modelMaxInputTokens? |
Record<string, number> |
正数型、按模型设置的最大输入限制,用于目录自动压缩提示。 |
modelAutoCompactTokenLimits? |
Record<string, number> |
按模型设置的正安全整数软自动压缩预算。该值只能降低“上下文或最大输入的 90%”这一有效上限;无法解析出有效上下文窗口时不会输出。对于规范 openai,键必须是受支持的精确原生模型 ID,且不得包含提供者或账户选择器前缀。提供者 PATCH 会合并条目;将某个键设为 null 会删除该键,将整个字段设为 null 会清空映射。这些 null 删除标记仅适用于 PATCH。 |
defaultMaxOutputTokens? |
number |
当客户端省略 max_output_tokens 时,openai-chat 的提供者级回退值。 |
modelMaxOutputTokens? |
Record<string, number> |
正数型、按模型设置的 openai-chat 回退预算;精确/模式匹配优先于提供者默认值。 |
modelCosts? |
Record<string, ProviderCostOverlay> |
按模型设置的显示价格(每 100 万 token 的美元数),以该提供者的精确上游模型 ID 为键(不是提供者标识符或路由后的 provider/model 标签),值为四个字段:input、output、cacheRead、cacheWrite(示例:{ "deepseek-v4-flash": { "input": 0.14, "output": 0.28, "cacheRead": 0.0028, "cacheWrite": 0 } })。任何模型 ID 都是有效键——自定义提供者可以通过 openai-chat 适配器指向任意 OpenAI 兼容端点,即使不存在于内置目录中,本地 OpenAI 兼容和内部提供者的 ID 同样有效。用户配置的价格在 Logs 的 ~$ 和 Usage 估算中优先于内置目录;历史条目也会按当前覆盖项重新计价,因此修改价格可能改变过去的总额(回退顺序:用户配置 → jawcode 目录 → expected-price 覆盖 → 模型级厂商价格);用户明确将所有费率设为零时,会得到已知的零费用估算;删除该模型的覆盖项即可恢复自动定价。目录中的全零价格仍会回退到下一个来源。每个费率必须是大于等于 0 的有限数字,且不超过 1,000,000(每 100 万 token 的美元数);超出范围的条目会在管理边界被拒绝,并在加载时被丢弃。仅用于显示的估算:覆盖项不影响路由、账户选择、配额或计费。 |
headers? |
Record<string, string> |
额外的上游请求头。会拒绝 Authorization、cookie、API key 头、嵌入换行符以及无效名称。 |
openRouterRouting? |
OpenRouterProviderRouting |
默认的 OpenRouter order、only 和 allowFallbacks 偏好;仅对使用 openai-chat 的规范 OpenRouter 有效。 |
modelOpenRouterRouting? |
Record<string, OpenRouterProviderRouting> |
精确模型 id 级别的覆盖项,会替换提供者级 OpenRouter 偏好。 |
vercelGatewayRouting? |
VercelGatewayRouting |
默认的 Vercel AI Gateway order、only 和 sort("cost" | "ttft" | "tps")偏好;仅对使用 openai-chat 的规范 Vercel AI Gateway 有效。 |
authMode? |
"key" | "forward" | "oauth" | "local" |
身份验证模式(默认 key)。OAuth/订阅凭据存放在 config.json 之外;local 仅限注册表条目允许它的提供者。 |
codexAccountMode? |
"pool" | "direct" |
仅适用于规范的 openai;默认是 Pool。Direct 会绕过池状态。 |
refreshPolicy? |
"proactive" | "lazy-only" | "disabled" |
覆盖该 OAuth 提供者的 Token Guardian 策略。 |
reasoningEfforts? |
string[] |
要向外暴露并发送的、提供者级 Codex 推理标签。 |
modelReasoningEfforts? |
Record<string, string[]> |
按模型设置的标签。空列表会隐藏 effort 控件。 |
modelSupportsReasoningSummaries? |
Record<string, boolean> |
将某个模型设为 false,即可停止暴露摘要并移除摘要交付字段。 |
modelReasoningSummaryDelivery? |
Record<string, "sequential" | "sequential_cutoff" | "concurrent" | "concurrent_cutoff"> |
按模型设置的 Responses 交付枚举;会重写现有的 delivery 字段。 |
modelAdapters? |
Record<string, string> |
按模型设置的 openai-chat 或 openai-responses 线协议覆盖项,用于混合线协议网关。显式条目优先于注册表默认值;DeepSeek 预设可以为 deepseek-v4-flash 选择原生 Responses,GitHub Copilot 则为 模型(gpt-5.3-codex、gpt-5.4、gpt-5.4-mini、gpt-5.5、gpt-5.6-luna、gpt-5.6-sol、gpt-5.6-terra, gpt-6.1-sol, gpt-6.1-terra、gpt-6-astra, grok-4.5, grok-4.6, mai-code-1.1-flash, mai-code-1-flash-picker)声明了 Responses 专用默认值,因为这些模型在代理流量下会拒绝 /chat/completions。没有内置默认值的模型(例如 gpt-5.4-nano)可以在此手动启用。单一线协议上游固定项和规范 ChatGPT forward 会拒绝覆盖。 |
| xAI Responses 启用项(仪表板) | 开关 | 仅用于 xai,以原子方式设置或清除 grok-4.5 和 grok-4.6 的 modelAdapters 条目。若只存在一个条目,则显示混合状态,直到下次开关写入将两者统一。其他覆盖项和层级行为不变。 Grok 4.7 在 OAuth 上通过注册表线协议默认使用 Responses,也可通过显式的 modelAdapters["grok-4.7"] = "openai-chat" 条目切换到 Chat。 |
xaiResponsesXSearch? |
boolean |
默认禁用。在 xAI Responses 目标上,仅当有效的 web_search 工具在最终请求规范化后仍保留时,才附加由提供方托管的 x_search 声明。不会重复已有声明,绝不会扩大调用方的 tool_choice/allowed_tools 选择范围,并且此项独立于网络搜索辅助服务的 search.xSearch 选项。 |
modelPreferHostedTools? |
Record<string,string[]> |
非 forward Responses gateway 的精确模型 ID opt-in,用于上游预留 hosted tool namespace 的情况。目前只支持 ["image_generation"];匹配模型必须使用 openai-responses wire 且支持该 hosted 工具。它会移除冲突的客户端 image_gen 声明,并改写其 selector 以保持调用方的 tool choice。对于 OpenAI API 的虚拟 -pro 模型,先匹配所选公开 ID,未命中时才使用解析出的基础 wire-model ID 作为回退。modelAdapters 会先按公开 ID、再按基础 ID 解析;后一次结果决定最终 wire。未配置模型保持普通 alias 行为。 |
annotateEmptyToolOutputs? |
boolean |
在工具结果到达模型之前,将存在但为空的结果替换为简短标记,以免空白结果被误认为缺失结果。适用于空白字符串和仅包含文本的部件数组;图像、文件和加密部件绝不会被修改。内置注册表中 DeepSeek 的默认值为 true,其他情况下不设置。设为 false 可让提供者退出此行为——后续编辑即使省略该字段,也会保留显式的 false。PATCH /api/providers?name=<provider> 接受 true、false 或 null;传入 null 可清除覆盖值并恢复注册表默认行为。 |
reasoningEffortMap? |
Record<string, string> |
提供者级、用于推理标签的线协议别名。将标签映射为 "__omit__" 可在上游请求中完全省略推理字段(例如针对需要省略 reasoning_effort 才能触发深度思考模式的 Ollama 本地模型)。 |
modelReasoningEffortMap? |
Record<string, Record<string, string>> |
按模型设置的推理标签线协议别名。将标签映射为 "__omit__" 可在上游请求中完全省略推理字段。 |
reasoningWireFormat? |
"gateway-object" |
用于接受 reasoning: { enabled, effort } 而非 reasoning_effort 的 OpenAI 兼容 gateway。ClinePass preset 会自动设置。 |
noReasoningModels? |
string[] |
会拒绝推理/思考参数的模型。 |
noTemperatureModels? |
string[] |
会拒绝调用方指定 temperature 的模型。 |
noTopPModels? |
string[] |
会拒绝调用方指定 top_p 的模型。 |
noStopModels? |
string[] |
会拒绝调用方指定 stop 的模型。openai-chat 适配器、Chat 直通和 Responses 直通会为这些模型省略该字段。内置 xai 预设在此列出 xAI 文档说明会拒绝该参数的推理模型(grok-4.7, grok-4.6, grok-4.5, grok-4.3, grok-4.20-multi-agent-0309, grok-4.20-0309-reasoning, grok-build-0.1);grok-4.20-0309-non-reasoning, grok-composer-2.5-fast 保留调用方的 stop。 |
noPenaltyModels? |
string[] |
会拒绝 presence/frequency penalty 的模型。 内置 xai 预设在此列出 xAI 文档说明会拒绝这些参数的推理模型(grok-4.7, grok-4.6, grok-4.5, grok-4.3, grok-4.20-multi-agent-0309, grok-4.20-0309-reasoning, grok-build-0.1);非推理模型保留调用方的 penalty。 |
noStructuredOutputModels? |
string[] |
openai-chat 端点拒绝 response_format 的精确模型 ID。仅当请求模型与条目完全匹配时才省略该字段;其他 openai-chat 模型仍启用 structured-output 转换。 |
noJsonSchemaModels? |
string[] |
openai-chat 端点拒绝 json_schema 形式但仍接受 json_object 的精确模型 ID。这类请求会降级为 json_object 而不是被丢弃,因此请求 JSON 的调用方仍能拿到 JSON。同一模型同时出现在两个列表时,以 noStructuredOutputModels 为准。opencode go、opencode zen 预设已为其 DeepSeek 路由内置该项。 |
foldDeveloperRoleToSystem? |
boolean |
记录某个 openai-chat 目的地是否接受 developer 角色。foldDeveloperRoleToSystem 未设置时按 system 发送,true 时按 system 发送,false 时按 developer 发送。未设置表示尚未记录该目的地的情况;true 记录上游拒绝该角色;false 记录其接受该角色。未启用 singleLeadingSystemMessage 时,消息保留在对话中的原有位置,只有角色改变。拒绝该角色的目的地会返回 400 role 'developer' is not allowed,这一轮根本无法开始,这就是未记录状态默认折叠的原因。 |
parallelToolCalls? |
boolean |
切换并行工具调用。OpenAI Chat 默认开启;非 chat 适配器只有显式 true 时才会声明支持。 |
responsesItemIdRepair? |
{ message?: string[]; reasoning?: string[]; repairMissingTerminalIds?: boolean; repairInvalidIds?: boolean } |
默认关闭的下游 SSE 修复,用于精确占位 id、缺失的终止 id,以及(repairInvalidIds)缺少规范 msg_/rs_ 前缀的 message/reasoning id。function-call id 永远不会被重写。内置 DeepSeek 默认启用后两项。 |
responsesSnapshotRepair? |
boolean |
默认关闭的客户端修复,用于补全 SSE 与 JSON 中稀疏 Responses 生命周期快照缺失的 status、output 和工具元数据;原始检查与持久化保持不变。 |
promptCacheKey? |
boolean |
为整个 openai-chat 提供商启用 prompt_cache_key 转发。适配器只转发收到的密钥,不自行生成,但 Claude Messages 转换会从 metadata.user_id,或在没有元数据时从模型/系统/工具组合派生密钥。除非预设声明,否则默认关闭;Mistral 按其提示缓存契约启用,显式 false 可关闭。仅在上游明确支持时启用,严格网关可能以 HTTP 400 拒绝未知字段。 |
retryOn429? |
{ enabled?: boolean; attempts?: number; intervalMs?: number; maxIntervalMs?: number; respectRetryAfter?: boolean } |
仅限 API-key 提供商(authMode: "key")。未配置时关闭,但规范端点的 OpenCode Go 和 Command Code,以及规范 Mistral 的 openai-chat 例外:默认重放 6 次、间隔 10 秒、上限 60 秒。配置对象即启用;enabled: false 也会关闭该默认策略。流开始前的 HTTP 429 按 Retry-After 或固定间隔等待,然后在密钥故障转移之前用同一密钥重放同一请求。覆盖文本轮次恢复、Responses passthrough、图像/视频桥、web-search 侧车和终结续接;自定义 runTurn 不在范围内。attempts 统计首个 429 后的同密钥重放次数(总发送次数 = attempts + 1),预算由整个请求共享。耗尽时仅停止同密钥重放,随后按可用目标执行正常密钥故障转移或最终错误处理;密钥认证 passthrough 无故障转移,会原样返回 429。规范 Mistral Chat 的显式上游延迟超过允许等待时间时,会停止同密钥重放并保留原始 Retry-After;池中另一密钥仍可能处理请求。其他提供商仍将等待截断至上限。Mistral 按凭据/模型共享重试截止时间;requestPacing.enabled: false 或 retryOn429.respectRetryAfter: false 可关闭。无重试时间的 429 在确认每分钟预算不足时触发保守的 60 秒恢复等待,随后仅探测一次,成功即恢复正常流量。正常流量不预测下一次 token 成本。策略使用公布的额度,排除已知耗尽的月度额度,不承诺精确重置时间,也不触发历史压缩。Codex 本身不会重试 429。对象默认值:enabled: true、attempts: 3、intervalMs: 5000、maxIntervalMs: 60000(单次等待上限,配置最大 600000)、respectRetryAfter: true。 |
transientRetryOn5xx? |
{ enabled?: boolean; attempts?: number } |
仅限使用 key 认证的 openai-chat 与 openai-responses 提供商。authMode: "forward" 的提供商(ChatGPT 账号池)从不读取此选项,保持默认重试次数。可选的流开始前上游瞬态状态码(500、502、503、504、520、521、522)重试:未配置时关闭;对象存在即启用,除非 enabled: false。覆盖初始 Responses 请求、终结守卫续接、原生 /v1/chat/completions,以及 429/账户恢复重新获取。attempts 是单个请求允许向上游发送的总次数,包含首次发送(1..10,默认 3);它是与连接重置恢复共享的按请求预算,因此 3 表示最多只有三个实际请求到达提供商。等待采用固定 400 毫秒的指数退避,上限为 5 秒,并遵循 Retry-After。此选项独立于处理速率限制的 retryOn429;流开始后的故障绝不会重放。 每个 Combo 目标都把预先预约的首次发送计入该目标配置的总次数;attempts: 1 只发送一次,不会退还预约来增加额度,也不会提高共享上限。发送前的本地拒绝或取消会释放未使用的预约。 |
retryOnReset? |
{ enabled?: boolean; replacements?: number } |
适用于原生 openai-responses 提供商(包含 authMode: "forward"),以及收到上游响应头之前的通用 Responses 转换发送路径。可选地替换一次在调用方尚未观察到任何内容时就失败的发送:未配置时关闭;对象存在即启用,除非 enabled: false。涵盖两个不确定阶段——响应头到达前连接断开,以及响应头之后 SSE 正文只承载控制事件时断开。canonical ChatGPT 上游 WebSocket 在 create 帧发出之后、任何 Responses 事件到达之前关闭或出错时,也按同样方式处理,其替换发送走 HTTP。只有自包含的请求才会被替换:store: false、完整的 input、没有 previous_response_id/conversation/stream_id,且只使用由客户端执行的工具。replacements 是单个逻辑请求在所有环节和所有组合子请求中可以进行的替换发送次数(1..2,默认 1);它既不是按环节的重试次数,也不是发送预算,因此替换发送仍必须落在该环节已有的发送额度之内。已经产生输出或工具调用的请求,无论此值为何都不会被替换。如果上游已经开始了第一次推理,被替换的推理仍可能计费,因此该选项默认关闭。 通用转换发送路径的首次发送和重建后的发送都支持响应头之前连接重置后的替换,使用同一授权和发送预算。适配器自行管理的传输,以及收到上游响应头之后的转换流故障,均不在此选项范围内。 |
autoToolChoiceOnlyModels? |
string[] |
tool_choice 只接受 auto 或 none 的模型;强制选择会被降级。 |
preserveReasoningContentModels? |
string[] |
需要在聊天历史中保留先前 assistant reasoning_content 的模型。从仪表板保存时会保留已存储的列表(包括 [])。PATCH /api/providers?name=<provider> 接受数组,或传入 null 清除该字段。将提供方改到其他适配器、base URL 或认证模式的保存不会保留该列表(见下文)。 |
reasoningDetailsModels? |
string[] |
以结构化 reasoning_details 数组返回思考内容的模型(启用 reasoning_split 的 MiniMax M 系列);流式增量为累积快照,按前缀差分处理,保留的推理以 reasoning_details 数组而非 reasoning_content 字符串回放。 |
requiresReasoningPlaceholderModels? |
string[] |
上游会拒绝缺少 reasoning_content 的 tool_call 续接消息的模型(DeepSeek thinking 模式);重放缓存 miss 时注入最小占位符。缺省沿用 preserveReasoningContentModels;设为 [] 可显式关闭。从仪表板保存时会保留已存储的列表(包括 [])。PATCH /api/providers?name=<provider> 接受数组,或传入 null 清除该字段。将提供方改到其他适配器、base URL 或认证模式的保存不会保留该列表(见下文)。 |
thinkingToggleModels? |
string[] |
使用 thinking.enabled 而不是 effort 阶梯的 chat 模型。 |
thinkingBudgetModels? |
string[] |
使用整数 thinking_budget 的 chat 模型;effort 会映射为预算比例。 |
noVisionModels? |
string[] |
经由视觉 sidecar 发送的纯文本模型;匹配时会容忍 Ollama 的 :size 标记。 |
escapeBuiltinToolNames? |
boolean |
为 Anthropic 兼容网关转义内置工具名,并在返回的调用中恢复。 |
anthropicEofTolerance? |
boolean |
允许 Anthropic 兼容网关在 message_stop 前结束流,仅当已收到可见文本或完整的 JSON 对象工具输入时。默认关闭。 |
googleMode? |
"ai-studio" | "vertex" | "cloud-code-assist" |
Google 传输/身份验证模式。默认 ai-studio。 |
googleToolSchemaPolicy? |
"compatible" | "reject-lossy" |
仅限 Google。省略或设为 compatible 时保留兼容架构和现有的非直连 400 修复。reject-lossy 会在发送前拒绝初始损失或结果不确定的有界比较,并阻止会放宽约束的 Vertex 或 Cloud Code Assist 修复。直连 AI Studio 从不执行该修复。 |
project? |
string |
Vertex 或 Antigravity Cloud Code Assist 项目 id。设置后,Vertex API 密钥使用项目端点;未设置时,即使存在 GOOGLE_CLOUD_PROJECT 也使用 express 模式。ADC 回退到 GOOGLE_CLOUD_PROJECT / GCLOUD_PROJECT。设为 "auto" 时,每个 Vertex API 密钥各自解析所属项目(解析成功的结果按密钥缓存;解析失败的密钥会在后续请求中再次探测),同一个密钥池可跨多个项目;ADC 不接受 "auto"。 |
location? |
string |
Vertex 位置。API 密钥的项目端点默认使用 global,并忽略 GOOGLE_CLOUD_LOCATION;ADC 需要此字段或 GOOGLE_CLOUD_LOCATION 回退。 |
mcpServers? |
Record<string, CursorMcpServerConfig> |
仅 Cursor:stdio 或 Streamable HTTP MCP 服务器。 |
desktopExecutor? |
DesktopExecutorConfig |
仅 Cursor:外部 computer-use 和录屏命令。 |
unsafeAllowNativeLocalExec? |
boolean |
Cursor 旧布尔值;仅当更新字段未设置时,等同于 nativeLocalExec: "on"。 |
nativeLocalExec? |
"off" | "codex-sandbox" | "on" |
Cursor 本地执行策略。off 是默认值;codex-sandbox 目前会像 off 一样失败关闭。 |
LM Studio instruction compatibility: singleLeadingSystemMessage: true overrides chronological Chat instruction placement by merging text-only system/developer messages into one leading system message. The LM Studio preset enables it by default; set it to false to disable merging.
注册或替换提供商(POST /api/providers)时,会先验证 responsesPath 和 chatCompletionsPath,再修改内存或磁盘中的配置。PATCH /api/providers?name=<provider> 会将请求体与已保存的提供商合并;除仅更新 requestPacing 的请求外,凡是修改 disabled 以外字段的更新,都会在保存前以同样方式验证合并后提供商的路径,若保留的既有路径无效则返回 400,且不更改配置。加载配置文件时也适用同样的路径规则。
API key 提供者可以持有字面量 key,或环境引用。OAuth 提供者使用由 ocx login 填充的凭据存储;基于订阅的 Claude Code 启动行为在 claudeCode.authMode 下配置。
保存提供方时会保留什么
Section titled “保存提供方时会保留什么”用已有提供方的名称调用 POST /api/providers,会用根据请求构建的行替换已存储的行。仪表板的添加/编辑表单无法发送所有字段,因此保存时会保留请求省略的部分已存储字段。其中十一个记录的是某个上游的行为:preserveReasoningContentModels, preserveResponsesReasoningContent, requiresReasoningPlaceholderModels, foldDeveloperRoleToSystem, singleLeadingSystemMessage, reasoningWireFormat, omitReasoningEffortWithToolsModels, promoteAdditionalTools, retryOn429, transientRetryOn5xx, retryOnReset。
| 保存 | 十一项设置 | 已存储的 apiKeyPool |
|---|---|---|
| 目的地相同,字段省略 | 保留已存储的值,包括显式的 [] 或 false |
保留 |
| 新目的地,字段省略 | 不保留;可能套用新目的地的注册表默认值 | 不保留 |
| 请求中发送了该字段 | 请求中的值 | 请求中的值 |
目的地指适配器、base URL(协议与主机名比较时不区分大小写,忽略末尾斜杠),以及请求中指定了时的认证模式。把提供方移到其他目的地时,描述旧上游的十项设置和为旧上游签发的密钥池都不会带过去。保存从不把旧行的其余部分合并进新行。
PATCH /api/providers?name=<provider> 只修改它指定的字段,无论目的地如何都保留其他所有已存储字段。它接受全部十项设置,null 表示清除。对于两个推理列表,空数组会作为显式退出选项保存,而不会被删除。
响应服务等级的可信度
Section titled “响应服务等级的可信度”当提供者响应中的 service_tier 无法确定 Fast 是否生效时,在 config.json 中将
providers.<name>.responseTierAuthoritative 设为 false。这是运营者对整个提供者链路的声明,
独立于 supportsServiceTier 和 fastWire;它不会启用 Fast,也不会改变出站 service_tier。
例如,对于已知 Codex 后端响应元数据不具权威性的网关,在现有 provider 对象中加入:
{ "responseTierAuthoritative": false }网关需要显式配置。 仅升级 OpenCodex 不会为现有 provider 自动添加该声明。未配置时,
符合 Fast 条件且已发送 priority 的请求收到 service_tier: "default",仍会按原逻辑记录为 response-declined。
仅对已知响应元数据无法确认实际等级的链路设置 false。
对于符合 Fast 条件且已发送 priority 的请求,default 和 priority 响应都只作为观察值。
日志保留 responseServiceTier,并记录 tierOutcome.responseTierAuthoritative: false、
fastOutcome: "applied" 和 confirmation: "assumed",不会仅凭响应回显判为 response-declined。
这里 applied 表示请求参数已发出,assumed 表示 Fast 的实际效果尚未确认。
模型提示会分别显示请求等级、原始响应等级和确认状态。这些记录不能证明实际加速或计费等级。
费用估算沿用请求等级的回退逻辑,不将原始回显当成已确认的价格等级;要求响应确认的定价规则 不能使用该回显作为证据。没有可信度标记的历史记录保留原解释。
该字段只接受布尔值。对于官方 API、未声明的网关等其他目的地,省略或显式设为 true
都保留基于响应的判定。标准 https://chatgpt.com/backend-api/codex 地址配合
authMode: "forward" 始终自动按非权威处理,即使配置为 true 也不例外。
OpenCodex 不会依据网关名称或 URL 猜测可信度。如果同一网关混合不同的响应契约,
应拆成独立 provider 条目,只为相关条目配置此声明。
提供者诊断出站安全性
Section titled “提供者诊断出站安全性”仪表板连接测试和实时模型发现使用受限的、仅 GET 传输。没有出站代理时,opencodex 只会解析一次主机名,并仅连接到该已验证地址。HTTPS 仍会保留原始 Host、SNI 和证书验证;提供者配置不能关闭证书检查。
这些操作使用服务器配置的出站 fetch。通过 config.proxy 设置或继承自 SOCKS5 ALL_PROXY 的服务器 SOCKS5 代理,在目标不匹配 NO_PROXY 时使用 OpenCodex 的内置隧道。HTTP_PROXY 和 HTTPS_PROXY 保留 Bun 的原生 HTTP(S) 处理,而非 SOCKS 的 ALL_PROXY 不是原生 HTTP fetch 路由。URL 和字面量地址检查仍会执行,但所选代理会决定最终路由、DNS 解析结果和对端,因此 opencodex 无法固定或验证该对端。这是一个明确的安全限制。
私有/本地目标需要 allowPrivateNetwork: true,并且在出站代理启用时,还需要匹配的 NO_PROXY 条目。回环地址会自动加入;每个 LAN 主机都必须显式列出,因为 CIDR 条目不会被解释。匹配器支持精确主机、域后缀、可选端口、带方括号的 IPv6 以及 *;例如,应显式列出 192.168.1.50。元数据和链路本地目标仍会被阻止。诊断请求会拒绝重定向,并报告一个已剥离凭据的目标。普通提供者请求的重定向审查仍然独立于这个诊断保护。
面向 Clash / Surge / Mihomo 用户的 fake-IP DNS 例外有两种,且都只作用于 DNS 应答——URL 中的字面地址仍会被拒绝。IANA 基准段 198.18.0.0/15(含 IPv4-mapped IPv6 写法)在该主机适用出站代理时被接受。Mihomo 默认的 IPv6 fake-IP 段 fdfe:dcba:9876::/48 采用更严格的门槛:必须设置与 URL 协议匹配的代理变量(https: 对应 HTTPS_PROXY,http: 对应 HTTP_PROXY)或 SOCKS5 的 ALL_PROXY(非 SOCKS 的 ALL_PROXY 不算),主机不能命中 NO_PROXY,随后请求会被显式绑定到该代理。其他 ULA、相邻前缀,或与真实私网应答混合的 fake-IP 应答仍需要 allowPrivateNetwork: true。提供方保存时的校验不应用该 IPv6 例外。
Codex 账户池
Section titled “Codex 账户池”请在仪表盘 Codex Auth 页面添加 pool account 并刷新 quota。配置只保存非 secret account
metadata;access/refresh token 存放在加固的 Codex account credential store 中。Pool routing
分为新建/未绑定任务分配、基于用量的主动切换和故障恢复。已绑定任务通常保持 affinity。默认(pool.cacheAffinity)下,该重新绑定会等到绑定账号耗尽或无法继续服务,并且只改绑到确有额度余量且 usage 严格更低的账号;所有账号都高于阈值时,已绑定任务留在原账号。关闭该标志后,quota 可在超过阈值后的下一次请求中重新绑定,但仍只改绑到确有额度余量且 usage 严格更低的账号。暂停、cooldown、重新认证和故障处理也能独立清除或改变
routing。未绑定请求没有 live 账号绑定,也可能是代理重启或 affinity 重置后的已有任务。输出前的
429/402 即使在关闭基于用量的主动切换时,也可在同一请求中对合格替代账号重试一次。
账号变化后会保留并重放对话上下文,但账号间的 provider prompt cache 不保证复用,可能需要重新预热。
暂停后仍会显示账号及其 quota metadata,但不会参与自动切换、重试/failover 选择、cooldown 恢复探测或手动激活。
暂停还会清除该账号的 thread affinity map:进行中的请求保留已捕获的 credential,但后续 turn 会重新路由,无法再使用已暂停账号。
暂停状态会跨重启保留;如果所有账号均已暂停,Pool 路由会明确失败,而不会暗中选择某个账号。
暂停已达上限账号 会先刷新有 credential 的合格账号,只暂停相关 quota window 本次明确返回 100% 的账号;无 credential、未知额度或刷新失败的账号保持不变。
遇到 401/403 时,App 登录会清除该账户的进程内 affinity 并要求重新认证。
遇到 429 时,它会遵循 Retry-After、启动账户 cooldown、清除 affinity,
并可将请求切换到另一个符合条件的 Pool 账户。即使 autoSwitchThreshold: 0,
这些故障恢复流程仍然有效;0 只会禁用基于用量的主动切换。
分配与主动切换策略: quota(默认)在没有活跃账号时选择 usage 最低的合格账号;活跃账号合格且低于 autoSwitchThreshold 时继续使用;达到阈值后,可把未绑定请求切换到 usage 更低的合格账号。默认下 cache affinity 优先于 quota 余量,已绑定任务会保留到账号耗尽(已知 usage 为 100%)或无法继续服务,改绑时只前往确有额度余量且 usage 严格更低的账号。关闭该标志后,也可在该阈值把已绑定任务的下一次请求改绑到确有额度余量且 usage 严格更低的账号。round-robin 均匀分配未绑定请求,用量
阈值不会改变正常轮换。accountPoolStickyLimit(默认 1,1–100)统计分配/绑定,而不是成功响应。
fill-first 在 cooldown、重新认证或耗尽阈值前把未绑定请求分配给活跃账号;健康的已绑定任务保持
affinity。这些策略不能规避 provider enforcement。
anthropicAccountPool(实验性)
Section titled “anthropicAccountPool(实验性)”这个可选功能会池化已经存储在 auth.json 中的多个 Anthropic OAuth 账户。默认关闭,且尚未经过充分实战验证。同一组织内的账户可能共享配额,而自动轮换可能触发提供者限制。
| 键 | 类型 | 默认值 | 说明 |
|---|---|---|---|
anthropicAccountPool.enabled? |
boolean |
false |
启用粘性会话亲和性与基于用量的新会话选择。429 故障转移不由此开关控制:只要存有两个及以上可用账号就会生效,与其他多凭据提供方一致,且无法关闭。 |
anthropicAccountPool.autoSwitchThreshold? |
number |
80 |
对于新会话,当活动账户达到此阈值时,选择配置窗口中已知缓存使用率最低的账户。0 会禁用配额选择。 |
anthropicAccountPool.strategy? |
"quota" | "round-robin" | "fill-first" |
"quota" |
新会话策略;quota 按 quotaWindow 指定的窗口(默认是 5 小时条形数据)对账户排序,fill-first 也在同一窗口中判定其耗尽阈值。 |
anthropicAccountPool.quotaWindow? |
"five-hour" | "weekly" | "max-utilization" |
"five-hour" |
基于用量选择账户时使用的、由提供商报告并缓存的用量条。five-hour 保持原有行为。weekly 使用每周用量条,并在仍有其他可用账户时跳过 5 小时用量已耗尽的账户;若没有其他账户,则回退使用这些账户。max-utilization 使用已知值中的最高值,因此每周用量尚不可用时仍可使用 5 小时用量;两者都未知时,账户遵循 unknown 用量排序。已知用量排在 unknown 之前,但如果所有可用账户都未知,仍会按可用顺序选择一个账户。在前述较低 5 小时用量的同分判定之后,完全相同时也保留可用顺序。不会主动重新平衡健康且已建立亲和性的会话。在新会话分配和符合条件的 429 替代后的路由恢复中,quota 直接按此窗口对可用候选账户排序;fill-first 按此窗口的阈值和耗尽规则以稳定顺序前进;round-robin 忽略此设置。冷却状态、故障转移上限和重新认证资格仍是独立的本地状态。各账户的每周用量只有在控制面板的提供商页面完成查询后才可用。 |
anthropicAccountPool.stickyLimit? |
number |
1 |
在一次轮询选择中保留的成功新会话绑定次数。范围 1–100。 |
只有共享5小时或每周额度明确拒绝的429才会冷却账户并切换。临时速率限制保留亲和性,只暂停该账户的请求准入;每个请求最多一次短暂的同账户重试和一次合格兄弟账户切换。没有依据响应头的429只允许一次同账户短暂重试,不冷却账户,也不生成Retry-After。默认单账户行为不变。Fable专属拒绝不限制Sonnet;手动选择和亲和性均检查请求模型的共享与家族额度。被动家族信息在30分钟或已知重置时到期,由一个服务请求串行重新验证。使用阈值仍是软偏好,全部候选耗尽时保留原有回退,不是用量或账单硬上限。亲和性是进程本地的,并且有大小上限。令牌刷新失败保留原有重新认证规则。明确的订阅或账户计费 403 可在输出前切换账户,并按 Retry-After 或默认十分钟冷却;普通权限拒绝不会切换。如果所有合格账户都在冷却,客户端会在已知时收到带 Retry-After 的 429,而不是身份验证错误。
当请求可用的每个账户都因配额耗尽而被挂起(共享 5 小时或每周窗口,或所请求模型家族的每周窗口)时,这个 429 是用量上限而不是速率限制:Responses 正文的 error.type 和 error.code 为 usage_limit_reached;若每个被挂起账户的上游重置时间都已知,还会带上 resets_at(最早重置的 epoch 秒)。Codex 会停止并显示何时可以重试,而不是一直重试到 “exceeded retry limit”。最后一个账户因配额耗尽被拒且没有可替换账户时,也会得到同样的响应。只要有一个被挂起账户只是临时限速、正在重新验证模型家族或因权限被拒,响应就保持可重试的 rate_limit_exceeded。Combo 目标保持速率限制形式,以便 combo 转到下一个目标。原生 /v1/messages 保持 Anthropic 的 rate_limit_error 类型,消息中会说明用量上限。
只要一次新的用量读取(仪表盘的提供方页面,或 ocx account list anthropic --quota --refresh)显示被拒绝的每个窗口都低于 100%,配额冷却就会提前解除,无论它来自 Retry-After 还是窗口重置。这适用于升级套餐或窗口提前重新开放的情况。在拒绝之前开始的读取永远不会解除它,权限类 403 冷却会等到其截止时间。
Anthropic · Pool 2 (anthropic2)
Section titled “Anthropic · Pool 2 (anthropic2)”anthropic2(“Anthropic · Pool 2”)是第二个内置的 Anthropic OAuth 提供者,拥有自己的账户池。它与 anthropic 使用同一套 Anthropic 实现:相同的登录流程、线路格式、原生 Messages 与 Responses 桥接以及模型元数据。只有账户及其所在的账户池是分开的。通过模型前缀选择账户池:anthropic/claude-sonnet-5 使用主账户池,anthropic2/claude-sonnet-5 使用 Pool 2。
在你添加之前,Pool 2 处于休眠状态。使用 ocx login anthropic2 登录,或在控制面板的提供者页面添加 Anthropic · 账户池 2。首次登录成功后会创建带有标记 "anthropicOAuthInstance": "anthropic2" 的 providers.anthropic2。Pool 2 永远不会成为默认提供者:不带前缀的 claude-* 模型名、默认模型以及 Claude Code 调用方转发仍解析到 anthropic。你此前自行创建、没有标记的 anthropic2 条目保持其自定义含义;登录会拒绝该名称冲突,既不改写该条目,也不改写你的凭据。
Pool 2 从自己的提供者条目读取账户池设置。键、默认值和行为与上文的顶层 anthropicAccountPool 相同,且不从主账户池继承任何内容。providers.anthropic.anthropicAccountPool,以及任何其他提供者上的该字段,都会被拒绝。
{ "anthropicAccountPool": { "enabled": true, "strategy": "quota" }, "providers": { "anthropic2": { "adapter": "anthropic", "authMode": "oauth", "baseUrl": "https://api.anthropic.com", "anthropicOAuthInstance": "anthropic2", "anthropicAccountPool": { "enabled": true, "strategy": "round-robin" } } }}两个账户池在 opencodex 内部相互隔离:
- 凭据: Pool 2 账户以独立的
anthropic2键保存在受保护的凭据存储中。若登录的令牌或已验证的 Anthropic 账户已保存在另一个账户池中,该登录会被拒绝。 - 账户池设置与运行时状态: 选择、会话亲和性、冷却、暂停、模型路由和按账户阈值都只属于一个账户池。路由的
fallback: true只在同一账户池内放宽。 - 配额与用量: 用量探测、配额缓存和用量归属按账户池分别记录,因此同一个账户 ID 同时出现在两个账户池中时,会有两条独立记录。
- 重置额度: Pool 2 使用自己的日志(
anthropic2-reset-grant-ledger.json),与保持不变的主账户池日志并存。 - 恢复: 直接的
anthropic2/<model>请求绝不会回退到主账户池,Pool 2 的速率限制或拒绝也绝不会让主账户池的账户进入冷却。显式指定两个账户池的组合(combo)保留你声明的目标。
这种分离是 opencodex 内部的路由边界。它不会改变 Anthropic 对待你账户的方式,也不会消除上文所述的账户策略风险。
Pool 2 账户只能通过浏览器 OAuth 添加。与 anthropic 不同,Pool 2 从不导入、接管或回写 Claude Code CLI 令牌;这一差异是有意为之。Pool 2 初始为空;没有可用 Pool 2 账户的 Pool 2 请求会以认证错误失败,而不会借用主账户池或 Claude Code 的凭据。
账户命令和管理 API 按名称指定账户池:ocx account pool anthropic2 …、ocx account auto-switch anthropic2 …、ocx account routes anthropic2 … 以及 ocx account anthropic-reset-grants --provider anthropic2。账户池设置和重置额度端点接受 provider: "anthropic2";省略时仍使用主账户池。
辅助功能的账户池选择(anthropicInstance)
Section titled “辅助功能的账户池选择(anthropicInstance)”网页搜索和视觉辅助功能在全局 webSearchSidecar、visionSidecar 设置以及 Claude Code 覆盖项 claudeCode.webSearchSidecar、claudeCode.visionSidecar 中接受可选的 anthropicInstance。当辅助功能的后端为 Anthropic 时,控制面板将其显示为 账户池 选择项。
| 值 | 行为 |
|---|---|
| 未设置(默认) | 跟随当前请求的账户池:anthropic2/<model> 请求使用 Pool 2,anthropic/<model> 请求使用主账户池。来自其他提供者的请求保留现有的辅助功能发现逻辑,该逻辑从不选择 Pool 2。 |
"anthropic" |
始终使用主账户池。 |
"anthropic2" |
始终使用 Pool 2。 |
该字段仅在辅助功能的后端解析为 Anthropic 时生效。与其他后端一起设置会导致校验错误;由于网页搜索默认使用 OpenAI,请同时设置 "backend": "anthropic"。以另一个账户池限定的辅助模型(例如 anthropic/claude-sonnet-5 搭配 "anthropicInstance": "anthropic2")同样会被拒绝。如果所选账户池没有可用账户,辅助功能会在发送任何内容之前失败,不会切换到另一个账户池。此时主请求会在没有该辅助功能的情况下照常进行。未设置的选择会保存为缺省,而不是 "anthropic"。
{ "webSearchSidecar": { "backend": "anthropic", "anthropicInstance": "anthropic2" }}托管记录形状
Section titled “托管记录形状”apiKeys[] 条目包含 id、name、生成的 key 以及 ISO 格式的 createdAt 字符串。codexAccounts[] 条目要求有 id、email 和 isMain,并可选 plan、chatgptAccountId 和具备隐私安全性的 logLabel。这些记录通常由仪表板管理。
tokenGuardian(OcxTokenGuardianConfig)
Section titled “tokenGuardian(OcxTokenGuardianConfig)”| 字段 | 类型 | 默认值 | 含义 |
|---|---|---|---|
enabled? |
boolean |
false |
全局主动刷新开关。 |
tickSeconds? |
number |
21600 |
扫描间隔(6 小时,最少 60 秒)。 |
jitterSeconds? |
number |
300 |
扫描前的随机延迟。 |
concurrency? |
number |
3 |
最大并发刷新数。 |
leadSeconds? |
number |
900 |
相较于一个 tick 的额外刷新提前量。 |
failureBackoffBaseSeconds? |
number |
300 |
初始瞬态故障退避时间。 |
failureBackoffMaxSeconds? |
number |
3600 |
退避上限和永久故障延迟。 |
codexWarmupEnabled? |
boolean |
false |
启用合成的 Codex 池账户验证。 |
codexWarmupMaxAgeSeconds? |
number |
691200 |
8 天后重新验证账户。 |
codexWarmupModel? |
string |
gpt-5.6-luna |
用于可选预热的原生模型。 |
固定提供者端点
Section titled “固定提供者端点”路由会先于适配器解析提供者端点。对于大多数内置项,注册表端点会覆盖所配置的 baseUrl。以下四类条目会保留所配置的 URL:
- 启用覆盖的提供者:
ollama、vllm、lm-studio、litellm、qwen-cloud和alibaba-token-plan-intl; - 由用户填写的注册表模板,例如
azure-openai和cloudflare-ai-gateway; - 被提升的固定 API key 预设,并保留一个更早、同名的自定义目标;以及
- 不在注册表中的提供者。
适配器之后可以再调整解析后的 URL。例如,Kiro 会依据导入凭据的 API 区域,遵循规范的 runtime.{region}.kiro.dev。参见适配器。
当路由丢弃 baseUrl 时,opencodex 会记录注册表端点以及仅有的已配置 origin;配置的路径本身也可能包含凭据。请移除未使用的 URL,或选择与预期区域相匹配的提供者条目。alibaba-token-plan 锁定在北京,而 alibaba-token-plan-intl 覆盖国际端点。
对于损坏的 openai-responses 网关,修复应放在提供者对象上:
{ "providers": { "custom-gateway": { "adapter": "openai-responses", "baseUrl": "https://gateway.example/v1", "apiKey": "${GATEWAY_KEY}", "responsesItemIdRepair": { "reasoning": ["rs_0"], "message": ["msg_0"], "repairMissingTerminalIds": true } } }}占位列表必须精确匹配。对于正常/有状态的 Responses 提供者,请保持该字段未设置,以便转发能保持逐字节一致。
Cursor 提供者(adapter: "cursor")
Section titled “Cursor 提供者(adapter: "cursor")”Cursor 桥接是实验性的。执行 ocx login cursor 之后,添加或编辑 providers.cursor。
如果代理无法承载 Cursor 默认的 HTTP/2 stream,请将 upstreamHttpVersion 设置为
"http1.1" 或其别名 "h1"。推理会切换到 Cursor 的 RunSSE + BidiAppend 兼容传输,GetUsableModels
实时发现也会使用 HTTP/1.1。该配置要求 baseUrl 使用 HTTPS。保持未设置或使用 "auto",
则继续使用现有 HTTP/2 行为。
在仪表板中,可通过 Providers → Cursor → 设置 → Cursor 传输协议 进行选择。
Cursor Router 的优化层级会作为独立的 Codex id 暴露,因为选择器无法渲染 Cursor 特定的模型参数:
| Codex model | Cursor Router mode |
|---|---|
cursor/auto |
Team/account default |
cursor/auto-cost |
Cost |
cursor/auto-balance |
Balance |
cursor/auto-intelligence |
Intelligence |
显式变体会携带 Cursor 的 default 模型及其 optimization 参数,从而在每次请求中保留该选择。即使实时发现未返回 default,它们仍然可用。
Cursor 由服务端驱动的本地工具默认是禁用的。Codex 继续使用自己的工具,例如 apply_patch 和 exec_command,并沿用自己的审批与沙箱策略:
"off"(默认)会拒绝执行 Cursor 原生的read、write、delete、ls、grep、shell和fetch。"on"会启用受信任的本地执行,并绕过 Codex 的审批/沙箱语义。"codex-sandbox"为兼容性保留,但会像"off"一样失败关闭;请求文案并不是可信的沙箱证明。
{ "providers": { "cursor": { "adapter": "cursor", "baseUrl": "https://api2.cursor.sh", "authMode": "oauth", "defaultModel": "auto", "nativeLocalExec": "off" } }}请将 nativeLocalExec 设置在 providers.cursor 上,而不是顶层。在仪表板中,使用 Providers → Cursor → Edit JSON,保存,然后重启。旧的 unsafeAllowNativeLocalExec: true 仅在未设置 nativeLocalExec 时,才等同于 nativeLocalExec: "on"。MCP、屏幕录制和 computer use 由 mcpServers 和 desktopExecutor 单独控制。
每个 mcpServers.<name> 都可以接受 command(stdio)或 url(Streamable HTTP)。stdio 还接受 args、env 和 cwd;HTTP 接受 headers。两者都支持 enabled(默认 true)和 toolPrefix。desktopExecutor 接受 computerUseCommand、recordScreenCommand、cwd、env 和 timeoutMs(默认 30000)。命令通过 sh -c 执行,从 stdin 读取一个 JSON 请求,并且必须向 stdout 写入一个 JSON 结果。
xAI Grok 4.7
Section titled “xAI Grok 4.7”Grok 4.7 在 OAuth 上支持 Fast,提供 low / medium / high / xhigh,上下文窗口为 500,000。按 xAI 标准价格,每百万 token 的输入、缓存输入和输出费用分别为 $2.00、$0.50 和 $6.00;上下文达到 200,000 token 时分别为 $4.00 / $1.00 / $12.00。
未显式配置提供商的 fastWire 时,通过 allowedModels 限制的 opencodex API 密钥必须允许 xai/grok-4.7-build-fast(或不带提供商前缀的模型 ID),才能发送 OAuth Fast 请求。仅允许 xai/grok-4.7 不会授予此 Fast 模型的权限。仅允许 Fast 模型的密钥可以使用该模型;普通请求或关闭 Fast 时仍需允许 xai/grok-4.7。显式配置 fastWire 时,应允许实际发送的模型。例如,service-tier 方式保留 xai/grok-4.7,因此需要该模型的权限。提供商限制仍然有效。
OpenRouter 提供者路由
Section titled “OpenRouter 提供者路由”OpenRouter 可以通过多个推理提供者来提供同一个模型。openRouterRouting 会让请求停留在偏好的提供者上;modelOpenRouterRouting 则会对精确模型 id 进行替换。对于提示缓存亲和性来说,这很有用,因为不同推理提供者的缓存支持、保留策略、命中率和定价都不同。
提供者名称使用 OpenRouter slug。allowFallbacks: false 会失败关闭;true 则允许在有序列表之后使用另一个合格提供者。only 永远是允许列表。
{ "providers": { "openrouter": { "adapter": "openai-chat", "baseUrl": "https://openrouter.ai/api/v1", "apiKey": "${OPENROUTER_API_KEY}", "openRouterRouting": { "order": ["deepseek"], "allowFallbacks": false }, "modelOpenRouterRouting": { "anthropic/claude-sonnet-5": { "only": ["anthropic"], "allowFallbacks": false } } } }}模型键必须是精确的原生 OpenRouter id,不带外层的 opencodex 提供者前缀。选择 openrouter/anthropic-claude-sonnet-5 会在应用模型规则之前,还原为原生 anthropic/claude-sonnet-5。
Vercel AI Gateway 提供者路由
Section titled “Vercel AI Gateway 提供者路由”Vercel AI Gateway 可以在多个底层推理提供者之间路由一个模型。vercelGatewayRouting 配置提供者级偏好;modelVercelGatewayRouting 会针对精确模型 ID 替换这些偏好。两者均未设置时,resolveVercelGatewayRouting() 返回 undefined,因此 Chat 请求构建器会省略 provider 字段,Vercel AI Gateway 则保留其默认的动态路由行为。
order:按优先级排列的 Vercel AI Gateway 上游提供者 slug。only:限制可用 Vercel AI Gateway 上游提供者的显式允许列表。sort:按"cost"(成本最低)、"ttft"(首个 token 所需时间)或"tps"(每秒 token 数)自动排列可用提供者。
{ "providers": { "vercel-ai-gateway": { "adapter": "openai-chat", "baseUrl": "https://ai-gateway.vercel.sh/v1", "apiKey": "${VERCEL_AI_GATEWAY_KEY}", "vercelGatewayRouting": { "sort": "ttft" }, "modelVercelGatewayRouting": { "zai/glm-5.2": { "only": ["novita", "deepinfra"], "order": ["novita", "deepinfra"] } } } }}模型键是 Vercel 的公开模型选择器,不带外层的 OpenCodex 提供者前缀。选择 vercel-ai-gateway/zai-glm-5.2 时,会先还原为原生 zai/glm-5.2,再应用模型规则。相同映射也适用于原生 vercel/<model-id> 选择器:在 OpenCodex 中使用编码后的 vercel-ai-gateway/vercel-<model-id> 选择器,并将 vercel/<model-id> 保留为模型键。
静态模型允许列表
Section titled “静态模型允许列表”liveModels: false 时,若 models 为空或省略,初始列表先加入已配置的 defaultModel,
再加入 retainModels,重复 ID 仅保留首次出现的位置。若显式设置了非空 models,则按
models、retainModels 顺序构建,不会自动加入另一个 defaultModel;仍可将该模型明确写入
models 或 retainModels。这些字段均未提供 ID 时,初始列表为空。此顺序不保证最终选择器的显示顺序。
selectedModels、disabledModels 和提供商禁用策略仍然适用。authMode: "forward" 保留原有独立分支,
不使用此静态路由列表。这些规则不改变实时发现失败时的回退行为。
实时发现会在缓存前拒绝超过 4 MiB 或 2,000 条原始模型行;内置预设可能使用更低的限制,并过滤为可聊天的行。过大或格式错误的结果会走陈旧/配置回退。合法的、零可用结果的发现仍然具有权威性,不会被静默替换或截断。
当需要继续运行发现,但只有选定 id 应该出现在 Codex 和 /v1/models 中时,请使用 selectedModels。仪表板会保留完整的已发现列表,以便之后调整允许列表。
请使用 modelDisplayNames 设置显示名称。优先顺序是操作者设置的 modelDisplayNames、提供者目录元数据,然后是普通的 provider/model 显示。键是此提供者内精确的原生模型 id,例如 xai/grok-4.6 的键是 grok-4.6。名称只改变显示,不会改变精确路由 id 或上游模型 id。请只把此字段加入 config.json 中现有的提供者设置,并保留所有其他字段。向 PUT /api/providers/:provider/model-display-names 发送 { "modelId": "grok-4.6", "displayName": "Grok 4.6" } 可保存名称,发送 displayName: null 只重置该名称。
本地 Codex 目录中受支持的不带前缀的原生 GPT 条目也可以通过
providers.openai.modelDisplayNames 设置精确的显示名称, 例如 "gpt-6-astra": "GPT 6 Astra"。
启动时同步和本地目录收敛都会重新应用这些名称。删除名称设置时, 只有条目的当前显示名称仍与已应用的覆盖值一致,
才会恢复原始原生名称。外部更改的显示名称仍受现有原生元数据规范化规则约束。
例如,Astra (gpt-6-astra) 仍会将不同于固定原生名称的名称替换为该固定名称。
显示名称覆盖不会改变模型 ID、元数据(包括能力)、排序、路由组合别名和带账户限定的条目。
此本地目录覆盖不会重命名 HTTP 模型列表中的条目或虚拟 *-pro 条目。
预览版 GPT-5.6 回退条目使用相同机制。OpenAI API key 预设会为基础和 Pro id 设定 1050000 上下文和 922000 最大输入;OpenRouter 会为 openai/gpt-5.6-sol、openai/gpt-5.6-terra 和 openai/gpt-5.6-luna 设定 1050000 上下文。原生 Pool/Direct 的窗口遵循保留 OpenAI 供应商策略;同步后的目录会声明 max,同时保留 xhigh 的独立性。
{ "providers": { "openrouter": { "adapter": "openai-chat", "baseUrl": "https://openrouter.ai/api/v1", "apiKey": "${OPENROUTER_API_KEY}", "liveModels": false, "models": ["deepseek/deepseek-v4-flash", "qwen/qwen3-coder-plus"] } }}模型显示名称编辑器
Section titled “模型显示名称编辑器”仪表板的 Models 可让你为已发现的模型持久保存易读名称。展开提供者,找到一个已发现的模型,然后选择 Name。
保存易读名称时,对话框会一直显示精确的 provider/model 选择器。选择 Reset name 可恢复为
提供者元数据中的名称,或默认的选择器显示。Name 只改变显示;单独的别名铅笔图标用于修改
短路由别名,并不是显示名称编辑器。原生 OpenAI 和自定义模型条目保留现有控件。
如果更改已保存但刷新失败,对话框会反映已保存的覆盖值,并继续提供 Retry。如果服务器报告 目录收敛失败,Retry 会重新执行目录收敛;如果只是列表请求失败,则重新加载列表。重置后的恢复 会保留重置操作,不会恢复旧名称。请求的总时限为 60 秒,涵盖写入及后续的列表刷新。超时不会撤销 写入:进行其他更改前,请使用 Retry 检查当前名称。
{ "port": 10100, "defaultProvider": "openai", "providers": { "openai": { "adapter": "openai-responses", "baseUrl": "https://chatgpt.com/backend-api/codex", "authMode": "forward" }, "anthropic": { "adapter": "anthropic", "baseUrl": "https://api.anthropic.com", "authMode": "oauth", "defaultModel": "claude-sonnet-4-6" }, "ollama-cloud": { "baseUrl": "https://ollama.com/v1", "apiKey": "${OLLAMA_API_KEY}", "defaultModel": "glm-5.2", "noVisionModels": ["glm-5.2", "gpt-oss", "qwen3-coder", "deepseek-v4-flash"] } }, "subagentModels": ["anthropic/claude-opus-5", "ollama-cloud/glm-5.2"], "disabledModels": [], "websockets": false, "webSearchSidecar": { "maxSearchesPerTurn": 3, "routedModelStallTimeoutMs": 200000, "timeoutMs": 60000 }, "visionSidecar": { "enabled": true }}anthropicAccountPool.routes
Section titled “anthropicAccountPool.routes”anthropicAccountPool.routes 将模型绑定到已保存的 Anthropic OAuth 账户 ID。启用账户池后,区分大小写的 match 通配模式按顺序取第一个匹配规则,限制首次选择和 429 重试。仅当该规则没有可用账户时,fallback: true 才回退到普通账户池。
promptLengthPricing
Section titled “promptLengthPricing”可选字段 promptLengthPricing 扩展四项基础费率。mode: "automatic"(或省略该字段)保留目录的上下文计价规则;mode: "flat" 禁用这些规则。mode: "custom" 使用正安全整数 thresholdTokens、值为 "gt"(>)或 "gte"(≥)的 comparison,以及包含四项绝对替代费率的 rates。阈值统计所有提示词 token,包括缓存读取和写入,不包括输出。选中的费率适用于包括输出在内的整个请求,并在阈值两侧都取代目录上下文规则。Fast/Priority 调整在选定费率后只应用一次,并遵循目录为该模型公布的 Priority 关系;仅当目录将该关系声明为 lower-bound(目前为 xAI Grok)时,估算才会标记为下限;没有目录规则的模型只应用一次 Priority 倍率。可在 Models → Price 中配置。Reset to automatic 删除包括基础费率和规则在内的整个覆盖配置。旧配置保持兼容;这些设置只涉及显示的费用估算。

