本文是系列博文的第二篇,将带你从零开始在Windows上部署Ollama + DeepSeek模型,并通过自建Bridge打通WSL到Windows的AI调用链路。所有步骤均经过真实环境验证。
一、环境架构确认
本系列采用 Windows 宿主 + WSL子系统 的混合架构。在开始之前,先理清一个关键决策:为什么把Ollama装在Windows而非WSL?
选择Windows端Ollama的理由:
- GPU驱动支持更成熟:Ollama在Windows上原生支持NVIDIA和AMD Radeon GPU,驱动配置比WSL更直观
- 开机自启便利:作为Windows应用,可直接放入Startup文件夹,无需额外配置systemd
- 资源管理直观:通过任务管理器即可监控内存和GPU占用
最终架构图:
WSL应用层
│
▼
Windows Bridge(:18080)
│ OpenAI兼容格式
▼
Windows Ollama(:11434)
│
▼
deepseek-r1:7b
WSL中的OpenCode通过Bridge调用Windows上的Ollama,而不是直连Ollama的11434端口------这是为了统一API格式、便于后续接入更多应用。
二、Windows端Ollama安装与模型下载
2.1 下载与安装
访问Ollama官网下载Windows安装包(ollama-windows-amd64.exe),双击运行即可。默认安装在用户目录下,若需自定义路径,可使用以下命令启动安装程序:
OllamaSetup.exe /DIR="F:\Ollama"
本文实际环境安装路径为 F:\Ollama\ollama.exe。
验证安装:
where.exe ollama
# 输出: F:\Ollama\ollama.exe
Get-Process ollama
# 确认进程存在
2.2 配置开机自启动
将Ollama添加到Windows Startup文件夹,确保每次开机自动运行:
# 查看启动项
Get-CimInstance Win32_Process -Filter "Name='ollama.exe'"
# 确认: "F:\Ollama\ollama.exe" serve
Ollama默认API地址为 http://localhost:11434,无需认证即可访问。
2.3 拉取并运行DeepSeek R1模型
# 拉取模型
ollama pull deepseek-r1:7b
# 验证模型已加载
ollama ps
# 输出示例:
# NAME ID SIZE
# deepseek-r1:7b 755ced02ce7b 5.1 GB
# PROCESSOR CONTEXT
# 100% CPU 4096
踩坑记录:PowerShell下curl的JSON转义问题
在PowerShell中使用 curl.exe(而非 curl 别名)时,JSON转义容易出错:
# 错误示范
curl.exe -d "{\"model\":\"deepseek-r1:7b\"...}" http://localhost:11434/api/generate
# 正确做法:直接使用Invoke-WebRequest
Invoke-WebRequest -Method POST -Body '{"model":"deepseek-r1:7b", "prompt":"测试", "stream": false}' -uri http://localhost:11434/api/generate
2.4 验证Ollama API
通过原生API验证模型可用:
body = @{model="deepseek-r1:7b"; prompt="只回答:LOCAL OK"; stream=false} | ConvertTo-Json
Invoke-RestMethod -Method POST -Body $body -ContentType "application/json" -Uri "http://localhost:11434/api/generate"
成功返回包含 "response": "LOCAL OK" 的JSON结果。这是整个链路打通的第一个里程碑。
三、构建Cursor Ollama Bridge(模型网关)
3.1 为什么需要Bridge?
Cursor等AI工具期望的是OpenAI兼容的API格式(/v1/chat/completions、/v1/models),而Ollama原生API格式不同。Bridge的作用就是将Ollama API封装为OpenAI格式,让任何支持OpenAI接口的工具都能调用本地Ollama模型。
3.2 实现:编写bridge.py
在 F:\Ollama\cursor-bridge\ 目录下创建 bridge.py(根据实际场景需要优化):
from flask import Flask, request, jsonify
import requests
import json
app = Flask(name)
OLLAMA_URL = "http://127.0.0.1:11434"
API_KEY = "cursor-local-2026" # 自定义认证密钥
@app.route('/v1/models', methods='GET')
def list_models():
"""返回OpenAI格式的模型列表"""
resp = requests.get(f"{OLLAMA_URL}/api/tags")
models = resp.json().get('models', \[\])
return jsonify({
"object": "list",
"data": {"id": m\['name', "object": "model", "owned_by": "library"} for m in models]
})
@app.route('/v1/chat/completions', methods='POST')
def chat_completions():
"""代理Chat Completion请求"""
# 验证API Key
if request.headers.get('Authorization') != f'Bearer {API_KEY}':
return jsonify({"error": "Unauthorized"}), 401
data = request.json
# 转换OpenAI格式 -> Ollama格式
ollama_payload = {
"model": data.get('model'),
"messages": data.get('messages'),
"stream": data.get('stream', False)
}
resp = requests.post(f"{OLLAMA_URL}/api/chat", json=ollama_payload)
return jsonify(resp.json())
if name == 'main':
app.run(host='127.0.0.1', port=18080)
启动Bridge:
python F:\Ollama\cursor-bridge\bridge.py
# 输出:
# ======================================
# Cursor Ollama Bridge
# Listen: http://127.0.0.1:18080
# Ollama: http://127.0.0.1:11434
# API Key: cursor-local-2026
# ======================================
3.3 验证Bridge接口
# 验证 /v1/models
Invoke-RestMethod -Uri "http://127.0.0.1:18080/v1/models" -Headers @{Authorization="Bearer cursor-local-2026"}
# 返回: {"object":"list","data":{"id":"deepseek-r1:7b","object":"model","owned_by":"library"}}
# 验证 /v1/chat/completions
$body = @{model="deepseek-r1:7b"; messages=@(@{role="user"; content="测试"})} | ConvertTo-Json
Invoke-RestMethod -Method POST -Uri "http://127.0.0.1:18080/v1/chat/completions" -Body $body -ContentType "application/json" -Headers @{Authorization="Bearer cursor-local-2026"}
# 返回: 200 OK
Bridge已成功将Ollama暴露为OpenAI兼容API。
四、打通WSL到Windows的网络通路
4.1 关键发现
WSL2默认使用NAT网络模式,WSL内部无法通过 127.0.0.1 访问Windows宿主机上的服务。需要找到WSL的Windows网关IP:
# 在WSL中执行
ip route | grep default
# 输出: default via 172.25.48.1 dev eth0
这里的 172.25.48.1 就是Windows宿主在WSL网络中的网关地址。
4.2 验证WSL访问Windows Bridge
在WSL中执行:
curl http://172.25.48.1:18080/v1/models \
-H 'Authorization: Bearer cursor-local-2026'
# 成功返回模型列表JSON
注意:如果上述方式不通,可尝试在Windows中配置端口转发:
# 管理员PowerShell
netsh interface portproxy add v4tov4 listenport=18080 listenaddress=0.0.0.0 connectport=18080 connectaddress=127.0.0.1
或配置WSL2为镜像网络模式(编辑 %USERPROFILE%\.wslconfig):
wsl2
networkingMode=mirrored
五、WSL端OpenCode CLI安装与配置
5.1 安装方式与踩坑
官方推荐的一键安装脚本遇到网络问题(GitHub release下载链路缓慢):
curl -fsSL https://opencode.ai/install | bash
# 长时间无响应
解决方案:手动下载 v1.18.18 的 opencode-linux-x64.tar.gz,手工安装:
# 解压
tar -xzf opencode-linux-x64.tar.gz -C /tmp/opencode-install/
# 验证
/tmp/opencode-install/opencode --version
# 输出: 1.18.18
# 安装到系统PATH
sudo install -m 755 /tmp/opencode-install/opencode /usr/local/bin/opencode
# 验证
which opencode
# 输出: /usr/local/bin/opencode
opencode --version
# 输出: 1.18.18
OpenCode官方推荐Windows用户通过WSL运行,这也是本系列采用的方式。
5.2 配置OpenCode使用Bridge
创建配置文件 ~/.config/opencode/opencode.jsonc:
{
"$schema": "https://opencode.ai/schema/config.json",
"providers": {
"ollama-bridge": {
"type": "openai",
"apiBase": "http://172.25.48.1:18080/v1",
"apiKey": "cursor-local-2026",
"models": "deepseek-r1:7b"
}
}
}
OpenCode本身支持在配置文件中自定义兼容OpenAI格式的Provider。这里将Provider命名为 ollama-bridge,指向Windows上的Bridge服务。
5.3 模型验证:链路正式打通
opencode run --model ollama-bridge/deepseek-r1:7b "只回答:OPENCODE LOCAL OK"
# 输出: OPENCODE LOCAL OK
这是整个工程最重要的验证结果。完整链路:
OpenCode(WSL)
↓
ollama-bridge Provider
↓
172.25.48.1:18080(Windows Bridge)
↓
127.0.0.1:11434(Windows Ollama)
↓
deepseek-r1:7b
六、模块小结与实战产出
本文核心要点回顾:
- 架构决策:Ollama安装在Windows端,利用GPU支持和开机自启便利;WSL中的OpenCode通过Bridge调用模型
- Ollama部署:安装、开机自启、拉取deepseek-r1:7b、验证原生API
- Bridge构建:用Flask编写代理,将Ollama封装为OpenAI兼容格式,监听:18080
- 网络打通:WSL通过网关IP(如172.25.48.1)访问Windows服务
- OpenCode配置:手动安装CLI,配置opencode.jsonc指向Bridge
实战产出:
| 产出 | 访问地址 | 说明 |
|---|---|---|
| 本地大模型API网关 | http://172.25.48.1:18080/v1 | OpenAI兼容,可供任何工具调用 |
| OpenCode CLI | /usr/local/bin/opencode | WSL中可调用本地DeepSeek模型 |
| 验证命令 | opencode run --model ollama-bridge/deepseek-r1:7b "测试" | 确认链路完全打通 |
核心配置文件清单:
- Windows Bridge:F:\Ollama\cursor-bridge\bridge.py
- OpenCode配置:~/.config/opencode/opencode.jsonc
- Ollama模型存储:可通过 OLLAMA_MODELS 环境变量自定义路径
参考资源:
- Ollama Windows文档:docs.ollama.com/windows-1
- OpenCode安装指南:opencode.ai-2
- OpenCode配置文件参考:opencode.ai/schema/config.json-10