
【免费下载链接】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 仓库中 KiroAWS CodeWhisperer网关对齐工作devlog 143的硬化阶段图系统梳理 Kiro 适配器在生产环境下的完整加固路线从 P0 级的流式协议终止、HTTP 重试退避、OAuth 单飞刷新、断点续传正确性、事件流解码器边界到 P1/P2 级的工具 Schema 清洗、模型解析、错误映射与可观测性。读完本文你将掌握 Kiro 单凭证适配器在 opencodex 中如何被逐阶段加固为可上生产状态的完整脉络、每阶段的验收标准以及对应源码实现位置与验证命令。背景与范围决策Kiro 网关对齐工作的目标是把 opencodex 的 KiroCodeWhisperer对外能力提升到与上游kiro-gateway对齐并稳定下来。整个工作遵循一个表面 一个完整 PABCD 循环的纪律每个阶段都以bun x tsc --noEmit类型检查 定向bun test验证收尾并对应一个原子提交。两项明确的范围决策决定了后续路线多账户故障转移multi-account failover明确出局opencodex 在更上层已有自己的 Codex 多账户池codexAccountsKiro 的单凭证导入是既定设计因此不属于 Kiro 适配器缺口。聚焦功能对齐 单凭证 Kiro 适配器的生产硬化外部代码级评审将工作重心从补缺口转向功能硬化用户方向为把功能硬化推得更狠。在硬化阶段图定稿前Phase 10原生图片输入已完成commit 494be0d因此最终阶段图从 Phase 70 开始。重排后的阶段图P0 优先硬化阶段图把全部工作按风险等级重新排定优先级形成一张完整的路线图阶段优先级表面Surface关闭的缺口70P0流异常/错误是终止性的上游错误帧之后不得再发doneparseKiroStream同时发出 error done80P0Kiro HTTP 重试/退避401/403 仅刷新一次、429/5xx 指数退避 抖动、首 token 前重试、客户端断开时中止上游无瞬时故障韧性90P0OAuth singleflight 刷新 SQLite 刷新前重载 busy-timeout刷新竞态覆盖凭证静默吞 DB 错误100P0断点续传 / 工具结果正确性测试矩阵仅当前轮的改写风险未验证的续传 工具延续110P0事件流解码器加固帧大小上限、头部长度边界、逐读边界、模糊测试二进制协议崩溃/损坏风险120P1工具 Schema 清洗剥离additionalProperties/ 空required、长描述移入系统提示、孤儿/无工具回退Kiro 对不支持的 schema / 无定义工具结果返回 400130P1模型解析器版本化 slug 归一化 max推理强度通告版本化 slug 误路由max 强度被隐藏140P1Kiro 特定错误映射认证/区域/配额/模型 - 可操作的 Codex 错误上游失败信息不透明150P2截断检测/恢复静默的流中途截断160P2用量估算标注 校准说明估算用量与权威用量不可区分170P2调试可观测性脱敏载荷 原始帧置于 flag 之后未来崩溃防护成本排序依据P0 先行生存性/正确性每个阶段走完整 PABCD 循环并配tsc 定向测试 原子提交。Phase 70 是体积最小、杠杆最高的 P0一个正确性缺陷上游调用失败目前可能看起来是部分成功因此领跑。已对齐表面无需返工阶段图同时明确了哪些表面在硬化前已达对齐状态Web 搜索 sidecar 已接入 KiroparseResponse 循环无需额外工作Token 用量启发式计划 142 已关闭——只需 P2 级的标注打磨通过 fake-thinking 标签实现推理强度请求侧——响应侧的解析回读跟踪在原始 Phase 40折叠进截断/P1 处理。Phase 70P0-1流异常帧必须终止解析这是整个硬化工作的领跑阶段解决一个直接的正确性缺陷parseKiroStream遇到:message-type exception | error的事件流帧时先产出error事件然后continue循环循环结束时会额外产出带用量的done。下游桥接层bridge对done和error都置terminatedtrue谁先到谁生效——但生成器在终止后仍会继续产出内容并补发成功形状的done导致失败的上游调用泄漏部分内容并伪装成成功。修复要点遇到 exception/error 帧时先关闭任何悬空的 tool call保持括号配对让 bridge 的closeCurrentToolCall路径在错误路由下也能正常工作产出error事件后立即return——不再解析后续帧不再发done。实现已落在 src/adapters/kiro/stream.ts事件流主循环中一旦检测到exception/error消息类型置open null并返回携带classifiedTerminal(classifyKiroStreamError(...))的终止结果对未知 Smithy 消息类型同样返回协议错误终止结果。测试要求覆盖三个场景流中途异常帧之后无done、无更多文本、内容前异常帧仅 error、以及既有异常用例断言不再有尾部done。对应文档见 devlog/_fin/143_kiro-gateway-parity/70_phase_stream_error_terminal.md。Phase 80P0-2Kiro HTTP 重试与退避Kiro 特定的瞬时故障韧性边界设定为不改凭证所有权连接/头部超时错误在响应体存在之前可重试HTTP 429/500/502/503/504 在解析任何 body 之前可重试有Retry-After则遵从否则指数退避 有界抖动保留客户端 abort 的传播同时覆盖正常 Kiro 调用路径和 web-search sidecar 循环使用的parseResponse路径。401/403 刷新一次被推迟到 Phase 90——因为provider.apiKey在适配器之外解析需要 OAuth singleflight/reload 语义才正确。设计上ProviderAdapter拥有请求构造和流解析但server.ts拥有 fetch因此需要在适配器基类上增加一个小扩展fetchResponse?(request, ctx): PromiseResponse定义见 src/adapters/base.ts。server.ts与web-search/loop.ts在存在adapter.fetchResponse时优先走它否则保持既有 fetch 路径——让 Kiro 重试局限在适配器内不影响其他 provider。实现最终落在独立的 src/adapters/kiro-retry.tsfetchKiroWithRetry采用进程级共享的节流门throttle gate 冷却期cooldown机制——共享探针只在出现 429 后才启动健康流量保持并行而被限流的账户不会烧掉每个调用者独立的退避预算。createKiroAdapter通过 src/adapters/kiro/adapter.ts 的fetchResponse暴露该重试入口并透传 abort signal、发送预算与物理发送观测physical send observer以便用量日志记录真实的物理请求次数。验收标准其他适配器保持直连 fetchKiro 在流解析开始后不重试只在调用方拿到 Response 之前重试本阶段不引入 401/403 刷新。测试见 tests/providers/kiro/kiro-retry.test.ts429→200 两次调用、Retry-After: 0后 200、400 不重试、调用方中止不重试。详见 devlog/_fin/143_kiro-gateway-parity/80_phase_http_retry_backoff.md。Phase 90P0-3OAuth 刷新单飞 Kiro SQLite 重载安全边界本地凭证存储OPENCODEX_HOME/auth.json 导入的 Kiro CLI SQLite token 缓存 → 出站 Kiro 运行时Authorization头。主要失效模式并发的近过期请求用同一个旧 refresh token 刷新、竞态写入auth.json、或错过 Kiro CLI 里更新的 token。加固内容三项通用按 provider 的 singleflight围绕getValidAccessToken的刷新工作用模块级Mapstring, Promisestring合并并发刷新成功/失败后一律在finally清理Kiro 专属的刷新前 SQLite 重载若已安装的 Kiro CLI 有新鲜 token优先持久化并使用它而非打桌面刷新端点Kiro 专属的刷新失败后 SQLite 重载若外部 Kiro CLI 在我们的失败尝试期间/之后已刷新通过重新导入它恢复。刷新路径中REFRESH_SKEW_MS用于判断导入 token 是否仍有效。验收标准不记录任何 tokensingleflight map 成功/失败后总是清空既有有效凭证走快速路径、不触碰 SQLite/fetchKiro 重载路径在登录时绝不削弱凭证优先级只防止 opencodex Kiro 凭证已存在后的陈旧刷新竞态。测试tests/oauth-refresh.test.ts使用隔离的OPENCODEX_HOME/HOME临时目录覆盖并发过期共享一次刷新、新鲜 SQLite token 先于刷新端点被导入、失败刷新后 SQLite 恢复等场景。详见 devlog/_fin/143_kiro-gateway-parity/90_phase_oauth_singleflight_reload.md。Phase 100P0-4断点续传 / 工具结果正确性previousResponseId场景下旧实现messages.slice(lastAssistant 1).filter(m m.role ! assistant)会丢掉 assistant 消息。当当前轮以toolResult开头时发出的 Kiro payload 只有userInputMessageContext.toolResults却没有带匹配toolUses的前置assistantResponseMessage——Kiro 可能拒绝或误解该 payload。修复将载荷切片与用量切片分离currentTurnUsageMessages见 src/adapters/kiro/usage.ts 旧行为slice(lastAssistant1)且过滤 assistant避免把旧轮 user 文本/超大工具参数重新计入用量currentTurnPayloadMessages若当前尾部无 toolResult行为同旧若尾部有 toolResult则保留前一 assistant 之后的最小历史交换——最后 user/developer - 最后 assistant(toolUses) - toolResult(s)保证 Kiro 收到工具调用的完整上下文。载荷构造位于 src/adapters/kiro/payload.ts含 toolResult 合并、孤儿工具结果修复与续传消息注入。测试矩阵覆盖续传工具结果时保留 assistant toolUse 历史、续传场景用量只基于工具输出、普通续传最新用户文本仍无历史。详见 devlog/_fin/143_kiro-gateway-parity/100_phase_resume_tool_result_correctness.md。Phase 110P0-5事件流解码器加固src/lib/eventstream-decoder.ts是 KiroCodeWhisperer GenerateAssistantResponse与 amazon-bedrockConverse共同依赖的application/vnd.amazon.eventstream解码器。原实现校验 CRC 和分块但缺乏硬边界无最大帧长、无headersLen total - 16守卫、parseHeaders()用 DataView/subarray 读取前不检查字节是否存在、伪造的巨大total会让流缓冲无限增长。加固内容src/lib/eventstream-decoder.tsMAX_MESSAGE_LEN 16 * 1024 * 1024另有MAX_HEADERS_LEN 128 * 1024decodeMessage拒绝total MAX_MESSAGE_LEN与headersLen total - MIN_MESSAGE_LENparseHeaders增加need(n, label)助手每次 DataView 读取前检查抛出明确的eventstream: truncated header ...错误decodeEventStream在前 4 字节可用时立即拒绝超限total缓冲增长超限时拒绝未完成的单帧。测试包括超限 total 抛错、头部长度越界抛错、截断字符串头抛受控错误、以及在每个字节边界切分合法帧仍可解码的小型模糊测试。详见 devlog/_fin/143_kiro-gateway-parity/110_phase_eventstream_hardening.md。Phase 120P1-1工具 Schema 清洗convertTools原先直传工具 JSON Schema而 kiro-gateway 会剥离 Kiro 拒绝的字段——尤其是additionalProperties和空required: []——否则合法的 Codex/OpenAI 风格工具 Schema 会变成 Kiro 400。实现迁移到独立的 src/adapters/kiro-tools.tsconvertKiroTools包装convertKiroToolContext因为原kiro.ts已到 500 行限制。Schema 递归清洗规则删除每个additionalProperties键、required为空数组时移除、保留非空required/properties/items/oneOf/anyOf。既有行为保持名称截断到 64 字符、空描述用占位符并截断描述截断做了代理对安全处理不会在 lone high surrogate 上切断产生 UFFFD见 src/adapters/kiro-tools.ts、inputSchema默认{}。当前实现还演进出了更完整的工具目录治理命名空间化的 wire 名称mcp__chrome-devtools__navigate_page经别名注册表映射为 Kiro 接受的 ≤64 字符安全名Kiro runtime service 拒绝含空格或超长名称MAX_KIRO_TOOL_COUNT与序列化目录字节预算控制出站目录规模超出预算时按优先级排序淘汰并生成[opencodex] Kiros outbound catalog budget...系统提示告知模型被省略的工具code-mode 执行路径工具保留专属席位见 src/adapters/kiro-tools.ts。长描述移入系统提示与孤儿工具结果回退是后续 P1 跟进阶段125。详见 devlog/_fin/143_kiro-gateway-parity/120_phase_tool_schema_sanitization.md。Phase 130P1模型解析器归一化折叠了旧 Phase 50mapModelId原先只剥离kiro-前缀缺少版本化 slug 归一化。需要把claude-sonnet-4-5-20250929、claude-3-7-sonnet这类版本化/短横线 slug 映射到规范 id避免误路由同时通告max推理强度。实现侧可以从 src/adapters/kiro/payload.ts 的normalizeKiroModelId与kiroReasoningModesrc/adapters/kiro/reasoning.ts区分 GPT-5.6 家族的reasoning字段与 Claude 类模型的output_config观察模型解析与推理强度映射的落地形态。Phase 140P1Kiro 特定错误映射目标是把上游的认证/区域/配额/模型不可用等失败映射为 Codex 可操作、可解释的错误替代泛化的上游失败不透明。实现侧见src/adapters/kiro-errors.tsclassifyKiroHttpError、safeKiroHttpErrorMessage被 src/adapters/kiro-retry.ts 与适配器formatErrorBody使用以及classifyKiroStreamError在 src/adapters/kiro/stream.ts 中的流级错误分类。认证区域检查还包括正则校验runtime.region-n.kiro.dev规范主机与未知端点/无效签名标记src/adapters/kiro-retry.ts。Phase 150/160/170P2截断恢复、用量标注与调试可观测性三个 P2 阶段共同构成静默失败不可见问题的收尾Phase 150 截断检测/恢复检测流中途截断并注入合成恢复消息让模型自适应而不是静默吞掉实现位于src/adapters/kiro-truncation.ts并设计了noteKiroTransientThrottlesrc/adapters/kiro-retry.ts这类流级节流到达于 HTTP 200 之后的冷却记录机制为下一次客户端重试预留状态Phase 160 用量估算标注CodeWhisperer 不上报权威用量启发式估算值必须在日志中明确标记为估算。适配器日志已携带estimated: true标记src/adapters/kiro/adapter.ts并配校准测试tests/providers/kiro/kiro-calibration.test.tsPhase 170 调试可观测性脱敏载荷 原始帧置于 flag 之后降低未来崩溃防护成本。验证纪律与验收闭环每个阶段都必须满足统一的完成标准bun x tsc --noEmit bun test tests/providers/kiro/... # 对应阶段的定向测试定向测试分布在 tests/providers/kiro/ 下kiro-adapter.test.ts、kiro-retry.test.ts、kiro-images.test.ts、kiro-oauth.test.ts、kiro-stream.test.ts、kiro-review-regressions.test.ts、kiro-calibration.test.ts等外加 tests/oauth-refresh.test.ts 与 tests/eventstream-decoder.test.ts。每阶段一个原子提交独立验证者按阶段分派。整个硬化计划完成时应确认不再静默丢弃图片、瞬时上游失败有重试、载荷有界、响应侧推理被呈现、版本化模型 slug 被解析、截断被呈现而非吞掉。这套从 P0 生存性到 P2 可观测性的路线图既是 Kiro 适配器上生产的完整清单也可作为其他 provider 适配器做生产硬化的可复用模板。赞分享【免费下载链接】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 Kiro 适配器原生图片输入userInputMessage.images 网关对齐实战opencodex Kiro 适配器原生图片输入userInputMessage.images 网关对齐实战 本文围绕 opencodex 项目中 Kiroopencodex Kiro 网关对齐实战工具 JSON Schema 净化Tool Schema Sanitization深度解析opencodex Kiro 网关对齐实战工具 JSON Schema 净化Tool Schema Sanitization深度解析 导读 本文基于 opopencodex Kiro 截断检测与恢复对齐 kiro-gateway 的 fail-closed 流式工具调用处理opencodex Kiro 截断检测与恢复对齐 kiro gateway 的 fail closed 流式工具调用处理 opencodexUniversa创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考