十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenCodex 独立 Images 数据面:Codex 图像生成/编辑代理通道的修复与验证

OpenCodex 独立 Images 数据面:Codex 图像生成/编辑代理通道的修复与验证 【免费下载链接】opencodexUniversal provider proxy for OpenAI Codex Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code项目地址https://gitcode.com/gh_mirrors/ope/opencodex点击查看免费下载OpenCodexuniversal provider proxy在 v2.7.1 时代存在一个真实缺陷Codex 通过image_gen.imagegen工具发起的POST /v1/images/generations与POST /v1/images/edits请求会被通用/v1/*守卫拦截并返回404 Unknown endpoint导致独立图像生成完全不可用。本文基于仓库开发日志 011_implementation_and_verification.md 及配套的计划、契约研究与威胁模型文档完整还原这次“独立 Images 数据面”修复从根因定位、TDD 红绿循环、安全设计、源码实现到自动化与真实 HTTP 双重验证的全过程。读完本文你将掌握Codex 本地image_gen扩展的请求链路、OpenCodex 数据面路由的插入位置与网关顺序、有界不透明请求转发与单次上游尝试的不变量以及该模块在后续迭代中API-Key 直连、Antigravity 回退、xAI 桥接如何保持这些安全不变量。一、背景与根因Codex 的image_gen不是托管 Responses 工具1.1 故障现场在修复前对运行中的代理做一次探针即可复现问题POST http://127.0.0.1:10100/v1/images/generations HTTP 404 {error:{message:Unknown endpoint: POST /v1/images/generations,type:not_found,code:not_found}}源码侧的证据同样明确src/server/index.ts只处理/v1/responses/compact与/v1/responses其余所有/v1/*路径统一落入 JSON 404 守卫修复前位于src/server/index.ts:292-350且既有回归测试甚至显式断言/v1/images/generations必须返回 404当时位于tests/server-auth.test.ts:1020-1035。也就是说这不是运行守护进程版本过旧的问题——仓库 HEAD 本身就没有该处理器。1.2 请求链路契约研究001_contract_research.md 给出了完整的因果链Codex不在客户端暴露托管式的 Responsesimage_generation工具而是声明本地命名空间函数image_gen.imagegen在 Codex 内部完成派发后再发起第二次 Images API 调用生成与编辑的差异由引用图是否存在决定无引用时生成gpt-image-2请求background:auto、quality:auto、size:auto有引用时构造携带images[].image_url的 JSON 编辑请求客户端只提交相对路径images/generations或images/edits再由 provider 基地址拼接Codex 期望一个data条目含必填b64_json的 Images 响应。由于 OpenCodex 向 Codex 注入openai_base_url http://host:port/v1及等价 provider 表相对调用最终变成/v1/images/generations或/v1/images/edits——恰好在通用守卫之前没有任何路由匹配。1.3 竞争假设的排除H1守护进程过期被否决。仓库 v2.7.4 仍无处理器且测试故意期望 404仅升级无法修复。H2应改用托管image_generation工具被否决。Codex 自身的responses_lite_uses_standalone_web_search_and_image_generation、non_lite_uses_standalone_image_generation_by_default等测试断言本地命名空间存在且托管工具缺省。H3缺失独立 Images 路由是根因成立。1.4 与 ima2-gen 的边界ima2-gen是另一条刻意不同的路径它发送POST /v1/responses并强制托管{type:image_generation}工具、解析 Responses SSE 中的image_generation_call.result。因此 OpenCodex绝不能把 Codex 的独立调用翻译成 ima2-gen 的托管工具工作流——Codex 自己拥有本地工具调用期望的是普通 Images 响应。同时公开 OpenAI 契约中POST /images/edits是 multipart而 Codex/ChatGPT 私有编辑请求是 JSON。这决定了实现方向保持请求字节与 Content-Type 原样透明转发而不是做有损改写。二、设计聚焦模块 网关顺序 不透明转发2.1 文件变更蓝图010_wp1_standalone_images_proxy.md 规划了最小变更集新增src/server/images.ts聚焦的 Images 代理所有者而非继续膨胀已超 1100 行的responses.ts或超 500 行的index.ts计划导出handleImagesRequest(req, config, operation)operation为闭合枚举generations | edits修改src/server/index.ts在通用/v1/*守卫之前、与 compact/Responses 路由并列的位置插入两条精确的 POST 分支新增集成测试与安全套件并修改未知路径测试从 404 列表中移除两个 Images 路径文档同步structure/01_runtime.md、structure/04_transports-and-sidecars.md以及三个 README 语言版本根目录README.md与readme/下的韩文、简体中文版。2.2 核心安全不变量威胁模型002_threat_model.md 将风险与对策一一锁定风险控制手段非回环暴露下的未认证调用处理器前置requireApiAuth(..., data-plane)跨源浏览器调用isAllowedRequestOrigin源策略门禁Token/账户错配resolveCodexAuthContext 头部白名单池凭据覆盖入站值凭据泄露请求体/头部不落日志客户端错误信息安全化隐私扫描SSRF上游主机只能来自受信任的 forward provider 配置头部走私/陈旧分帧仅复制白名单头部响应经sanitizePassthroughHeaders内存耗尽content-length仅作早期提示流式逐块计数超限取消并返回 413压缩放大任何非identity的请求content-encoding一律 415重复付费请求恰好一次上游尝试无幂等契约时不启用重置重试取消后的上游泄露fetch 前链接req.signal响应头后用relayWithAbort错误掩盖上游 HTTP 状态/体原样中继仅本地连接失败映射为安全 502跨账户健康污染仅池上下文记录 429/5xx/connect 结果三、实现src/server/images.ts与路由接入3.1 路由接入与网关顺序当前仓库中路由分支位于 src/server/index/serve-options.ts与计划一致地保留了既有网关顺序先排空draining→ 数据面 API 认证 → 源策略 → 处理器if (req.method POST (path /v1/images/generations || path /v1/images/edits)) { 1. disableResponsesRequestTimeout长耗时图像任务关闭请求级超时 2. isDraining() → 503 排空响应 3. resolveApiAuth(req, policy) → 失败 401 4. isAllowedRequestOrigin → 失败 403 5. operation pathname.endsWith(/edits) ? edits : generations 6. handleImages(req, config, endpoint, logCtx, turnAdmissionLease, admission) }同时src/server/index.ts 的 loopback 路由白名单也为这两个路径放行 POSTsrc/server/inbound-body-admission.ts将二者列入入站体预算管理路径。3.2 处理器内部流程当前源码视角经过后续迭代src/server/images.ts 已是该数据面的完整实现其关键常量为IMAGES_UPSTREAM_TIMEOUT_MS 300_000图像生成耗时数十秒300 秒是悬挂上限而非正常工作限IMAGES_RESPONSE_MAX_BYTES 100 MiB上游响应体缓冲上限防止超大/恶意响应耗尽进程内存请求体沿用数据面 256 MiB 上限MAX_DECOMPRESSED_BODY_BYTES。主流程handleImages依次执行读入并解析 JSON 请求体readJsonRequestBodyresolveInboundBodyLimitBytes(config.maxInboundBodyBytes)解析失败映射为安全 4xx确定性 provider 选择selectImagesProvider(config)定义于 src/providers/openai-sidecar.ts只接受启用的openai-responses适配器与forward认证模式显式images.provider时校验必须存在、未禁用、适配器兼容且有可用 API-Key失败则 fail-closed绝不回退到其他付费上游认证上下文解析cooldown → 429、线程亲和过期 → 409、凭据不可用 → 401与/v1/responses语义对齐失败被捕获而非立即返回让配置的 keyed provider 仍可服务请求头部装配provider 静态头 运行时池认证头运行时认证最后写入、优先生效 请求content-type转发分支ChatGPT forward 路径拼${provider.baseUrl}/images/${endpoint}keyed 路径在分支内重新执行selectProactiveApiKeyTransport并重建Authorization使用已提交的新 key 而非旧快照URL 归一化${baseUrl}/v1/images/${endpoint}若 OpenAI 凭据路径不可用generations还可回退到已登录的 Google AntigravityCloud Code Assist单次上游尝试fetch恰好一次redirect: manual携带 Codex 凭据时绝不跟随跨源 3xx不调用fetchWithResetRetry——付费且非幂等的 Images POST 没有源码可证明的幂等契约响应中继以 100 MiB 上限流式读取上游体超限返回安全 502仅中继content-type用forward?.recordOutcome?.(status)只对池上下文记录健康结果取消语义fetch 前链接req.signal响应头前取消即中止上游读取阶段对未锁定的上游 body 兜底cancel()响应头后取消即中断中继体。客户端取消 → 499上游悬挂 → 504连接错误 → 502。四、TDD 红绿循环与构建缺陷修复4.1 RED 证据产品代码落地之前先写入生成回归测试并运行bun test tests/images-proxy.test.ts Expected: 200 Received: 404 0 pass, 1 fail这复现的是通用守卫的真实失败路径而非纯 mock 单元条件。4.2 由“激活”暴露的构建缺陷真实流溢出测试首先暴露了一个顺序缺陷收集器在异步取消传播稳定之前就释放了 reader 锁。修复方案是在 cancel resolve/reject 之后再调度锁释放同时不等待地返回 413。流在溢出块之后仍保持打开这一事实恰好证明其底层取消钩子被触发。这正是“用激活场景驱动实现修正”的典型收益——纯静态审查很难发现这类竞态。五、自动化 C 证据5.1 聚焦套件bun test tests/images-proxy.test.ts tests/images-proxy-safety.test.ts \ tests/server-auth.test.ts tests/codex-auth-context.test.ts \ tests/upstream-retry.test.ts tests/passthrough-headers.test.ts 80 pass, 0 fail, 289 expect() calls覆盖点包括精确上游路径与 JSON 字节透传、version头、池亲和认证覆盖入站值、multipart 边界保持、429/5xx 与安全头部存活而set-cookie/content-encoding/陈旧content-length被剥离、路由网关排空 503/认证 401/源策略 403 且上游调用为零、声明超限与实际分块溢出双路 413、非 identity 编码 415、provider 选择优先级、认证上下文错误映射、单次尝试不变量、取消头前/头后、池健康记录与主账户健康隔离。5.2 全仓与静态门禁bun test ./tests/ 1942 pass, 0 fail, 8285 expect() calls across 194 files bun run privacy:scan Privacy scan passed bun run typecheck exit 0 git diff --check exit 0此外独立的gpt-5.6-sol中等强度实现审查返回PASSblocking_issues: none审查覆盖凭据类别、请求体边界、头部选择、单次尝试行为、取消/生命周期、健康隔离、文档与测试。注该开发日志2026-07-10记录的测试文件名为tests/images-proxy.test.ts与tests/images-proxy-safety.test.ts随着仓库演进当前树中对应覆盖位于 tests/server/server-images.test.ts 与 tests/server/server-images-bodyless-content-length.test.ts其测试夹具fakeImagesUpstream、forwardConfig、隔离的OPENCODEX_HOME延续了上述全部断言语义。六、手动 HTTP QA真实线路验证除自动化外还以打过补丁的 opencodex 源码服务 mock forward provider 配合curl -i完成了端到端 QA证据根目录记录于开发日志.codexclaw/evidence/019f4a8d-53c2-7de1-b812-beed6d130796/qa/http-images/generation返回 200并证明命中/backend-api/codex/images/generations认证、账户与version均正确edit返回 200证明命中/backend-api/codex/images/edits匿名/错误 key → 401恶意 Origin → 403合法 preflight → 204GET 与未知子路径 → JSON 404空/畸形请求体原样中继上游 400 信封错误 Content-Type 中继 415非 identity 编码本地返回 415真实分块 268,435,457 字节请求在 268,435,456 字节256 MiB上限处返回可解析的 413两次显式相同的 POST 使上游调用号分别来到 4 和 5证明每次调用相互独立、无隐藏自动重试内容协商保持在合理的 JSON 默认值。Teardown 证据记录两个监听端口均已清空、harness PID 已消失、临时根目录已移除。七、范围与部署说明本任务严格限定边界codex-rs与ima2-gen零改动既有无关 worktree 变更被保留未发布任何包任务期间未替换已在 10100 端口服务的已安装代理——因为中断活跃 provider 可能切断当前 Codex 会话补丁源码行为已在真实 HTTP 表面验证激活已安装的旧守护进程属于独立的重启/更新操作。这与计划中的非目标完全一致不做托管 Responses 图像工具翻译、不为非 OpenAI provider 增加图像生成、不改账户路由、不发布版本。八、演进与现状不变量如何延续该数据面在后继迭代中持续扩展但单次尝试、有界转发、认证隔离、池健康记录这些核心不变量被完整保留API-Key 直连显式images.provider指向openai-responseskey认证的自定义 providerfail-closed且 admission 密钥可兼作 OpenAI 风格 bearer 或x-opencodex-api-key见 structure/data-planes/images.mdGoogle AntigravityCCA回退generations在 OpenAI 凭据不可用/认证失败时可回退到已登录的 Antigravity并做promptFeedback.blockReason/finishReason安全过滤永久性阻断映射为 400 而非可重试的 502最终仍只输出{created, data:[{b64_json}]}绝不泄露 token/projectIdxAI Imagine 桥config.images.bridgeEnabled时可将请求发往api.x.ai含 URL 下载与编解码预算双记账结构化契约structure/runtime.md第 126–127 行将src/server/index.ts与src/server/images.ts的职责边界固化在服务器责任图中structure/decisions/ADR-0045-standalone-images.md记录相关决策未知 Images 子路径依旧落入 JSON/v1/*404 守卫。九、可复现的验证入口若要在当前仓库复现验证流程可依次执行前提已安装 Bun 并配置好测试隔离环境bun test tests/server/server-images.test.ts tests/server/server-images-bodyless-content-length.test.ts bun test tests/server-auth.test.ts tests/codex-auth-context.test.ts tests/upstream-retry.test.ts tests/passthrough-headers.test.ts bun run typecheck bun run privacy:scan参考资料实现与验证日志本文主体WP1 计划与验收标准契约研究Codex 独立图像生成链路威胁模型与信任边界WP1 diff 级实现计划当前实现源码 与 路由接入点数据面契约Standalone Images 与 ADR-0045赞分享【免费下载链接】opencodexUniversal provider proxy for OpenAI Codex Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code项目地址https://gitcode.com/gh_mirrors/ope/opencodex点击查看免费下载相关推荐opencodex 实战OpenCode Go 模型元数据漂移修复与 Codex 目录三层验证opencodex 实战OpenCode Go 模型元数据漂移修复与 Codex 目录三层验证 opencodex 作为 OpenAI Codex 与 Cla深入理解Ajv中的独立验证代码生成深入理解Ajv中的独立验证代码生成 什么是独立验证代码 AjvAnother JSON Schema Validator提供了从JSON Schema生成独后端API设计opencodex 的 codex-rs Responses 兼容性表面审计wire 协议缺口修复与验证实录opencodex 的 codex rs Responses 兼容性表面审计wire 协议缺口修复与验证实录 本篇技术指南围绕 opencodex 仓库中代号创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表