为 Reasonix 打造原生多模态:一次 139 行的源码改造
为 Reasonix 打造原生多模态:一次 139 行的源码改造

为 Reasonix 打造原生多模态:一次 139 行的源码改造

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。

starry0214

订阅评论
提醒
guest

0 评论
最新
最旧 最多投票
内联反馈
查看所有评论