Skip to content

Remove vision proxy - #4

Merged
Senguk520 merged 9 commits into
mainfrom
remove-vision-proxy
Sep 11, 2026
Merged

Remove vision proxy#4
Senguk520 merged 9 commits into
mainfrom
remove-vision-proxy

Conversation

@Senguk520

Copy link
Copy Markdown
Owner

概述

remove-vision-proxy 合入 main,发布 v0.2.0。核心变更:整体移除 sidecar 视觉子代理(破坏性变更),模型视觉能力判定收敛为「在线模型目录 + 实测校正表」;原生视觉模型同样依赖的 read 工具图片回填予以保留并修复;另含两项缺陷修复与注释/文案收尾。

净删约 3,000 行(35 files,+999 / −3999),同时消除 8 类历史问题:历史残桩重写、当前轮残桩、normalize 时机耦合、preprocess 降级占位符、agentic 不判模型能力、视觉子调用与主调用共用账号的 11140 风控、看门狗保活、OpenAICompat 镜像链零测试。

变更内容

1. sidecar:移除视觉子代理(9427df1,破坏性)

  • 删除策略层 preprocess / routing 全链路(applyCodebuddyVisionProxycodebuddyVisionPlandescribeImagesWithVisionModelcodebuddy_executor_vision.gocodebuddy_executor_vision_agentic.go 等)
  • 删除历史图片重写与 [历史图片] 标记相关逻辑
  • 删除 OpenAICompat 镜像链及其接入
  • 删除 CodebuddyVisionConfig 配置结构、VisionSubagent 打标链(logging holder / usage record / redisqueue / manifest 诊断字段 / handlers 注入)
  • 删除流超时特例(300s visionAgenticStreamIdleTimeoutrequestHasVisionInput,带图请求回归统一 idle 超时)

2. sidecar:read 工具图片回填保留并强化(0ba2687

  • 回填逻辑迁至新文件 codebuddy_executor_backfill.go始终启用:CodeBuddy / Cursor 经 read / read_file 读图时 role=tool 结果为占位符(base64 被省略),必须按 tool_callsfilePath 从磁盘回填;含 stub 检测、当前轮限定(防历史图重注入)、字符串 content 规范化(防 sjson 畸形 JSON)
  • 修复 <system_reminder> 尾消息场景不触发:CodeBuddy IDE 在工具结果后追加 role=user 的续跑提醒,使同轮 read 被判为历史轮而静默跳过回填;新增续跑提醒标记与 codebuddyTurnStartUserMessageIndex,当前轮起点回退到最后一条实质性 user 消息
  • Execute / ExecuteStream 两条路径固定 normalize → backfill 顺序(回填依赖最后一条 user 消息承载图片,上游只采纳该位置的图片)

3. 能力判定:在线清单 + 实测校正表(9427df1

  • 新增唯一允许的本地覆盖:codebuddyVisionExcluded = glm-5v-turbo(清单误标 true,实测 4 Key × 2 图 × 7 次全部拒答)→ 强制纯文本,避免带图必失败
  • codebuddyVisionIncluded = glm-5.1 / deepseek-v3-2-volc(清单误标 false,实测 4/4 Key 正确读图)→ 强制图片能力
  • 13 个实测原生视觉模型 + 2 个校正补入模型全部直通;带图请求不再产生额外 hy4-preview 子调用(零额外延迟与额度消耗)

4. desktop:移除视觉代理 GUI 与配置生成(78bec68

  • 移除「视觉代理工具 / 视觉策略 / 视觉模型」三项设置,以及 VisionMode 类型与 ServiceConfig 相关字段
  • gateway.rs 不再写入 codebuddy-vision 配置段与 manifest 的 visionMode / visionModel 字段

5. 缺陷修复(a8acde2

  • 请求体转储改为随「调试日志」开关门控:移除 sidecar 启动时硬编码的 CODEBUDDY_DEBUG_BODY=1(此前正常使用下每个请求体都写入 codebuddy_debug.log,单文件已累积至 87MB 且无清理机制),现默认关闭

6. 收尾与发版(7d5c12d070421e

  • 清理视觉代理移除后的 4 处注释/文案残留:codebuddy_executor.go 的 NOTE 改写为引用 backfill 的「最后一条 user 消息」依赖、codebuddy_model_cache.go 用途描述、UPSTREAM.md 职责列表、App.tsx 页脚注改为「在线模型目录与实测校正表」
  • 版本号四处同步:0.1.14 → 0.2.0(package.json / Cargo.toml / Cargo.lock / tauri.conf.json

破坏性变更与升级注意

  • 桌面端不再提供视觉代理相关设置项;旧 config.json 中残留的 codebuddy-vision 段会被忽略(不报错)
  • 带图请求改由原生视觉模型直通;纯文本模型收到图片时不再有代理兜底描述
  • 图片可用模型由 20/20 收敛至 15/20(hunyuan-chat / hunyuan-2.0-thinking / glm-5v-turbo / hy3 / hy3-x);其中 hy3 / hy3-x 维持清单直通,不做账号级黑名单
  • 能力判定口径统一为「在线模型目录 + 实测校正表」,避免向不支持的模型发送无效图片请求

测试与验证

  • sidecar:go build ./... 通过;go test(主包 / registry / config / logging / redisqueue / usage / handlers)全绿;sidecar 二进制构建通过
  • 新增/更新测试:codebuddy_executor_backfill_test.go(尾随 reminder、normalize 后回填顺序等回归)、codebuddy_executor_image_input_test.goTestCodebuddyModelSupportsImagesOverrides(校正表语义与大小写/空白)、buildModelsResponse 单测(glm-5v-turbo 排除断言);删除视觉代理用例约 990 行
  • desktop:npx tsc --noEmitnpm run buildcargo check 通过
  • 决策依据与能力矩阵见《模型视觉能力实测与校正表》§5、《视觉模型修改交接文档》第 17 章

已知问题(与本次变更无关,未处理)

  • internal/runtime/executor 全量测试仍有 5 个 Claude / Kimi / Codex 既有失败

背景:旧实现同时维护「硬编码黑名单 + 硬编码白名单 + 在线清单」三处判定,与 2026-09-11 全量实测结果冲突(实测证明清单本身存在误标,而硬编码表同样过时)。本次先把链路对齐为「清单唯一来源」,清单误标的校正(glm-5v-turbo 等)留待后续单独决策。

改动:1) registry/model_definitions.go 删除 codebuddyVisionBlacklist / codebuddyVisionBackendWhitelist,CodebuddyModelSupportsImages 收敛为「在线清单 supportsImages + 未命中/空一律 false」;2) executor/codebuddy_executor_vision.go 新增 codebuddyEffectiveModel / codebuddyModelIsNativeVision / codebuddyAgenticVisionPlan 纯函数,preprocess / routing / 历史图片重写 / agentic 判定统一复用;3) executor/codebuddy_executor.go 的 Execute / ExecuteStream agentic 分支接入原生视觉豁免:原生视觉模型与视觉引擎自身整段跳过子代理循环,文本化历史图片也仅对纯文本模型执行。

行为变化:deepseek-v4-flash / deepseek-v4-pro / deepseek-v4.1-flash / glm-5.3-flash 等清单标记 supportsImages=true 的模型图片直通(不再走 preprocess/agentic);glm-5.1 / glm-5.2 不再被硬编码为原生视觉,交由视觉层处理。

测试:registry 用例重写为「目录驱动」(installCodebuddyTestCatalog 固定目录并 cleanup 恢复),新增 TestCodebuddyAgenticVisionPlan / TestCodebuddyEffectiveModel / TestCodebuddyModelIsNativeVision,manifest_policy_test 与 registry 用例注释同步到新判定来源。

验证:独立实例 11599 + 真实上游实测通过(原生视觉直通无子代理日志;纯文本模型走子代理;/v1/models input_modalities 跟随清单)。
问题:request_completed 事件先于 usage 事件到达,两者携带的结论不一致 —— 完成时 cache_hit 恒为 false(小时桶按 miss 计数)、流式请求 HTTP 200 开流后仍可能中途失败(成功数先记),导致统计页的缓存命中率与成功率偏差。

改动:1) models.rs 新增 DayStats::reclassify_hour_hit / reclassify_success:usage 事件携带最终结果时,把小时桶与当日/累计统计中的对应计数从 miss 挪到 hit、从成功挪到失败(或反向),并放开「delta 全零即返回」的提前退出,保证仅状态变化(token/credit 无增量)时也会修正;2) gateway.rs 在 ingest_event 中读取 usage 事件的 errorMessage,非空时写入请求日志 error 字段,流式中途失败不再只靠状态码判断。

影响:统计页成功率/缓存命中率与真实结果一致;请求日志可直接看到上游返回的最终错误信息。
package.json / src-tauri/Cargo.toml / src-tauri/Cargo.lock / src-tauri/tauri.conf.json 四处版本号同步升级。

本次发布包含:1) sidecar 原生视觉模型直通改造(能力判定收敛为在线清单,子代理补原生视觉豁免);2) 桌面端用量统计修正(成败/缓存命中按 usage 事件最终结果落定,记录最终错误信息)。
决策依据(2026-09-11 量化评估,详见《模型视觉能力实测与校正表》§5):收益为净删约 2,900 行并消除 8 类历史问题(历史残桩重写、当前轮残桩、normalize 时机耦合、preprocess 降级占位符、agentic 不判模型能力、视觉子调用与主调用共用账号的 11140 风控、看门狗保活、OpenAICompat 镜像链零测试),带图请求不再产生额外 hy4-preview 调用(零额外延迟/额度);损失为 5 个可服务模型失去图片能力(hunyuan-chat / hunyuan-2.0-thinking / glm-5v-turbo / hy3 / hy3-x),图片可用模型 20/20 → 15/20,13 个实测原生视觉 + 2 个校正补入模型全部直通。

移除内容:1) 策略层 preprocess/routing 全链路(applyCodebuddyVisionProxy、codebuddyVisionPlan、describeImagesWithVisionModel 等);2) agentic 子代理整文件(inspect_image 工具循环、心跳保活、用量上报);3) 历史图片重写(rewriteCodebuddyHistoricalImagesForTextModel 及 [历史图片] 标记相关);4) OpenAICompat 镜像链整文件与接入;5) CodebuddyVisionConfig 配置结构与 Config.CodebuddyVision 字段;6) VisionSubagent 打标链(logging holder / usage record / redisqueue / manifest 诊断字段 / handlers 注入);7) 流超时特例(visionAgenticStreamIdleTimeout 300s 与 requestHasVisionInput,带图请求回归统一 idle);8) 原生视觉豁免函数(codebuddyModelIsNativeVision / codebuddyAgenticVisionPlan / codebuddyEffectiveModel,已无代理可豁免)。

保留(与视觉代理无关,原生视觉模型同样依赖):read 工具图片回填迁至新文件 codebuddy_executor_backfill.go —— CodeBuddy/Cursor 经 read/read_file 读图时 role=tool 结果为占位符(base64 被省略),必须从 tool_calls filePath 从磁盘回填,永远启用;含 stub 检测、当前轮限定(防历史图重注入)、字符串 content 规范化(防 sjson 畸形 JSON);图片输入检测与读图诊断(codebuddyDumpReadToolDiagnostic)同步保留。

新增最小校正表(唯一允许的本地能力覆盖,internal/registry/model_definitions.go,查在线清单之前生效):codebuddyVisionExcluded = glm-5v-turbo(清单误标 true,实测 4 Key × 2 图 × 7 次全部拒答)→ 强制纯文本,客户端不发图,避免带图必失败;codebuddyVisionIncluded = glm-5.1 / deepseek-v3-2-volc(清单误标 false,实测 4/4 Key 正确读图)→ 强制图片能力,保住已验证能力。hy3 / hy3-x 保持直通(23/31 账号可用,接受 4/31 失败,不做账号级黑名单)。

测试:删除视觉代理用例约 990 行;图片检测用例迁至 codebuddy_executor_image_input_test.go;新增 TestCodebuddyModelSupportsImagesOverrides(校正表语义与大小写/空白);更新 buildModelsResponse 单测(去掉 vision-proxy 双态,新增 glm-5v-turbo 排除断言)。

验证:go build ./... 通过;go test 主包/registry/config/logging/redisqueue/usage/handlers 全绿,executor 全量仅剩 5 个 Claude/Kimi/Codex 既有失败(与本次无关);sidecar 二进制构建通过。文档:现行架构与移除后能力矩阵见《视觉模型修改交接文档》第 17 章。
配套 sidecar 视觉子代理移除(见上一提交):桌面端不再暴露「视觉代理工具 / 视觉策略 / 视觉模型」三项设置,也不再向 sidecar 写入 codebuddy-vision 配置段与 manifest visionMode/visionModel 字段。

- src/types.ts:删除 VisionMode 类型、ServiceConfig 的 visionToolEnabled/visionMode/visionModel 字段与默认值;2) src/App.tsx:删除协议兼容分区的视觉开关、策略下拉、模型输入框(含 datalist 候选),分节描述同步去掉视觉代理说明;3) src-tauri/src/models.rs:删除对应字段与 Default 值;4) src-tauri/src/gateway.rs:删除 vision_mode/vision_model 归一逻辑、config.json 的 codebuddy-vision 段、manifest 的 visionMode/visionModel 字段(sidecar 已不读取;旧配置文件中的残留字段会被忽略)。

验证:npx tsc --noEmit 与 npm run build 通过;cargo check 通过。
CodeBuddy IDE 在每个 tool 结果后追加 role=user 的 <system_reminder> 续跑提醒,使同轮 read tool_call 被判为历史轮而静默跳过回填;即便注入成功,图片所在 user 消息也会被尾随消息顶掉,而上游只采用最后一条 user 消息中的图片。

- backfill: 新增续跑提醒标记与 codebuddyTurnStartUserMessageIndex,当前轮起点回退到最后一条实质性 user 消息
- executor: Execute/ExecuteStream 两条路径钉死 normalize -> backfill 顺序
- test: 新增尾随 reminder 场景与 normalize 后回填顺序两条回归测试
…BODY=1

该环境变量自 01c6aac 引入后始终为 1,导致正常使用下每个请求体都写入 debug-log/codebuddy_debug.log,单文件已累积至 87MB 且无清理机制。现改为仅在 state.config.debug_logs 开启时注入,默认关闭。
背景:9427df1 移除视觉子代理、78bec68 移除视觉代理 GUI 设置项之后,仍有
四处注释/文案在描述已删除的实现。本次为复查收尾,仅改注释与文案,无任何
逻辑变更。

- codebuddy_executor.go:normalizeCodebuddyToolMessages 延迟调用的 NOTE 不再
  引用已删除的 deferred streaming preprocess / lastCodebuddyUserMessageIndex,
  改写为引用 codebuddyBackfillReadToolImages 的顺序依赖:回填依赖「最后一条
  user 消息」承载图片(上游只采纳该位置的图片),而 normalize 可能在消息末尾
  追加合成 user 消息,因此二者必须保持 normalize → backfill 的先后顺序。
- codebuddy_model_cache.go:持久化完整 ModelInfo 字段的用途描述由
  "vision-proxy routing and max_tokens clamping" 修正为
  "max_tokens clamping and image-capability checks"。
- UPSTREAM.md:外层 coderelay-proxy 包职责列表移除已不存在的 vision routing。
- src/App.tsx:模型管理页脚注「视觉能力由后端模型目录和账号池探测结果决定」
  修正为「视觉能力由在线模型目录与实测校正表决定」,与现行能力判定口径一致。

核查:全仓检索 vision routing / vision-proxy routing / 账号池探测 /
lastCodebuddyUserMessageIndex 已无残留;相关文件无 lint 报错。
- package.json:0.1.14 → 0.2.0
- src-tauri/Cargo.toml:0.1.14 → 0.2.0
- src-tauri/Cargo.lock:coderelay 包版本随 Cargo.toml 同步为 0.2.0
- src-tauri/tauri.conf.json:0.1.14 → 0.2.0

0.2.0 为视觉子代理整体移除(9427df1 破坏性变更)后的首个版本:模型能力判定
收敛为「在线模型目录 + 实测校正表」,read 工具回填保留;本次提交仅同步版本号,
无功能改动。
@Senguk520
Senguk520 merged commit 08e3489 into main Sep 11, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant