@yandy0725/pi-vision-tools0.3.1
pi package adding a describe_image tool that lets non-multimodal models delegate image analysis to a vision model
Untested on omp
This is a pi package. No one has reported whether it works on omp yet. If you try it, add your result below.
Reports 0
No reports yet.
Readme
pi-vision-tools
让非多模态模型通过委托给配置好的视觉模型来分析图像。提供一个 describe_image 工具 + /vision 命令。
功能
- 一个工具(
describe_image),将图像 + 提示词发送给支持视觉的模型,并将文本结果返回给调用方模型 - 调用方模型按需控制成本/质量:
compress(开关)、thinkLevel(从 off 到 xhigh)以及提示词本身——无需预配置 - 模糊模型选择:按名称(
"haiku"、"qwen vl")或精确provider/id配置视觉模型;只考虑支持图像输入的模型 - 始终按调用方模型模态自动开关:如果当前模型已支持图像输入,工具自动禁用;否则启用
- 页脚指示器(
👁 provider/model),在工具激活且视觉模型已配置时可见 - 无需
/reload:配置更改即时生效
工作原理
调用方模型 → describe_image → 视觉模型 → 文本返回给调用方模型
(无视觉能力) (图像+提示词) (能看图像)
- 调用方模型调用
describe_image,传入图像和提示词 - 工具解码图像,可选使用 sharp 压缩,然后调用配置好的视觉模型
- 视觉模型的文本回答作为工具结果返回
前缀缓存
切换模型时自身的 prefix cache 已因 model 变化而失效,setActiveTools 增删 describe_image 只是新 model 系统提示的正常组成部分,不会额外造成 cache 抖动。
对同一个 model,tool 列表是确定的(无视觉一定带 describe_image,有视觉一定不带),所以中间切换到其他 model 再切回来时,前缀内容与先前一致,仍然能命中原有缓存。
安装
pi install npm:@yandy0725/pi-vision-tools
或在 ~/.pi/agent/settings.json 中添加:
{
"packages": ["npm:@yandy0725/pi-vision-tools"]
}
配置
/vision 命令
| 命令 | 功能 |
|---|---|
/vision 或 /vision status |
显示当前配置:解析后的 provider/model、默认 think level、工具是否激活、调用方模型是否支持视觉 |
/vision config model <m> |
设置视觉模型:精确 provider/id(如 openai/gpt-4o)或模糊名(如 haiku、qwen vl) |
/vision config default-think-level <level> |
设置默认 think level:off、minimal、low、medium、high、xhigh。工具参数 thinkLevel 优先于它;非法值会被拒绝且不写盘 |
配置持久化到 ~/.pi/agent/vision-tools.json,即时生效——无需 /reload。
工具启停是自动的:调用方模型自带图像输入时 describe_image 会从工具列表中移除,否则启用——没有任何强制开关。
老配置键(enabled、defaultReasoning)在加载时被忽略;升级后如需固定 think level,请重新设置一次。
模型选择
model 可以填精确的 provider/id,也可以填模糊名。模糊匹配会对所有可用且支持图像输入的模型打分:精确 id > id/完整名包含 > 展示名包含 > 所有分词都出现。因此 haiku、qwen vl、anthropic haiku 都能解析到具体模型(前提是它已配置鉴权)。不支持图像输入的模型永远不会被选中;没有任何匹配时,报错会列出所有可用的视觉模型。
/vision status、/vision config model 的确认信息和页脚指示器都显示解析后的 provider/id,所以用模糊名时你始终能看到它实际选了什么:
{ "model": "haiku" }
配置只读取 model 与 defaultThinkLevel 两个字段——没有单独的 provider 配置。想锁定某个 provider 时把它写进值里:"model": "anthropic/claude-haiku-4-5"。
可选:sharp
安装 sharp 以在发送前自动压缩图像:
npm install sharp
sharp 是可选的。没有它,图像将原样发送(不报错)。压缩会将最长边降采样至 ≤1568px,去除 alpha 通道,并转换为 JPEG 格式。
环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
PI_VISION_MAX_DIM |
1568 |
最长边像素上限(1–10000) |
PI_VISION_JPEG_QUALITY |
85 |
JPEG 质量(1–100) |
在任何调用中设置 compress: false 可跳过压缩,用于需要像素级精度的场景(读取坐标、检查微小 UI 元素)。
工具参考
describe_image(image_path: string, prompt: string, compress?: boolean, thinkLevel?: string)
| 参数 | 必填 | 默认值 | 说明 |
|---|---|---|---|
image_path |
是 | — | 文件路径、data: URL 或原始 base64(>100 字符) |
prompt |
是 | — | 给视觉模型的指令 |
compress |
否 | true |
发送前是否压缩;设为 false 以获取像素级精度 |
thinkLevel |
否 | off |
think level:off、minimal、low、medium、high、xhigh |
示例工具调用
{
"image_path": "/home/user/screenshot.png",
"prompt": "请描述这张截图中看到的内容。",
"compress": true,
"thinkLevel": "high"
}
示例提示词
| 用途 | 提示词 |
|---|---|
| 描述图像 | "请详细描述这张图片。" |
| 读取坐标/位置 | "提交按钮的像素坐标是多少?" |
| 提取文字(OCR) | "提取这张图片中所有可见的文字。" |
| 查找 UI 缺陷 | "检查这张截图中是否存在布局、对齐或文字溢出问题。" |
| 解释图表 | "请逐步解释这个架构图。" |
| 分析错误 | "这个错误信息是什么意思,如何修复?" |
think level
| 级别 | 适用场景 |
|---|---|
off |
简单描述、文字提取、基础问答 |
minimal |
快速浏览,"这是什么?" |
low |
略多思考、中等细节 |
medium |
详细描述、UI 检查 |
high |
复杂分析、架构图、代码截图 |
xhigh |
深度推理、bug 排查、多步骤视觉谜题 |
支持的图像格式
支持:PNG、JPEG、GIF、WebP、BMP。
输入可以是:
- 文件路径(
/path/to/image.png、./relative.png,支持~前缀) data:URL(data:image/png;base64,...)- 原始 base64(字符串 >100 字符,自动检测)
许可证
MIT