ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

DeepChat 的 OpenAI Codex 图像生成:gpt-image-2 如何复用 ChatGPT OAuth 打通 /images/generations

2026/9/17 15:09:56 拓冰建站 浏览量
DeepChat 的 OpenAI Codex 图像生成:gpt-image-2 如何复用 ChatGPT OAuth 打通 /images/generations DeepChat 的 OpenAI Codex 图像生成gpt-image-2 如何复用 ChatGPT OAuth 打通 /images/generations【免费下载链接】deepchatDeepChat - A smart assistant that connects powerful AI to your personal world项目地址: https://gitcode.com/GitHub_Trending/dee/deepchatDeepChat 将openai-codex实现为一个专用运行时dedicated runtime它以 ChatGPT OAuth 凭据访问https://chatgpt.com/backend-api/codex在提供文本输出的 Codex 模型之外把gpt-image-2纳入精选模型目录使图像生成请求经由同一套 OAuth 令牌与账户头直接打到 Codex 后端的/images/generations。读完本文你可以掌握该功能的完整设计边界——模型目录如何收敛、请求传输层如何做端点感知处理、401 刷新与错误归一化如何工作以及凭据为何始终不离开主进程。一、定位一个专用运行时而不是第二个 OpenAI 提供商从 OpenAI Codex Image Generation 规格文档 的定义看DeepChat 把openai-codex视为一个独立的 provider 运行时而不是在现有 OpenAI 提供商上打补丁身份与元数据来源openai-codex继续以 OpenAI 提供商数据库内置 provider-dbsource provider 为openai作为能力身份和模型元数据来源默认 Base URLhttps://chatgpt.com/backend-api/codex在 src/main/provider/auth/openaiCodex/constants.ts 中由OPENAI_CODEX_BACKEND_API_URL默认https://chatgpt.com/backend-api拼接/codex得到并支持OPENAI_CODEX_API_BASE_URL环境变量覆盖鉴权ChatGPT OAuth。令牌保存在主进程既有的 OpenAI Codex 凭据存储中绝不写入 provider 的 API-key 字段也绝不暴露给渲染进程图像生成模型gpt-image-2通过POST /images/generations完成一次文本输入、图像输出的生成。规格文档同时明确了非目标Non-goals这些边界对理解实现取舍很关键不新增第二个 OpenAI 或 Codex 提供商不把 OAuth 凭据存入 provider API-key 字段或暴露给渲染进程不为 DeepChat 独立的图像生成流程引入图像编辑或参考图输入不复刻 Codex 的imagegen技能、prompt 改写或产物文件系统约定不添加gpt-image-2不支持的设置项例如透明背景。二、提供商目录gpt-image-2 如何进入精选模型列表规格文档的核心目标之一是当 provider-db 中存在gpt-image-2记录时将其暴露在 OpenAI Codex 的精选模型列表中若 provider-db 不包含该 ID则按其他精选 Codex 模型相同的方式静默省略。仓库源码印证了这一机制。在 src/main/provider/providers/aiSdkProvider.ts 中OPENAI_CODEX_RECOMMENDED_MODEL_IDS是一个显式的精选模型 ID 列表gpt-image-2与文本模型并列其中const OPENAI_CODEX_RECOMMENDED_MODEL_IDS [ gpt-5.5, gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.4, gpt-5.4-mini, gpt-5.3-codex-spark, gpt-image-2 ]模型的能力身份则由 provider-db 记录“拥有”owns。在内置模型库 resources/model-db/providers.json 中gpt-image-2的记录声明了type: imageGeneration输入模态为textimage输出模态为textimage上下文与输出上限均为 8192且tool_call: false、reasoning.supported: false。一个值得注意的投影细节Codex 图像生成投影会禁用视觉输入vision input。原因是当前独立生成路径只向/images/generations发送纯文本 prompt因此渲染进程不需要为 Codex 增加任何类型特判——模态投影在元数据层就完成了收敛参考图附件自然不会被纳入支持范围。三、运行时传输层一次工厂分支两个端点DeepChat 的 AI SDK 工厂按 provider 类型分发。openai-codex分支位于 src/main/provider/aiSdk/providerFactory.tscase openai-codex: { const codexBaseUrl normalizeOpenAICodexBaseUrl(baseUrl) const provider createOpenAI({ baseURL: codexBaseUrl, apiKey: openai-codex-oauth, headers: params.defaultHeaders, fetch: createOpenAICodexFetch(params.defaultHeaders, (url, init) fetchWithProviderHeaders(params.provider, url, init) ) }) return { providerOptionsKey: openai, apiType: openai_responses, model: maybeWrapModel(provider.responses(params.modelId) as any), imageModel: provider.image(params.modelId), endpoint: buildOpenAICodexResponsesEndpoint(codexBaseUrl), imageEndpoint: buildOpenAIEndpoint(codexBaseUrl, /images/generations) } }这段代码体现了规格文档同一个 OAuth owner 同时供应 Responses 语言模型和图像生成端点的设计provider.responses(params.modelId)构造面向/responses的流式语言模型provider.image(params.modelId)构造面向/images/generations的图像模型两者共享同一个createOpenAICodexFetch适配器——即下节详述的 Codex 专属 fetch 层注意apiKey: openai-codex-oauth只是占位值真实鉴权由 fetch 适配器注入Authorization: Bearer token这正是凭据不进 provider API-key 字段的落地方式。四、Codex OAuth fetch 适配器401 刷新、账户头与端点感知整个功能最核心的实现集中在 src/main/provider/openaiCodexAdapter.ts 的createOpenAICodexFetch。它做了四件事与规格文档逐条对应1. 401 时刷新一次 OAuth 并重试let response await baseFetch(url, nextInit) if (response.status ! 401) { return normalizeOpenAICodexErrorResponse(response) } const refreshedAuth await auth.forceRefreshBackendAuth() response await baseFetch(url, { ...nextInit, headers: applyCodexHeaders(init?.headers, defaultHeaders, refreshedAuth, accept) }) return normalizeOpenAICodexErrorResponse(response)重试是刷新一次的只有首次请求返回 401 时触发forceRefreshBackendAuth()用新令牌重放同一请求。由于{ ...init }整体透传abort signal 等请求控制属性在重试中被完整保留符合规格中preserves abort signals的要求。2. 注入鉴权头与产品标识applyCodexHeadersopenaiCodexAdapter.ts在每次请求上删除api-key/x-api-key/x-goog-api-key防止 API-key 形态的鉴权头泄漏设置Authorization: Bearer ${auth.accessToken}当存在账户 ID 时设置ChatGPT-Account-ID附带 Codex 产品标识OAI-Product-Sku: codex、Originator: codex_cli_rs、Version与对应的User-Agent按端点类型决定默认Accept。3. 端点感知的请求体处理规格文档要求/responses保持store: false、移除不支持的max_output_tokens图像端点保持 AI SDK 图像请求体不变。实现上通过isResponsesRequest(url)判定 URL 是否以/responses结尾是 Responses 请求normalizeOpenAICodexRequestBody强制写入store: false并delete normalized.max_output_tokens默认Accept: text/event-stream是图像请求请求体原样透传默认Accept: application/json。这种按端点分流的意义在于Responses 专用的兼容字段store、max_output_tokens不会错误地混入图像 API 请求两类端点的线上报文形态互不污染。4. 错误归一化且不暴露凭据normalizeOpenAICodexErrorResponseopenaiCodexAdapter.ts对失败响应做两类归一化权限/资格类错误状态码为 401/403/404 且响应体命中entitlement|not entitled|eligible|subscription|plan|codex access|forbidden|permission等关键词时统一改写为 403code: openai_codex_entitlement_required提示当前 ChatGPT 账户无 Codex 访问权限请切换有 Codex 权限的账户后重试。规格文档中没有图像权限的账户收到既有的归一化 Codex 权限错误即由此实现400 请求错误提取后端 JSON 中的error.message/message/detail取不到时截取正文前 1000 字符包装为invalid_request_errorcode: openai_codex_bad_request的标准 JSON 错误避免把后端原始报文可能含敏感信息直接透传。五、端到端数据流把以上各层串起来就是规格文档给出的完整数据流原文继承自 spec.mduser selects GPT Image 2 | v existing image-generation chat route | v AI SDK OpenAI image model | v Codex OAuth fetch adapter -- refresh on 401 -- encrypted credential store | v POST /backend-api/codex/images/generations | v base64 image - existing DeepChat image cache and message preview关键落点说明入口复用用户选择GPT Image 2后走的是 DeepChat 既有的图像生成会话路由没有新增屏幕、控件或文案凭据边界401 刷新时访问的加密凭据存储位于主进程src/main/provider/auth/openaiCodex/credentialStore.ts 所在模块原始 access token、refresh token 与账户标识从不跨越 preload 边界也不会出现在请求追踪中——渲染进程只拿到模型元数据和鉴权状态结果落地返回的 base64 图像数据走既有的 DeepChat 图像缓存与消息预览路径模型类型检测imageGeneration、图像设置面板等基础设施全部复用。六、用户可见形态与设置面板规格文档给出的用户可见布局示意如下OpenAI Codex GPT-5.6 Luna [chat] GPT-5.6 Sol [chat] ... GPT Image 2 [imageGeneration]选择GPT Image 2后即复用既有图像设置面板与图像结果渲染参考图附件在该路由下保持禁用。这也解释了规格文档中模型与会话级图像生成选项在能力归一化后仍然存活、而参考图附件不可用的验收标准视觉输入被投影禁用但生成选项本身尺寸、质量等gpt-image-2支持的设置完整保留。七、连接检查与失败行为一个容易被忽略的设计约束是连接检查不消耗图像配额。OpenAI Codex 的默认连接检查是一次纯文本请求——generate-text模型gpt-5.6-lunaprompt 为Hello对应 aiSdkProvider.ts 中checkPrompt || Hello的检查路径。这意味着启用或刷新 provider 不会占用图像生成额度连接检查通过也不证明该账户拥有图像生成权限——图像专属错误如entitlement_required只会在第一次真实的生成请求上浮现随后被适配层归一化为上文所述的 403 权限错误。完整的兼容性矩阵继承自规格文档既有 OpenAI Codex 文本请求保持原有报文形态与流式行为既有 API-key 形态的 OpenAI 图像生成不受影响Codex 图像生成不声明视觉输入参考图因此留在支持附件流之外provider-db 缺少元数据时省略gpt-image-2而不是合成不完整的能力数据。八、测试覆盖与验收清单该功能的验收标准在 spec.md 中列明刷新 OpenAI Codex 模型时当内置 provider-db 包含gpt-image-2时该模型出现在列表中DeepChat 将其识别为图像生成模型并显示既有图像设置 UI模型与会话级图像生成选项在能力归一化后存活参考图附件仍不可用生成请求命中/backend-api/codex/images/generations携带 OAuth/账户头、JSON accept 头且不含Responses 专属的store字段返回的 base64 图像走既有图像缓存与预览路径文本生成、OAuth 刷新、错误归一化与 provider 检查行为均保持不变。仓库中对应的测试文件可以作为验收依据的入口test/main/provider/openaiCodexAdapter.test.ts——fetch 适配器401 刷新、端点分流、错误归一化test/main/provider/aiSdkProviderFactory.test.ts——工厂分支双模型构造与端点拼接test/main/provider/openaiCodexProvider.test.ts——provider 级集成行为。九、小结为什么这套设计值得参考DeepChat 的 OpenAI Codex 图像生成方案展示了在 Electron 应用中接入OAuth 专属后端类模型的几个关键工程取舍专用 fetch 适配器隔离鉴权复杂性401 刷新、账户头注入、产品标识全部收敛在 openaiCodexAdapter.tsAI SDK 层只看到普通的fetch端点感知而非模型感知请求体改写按 URL/responsesvs/images/generations分流天然兼容后续在同一 provider 下增加端点的扩展元数据单源能力类型、模态、配额字段全部来自 provider-db 记录渲染层零特判凭据边界硬隔离令牌只在主进程凭据存储中流转preload 边界只传递状态与元数据。对想在 DeepChat 上启用该功能的用户而言操作路径就是完成 ChatGPT OAuth 登录Codex 运行时在模型列表中选择GPT Image 2然后使用既有图像生成面板发起生成——前提是你的 ChatGPT 账户具备 Codex 访问权限否则首次生成会得到归一化的权限错误提示。【免费下载链接】deepchatDeepChat - A smart assistant that connects powerful AI to your personal world项目地址: https://gitcode.com/GitHub_Trending/dee/deepchat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考