Reasonix 是一个基于 DeepSeek/MiMo 的 AI 编程助手终端。v2 版本用 Go 重写后,虽然性能大幅提升,但丢失了一个关键能力——原生多模态图片理解。
问题:为什么粘贴图片后模型看不见?
用户粘贴截图时,Reasonix 会把图片保存到 .reasonix/attachments/ 目录,然后在消息中插入一个文本标签。这个标签只是纯文本,API 请求中的 Content 是 string 类型,不支持 OpenAI 多模态 API 要求的 ContentPart 数组格式。
解决方案:139 行代码的精准手术
核心思路:在发送 API 请求前,检测消息中的 image path 标签,读取文件,Base64 编码,以 image_url content part 嵌入请求。
改动的 6 个文件
- provider.go — ImageAttachment 类型 (+8行)
- openai.go — contentPart 类型 + buildRequest 多模态 (+30行)
- agent.go — extractImageAttachments() 函数 (+54行)
- boot.go — isVisionModel() 模型判断 (+19行)
- config.go — session_dir 配置支持 (+21行)
- resume.go — /resume 显示项目名 (+13行)
工作原理
用户 Ctrl+V 粘贴图片
↓
TUI 保存到 .reasonix/attachments/
↓
agent.Run() 检测标签 → 读取文件 → base64 编码
↓
存入 Message.Attachments
↓
openai.buildRequest() 构建多模态 content 数组
↓
API: {"content": [{"type":"text","text":"..."}, {"type":"image_url","image_url":{"url":"data:image/png;base64,..."}}]}
关键设计决策
1. 只对视觉模型启用
isVisionModel() 判断当前模型是否支持视觉。DeepSeek Flash 等文本模型自动跳过,零开销。
2. Attachments 不序列化
Message.Attachments 标记为 json:-,不写入 session 文件。每次粘贴图片时实时读取编码。
更新兼容性
补丁以 git patch 格式保存(22KB)。更新后 git apply multimodal.patch 即可,核心改动仅 6 文件 139 行。
本补丁遵循 MIT License。
