[Feature]: 对齐“测试连接”和“实际调用”链路 / Ensure connection-test and actual-invocation parity
Problem / pain point / 问题
当前“测试连接”与“实际调用”并不总是走同一套有效 provider contract,因此容易出现误判:
- 测试连接通过,但真实
generate 失败
- 测试连接失败,但真实调用其实可用
/models 探测、wire 选择、baseUrl 规范化、keyless 判定、OAuth / Bearer 认证处理不完全一致
- active provider 的解析、renderer 传入值覆盖、真实调用时的 baseUrl snap-to-config 逻辑,并没有完整复用到测试链路
Today the connection-test path and the real invocation path do not always share the same effective provider contract, which creates false positives and false negatives:
- connection test passes while real
generate fails
- connection test fails even though real invocation works
/models probing, wire selection, baseUrl normalization, keyless handling, and OAuth / Bearer auth are not fully aligned
- active-provider resolution and runtime-only config snapping are not consistently reused by connection tests
Proposed solution / 方案
把“测试连接”升级成“对真实调用链路的低成本验证”,而不是一条独立的近似探测路径。
Turn connection testing into a low-cost validation of the real invocation contract rather than a separate approximate probe.
具体包括:
- 提炼共享的 “effective provider contract” 解析层
- 让测试链路与运行链路复用相同的 provider 解析、auth/header、baseUrl、wire、keyless、OAuth 逻辑
- 对
/models fallback、chat/completions / responses 探测、以及 runtime 实际发送条件做显式对齐
- 在无法完全复用真实请求时,返回结构化“哪里与真实调用可能分叉”的原因
- 为“test-pass / runtime-fail”和“test-fail / runtime-pass”建立回归测试
Alternatives considered / 备选方案
-
继续增强现有 diagnostics,但保留独立探测路径
-
直接用一次完整生成来代替测试连接
-
Keep improving diagnostics while preserving a separate probe path
- Rejected because it improves hints but does not remove the divergence
-
Replace connection testing with a full real generate call
- Rejected because it is slower, costlier, and may have side effects
Scope / 范围
Provider / model
Acceptance criteria / 验收标准
connection:v1:test-active 与实际 generate 共享同一套 active provider 解析语义
connection:v1:test-provider 与真实运行共享同一套 auth、header、baseUrl、wire、keyless 规则
/models fallback 与真实 wire 行为的关系被显式定义,而不是只靠局部 probe 经验
- ChatGPT Codex OAuth、keyless proxy、OpenAI-compatible gateway 都有 parity 覆盖
- 至少覆盖以下回归场景:
- test passes but runtime fails because effective wire / auth / baseUrl differs
- test fails but runtime succeeds because
/models is missing while inference works
- renderer 能收到结构化结果,明确区分“可连通但与实际调用不一致”
Likely touchpoints / 可能涉及
apps/desktop/src/main/connection-ipc.ts
apps/desktop/src/main/index.ts
apps/desktop/src/main/provider-settings.ts
apps/desktop/src/main/resolve-api-key.ts
packages/core/src/index.ts
packages/providers/src/index.ts
Related issues / 相关 issue
[Feature]: 对齐“测试连接”和“实际调用”链路 / Ensure connection-test and actual-invocation parity
Problem / pain point / 问题
当前“测试连接”与“实际调用”并不总是走同一套有效 provider contract,因此容易出现误判:
generate失败/models探测、wire 选择、baseUrl 规范化、keyless 判定、OAuth / Bearer 认证处理不完全一致Today the connection-test path and the real invocation path do not always share the same effective provider contract, which creates false positives and false negatives:
generatefails/modelsprobing, wire selection, baseUrl normalization, keyless handling, and OAuth / Bearer auth are not fully alignedProposed solution / 方案
把“测试连接”升级成“对真实调用链路的低成本验证”,而不是一条独立的近似探测路径。
Turn connection testing into a low-cost validation of the real invocation contract rather than a separate approximate probe.
具体包括:
/modelsfallback、chat/completions/responses探测、以及 runtime 实际发送条件做显式对齐Alternatives considered / 备选方案
继续增强现有 diagnostics,但保留独立探测路径
直接用一次完整生成来代替测试连接
Keep improving diagnostics while preserving a separate probe path
Replace connection testing with a full real generate call
Scope / 范围
Provider / model
Acceptance criteria / 验收标准
connection:v1:test-active与实际generate共享同一套 active provider 解析语义connection:v1:test-provider与真实运行共享同一套 auth、header、baseUrl、wire、keyless 规则/modelsfallback 与真实 wire 行为的关系被显式定义,而不是只靠局部 probe 经验/modelsis missing while inference worksLikely touchpoints / 可能涉及
apps/desktop/src/main/connection-ipc.tsapps/desktop/src/main/index.tsapps/desktop/src/main/provider-settings.tsapps/desktop/src/main/resolve-api-key.tspackages/core/src/index.tspackages/providers/src/index.tsRelated issues / 相关 issue