【免费下载链接】opencodex
Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code
导读
本文围绕 opencodex(Universal provider proxy for OpenAI Codex & Claude Code)中一次重要的provider 契约重构展开:项目把历史上公开的openai/openai-multi双 Codex 登录 provider 拆分,收敛为唯一的openai内置 Codex 登录 provider,并以持久化的providers.openai.codexAccountMode("pool" | "direct")作为账户选择策略。文章依据 devlog/_fin/260717_openai_single_provider_option/010_core_contract.md 中的核心契约、迁移规则、路由边界与验证矩阵,结合仓库源码逐一还原其实现细节。读完本文,你将掌握:codexAccountMode的 schema 校验与默认语义、v1→v2 配置迁移(含.pre-openai-tiers-v2.bak备份)的完整规则、Pool(主登录 + 附加账户轮换)与 Direct(仅主登录短路)在路由/认证/配额/侧车各链路上的隔离边界,以及该契约对应的测试矩阵与验收标准。
一、背景:从「三 provider 拆分」到「单 provider + 账户模式」
在本次重构之前,仓库中面向 Codex 登录的 OpenAI provider 采用「三层」布局:openai(Codex Direct)、openai-multi(Codex Multi,可管理多个附加 Codex 账户)、openai-apikey(纯 API Key 路由)。这种结构的问题在于:openai-multi作为可路由、可配置的公开 provider id,会让同一套 Codex 登录能力在注册表、预置、初始化配置、模型目录和侧车候选中反复出现两份,容易造成路由分支分裂与术语混乱(如「provider tier」「Codex Multi-account」等表述)。
本次重构的核心决策(来自 000_plan.md 的 User decision record)是:
openai-multi被移除为公开/可配置的 provider 与模型命名空间,仅保留为迁移期遗留 id(LEGACY_OPENAI_MULTI_PROVIDER_ID)。- 所有裸原生 OpenAI 模型 id 的账户选择统一由
providers.openai.codexAccountMode决定。 - 默认值为
"pool",且主登录(main login)作为普通合格成员参与轮换。 "direct"仅使用主登录,绝不触碰账户亲和性、附加账户凭据、池配额、冷却、健康或 active-account 状态。openai-apikey及其八个模型的目录、Pro 虚拟别名、密钥池所有权、selected-id 保留与 wire 重写完全不变。
锁定契约可以概括为一张表:
| 公开 provider id | 选中模型身份 | 凭据归属 | 账户规则 | 可变设置 |
|---|---|---|---|---|
openai | 裸 id(如gpt-5.6-sol) | 按模式由 Codex 登录/账户存储提供 | pool轮换主登录 + 附加账户;direct仅用调用方/主登录 | codexAccountMode,默认pool |
openai-apikey | 命名空间 id(如openai-apikey/gpt-5.6-sol、...-pro) | 仅配置的 API Key 或活跃密钥池条目 | 永不读取 Codex 账户,永不接收 Codex 登录兜底 | 不变 |
关键不变量:裸 OpenAI 家族模型只经启用的openai路由,绝不静默落入openai-apikey;pool与direct是同一个 canonical forward 传输(openai-responsesadapter、https://chatgpt.com/backend-api/codexbase URL、authMode: "forward")的两种模式,而不是两组 base URL 或 auth 模式。
二、类型层:codexAccountMode 落地与版本标记提升
契约首先落在类型定义上。当前实现中,模式类型与版本常量定义于 src/types/wire.ts:
// src/types/wire.ts export type CodexAccountMode = "direct" | "pool"; export const OPENAI_PROVIDER_TIER_VERSION = 2 as const;CodexAccountMode = "direct" | "pool"维持两个合法值,不引入第三/回退状态——这是本契约刻意为之:任何非法值都应在 schema 层失败,而不是在运行时悄悄退化为某种模式。OPENAI_PROVIDER_TIER_VERSION从 1 提升到 2,作为「OpenAI provider-contract 迁移标记」;配置键名openaiProviderTierVersion为磁盘向后兼容而保留原名。OcxProviderConfig上新增codexAccountMode?: CodexAccountMode(位于authMode之旁),仅在 canonical 内置openaiforward provider 上合法,缺失时默认pool。
从源码结构看,类型导出经由 src/types.ts 汇集:export type { UpstreamHttpVersion, ReasoningSummaryDelivery, CodexAccountMode } from "./types/wire"与OPENAI_PROVIDER_TIER_VERSION的再导出,使配置、路由、认证模块可以共享同一套契约。
三、配置层:schema 校验、superRefine 拒绝规则与默认值
3.1 模式字段的 schema 约束
在 src/config/schema/config-schema.ts 中:
providerConfigSchema扩展了codexAccountMode: z.enum(["pool", "direct"]).optional(),使非法字符串在 schema 解析时直接失败,而不是经.passthrough()泄漏到运行时。configSchema.openaiProviderTierVersion改为接受字面量1 | 2(见该文件第 161 行z.union([z.literal(1), z.literal(2)]).optional()),保证 v1 旧配置在迁移前仍可解析、可启动。
3.2 superRefine 的归属限制
schema.superRefine阶段强制执行两条归属规则(见 src/config/schema/config-schema.ts 第 617 行附近):
- 除 canonical
openai外的每个provider 都不允许携带codexAccountMode(报错路径["providers", <name>, "codexAccountMode"],消息为codexAccountMode is valid only on the canonical built-in openai provider); openai上若 adapter/base URL/auth 模式不是内置 forward 形状,同样拒绝该字段。
同时,旧openai-multi行在标记缺失或为 1 时必须保持可解析,以便启动迁移(migrate)而非直接丢弃配置——即「可迁移,不可悬空」。
3.3 默认值
getDefaultConfig().providers.openai携带codexAccountMode: "pool",保证全新安装即进入 Pool 默认;而mergeConfigDefaults的 provider 合并行为保持不变——运行时解析器仍然会把一个手工编写、缺省模式的openai行在下次保存前默认为pool,因此「手写最简配置」也能符合新默认。
四、迁移引擎:projectOpenAiTierMigration 的纯函数投影
迁移是本次重构中最重要的工程部件,它由 src/providers/openai-tiers.ts 中的projectOpenAiTierMigration(config)承担(该文件保留「tier」命名仅为了向后兼容)。
4.1 常量重命名:把遗留 id 关进笼子
模块顶部重新导出(来自openai-tiers-destination):
OPENAI_CODEX_PROVIDER_ID("openai",原OPENAI_DIRECT_PROVIDER_ID更名);LEGACY_OPENAI_MULTI_PROVIDER_ID("openai-multi",原OPENAI_MULTI_PROVIDER_ID更名——除迁移模块外,任何非迁移模块不得再导入旧常量名);OPENAI_API_PROVIDER_ID与LEGACY_CHATGPT_PROVIDER_ID值不变。
canonicalCodexForwardProvider(mode)现在接受一个模式参数并返回完整 canonical 传输加codexAccountMode:
function canonicalCodexForwardProvider(mode: CodexAccountMode): OcxProviderConfig { return { adapter: "openai-responses", baseUrl: CODEX_FORWARD_BASE_URL, authMode: "forward", codexAccountMode: mode, }; }而isCanonicalOpenAiForwardProvider保持传输聚焦:接受任一合法模式,但拒绝 key auth、自定义 base URL、query/fragment 凭据或其他 adapter。
4.2 投影的有序规则(对照 000_plan 的十条)
投影是纯函数且有序的,实现细节如下:
structuredClone(config)克隆输入,绝不修改调用方状态。- 校验
providers["openai-multi"]:managedLegacyMultiOverlay允许集仅为adapter、authMode、baseUrl、disabled、selectedModels、modelCosts;非 canonical 行直接抛OpenAiTierMigrationCollisionError(不保存、不备份),因为携带密钥/自定义形状的配置不能被静默丢弃。 - 模式解析(
resolvedOpenAiMode):- 显式合法的
providers.openai.codexAccountMode优先; - 否则,启用的遗留
openai-multi行、defaultProvider === "openai-multi"或已知openai-multi/引用 →pool; - v1 下仅有历史 Direct 的
openai→direct(保留先前显式行为); - 未标记/全新配置 → 默认
pool。
- 显式合法的
- 仅在配置确实引用 Codex-forward 面时保证一个 canonical
openai行(审计回折 A1):marker 1 且既无openai也无openai-multi时保留缺席、不复活已删除的 provider;仅禁用的 Multi 行则吸收进openai(模式pool)并保留disabled: true。 mergeLegacyOpenAiProviderRows合并selectedModels(先 canonical 后遗留,去重、稳定顺序);modelCosts键经rewriteLegacyOpenAiCostKeys重写后合并(bare 键优先)。- 删除
providers["openai-multi"]与providers.chatgpt;遗留默认映射到defaultProvider: "openai"。 rewriteLegacyOpenAiReferences将openai-multi/<model>精确改写为裸<model>,覆盖:disabledModels、subagentModels、injectionModel、shadowCallIntercept.model、webSearchSidecar.model、visionSidecar.model、claudeCode.webSearchSidecar.model、claudeCode.visionSidecar.model、claudeCode.model、claudeCode.smallFastModel、claudeCode.tierModels.{opus,sonnet,haiku,fable},以及modelMap的 DESTINATION 值(绝不重写 source 键)。providerContextCaps["openai-multi"]移入providerContextCaps.openai;两者并存时取更低的正值上限并产生仅含路径的 warning(providerContextCaps.openai + providerContextCaps.openai-multi: kept lower positive cap)。- 去重且保留首次出现顺序;不重写
openai-apikey/...、自定义 provider id、用量历史与请求日志。 - 写
openaiProviderTierVersion: 2;对已是 marker 2 的 canonical 单 provider 配置,二次投影changed: false、克隆相同、无警告(幂等)。
值得强调的安全边界(源码unknownLegacyOpenAiWarnings):投影只按已知路径白名单(isKnownLegacyValuePath)重写;未知 passthrough 字段中出现的openai-multi只产生路径级 warning(<path>: legacy OpenAI provider id left unchanged),绝不递归改写任意字符串——因为 passthrough 配置里允许出现 provider 密钥和自由格式 prompt。
4.3 备份:v2 快照与字节级安全
backupConfigBeforeOpenAiTierMigration泛化为~/.opencodex/config.json.pre-openai-tiers-v2.bak(见 src/config/openai-tier-backup.ts):
- 保留 v1 备份只读、绝不覆盖/改名/删除——v1 备份恢复的是「三 provider」之前的旧状态,v2 备份恢复的是本次反转之前的即时状态;
- 字节一致的既有 v2 备份直接复用;不一致的既有 v2 备份构成硬冲突,保存前中止;
- 维持 mode 0600、Windows ACL 加固、回滚与密钥残留错误处理(
OpenAiTierBackupIO语义不变)。
4.4 启动边界
src/providers/openai-tier-startup.ts 的runOpenAiTierStartupMigration保持服务器启动边界,严格顺序为project → backup → save(仅当changed === true);冲突或幂等输入时零备份/零保存。保存成功后,projection.warnings才逐条以仅含路径的console.warn输出——持久化成功之前不告警。
五、路由层:单一 openai 选择与 API 命名空间的隔离
src/router.ts 是本契约的语义执行点:
- 移除
OPENAI_MULTI_PROVIDER_ID与三元素OPENAI_TIER_ORDER,不再存在「多 provider 顺序选择」。 routeResult中调用providerCodexAccountMode(providerName, provider):显式direct优先,缺失模式默认pool。routeModel的isBareOpenAiFamilyModel分支只选择启用状态的openai;若缺失或禁用则抛NoEnabledOpenAiProviderError(原NoEnabledOpenAiTierError更名)——绝不回落openai-apikey(见 src/router.ts 第 495 行类定义与第 659/667/795 行抛点)。- 显式
openai-apikey/<model>保持原routeResult路径,不携带codexAccountMode。 - 显式
openai-multi/<model>迁移后不再匹配,走正常 no-provider 错误;没有运行时兼容别名——兼容性是一次性的配置/模型 id 重写,而非永久第二条路由。
providerCodexAccountMode实现在 src/providers/registry.ts 第 210–216 行附近:注册表模式仅作为缺省来源,持久化的 provider 值优先,调用方在解析运行时/DTO 模式时必须传入 provider 对象。
六、认证层:Direct 短路边界与 Pool 引擎所有权
src/codex/auth-context.ts 的resolveCodexAuthContext把 Direct 分支放在第一优先位置,构成「direct-pin 边界」:
if (mode === "direct") { if (!hasCallerCodexBearer(headers)) throw new CodexDirectAuthenticationError(); return { kind: "main", accountId: null }; }该分支必须先于读取x-codex-parent-thread-id、调用resolveCodexAccountForThreadDetailed、读取配额、检查冷却、导入primeCodexPoolQuotas、读取getMainAccountToken或调用getValidCodexToken——即任何池状态查找或池状态变更之前。CodexDirectAuthenticationError类定义见该文件第 431 行。
Pool 分支是唯一调用resolveCodexAccountForThreadDetailed的分支,继续产出main-pool(主登录)与pool(附加凭据)两种身份;applyCodexAuthContextToProvider受mode === "pool"保护,Direct 永不收到_codexAccountOverride或_codexAccountRequired;headersForCodexAuthContext对kind: "main"转发调用方 headers,仅对pool/main-pool替换认证。用户可见文案从「Codex Multi-account」更名为「OpenAI account pool」。
src/codex/routing.ts 的选择算法被复用而非重设计:getEligiblePoolAccounts(含MAIN_CODEX_ACCOUNT_ID)、线程亲和性处理、applyQuotaAutoSwitch、applyFailureFailover、recordCodexUpstreamOutcome语义不变;formatCodexProviderForLog(providerName, accountId, config)让 Pool 请求聚合在openai(或附加账户的openai-<safe-label>)下,永不再出现openai-multi日志身份。Direct 模式绝不从resolveCodexAuthContext进入该模块——认证上下文分支是唯一的所有权边界。
七、配额、启动预载、用量标签与侧车:模式感知的收尾链路
模式感知同样贯彻到配额与预热链路,避免 Direct 意外触碰附加账户存储:
- src/providers/quota.ts:
isBuiltInChatGptForwardProvider识别 canonicalopenai而非遗留 Multi;maybeFetchProviderQuota返回单个openai报告键。审计回折 A3 要求:listCodexAuthAccounts(src/codex/auth-api.ts 第 353 行附近)会读取/刷新每个附加账户,因此Direct 模式配额路径必须只解析主账户、不触碰附加账户存储;配额缓存键需包含解析后的模式,且管理模式 PATCH 必须失效该缓存,避免 Direct 下显示过期的 Pool 报告。 - src/codex/auth-api.ts:
primeCodexPoolQuotas的判定从config.providers[OPENAI_MULTI_PROVIDER_ID]改为「canonical 启用的openai且解析模式为pool」;Direct 模式在 WHAM 抓取、池账户迭代、primeInFlight创建之前即返回。 - src/oauth/token-guardian.ts:guardian 预热从内部 id
chatgpt改键为 canonicalopenai并模式感知——Pool 预热主登录 + 附加账户;Direct 只预热主登录、绝不迭代附加账户存储。 - src/providers/label.ts 与 src/usage/summary.ts:
baseProviderLabel增加读时 canonicalization,历史openai-multi(及 safe 账户标签变体)映射到openai,使迁移前的 Pool 用量与迁移后按同一身份合并;用量与请求日志文件永不改写,openai-apikey行保持独立。 - src/providers/openai-sidecar.ts:
OpenAiForwardSidecarCandidate.providerName收窄为OPENAI_CODEX_PROVIDER_ID;listOpenAiForwardSidecarCandidates只读config.providers.openai,canonical 且启用时返回恰好一个候选,其accountMode取自providerCodexAccountMode("openai", provider)。Direct 要求调用方 bearer;Pool 可注入选中的主/附加凭据;selectOpenAiImagesProvider保持独立 keyed 候选,池认证失败归池自身,不静默改计费到 API Key。
八、管理面与 GUI:无重启的模式切换
管理模式 DTO 与 GUI 在本契约下保持一致(详见 020_surfaces.md):
- src/server/auth-cors.ts:
codexAccountMode从FORBIDDEN_PROVIDER_RUNTIME_FIELDS移除(它现在是持久化配置而非运行时元数据);providerManagementConfigError拒绝向chatgpt/openai-multiPOST,openai必须等于 canonical 注册表种子(仅codexAccountMode可为"pool" | "direct"),自定义 provider 与openai-apikey不可携带该字段;safeConfigDTO通过providerCodexAccountMode(name, provider)输出解析后的模式。 - src/server/management-api.ts:
PATCH /api/providers只接受两个互斥操作——{ "disabled": true }或{ "codexAccountMode": "direct" | "pool" };模式 patch 写新 provider 对象(保留全部安全 overlay)→saveConfig(config)→clearThreadAccountMap()(防止后续切回 Pool 复用旧策略下的亲和性)→ 切到 Pool 时 best-effortprimeCodexPoolQuotas(config, "mode-change")(Direct 不预热)→ 返回{ success: true, name: "openai", codexAccountMode }。不刷新模型目录、不重启、不 drain 服务器,下一轮直接从活动配置对象读取新模式。 - GUI 侧(gui/src/codex-multi-state.ts、gui/src/pages/Providers.tsx、gui/src/pages/CodexAuth.tsx、gui/src/pages/Models.tsx 等):
codexAccountModeState(config)以Object.hasOwn判定absent / disabled / direct / pool,畸形值保守回落absent;Providers 页对openai卡渲染可访问的 Pool/Directradiogroup控件并即时 PATCH;Models 页保持一个openai裸 id 分组;i18n 四语言(en/ko/de/zh)同步新增prov.openaiMode*、codexAuth.accountMode*等键并删除全部 Multi 相关旧键。
九、测试矩阵与验收:如何证明迁移正确与模式隔离
9.1 迁移投影矩阵(必须逐条覆盖)
010_core_contract.md 定义了完整的「输入 → 输出」矩阵,核心用例包括:
| 输入 | 结果 |
|---|---|
未标记的最简openai | 单个 canonicalopenai、显式pool、marker 2 |
未标记的chatgpt(含/不含附加账户) | 单个 canonicalopenai、pool、隐藏chatgpt、无瞬时 Multi |
marker 1、仅 Direct 的openai | 单个openai、direct、marker 2 |
marker 1、启用的openai-multi | 单个openai、pool、遗留行移除 |
marker 1、默认openai-multi | 默认映射openai、模式pool |
| marker 1、禁用 Multi + 启用 Direct 且无 Multi 引用 | 单个启用openai、模式direct |
marker 1、openai与openai-multi均缺席(A1) | 保留缺席——不创建openai,marker 2 |
marker 1、仅禁用 Multi(无openai行)(A1) | 单个openai、pool、保留disabled: true |
marker 1、仅 Direct + 过期activeCodexAccountId(A1) | 单个openai、direct;过期 active id 清除或忽略(定义并测试) |
| marker 1、无 provider + 过期池状态(A1) | 保留缺席;池状态不动 |
claudeCode.model/smallFastModel/tierModels.*/modelMap含 Multi id(A2) | 精确裸 id 重写;modelMap源键绝不重写 |
两行均含selectedModels | 稳定并集、无重复 |
| 双 provider 上下文上限 | 取更低正上限于openai,仅路径 warning |
disabledModels/subagentModels含命名空间 Multi id | 裸 id、稳定顺序、去重 |
| injection/shadow/全局侧车/Claude 侧车模型引用 | 精确裸 id 重写 |
| canonical 行 + 未知 passthrough 路径含 Multi id | 已知路径迁移、未知路径保留、仅路径 warning |
| 非 canonical/含密钥的 Multi 行 | 冲突、输入不变、无备份/保存 |
| marker 2 canonical 结果 | changed: false、深等克隆、无 warning |
| 恢复 v2 备份 | marker 1/旧拆分可解析,下次启动重现相同 marker-2 字节,仅字节一致时复用备份 |
9.2 激活场景(C-ACTIVATION-GROUNDING-01)
- 场景 A(缺省模式默认 Pool 并轮换到非主合格账户):
providers.openai无codexAccountMode字段 + 可用主令牌 + 一个可用附加账户凭据 + 主配额高于autoSwitchThreshold、附加账户配额低于阈值 + 初始activeCodexAccountId为主账户。POST 裸gpt-5.6-sol后,上游应收到附加账户 bearer/account id、配置 active id 变为该账户、选中/wire 模型保持裸 id,且 route/log/catalog 中不出现openai-multi字符串。缺省解析为 direct 或池引擎未激活即判失败。 - 场景 B(显式 Direct 绝不触碰池状态):
codexAccountMode: "direct"+ 有效调用方 bearer + 已填充的附加账户存储/active id/配额/冷却/重认证/线程亲和状态。发送 HTTP、compact 与一次 Responses WebSocket 裸模型回合后,所有池快照哈希与 active id 必须不变、不产生配额预热抓取、即使所有池账户不可用请求仍成功。测试要求:Direct 分支一旦移动到 thread-id、配额、冷却、main-pool-token 或账户存储解析之后即失败;通过管理模式 PATCH 设置模式时,基线快照须在 PATCH 完成之后采集(PATCH 本身会保存配置并清空亲和性)。
9.3 验收命令与最终结果
聚焦核心套件(迁移/路由/认证/目录/配额/侧车):
bun test --isolate \ tests/openai-provider-option.test.ts \ tests/openai-provider-option-migration.test.ts \ tests/openai-provider-option-startup.test.ts \ tests/router.test.ts \ tests/codex-routing.test.ts \ tests/server-auth.test.ts \ tests/codex-catalog.test.ts \ tests/codex-quota-prime.test.ts \ tests/provider-quota.test.ts \ tests/server-images.test.ts \ tests/server-search.test.ts验收标准(Cycle 1 acceptance):注册表/预置/初始化不再暴露openai-multi;全新/缺省openai解析 Pool、显式 direct 解析 Direct;v1 拆分迁移为单行 + v2 备份 + 幂等 marker 2;全部已知 selected-id 侧车位置改写为裸 id;裸 id 永不凭据回退openai-apikey;Pool 在配额压力下可验证地轮换主 + 附加账户;Direct 可验证地保持所有池状态不变;原生目录无命名空间 Multi 重复、API 行/别名/元数据不变。
实现与验证的最终证据记录在该单元的 closeout 中(010_core_contract.md 与 000_plan.md 收据):Cycle 1 落地于提交4da9c167、Cycle 2 落地于14e57661;聚焦超集 309 pass / 0 fail;全库隔离套件 2,850 pass / 0 fail(12,188 断言、256 文件);隔离运行时验证了 Pool 轮换、Direct 隔离、API Pro 身份、真实 Codex 客户端历史与用户状态哈希不变;127.0.0.1:10100活跃代理监听器身份在前后均为 PID 17423 且字节一致,全程零控制操作。存储扫描确认openai-multi仅存在于迁移实现、历史与拒绝语义上下文中,活动 README/docs-site/structure 匹配数为 0。
十、迁移兼容性要点与实操注意
- 升级路径:携带 marker 1(或未标记)的既有配置会在下次启动时被投影为 marker 2,先写入
config.json.pre-openai-tiers-v2.bak(0600,no-replace);.pre-openai-tiers-v1.bak保持只读历史。 - 手动编写配置:缺省
codexAccountMode的openai行在运行时解析为pool;若要在管理写路径上显式设置,必须写"pool"或"direct"之一,非法值在 schema 层即被拒绝。 - 不要为裸模型配置
openai-apikey兜底:裸 OpenAI 家族模型只走启用的openai;API Key 路由必须显式使用openai-apikey/<model>命名空间。 - Direct 的语义边界:
direct是「仅当前/主 Codex 登录」,它与 Pool 共享同一 forward 传输,只是不查询、不预热、不轮换任何池状态;切回 Pool 前亲和性映射已被 PATCH 清空,新回合重新进入正常的配额/亲和性选择。 - 用量归并:迁移前的 Pool 用量(历史
openai-multi行)在读时归一到openai身份,与迁移后合并展示;文件本身不被改写。
结语
codexAccountMode契约把「多个 Codex 登录 provider」重构为「一个 provider、两种账户模式」,是 opencodex 在配置面、迁移面、路由面、认证面、配额面与 GUI 面的一次系统性收敛。从 src/types/wire.ts 的类型常量、src/config/schema/config-schema.ts 的严格校验、src/providers/openai-tiers.ts 的纯投影迁移,到 src/router.ts 的单 provider 路由与 src/codex/auth-context.ts 的 Direct 短路边界,每一层都有明确的源码实现与测试矩阵背书。读者可沿文中所列路径直接深入源码,或继续阅读同目录的 000_plan.md(规划与决策)、020_surfaces.md(管理面/GUI)与 030_verification_closeout.md(集成与验证)获取完整闭环。
【免费下载链接】opencodex
Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code
相关推荐
ZeroTierOne Windows 构建与本地联调指南:从 MSBuild 编译到双会话测试
ZeroTierOne Windows 构建与本地联调指南:从 MSBuild 编译到双会话测试 ZeroTierOne 在 Windows 平台上的工程代码集
opencodex 原生 Codex 路由模型目录规约:Phase 100 实现指南
opencodex 原生 Codex 路由模型目录规约:Phase 100 实现指南 opencodex 作为 OpenAI Codex 与 Claude Co
OpenCodex 维护实录:codex-rs Realtime 与 Subagent 契约研究及 devlog `_plan` → `_fin` 归档清扫单元
OpenCodex 维护实录:codex rs Realtime 与 Subagent 契约研究及 devlog _plan → _fin 归档清扫单元 本文基
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考