1. 为什么要在 WSL 里折腾 openclaw + ollama 这条链路
openclaw 是一个把大模型能力封装成可编排 Agent 的开源工具,它能通过 gateway 把本地模型、远程模型、工具调用统一到一个控制台里。ollama 则是目前最省事的本地模型运行方案,一条命令就能把 qwen3、deepseek-r1 这类模型跑起来。把两者放在 WSL 里跑,好处是 Linux 环境对 Node、Python、各类依赖的兼容性明显好于 Windows 原生,同时又能复用 Windows 上已经装好的 ollama 模型文件,不用重复下载几十 GB 的权重。
这套组合适合谁?适合想在自己机器上跑通「Agent 调用本地模型」最小闭环的开发者,尤其是已经装了 WSL、装了 ollama,但卡在「openclaw 发现不了本地模型」或者「gateway 起来了但 dashboard 打不开」这两个坑上的人。我自己在配这套东西的时候,前前后后重启了七八次 WSL,才把网络链路和 token 认证这两块理顺。
这篇记录聚焦三件事:一是给出可复制的 config.toml / settings.json 骨架,二是说明 TaoToken 统一 Key 与 API 通道应该接在哪个位置,三是把 gateway 启动后验证本地模型连通性的具体命令和预期返回写清楚。目标不是讲原理,而是让你照着敲能跑通。
需要先说明一点:本地 ollama 模型和 TaoToken 的 API 通道并不冲突。本地模型负责离线、低延迟的日常对话,TaoToken 负责在需要更强模型或者需要统一计费、统一 Key 管理时做补充。两者可以在同一个 openclaw 配置里共存,后面配置章节会给出具体写法。
2. 前置准备:WSL、ollama、openclaw 与 TaoToken 的接入位置
2.1 基础环境确认
开始之前,先在 WSL 里确认三样东西都在:
# 确认 WSL 版本,建议 WSL2 wsl --version # 确认 ollama 在 Windows 侧已安装并运行 # 在 Windows PowerShell 中执行 ollama list # 确认 Node 版本,openclaw 依赖 Node 18+ node -v npm -v如果ollama list能列出 qwen3:8b、deepseek-r1:1.5b 这类模型,说明 Windows 侧 ollama 已经就绪。接下来要解决的是 WSL 能不能访问到它。
2.2 TaoToken 统一 Key 的接入位置
TaoToken 在这里扮演的角色是「统一 API 通道 + 统一 Key 管理」。openclaw 的配置文件里通常有一个 provider 段落,本地 ollama 是一个 provider,TaoToken 是另一个 provider。TaoToken 的 API 地址是https://taotoken.net/api,Key 在控制台的 API Keys 页面生成。
接入位置有两个:
第一个位置是 openclaw 的config.toml,在[providers]段里新增一个 taotoken provider,把 base_url 指向https://taotoken.net/api,api_key 填你生成的 Key。
第二个位置是环境变量。openclaw 支持从环境变量读取 provider 凭据,你可以把TAOTOKEN_API_KEY写进~/.bashrc,这样配置文件里就不用硬编码 Key。
如果你还没生成 Key,可以去 TaoToken 控制台的 API Keys 页面创建:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
2.3 目录结构约定
为了避免后面路径混乱,约定一下本文用到的路径:
~/.openclaw/ # openclaw 配置根目录 ~/.openclaw/config.toml # 主配置 ~/.openclaw/settings.json # 运行时设置 ~/.openclaw/logs/ # 日志目录如果你的 openclaw 安装后没有自动生成这些目录,手动建一下:
mkdir -p ~/.openclaw/logs3. 可复制配置:config.toml 与 settings.json 骨架
3.1 config.toml 完整骨架
下面这份配置同时包含本地 ollama provider 和 TaoToken provider,你可以直接复制后改 Key:
# ~/.openclaw/config.toml [gateway] port = 18789 host = "127.0.0.1" [gateway.auth] # token 建议用 openclaw config get gateway.auth.token 生成后回填 token = "" [agent] # 默认模型指向本地 ollama default_model = "ollama/qwen3:8b" # 备用模型走 TaoToken 通道 fallback_model = "taotoken/claude-sonnet" [providers.ollama] type = "ollama" base_url = "http://localhost:11434" api_key = "ollama-local" # 占位,ollama 本身不校验 models = ["qwen3:8b", "deepseek-r1:1.5b"] [providers.taotoken] type = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" models = ["claude-sonnet", "gpt-4o"] [skills] enabled = [] [channels] enabled = []几个关键点解释一下。[providers.ollama]里的base_url用http://localhost:11434,前提是你已经按后面章节把 WSL 网络模式改成 mirrored,否则这里要换成 Windows 宿主机的实际 IP。[providers.taotoken]的api_key用了${TAOTOKEN_API_KEY}这种环境变量引用写法,避免把 Key 明文写进配置文件。
3.2 settings.json 骨架
settings.json 主要管运行时行为,和 config.toml 分工不同:
{ "runtime": { "logLevel": "info", "logDir": "~/.openclaw/logs", "requestTimeoutMs": 120000 }, "model": { "default": "ollama/qwen3:8b", "temperature": 0.7, "maxTokens": 4096 }, "gateway": { "enableBrowserControl": true, "browserControlPort": 18791 }, "providers": { "ollama": { "discoverModels": true, "healthCheckIntervalMs": 30000 }, "taotoken": { "enabled": true, "retryOnFailure": true } } }discoverModels: true这个开关很重要,它决定 openclaw 启动时会不会主动去http://localhost:11434/api/tags拉模型列表。如果这里关了,后面openclaw models status就看不到 ollama 的模型。
3.3 环境变量写入
把 TaoToken Key 和 ollama 占位 Key 写进 shell 环境:
# 追加到 ~/.bashrc echo 'export TAOTOKEN_API_KEY="你的TaoToken Key"' >> ~/.bashrc echo 'export OLLAMA_API_KEY="ollama-local"' >> ~/.bashrc source ~/.bashrcTaoToken Key 的生成入口在控制台:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
4. 启动 gateway 并验证本地模型连通性
4.1 先解决 WSL 访问 Windows ollama 的问题
这一步是整个链路里最容易卡住的地方。默认情况下,WSL2 里的localhost指向的是 WSL 自己,不是 Windows 宿主机,所以curl http://localhost:11434/api/tags会直接 connection refused。
先在 Windows 侧设置 ollama 监听所有网卡。打开系统环境变量,新增:
变量名:OLLAMA_HOST 变量值:0.0.0.0:11434然后完全退出 ollama(托盘图标右键退出),重新启动。用 PowerShell 验证监听状态:
netstat -ano | findstr 11434预期看到:
TCP 0.0.0.0:11434 0.0.0.0:0 LISTENING TCP [::]:11434 [::]:0 LISTENING接着放行防火墙端口,管理员 PowerShell 执行:
New-NetFirewallRule -DisplayName "Allow Ollama 11434" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 11434最后改 WSL 网络模式。在 Windows 用户目录下创建或编辑.wslconfig:
[wsl2] networkingMode=mirrored重启 WSL:
wsl --shutdown wsl回到 WSL 里再测一次:
curl http://localhost:11434/api/tags预期返回类似:
{"models":[{"name":"qwen3:8b","modified_at":"2026-03-10T12:00:00Z"},{"name":"deepseek-r1:1.5b","modified_at":"2026-03-09T08:30:00Z"}]}只要这个 curl 通了,openclaw 发现本地模型就没有网络障碍了。
4.2 启动 gateway
前台启动 gateway,方便看日志:
openclaw gateway --port 18789正常输出:
[gateway] agent model: ollama/qwen3:8b [gateway] listening on ws://127.0.0.1:18789 [browser/server] Browser control listening on http://127.0.0.1:18791/ (auth=token)注意这里有两个端口:18789 是 gateway 的 WebSocket 入口,18791 是 browser control 的 HTTP 入口。很多人误把 18791 当成 dashboard 打开,结果看到 Unauthorized,就是因为 browser control 默认带 token 认证。
4.3 获取带 token 的 dashboard 链接
不要手动拼 URL,直接用命令输出:
openclaw dashboard --no-open预期输出:
Dashboard URL: http://127.0.0.1:18789/#token=b9e410df30709779cc331a63de57813922e0f9c6ec475429把这个完整链接复制到浏览器打开,就能进入控制台。如果之前打开过旧链接导致 token mismatch,先在浏览器控制台清一下缓存:
localStorage.clear(); sessionStorage.clear(); location.reload();4.4 验证模型连通性
在 dashboard 里发一条消息,比如「你好,请用一句话介绍你自己」。如果模型正常响应,说明整条链路通了。也可以命令行验证:
openclaw models status预期输出:
Default : ollama/qwen3:8b Configured models (2): - ollama/qwen3:8b - taotoken/claude-sonnet看到这个输出,说明本地 ollama 模型和 TaoToken 通道都已经注册成功。
5. 本篇常见报错排查
5.1 Failed to discover Ollama models: TypeError: fetch failed
这个报错几乎都是 WSL 访问不到 Windows ollama 导致的。按顺序排查:
# 第一步,确认 WSL 内能访问 curl http://localhost:11434/api/tags # 如果不通,确认 OLLAMA_API_KEY 已设置 echo $OLLAMA_API_KEY # 如果为空,补上 export OLLAMA_API_KEY="ollama-local"如果 curl 本身就不通,回到 4.1 节检查 OLLAMA_HOST、防火墙、mirrored 网络模式三件套。
5.2 curl: (7) Failed to connect to 127.0.0.1 port 11434
注意这里用的是127.0.0.1而不是localhost。在 mirrored 模式下两者等价,但在 NAT 模式下127.0.0.1指向 WSL 自己,必然不通。解决办法就是切 mirrored 模式,或者把 base_url 改成 Windows 宿主机 IP。
5.3 gateway token missing / token mismatch
token missing 是浏览器没带 token,token mismatch 是带了旧 token。统一处理方式:
openclaw config get gateway.auth.token openclaw dashboard --no-open用第二条命令输出的完整 URL 打开,不要自己拼。如果还不行,清浏览器 localStorage 再试。
5.4 ERR_CONNECTION_REFUSED 打开 18789
说明 gateway 没起来,或者起来了但端口不是 18789。先确认进程:
ps aux | grep openclaw如果没有 gateway 进程,重新前台启动:
openclaw gateway --port 187895.5 openclaw: command not found
安装脚本执行后没刷新 shell:
source ~/.bashrc hash -r openclaw --version如果还不行,检查 npm 全局 bin 是否在 PATH 里:
npm prefix -g echo $PATH6. 后续扩展与 TaoToken 通道的配合方式
本地模型跑通之后,下一步通常有两个方向。一个是接工具调用,让 openclaw 能执行 Python 脚本、读写文件,这个在 skills 段里配置。另一个是把 TaoToken 通道用起来,在本地模型处理不了的复杂任务上做 fallback。
TaoToken 的接入文档在这里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
如果你打算长期跑 coding agent 或者多轮工具调用,可以看一下 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
想直接在网页里对比不同模型的表现,模型对话入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite
配置里fallback_model = "taotoken/claude-sonnet"这行的作用就是:当本地 qwen3:8b 在某个任务上超时或者返回质量不达标时,openclaw 会自动切到 TaoToken 通道的模型继续处理。这样既保留了本地模型的低延迟优势,又不会在复杂任务上卡死。
最后提醒一个实操细节:每次改完 config.toml 或 settings.json,都要重启 gateway 才生效。前台启动的话 Ctrl+C 停掉再重新openclaw gateway --port 18789就行。日志在~/.openclaw/logs/下,排查问题时先看最新那个日志文件的尾部。