进阶实战

给 Claude Code 装上 "眼睛和耳朵"

看完图片、听懂语音、还能随时切换模型——用 Qwen 多模态 API + 模型路由代理,把你的 CLI 变成全能 AI 工作站。

1 搞懂架构 2 拿 Qwen Key 3 路由+自启 4 配置切换 5 实战体验
1
先搞懂:多模态是什么?
一句话看懂整个架构
≈ 2 分钟

"多模态"就是说 AI 不光能看文字,还能看图片、听语音、分析视频。不同的模型擅长不同的事情,我们可以让它们分工合作

🎯

简单来说:DeepSeek 擅长写代码和推理,Qwen-VL 能看懂图片,Qwen-Omni 能听能说。我们的目标就是一个命令切换,让它们各展所长。

架构长这样

🤖

核心亮点:全自动!路由代理会自动检测你有没有发图片——发了就自动走 Qwen-VL(多模态),没发就走 DeepSeek(文本)。你完全不需要手动切,就像现在你发图给我、我自动识别一样。

Claude Code
你正在用的界面
模型路由代理
根据模型名自动分配
DeepSeek
写代码 · 推理
Qwen-VL
看图片 · 识图
Qwen-Omni
听 · 说 · 看视频

核心思路:在 Claude Code 和真正的 AI 模型之间加一个"路由器",它会根据你用的模型名,自动把请求发到对应的后端。你只需要记住几条切换命令就行。

▼ 准备好了就继续 ▼
2
获取 Qwen API Key
去阿里云通义千问拿一把新钥匙
≈ 8 分钟

跟之前 DeepSeek 类似,你需要去阿里云的百炼平台(DashScope)注册,获取 Qwen 系列的 API Key。

① 注册阿里云百炼

去阿里云百炼平台,用手机号注册或登录。新用户有免费额度。

🖼 登录后,在左侧菜单找到「API-KEY 管理」,点击「创建 API-Key」。把生成的那串复制保存好。
💰
费用:Qwen-VL-Plus 和 Qwen-Omni 都有免费额度,日常使用基本够用。用完后按量计费,价格很低。
💡

小提示:不需要另外设置 Claude Code 的环境变量——API Key 是写在路由代理配置文件里的,后面一步会说明。这一步你只需要把 Key 复制下来保存好就行。

▼ 继续往下 ▼
3
部署模型路由代理
在电脑上跑一个"交通指挥员"
≈ 5 分钟

模型路由代理是一个很小的程序,负责把请求"分发"到不同的 AI 模型上。你需要创建一个文件并启动它。

① 创建路由文件

打开命令提示符(CMD),执行以下命令:

命令提示符
mkdir %USERPROFILE%\.claude 2>nul || rem 已存在 && cat > ~/.claude/model-router.js << 'ROUTEREOF'
ℹ️
执行上面那条命令后,终端会进入"等待输入"状态,光标在闪烁。接下来执行下面的命令把它粘贴进去。

复制下面这整段代码,粘贴到终端(⌘VCtrl+V),然后按回车:

粘贴到命令提示符
const http = require('http'); const https = require('https'); const PORT = 8123; const BACKENDS = { deepseek: { baseUrl: 'https://api.deepseek.com/anthropic', apiKey: '你的DeepSeekKey', match: (m) => m.toLowerCase().includes('deepseek'), }, qwen: { baseUrl: 'https://dashscope.aliyuncs.com/apps/anthropic', apiKey: '你的阿里云百炼Key', match: (m) => { const n = m.toLowerCase(); return n.includes('qwen') || n.includes('qwq'); }, }, }; let forceBackend = null; let forceModel = null; // 智能路由:检测消息中是否有图片,自动走多模态 function hasImage(body) { try { const parsed = JSON.parse(body); const messages = parsed.messages || []; for (const msg of messages) { const c = msg.content; if (Array.isArray(c)) { for (const block of c) { if (block.type === 'image' || block.type === 'image_url') return true; } } } } catch (_) {} return false; } // 智能路由 + 手动切换双重支持 function resolveBackend(model, body) { if (forceBackend) return forceBackend; // 自动检测图片 if (body && hasImage(body)) { console.log(' 📸 检测到图片 → 自动路由到 Qwen-VL'); return BACKENDS.qwen; } for (const b of Object.values(BACKENDS)) { if (b.match(model)) return b; } return BACKENDS.deepseek; } const server = http.createServer((req, res) => { const url = new URL(req.url, \`http://\${req.headers.host}\`); const params = url.searchParams; // 健康检查 if (url.pathname === '/health' && req.method === 'GET') { res.writeHead(200, { 'Content-Type': 'application/json' }); return res.end(JSON.stringify({ status: 'ok' })); } // 切换后端 if (url.pathname === '/switch' && req.method === 'POST') { const backend = params.get('backend'); if (backend === 'auto') { forceBackend = null; forceModel = null; return res.end(JSON.stringify({ status: 'ok', mode: 'auto' })); } if (BACKENDS[backend]) { forceBackend = BACKENDS[backend]; forceModel = params.get('model') || null; return res.end(JSON.stringify({ status: 'ok', backend, model: forceModel })); } return res.end(JSON.stringify({ error: \`可用后端: \${Object.keys(BACKENDS).join(', ')} 或 auto\` })); } // 代理请求 if (!url.pathname.endsWith('/v1/messages')) { res.writeHead(404); return res.end('Not Found'); } let body = ''; req.on('data', c => body += c); req.on('end', () => { try { const parsed = JSON.parse(body); const model = parsed.model || ''; const backend = resolveBackend(model, body); const target = \`\${backend.baseUrl}/v1/messages\`; const finalModel = forceModel || model; const u = new URL(target); const opts = { hostname: u.hostname, port: u.port || 443, path: u.pathname, method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': backend.apiKey, 'Content-Length': Buffer.byteLength(body), }, }; const proxy = https.request(opts, (pr) => { const h = { ...pr.headers }; delete h['transfer-encoding']; delete h['connection']; delete h['content-encoding']; res.writeHead(pr.statusCode, h); pr.pipe(res); }); proxy.on('error', e => { res.writeHead(502, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ error: { message: e.message } })); }); proxy.write(body); proxy.end(); } catch (e) { res.writeHead(400); res.end(JSON.stringify({ error: { message: 'JSON 格式错误' } })); } }); }); server.listen(PORT, '127.0.0.1', () => { console.log(\`\\n 🚀 模型路由代理启动 → http://127.0.0.1:\${PORT}\`); console.log(' 📡 后端: deepseek, qwen'); console.log(' ❌ 按 Ctrl+C 停止\\n'); });
✏️
重要:代码中 你的DeepSeekKey你的阿里云百炼Key 要换成你自己的真实 Key。可以先粘贴后再去编辑这个文件。

粘贴完按回车后,再执行下面这行命令收尾(输入 ROUTEREOF 结束写入):

命令提示符
ROUTEREOF
💡
更简单的方法:你也可以直接用记事本/文本编辑新建一个文件,保存为 ~/.claude/model-router.js,把上面那段代码复制进去。然后编辑你的 Key 就行。

② 填入你的 API Key

打开文件替换其中的 Key:

命令提示符 — 编辑文件
notepad %USERPROFILE%\.claude\model-router.js

用键盘方向键移动光标,找到 你的DeepSeekKey你的阿里云百炼Key,删掉它们改成你真正的 Key。
改完后按 Ctrl+X → 按 Y → 按 回车 保存退出。

③ 启动路由代理

先手动启动一次,看看能不能正常工作:

命令提示符 — 启动
node "%USERPROFILE%\.claude\model-router.js"

看到终端显示 🚀 模型路由代理启动 就说明成功了。
Ctrl+C 停止它,然后往下看——我们来设置开机自启。

♻️

不用每次手动启动!下面一步教会你设置开机自动运行,以后每次开机代理自己就启动了,完全不用管。

④ 设置开机自启(一劳永逸)

Windows 用 开机启动文件夹 实现。创建一个批处理脚本放进去即可。

在命令提示符里执行以下命令创建开机自启脚本:

命令提示符 — 创建自启脚本
powershell -Command "$s=(New-Object -COM WScript.Shell).CreateShortcut('%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\model-router.lnk');$s.TargetPath='node.exe';$s.Arguments='%USERPROFILE%\.claude\model-router.js';$s.WindowStyle=7;$s.Save()"

这条命令会在开机启动文件夹创建一个快捷方式,让 Node.js 在后台静默运行路由代理。

然后现在先手动启动一次:

命令提示符 — 立即启动
start /b node "%USERPROFILE%\.claude\model-router.js"

搞定!以后每次开机、重启,路由代理都会自动在后台悄悄运行。可以关掉这个命令提示符窗口了。用 call %USERPROFILE%\.claude\switch-model.bat status 随时检查运行状态。

▼ 快完成了! ▼
4
配置切换脚本
一键切换,想用哪个用哪个
≈ 3 分钟

路由代理已经跑起来了,现在创建一个简单的切换脚本,让你随时切换后端。

下载/创建切换脚本

执行以下命令创建切换脚本:

命令提示符
notepad %USERPROFILE%\.claude\switch-model.bat

复制下面整段代码,粘贴进去(⌘V / Ctrl+V),然后按 Ctrl+XY回车 保存:

switch-model.sh
@echo off set PROXY_URL=http://127.0.0.1:8123 check_proxy() { if ! curl -sf "$PROXY_URL/health" > /dev/null 2>&1; then echo "⚠️ 代理未运行,请先执行: node "%USERPROFILE%\.claude\model-router.js"" return 1 fi } case "$1" in deepseek) check_proxy && curl -s -X POST "$PROXY_URL/switch?backend=deepseek" echo "" echo "💡 已切换 DeepSeek(文本)" ;; qwen-vl) check_proxy && curl -s -X POST "$PROXY_URL/switch?backend=qwen&model=qwen3-vl-plus" echo "" echo "💡 已切换 Qwen-VL(支持识图)" ;; qwen-omni) check_proxy && curl -s -X POST "$PROXY_URL/switch?backend=qwen&model=qwen3.5-omni-plus" echo "" echo "💡 已切换 Qwen-Omni(多模态,支持语音+视频)" ;; auto) check_proxy && curl -s -X POST "$PROXY_URL/switch?backend=auto" echo "" echo "💡 已切换自动模式(根据模型名路由)" ;; status) curl -s "$PROXY_URL/status" 2>/dev/null | python3 -m json.tool 2>/dev/null \ || echo "代理未运行" ;; *) echo "用法: bash %USERPROFILE%\.claude\switch-model.bat {deepseek|qwen-vl|qwen-omni|auto|status}" ;; esac

给脚本添加执行权限:

命令提示符
rem Windows 不需要 chmod,可直接运行

测试一下

在新终端窗口执行以下命令验证:

命令提示符
bash %USERPROFILE%\.claude\switch-model.bat status

如果显示后端信息和当前模式,说明一切正常!现在你可以随时切换模型了。

▼ 最后一步了! ▼
5
实战:体验多模态
让 AI 看你的截图、桌面和照片
≈ 5 分钟

路由部署好了、切换脚本有了。但最爽的是——你什么都不用切,直接发图,路由代理会自动识别并走 Qwen-VL。

🤖
自动 vs 手动:
自动(推荐):直接发图给 Claude Code,路由自动判断走 Qwen-VL
手动:用切换命令强制指定模型(适合你知道自己想要什么模型的情况)

简单说——就像你现在跟我聊天一样,发图我就自动识别,不用你先说“切到看图模式”。

① 默认就行——直接发图

保持默认的 deepseek 模式,路由代理会自动检测你发的内容中是否有图片。有图自动走 Qwen-VL,纯文本走 DeepSeek。

🤖 自动路由:你发图 → 代理检测到图片 → 自动转发给 Qwen-VL → 识别结果回来。全程无需手动切换。

② 如果你想手动指定

某些场景下你可能想强制用某个模型(比如知道接下来都要看图):

在终端执行:

命令提示符 — 切换模型
bash %USERPROFILE%\.claude\switch-model.bat qwen-vl
💡 切换后终端会提示 "已切换 Qwen-VL(支持识图)"。这个切换是立即生效的,不需要重启 Claude Code。

③ 启动 Claude Code 发图

启动 Claude Code:

命令提示符 — 启动
claude

启动后,你可以直接拖拽一张图片到终端窗口,Claude Code 会识别并询问你要做什么。

> 把图片文件从桌面拖到这里...

📎 [图片 attachment: screenshot.png]

💬 输入你对图片的提问,比如:
"这张截图里有什么问题?"
"帮我描述这张图的配色方案"
"这张 UI 设计图你觉得怎么样?"
🎯
实战场景举例:
• 截个网页 → "帮我写一个跟这个一样的页面"
• 拍个设计稿 → "帮我把这个设计用代码实现"
• 截个报错 → "这个错误什么意思?怎么修"
• 拍个菜单/文档 → "帮我翻译/总结一下"

④ 切回 DeepSeek 写代码

看完图了想切回写代码模式:

命令提示符 — 切回
bash %USERPROFILE%\.claude\switch-model.bat deepseek
🔄

切换不影响当前对话:在 Claude Code 对话中切换模型,不需要退出重进,直接继续聊就行。模型会实时切换。

💬 还能直接跟 Claude Code 说"换模型"

就像你现在跟我说话一样,在 Claude Code 的对话里,你可以直接打字告诉它你想换模型,比如:

💬 你:换成能看图的那个模型
🤖 Claude Code:正在切换到 Qwen-VL……

💬 你:切回 DeepSeek 写代码
🤖 Claude Code:已切换回 DeepSeek

💬 你:用 Qwen 最强的那个
🤖 Claude Code:正在切换到 Qwen3.7-Max……

跟聊天一样自然。Claude Code 会根据你的要求自动执行切换命令,你不需要记住命令语法。就像你现在跟我说"切到qwen-vl"一样。

📖 Qwen 模型大全 · 选哪个?什么时候用?

路由指令/模型名能力适合场景
📝 文本模型(写代码、聊天、推理)
qwen3.7-max最强推理+代码复杂编程、数学推理、深度分析
qwen3.7-plus多模态+推理全能日常使用,兼顾文本和图片(推荐默认)
deepseek(切换脚本)代码专家写代码、调试(教程默认)
qwen3.6-flash快速便宜简单问答、翻译、摘要,速度快
qwq-plus深度推理数学题、逻辑题、需要"想很久"的问题
🖼️ 多模态·看图模型
qwen-vl(切换脚本)看图片、读截图发图让它看(自动路由检测到图片时也会走这个)
qwen3.7-plus最新多模态 Agent能看能推理,取代 qwen-vl 的新选择
qwen-vl-ocr文字识别专精提取图片中的文字、扫描文档、翻译菜单
🎤 语音·多模态模型
qwen-omni(切换脚本)听、说、看、写语音对话、视频分析、全能多模态任务
qwen3-omni-flash快速语音多模态实时语音交互,速度快延迟低
🤖

最推荐的日常搭配:默认 DeepSeek 写代码,需要看图时说"切到qwen"——代理会自动检测图片走多模态。你也可以直接上 qwen3.7-plus,一个模型搞定文本+图片+推理,省去切换的麻烦。

🎉 恭喜你!

你已经在 Claude Code 上部署了多模态工作流。
现在你的 AI 助手能自动识别你发的图片,也能随时手动切模型。
国内完全可用,一个终端窗口搞定一切。

← 返回进阶选择页 💻 基础篇安装