用途:当会话模型看不到图片(盲,如 DeepSeek)时,把图片转成文本,让模型基于文本继续回答,相当于给模型补上一只眼睛。在线服务不可用(额度耗尽、断网、未配 mytokens)时,脚本自动回退到本地 Qwen3-VL(MLX,模型在 HuggingFace cache 里,离线可用),调用方无需区分。
图片来源处理:prompt 里的图片路径直接跑 qwen_vision.py 转文本;粘贴进终端的图([Image #N])若已装 hook,描述已注入可直接用,未装则请用户把图存成文件给路径。拿不准模型是否盲时,用 check_vision.py 判定:VISION 表示能看图无需本 skill;NO_VISION_SILENT 表示盲,用本 skill;NO_VISION_HARD 表示图会让整轮失败,粘贴的图救不了,只能走路径。
使用方式:确认消息里有图且模型是盲的,然后运行自包含脚本(从任意 cwd 都能跑):uv run --no-project ~/.claude/skills/claude-qwen-vision/scripts/qwen_vision.py /path/to/image.png [更多路径...] --prompt "<用户真正想问的问题>"。多张图一次传入,输出按 图1: 图2: 分段。成功时 stdout 一定有内容;qwen 返回空文本、响应被截断、文件或网络出错,脚本都向 stderr 报错并以非零码退出。在线不可用时自动回退本地,默认用 30b,--local-model 8b 换更快的 8b,--no-local-fallback 关闭回退。最后以 qwen 的文本输出为图片真实内容,直接完整回答用户问题。
脚本:qwen_vision.py(图片路径或 --base64 → qwen3.8-max → 文本,--account paygo 切换账号,在线不可用自动回退本地);qwen_vision_local.py(离线回退,本地 Qwen3-VL MLX,--model 30b|8b);check_vision.py(判定模型是否盲);user_prompt_hook.py(UserPromptSubmit hook,粘贴的图自动转文本注入);install-hook.sh(把 hook 合并进 settings.json,幂等,改前备份)。
本地模型:默认 30b(mlx-community/Qwen3-VL-30B-A3B-Instruct-4bit,质量最好),8b(mlx-community/Qwen3-VL-8B-Instruct-8bit,更省内存);模型缺失时自动退到另一个,两个都没有则明确报错并给出 repo。
限制:NO_VISION_HARD 的模型粘贴图会让整轮 400 失败,只能走文件路径;CLAUDE_CONFIG_DIR 指向别处的会话,skill 和 hook 要分别装;凭证一律运行时从 mytokens 读取,脚本里不存任何 token。