# Kimi Eyes 👀 > [English](README.en.md) | 中文 让 KimiCode 的**非多模态模型**也能分析图片与截图(借鉴 [opencode-vision](https://github.com/JochenYang/opencode-vision) 的思路,但更薄:无 hook、无消息变换、无状态残留)。 **核心机制**:插件声明一个 MCP stdio 服务器,暴露两个工具——`read_image`(读本地图片)与 `read_clipboard_image`(读剪贴板截图),经 `SYSTEM.md` 引导模型调用;服务器按你配置的协议(OpenAI 兼容 / Anthropic)把图片发给你自己配置的多模态 API,返回文本描述。 ``` 多模态模型:Alt+V 粘贴即看,插件自动闲置 非多模态模型:@图片路径 / 截图后提问 → 模型调 mcp__kimi-eyes__read_image / read_clipboard_image → 你的 VLM 返回描述 ``` ## 前置要求 - KimiCode CLI(本插件通过插件机制加载,需支持 `/plugins` 与 MCP) - Node.js ≥ 18(`node --version` 检查;原生 fetch 需要 18+) - 一个支持视觉输入的多模态 API(OpenAI 兼容 `chat/completions`,或 Anthropic `messages`),Key 由你自己提供 ## 适用范围 **本插件对主模型没有任何限制**——无论你的 KimiCode 当前用哪个模型、来自哪家服务商,只要它不具备原生图片输入能力(`image_in`),本插件就能为它补上视觉: - **常见非多模态模型**:DeepSeek(deepseek-chat)、Qwen 纯文本版(qwen-plus / qwen-turbo)、Llama 文本系列、以及本地部署的文本模型(Ollama / vLLM 等) - **任何第三方模型**:通过 KimiCode 配置的任意 OpenAI 兼容或自定义模型,只要它原生不看图,插件就会在消息含图片时引导模型调用视觉工具 - **多模态模型**:自动跳过(Alt+V 粘贴即看,插件闲置) 视觉能力由**你自己配置的 VLM** 提供,与主模型完全解耦: | 协议 | 常见视觉模型示例 | | --- | --- | | OpenAI 兼容 | qwen-vl 系列、GLM-4V、GPT-4o / GPT-5 兼容端点、Gemini 兼容端点等 | | Anthropic | Claude 3.5 / 3.7 / 4 系列等 | 一句话:**主模型只管理解文字,看图交给外部 VLM**。配置时只需在 setup 向导第一步选择与你视觉 API 服务商匹配的协议,其余全部自动。 ## 快速开始 ### 1. 安装插件 在 KimiCode 会话里执行: ``` /plugins install D:\AIGC\Plugin\kimi-eyes ``` ### 2. 配置视觉 API(一次性) 在插件目录运行配置向导: ``` cd D:\AIGC\Plugin\kimi-eyes node setup.mjs ``` 向导按顺序引导:**选择协议(OpenAI 兼容 / Anthropic)→ 填写 BaseUrl → 填写 API Key(掩码输入)→ 拉取模型列表选择多模态模型 → 1×1 图片视觉验证 → 可选填写当前主模型名(用于触发判断)→ 写入配置**。 - 模型列表自动从 `GET {BaseUrl}/models` 拉取,用内置的 models.dev 数据库**精确标注「✓视觉 / 文本」**,未收录的按关键词标「★疑似」;拉取失败时回退为手动输入 - 视觉验证通过才落盘,防止配到一个不收图片的模型 - 最后一步可填写**当前主模型名**(可选):插件用 models.dev 判定后,若该模型支持原生识图,工具会直接提示无需调用——即「多模态不触发」的代码级判断(详见[触发](#触发日常全自动)) - 配置写入 `~/.kimi-code/kimi-eyes/config.json`(类 Unix 系统自动 `chmod 600`) ### 3. 启用 ``` /reload ``` MCP 服务器会随会话自动启动。 ### 4. 使用 | 场景 | 操作 | | --- | --- | | 多模态模型 | 直接 Alt+V 粘贴图片,原生看图,插件不参与 | | 非多模态 + 有图片路径 | 输入 `@截图.png` 或直接给路径,模型自动调 `read_image` | | 非多模态 + 刚截图/复制 | 截图后直接提问「分析这张截图」,模型自动调 `read_clipboard_image` 读系统剪贴板 | ## 激活与触发 ### 激活(一次性) ``` /plugins install D:\AIGC\Plugin\kimi-eyes # 1. 安装 /reload # 2. 启用(或 /new 新开会话) ``` 启用后 MCP 服务器随每个会话自动启动,没有单独的「开启功能」步骤。验证方式: - `/plugins list` → kimi-eyes 状态应为 enabled - `/mcp` → kimi-eyes 服务器应显示 connected - `/plugins info kimi-eyes` → 应无诊断错误 ### 触发(日常,全自动) 插件是**被动式**的:`SYSTEM.md` 为模型植入规则,模型在合适时机自动调用工具,无需手动操作: | 信号(消息里的任何一项) | 模型自动行为 | | --- | --- | | 图片格式路径或 `@` 引用(`.png/.jpg/.jpeg/.webp/.gif/.bmp`) | **硬触发**:无条件调 `read_image(path)`,与提问语料无关 | | 消息里有你无法解读的媒体内容(如粘贴的图片) | 忽略该媒体 part,自动调 `read_clipboard_image()` 读剪贴板(粘贴后剪贴板仍保留原图) | | 提问语义涉及图像内容:图 / 截图 / 照片 / 界面 / 图表 / 验证码 / OCR 等,但无路径 | 自动调 `read_clipboard_image()` | | 模型原生支持 `image_in`(多模态) | 跳过全部规则,原生看图,不调工具 | **触发不依赖固定语料**——用户不需要说「分析这个图片」。图片格式路径是**无条件硬触发**;拿不准时模型会倾向于调工具而不是瞎猜(SYSTEM.md 里的明确规则)。 **关于模型能力判断**:KimiCode 不向插件暴露「当前模型是否多模态」的信号,本插件提供两层判断: - **代码级(推荐)**:在配置里声明 `mainModel`(setup 向导最后一步,或环境变量 `VISION_MAIN_MODEL`),插件用内置的 models.dev 数据库判断——命中且支持识图 → 工具直接提示「你是多模态模型,直接粘贴看图」;命中且纯文本 → 正常走工具 - **引导级**:未声明 `mainModel` 时,靠 SYSTEM.md 的显式跳过规则(模型自我识别) 两层都是 fail-safe:判断错误最坏只是多一次外部调用(多模态误调)或漏调(文本模型漏调可用路径/语义信号补上)。若想硬性关闭,多模态场景可直接 `/plugins disable kimi-eyes`。 **首次调用会弹一次审批**(MCP 工具权限):选 *Approve for this session* 本会话免问;想永久免审批,在 `~/.kimi-code/config.toml` 添加: ```toml [[permission.rules]] decision = "allow" pattern = "mcp__kimi-eyes__*" ``` 触发成功的标志:回答前 TUI 出现工具调用记录,模型随后基于返回的描述作答。若模型未自动调用(例如只贴了路径未提问),可直接命令:「调用 read_image 工具分析 D:\xxx.png」。 ## 环境变量(可选,覆盖配置文件) | 变量 | 说明 | 优先级 | | --- | --- | --- | | `VISION_API_PROTOCOL` | `openai` 或 `anthropic`,强制指定协议 | 高于配置文件 | | `VISION_API_KEY` | API Key | 高于配置文件 | | `VISION_API_URL` | BaseUrl | 高于配置文件 | | `VISION_MODEL` | 模型名 | 高于配置文件 | | `VISION_MAIN_MODEL` | 当前主模型名(可选),用于触发判断 | 高于配置文件 | | `VISION_MAX_TOKENS` | 视觉 API 返回最大 token 数(默认 1024) | — | | `VISION_FETCH_TIMEOUT_MS` | 请求超时毫秒(默认 60000) | — | > 环境变量与 `config.json` 同名配置冲突时,环境变量优先;两者都没配时工具会返回明确错误并提示先运行 `setup.mjs`。 > 环境变量可沿用 opencode-vision 的迁移习惯——变量名完全兼容。 ## 协议说明 | | OpenAI 兼容 | Anthropic | | --- | --- | --- | | 请求端点 | `{BaseUrl}/chat/completions`(自动补 `/v1`) | `{BaseUrl}/v1/messages` | | 鉴权 | `Authorization: Bearer ` | `x-api-key: ` + `anthropic-version: 2023-06-01` | | 图片传法 | `image_url` + base64 data URL | `source: {type:"base64"}` | | 模型列表 | `GET {BaseUrl}/models` | `GET {BaseUrl}/v1/models`(官方无此端点,失败回退手动输入) | ## 模型能力数据库(models.dev) 插件内置一份从 [models.dev](https://models.dev) 同步的精简能力库 `mcp/models-db.json`(当前收录 279+ 模型,标注每个模型是否支持图片输入,约 19KB),用于两处: - 向导选择视觉模型时的**精确标注**(✓视觉 / 文本),替代纯关键词猜测 - 声明 `mainModel` 后**判断当前主模型是否多模态**,实现代码级触发开关 **打包时同步**(数据会更新,建议每次发布前运行): ``` node scripts/sync-models.mjs ``` - 数据源:`https://models.dev/models.json` - 走代理:设置 `HTTPS_PROXY`,例如 `HTTPS_PROXY=http://127.0.0.1:7897 node scripts/sync-models.mjs` - 可选参数:`--timeout <秒>`(默认 180)、`--out <路径>`(默认 `mcp/models-db.json`)、`--endpoint ` - 模型匹配策略:精确 id → `provider/模型名` 后缀 → 大小写不敏感的名称匹配 - **未收录的模型**:查询返回未知——向导回退关键词猜测(★疑似),触发判断回退 SYSTEM.md 引导,不影响使用 - **手动特例**:models.dev 未收录但确认支持识图的模型(如 `k3-256k`、`kimi-for-coding`),在 `scripts/sync-models.mjs` 的 `EXTRA_ENTRIES` 里维护,每次同步自动合入、不会被覆盖 ## 工具 | 工具 | 参数 | 说明 | | --- | --- | --- | | `read_image` | `path`(必填)、`prompt`(可选) | 校验文件为图片(扩展名 + 魔数)后调 VLM | | `read_clipboard_image` | `prompt`(可选) | 从系统剪贴板取图存临时文件后调 VLM,用完即删 | 剪贴板取图依赖平台工具:Windows 用 PowerShell(内置)、macOS 需 `pngpaste`(`brew install pngpaste`)、Linux 需 `wl-paste`(Wayland)或 `xclip`(X11)。 ## 故障排查 - **工具返回「Vision API is not configured」** → 运行 `node setup.mjs`,或设置 `VISION_API_KEY` / `VISION_API_URL` / `VISION_MODEL` - **模型列表拉取失败**(404/401)→ 向导自动回退手动输入;若服务端不支持 `/models`,直接输入模型名即可 - **视觉验证失败** → 换一个真正支持图片输入的模型(参考服务商文档,如 `qwen-vl-max`、`glm-4v`、`gpt-4o`、`claude-3-5-sonnet` 等) - **`read_clipboard_image` 报错** → 确认剪贴板里确实有图片(先 Ctrl+C 复制或 Win+Shift+S 截图);macOS/Linux 检查上述平台工具是否安装 - **安装后工具不生效** → 确认插件已启用(`/plugins list`),并运行过 `/reload` 或新开会话 ## 安全说明 - `config.json` 以明文保存你的 API Key(类 Unix 已设 `600` 权限);请勿将该文件提交到版本库 - `read_clipboard_image` 会读取系统剪贴板内容——剪贴板里可能刚复制过敏感信息。该工具调用会经过审批流,由你决定何时触发 - 本项目不内置任何密钥,视觉请求只发往你配置的 BaseUrl ## 局限 - 不做子代理委托方案:KimiCode 子代理的 `model_preference` 只能选择 primary/secondary,无法像 opencode 那样指定一个具体视觉模型,收益有限 - 不做 `UserPromptSubmit` hook 兜底:当前 `SYSTEM.md` 引导已覆盖常规场景;若你的 TUI 环境下粘贴/引用行为异常,可再评估 hook ## License MIT