AtomCode 视觉预处理(Vision Preprocessor)系统分析
持续深度分析 — 图片处理管线、视觉模型支持、配置集成 2026-06-23
1. 系统概览
1.1 源文件
crates/atomcode-core/src/vision_preprocessor.rs1.2 用途
当使用的模型本身不支持图像输入时(可能是纯文本模型),Vision Preprocessor 通过一个专门的视觉模型(或外部 API)完成图像理解,将结果转换为文本描述,然后提供给 LLM。
用户发送图片
│
▼
当前模型支持图片? ──是──▶ 直接发送到 LLM
│
否
▼
Vision Preprocessor 激活
│
├── 使用 vision_preprocessor_provider 处理图片
├── 生成文本描述
└── 将描述作为增强上下文提供给 LLM2. 配置
2.1 配置字段
toml
# config.toml 中的配置
vision_preprocessor_provider = "<name>"在 Config 配置中的位置:
!`$ARGUMENTS...`vision_preprocessor_provider`ui`notification`telemetry`light`theme...2.2 错误消息
"[model] does not support image input and no vision_preprocessor_provider
is configured. Use /model to switch to a vision-capable model, or set
vision_preprocessor_provider in config."当两个条件同时满足时触发:
- 当前模型不支持图像输入(纯文本模型)
- 未配置
vision_preprocessor_provider
解决方案:
/model切换到支持视觉的模型- 在
config.toml中设置vision_preprocessor_provider
3. 支持的视觉模型
3.1 内置视觉能力模型
| 模型 | 类型 | 视觉能力 |
|---|---|---|
claude-sonnet | Claude 3.5 Sonnet | ✅ 原生支持 |
claude-opus | Claude 3 Opus | ✅ 原生支持 |
claude-haiku | Claude 3 Haiku | ✅ 原生支持 |
gpt-4o / gpt-4.1 | OpenAI | ✅ 原生支持 |
gpt-4o-mini | OpenAI | ✅ 原生支持 |
o1 / o3 | OpenAI | ✅ 原生支持 |
gemini-* | ✅ 原生支持 | |
deepseek-vl / deepseek-vl2 | DeepSeek Vision | ✅ 原生支持 |
llava | 开源 | ⬜ 通过视觉预处理器 |
pixtral | Mistral | ✅ 原生支持 |
qvq | Qwen | ✅ 原生支持 |
qwen-vl | Qwen | ✅ 原生支持 |
kimi | Moonshot | ✅ 原生支持 |
glm-4v | 智谱 | ✅ 原生支持 |
minicpm-v | 开源 | ⬜ 通过视觉预处理器 |
3.2 Vision Preprocessor Provider
当主要 LLM 为纯文本模型时的回退方案:
vision_preprocessor_provider = "provider_name"该提供商需要指向支持视觉的模型(如 claude-sonnet, gpt-4o 等),专门用于处理图像→文本的转换。
4. TUI 中的视觉处理
从 TUI 事件枚举提取的视觉处理相关渲染事件:
rust
enum TuiRenderEvent {
// ...
VisionPreprocess, // 视觉预处理开始
VisionPreprocessSuccess, // 视觉预处理成功
// ...
ImageAttachment, // 图片附件
// ...
}4.1 视觉预处理生命周期
ImageAttachment 事件触发
│
▼
VisionPreprocess 状态 (用户看到处理指示器)
│
├── 使用 vision_preprocessor_provider API
├── 分析图片内容
└── 生成文本描述
│
▼
VisionPreprocessSuccess (描述就绪)
│
▼
描述文本注入到 LLM 上下文
│
▼
LLM 继续生成回复5. 图片处理管道
原始图片 (Base64)
│
▼
┌─────────────────────────────────────┐
│ Vision Preprocessor │
│ │
│ 1. 解码 Base64 图片数据 │
│ 2. 格式检测 (PNG/JPEG/WebP/GIF) │
│ 3. 大小调整(如超过模型限制) │
│ 4. 发送到视觉 API │
│ 5. 接收文本描述 │
│ 6. 将描述插入 LLM 上下文 │
└─────────────────────────────────────┘
│
▼
文本描述 → 用户消息上下文增强6. 与现有的图片附件系统关系
ImageInput → ChatRequest/LiveMessageReq
│
├── model 支持视觉 ──▶ 直接发送图片 token
│
└── model 不支持视觉
│
└── vision_preprocessor_provider 已配置?
│
├── 是 ──▶ Vision Preprocessor 处理 → 文本描述
│
└── 否 ──▶ 错误提示:'/model' 切换或设置配置7. 新覆盖的盲区
| # | 之前未覆盖的领域 | 状态 | 发现 |
|---|---|---|---|
| 1 | Vision Preprocessor 系统 | ✅ | 专用 Rust crate + 完整处理管线 |
| 2 | 配置集成 | ✅ | vision_preprocessor_provider 字段 |
| 3 | 支持的视觉模型 | ✅ | 20+ 模型含视觉能力评估 |
| 4 | TUI 视觉状态 | ✅ | VisionPreprocess / VisionPreprocessSuccess 事件 |
| 5 | 回退机制 | ✅ | 不支持视觉时的两种解决方案 |
逆向命令索引
bash
# 提取视觉预处理源文件
strings atomcode.bin.bak | grep "^crates/atomcode-core/src/vision_preprocessor.rs"
# 输出: crates/atomcode-core/src/vision_preprocessor.rs
# 提取视觉相关配置
strings atomcode.bin.bak | grep -iE "vision_preprocessor" | sort -u
# 输出: vision_preprocessor_provider
# 提取支持的模型
strings atomcode.bin.bak | grep -iE "vision|visual" | grep -v "https\?://" | sort -u | head -5本报告由持续分析循环生成 — 37 份报告中的最后一份子系统分析