ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

OpenCodex 未答复 Issue 三方分流与修复实录:Cursor 工具目录容量预算、错误分类与成本标签

OpenCodex 未答复 Issue 三方分流与修复实录:Cursor 工具目录容量预算、错误分类与成本标签 【免费下载链接】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 开发日志中针对 2026-07-21 累积未答复 issue 的三方triage文档完整还原了项目在改动代码前对七条 issue 的逐条验证流程以及其中两条缺陷#190 Cursor 工具目录超限、#181 删除 provider 时守卫信息丢失和一条语义误导#198 成本估算被误读为账单的修复决策。读者将掌握 OpenCodex 的 issue 分流方法论、Cursor 路由下 MCP 工具目录的精确序列化容量预算算法以及错误分类与 GUI 文案的落地方式并能在自己的代理网关项目中直接复用同样的验证与修复思路。背景为什么改代码前必须先做 issue 三方OpenCodex 是一个面向 OpenAI Codex 与 Claude Code 的通用 provider 代理Universal provider proxy可把 Claude、Gemini、Grok、DeepSeek、Ollama 等任意 LLM 接入 Codex CLI、App、SDK 与 Claude Code。面对一段时期内积累的未答复 issue项目团队没有直接照单全改而是先对每一条报告做「验证 — 归因 — 决策」的三方流程验证每条报告在当前dev分支上的真实表现归因确认是已修复、是真实缺陷、还是功能请求决策只修复被证实的缺陷并以证据支撑的方式答复 issue。本次 triage 覆盖五组共七条 issue#190、#181、#198、#180、#196、#177、#178。原文档还明确记录了决策约束Cursor 通过 protobufMcpTools字段注册客户端工具存在可观测的数量与字节上限同一个过滤后的 catalog 必须同时驱动 protobuf 广告与客户端工具调用识别GUI 可见文本必须在所有 locale 下完成翻译。Issue 判定矩阵七条报告的三方结论Issue主题三方结论#190Cursor 拒绝聚合后的 Codex 工具 catalog报resource_exhausted真实缺陷本次修复#181删除 provider 时服务端可操作的 default-provider 守卫信息被 GUI 隐藏真实缺陷本次修复#198usage/log 的成本估算可能被误认为实际账单语义缺陷本次修复文案标注#180账号相关能力缺口已在dev完整实现无需重复开发#196供应商相关回归已在dev吸收验证通过#177Warp 是否暴露模型推理契约功能请求契约不匹配保持开放#178Factory 是否暴露模型推理契约功能请求契约不匹配保持开放值得强调的是 #180 与 #196triage 的核心价值之一就是避免重复实现。验证发现 #180 要求的「账号命令族」已经在dev上以完整的ocx account命令实现见 src/cli/account-api.ts、src/cli/account-auth.ts其 41 用例回归矩阵全部通过#196 也已被dev吸收registry 与三条 Qwen 3.8 reasoning replay 测试均通过。若跳过验证直接照旧补丁就会与既有实现冲突或重复。#190 深度解析Cursor 工具目录的容量预算算法这是本次 triage 中工程量最大的修复。Cursor 客户端通过 protobufMcpTools字段注册工具超过其可观测上限时返回resource_exhausted导致整个聚合 catalog 被拒绝。备选方案与否决理由文档记录了四条候选路线并逐一给出否决或采纳依据导入已关闭的 #192 启发式补丁—— 被否决该补丁低估 protobuf 字节数保留工具可能冲破数量上限且不能可靠提升被搜索的工具按数量整体丢弃整个 namespace—— 被否决粒度太粗会连带丢弃低优先级 namespace 中的高价值工具把 schema 占位并移入 prompt 文本—— 被否决等于发明一套不兼容的 schema-stubbing 协议破坏客户端对工具契约的理解精确测量实际序列化定义并优先保留可恢复工具——采纳精确序列化消除了上述失败模式且无需引入不兼容协议。双上限常量与精确字节测量实现位于 src/adapters/cursor/request-builder.ts两个探针验证过的边界直接以常量形式存在/** Probe-verified Cursor Connect boundaries, with byte headroom for the enclosing field. */ export const CURSOR_TOOL_COUNT_LIMIT 330; export const CURSOR_TOOL_BYTES_LIMIT 120_000;330是定义数量上限120_000是字节上限。关键设计是不靠估算而是对每个候选工具真实序列化后逐字节累计。测量函数位于 src/adapters/cursor/tool-definitions.ts/** Exact byte size of the protobuf field value Cursor receives for client tool registration. */ export function cursorMcpToolsEncodedSize( tools: readonly OcxTool[] | undefined, toolChoice?: OcxRequestOptions[toolChoice], ): number { const definitions buildCursorToolDefinitions(tools, toolChoice); return toBinary(McpToolsSchema, create(McpToolsSchema, { mcpTools: definitions })).byteLength; } /** Exact additive contribution of one repeated McpToolDefinition entry. */ export function cursorMcpToolEncodedSize( tool: OcxTool, toolChoice?: OcxRequestOptions[toolChoice], ): number { return cursorMcpToolsEncodedSize([tool], toolChoice); }由于 protobuf 的 repeated 字段按 tag/length/value 拼接序列化单条定义的单元素包装大小即为该工具对McpTools的精确增量贡献。这样 description、名称、provider identifier 与 input schema 的变化全部计入字节预算不再存在估算盲区。六档优先级与两阶段填充当候选集合超限时applyCursorToolBudget按优先级排序后分两阶段填充src/adapters/cursor/request-builder.ts优先级工具类别说明0执行路径工具exec/exec_command/shell_command及裸 Codex shell bridge拥挤 catalog 也不能丢弃 Codex 执行通道1wait工具仅恢复已让出的执行单元置于exec之后以免大 schema 挤占创建者2apply_patch及合成结构化编辑工具edit_file/multi_edit结构化编辑在回程转换成 apply_patch必须与它同生死3显式选择tool choice 固定的工具用户钉选的工具必须存活4tool_search加载的工具被搜索提升的工具下一轮即可使用5无 namespace 的裸工具高价值6带 namespace 的工具最容易被裁剪两阶段策略为Phase 1 先接纳所有钉选工具优先级 ≤ 3保证执行路径与用户选择不被拥挤目录挤掉Phase 2 按剩余优先级继续填充。填充过程中逐工具做「数量 字节」双检超出一个即跳过该候选但继续尝试后续更小的工具从而最大化目录填充率。代码中还有一个evictNonExecutionPath的强制接纳机制当执行路径工具因超大 schema 无法在剩余字节中放下时会从已接纳列表尾部回退非执行路径工具腾出空间确保至少接纳一个符合条件的执行路径工具src/adapters/cursor/request-builder.ts。错误分类不再是「配额限流」修复后的另一个关键点在于错误语义。文档明确残余的 catalog 溢出被分类为HTTP 400tool_catalog_too_large而不是被误判成配额quota限流。这一定义落在 src/lib/errors.tsreturn { message, type: invalid_request_error, code: tool_catalog_too_large };分类的差异直接影响上层行为请求日志tests/usage/request-log.test.ts、组合路由 failover 判定tests/routing/router-combo-failover-classification.test.ts与 adapter 错误内联tests/adapters/adapter-error-inline.test.ts都会依据这个 code 决定是否重试、是否切换 provider。把它归类为invalid_request_error意味着这是请求方需要修复的输入问题不是服务方资源耗尽重试或 failover 都无法解决。配套文档还记录了一个细节当tool_search可用时请求会附带显式的恢复说明recovery note告知在超大目录中被裁剪的低优先级工具可通过搜索重新启用。这意味着「tool_search 加载的工具」在下一轮有更高优先级是一种可持续的目录扩充通道。#181 深度解析provider 删除时守卫信息的可见性缺陷本质当用户通过 GUI 删除一个 provider 时服务端可能出于依赖关系拒绝该操作例如有 combo 仍然引用它但旧实现把这个可操作的守卫信息吞掉了用户看到的是一个无法理解的失败且不知道自己该先去解除 combo 依赖。服务端结构化错误管理 API 在 src/server/management/provider-routes.ts 中对该场景返回结构化错误return { ok: false, status: 409, error: cannot delete provider ${JSON.stringify(redactSecretString(name))} while combos depend on it, code: provider_has_dependent_combos, };注意两点错误信息中的 provider 名称经过redactSecretString脱敏避免把含密钥的字符串回显给客户端同时携带了机器可读的provider_has_dependent_combos错误码GUI 可以据此精准定位展示。GUI 侧翻译与降级修复后GUI 直接展示管理 API 的结构化删除错误当响应为网络错误、空响应或格式错误时则回退到本地翻译文案。这保证了四个语言环境含所有 locale下用户都能看到可操作的信息——要么是「该 provider 仍被某些 combo 依赖请先解除」要么是网络层面的兜底提示。#198 深度解析成本估算与账单的语义隔离缺陷本质Usage/log 界面展示的成本估算值是API list-price标价等价估算不是真实扣费。旧实现未做区分用户可能把估算值当作实际账单对账产生误解。四语文案落地修复在 GUI 文案层统一标注语义覆盖英文、韩文、德文与中文。以英文 i18n 文件为例gui/src/i18n/en.tslogs.metric.estimatedCostTitle: API list-price equivalent, not an actual charge; unmatched pricing is unavailable, usage.cost.total: API list-price equivalent (this range), logs.detail.section.cost: API list-price equivalent, usage.col.apiListPrice: API list-price这些文案贯穿日志指标、用量总览、日志详情与表格列头gui/src/pages/Usage.tsx 中对应的数据模型字段注释同样声明「API list-price estimate for the priced portion of this row」。同时配套的公开文档也做了同步更新形成「代码 文案 文档」三层一致的语义。#177 / #178外部厂商契约评估的边界两条 issue 都被判定为功能请求且都未进入实现原因具有方法论意义#177Warp文档明确 Warp 暴露的是异步的 Oz agent-run API而非 OpenAI 兼容的 model-inference 端点#178Factory文档明确 Factory 的公开契约是为其自有客户端配置上游模型网关同样不是可注册为 OpenCodex provider 的模型推理端点。结论是两者的公开契约都不满足「注册为 OpenCodex provider」所需的条件除非新增一个 adapter 契约。这是「不因 issue 热度而强行适配」的典型案例——契约不匹配时正确的答复是说明原因并保持开放而不是硬造一层不兼容的桥接。验证矩阵与质量门禁修复必须通过完整验证链原文档记录了每一层的结果全仓库测试套件3,296 通过、0 失败在仅含 fixture 字符串的隐私修复之前修复后的聚焦套件94 通过、0 失败覆盖 Cursor 错误/目录处理、请求日志与 #180 CLI 矩阵TypeScript根级 typecheck 通过GUIESLint、i18n lint 与生产构建通过隐私privacy scan 通过#180 相关 fixture 字符串从 token 形状的字面量改为等价内容行为不变React Doctor全量扫描通过仅报告仓库既有基线197 条诊断含一条既有的Models.tsx状态更新器错误本次改动未引入任何新诊断。此外本次 triage 的验证计划还明确了测试组织的三个层面聚焦的解析器 / Cursor 请求构建器 / 工具定义 / 错误测试、GUI lint 与构建、以及推送dev前的全仓库 pre-push 门禁。方法论沉淀本次 triage 的可复用要点从 devlog/_fin/260721_unanswered_issue_triage/000_plan.md 记录的整个流程中可以提炼出四条对代理网关类项目普适的经验先验证再修复七条 issue 中仅三条需要动代码#190、#181、#198两条已在dev上实现/吸收#180、#196两条因契约不匹配保持开放#177、#178。triage 避免了重复开发与无效适配。精确测量优于启发式估算工具目录的字节预算用真实 protobuf 序列化结果逐条累计消除了估算误差导致的resource_exhausted复发。错误分类决定上层行为tool_catalog_too_large归类为invalid_request_error让日志、failover 与错误展示层都按「请求方需修正输入」而非「资源耗尽需重试」处理。语义必须显式传达成本标注为「API list-price equivalent, not an actual charge」并同步到代码注释、GUI 文案与公开文档避免估算值与账单的混淆。这套「验证 → 归因 → 决策 → 验证」的闭环正是 OpenCodex 在维护多 provider 聚合代理时保持可维护性的关键实践。读者若在自建网关中遇到 Cursor/MCP 工具目录超限、删除资源时守卫信息丢失、成本估算误导等同类问题可直接参照本文的容量预算算法、错误分类策略与文案语义标注方式落地。赞分享【免费下载链接】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 DeepSeek V4 400 与 hy3-preview 模型目录漂移Issue 78 / 82 归因与修复全记录opencodex 实战修复 opencode go DeepSeek V4 400 与 hy3 preview 模型目录漂移Issue 78 / 82 归OpenCodex Cursor 适配器修复实录store:false 下的会话上下文延续、resource_exhausted 错误分级与 HTTP/2 传输加固OpenCodex Cursor 适配器修复实录store:false 下的会话上下文延续、resource_exhausted 错误分级与 HTTP/2 传opencodex PR 73 Cherry-Pick 与传输加固Codex/Cursor 桥接层的错误分类与取消语义修复opencodex PR 73 Cherry Pick 与传输加固Codex/Cursor 桥接层的错误分类与取消语义修复 导读 本文基于 opencodex上一篇gh_mirrors/ai/aima-python与PyTorch集成混合AI系统开发实践下一篇Ubuntu 24.04 安装 ROCm 报 Release file 源错误完整排查与重装指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表