Clawdbot 整合 Qwen3-32B 本地部署及 18789 端口调试指南
1. 为什么需要这个整合方案
你是不是也遇到过这样的问题:想用本地部署的大模型做聊天机器人,但发现直接调用 Ollama 的 API 在 Web 前端里跨域报错?或者 Clawdbot 配置完后一直连不上模型,控制台疯狂刷 404?又或者好不容易跑起来了,发个消息却卡在'正在思考'半天没反应?
了如何在本地通过 Clawdbot 集成 Qwen3-32B 大模型。主要解决了 Clawdbot 无法直接调用 Ollama API 导致的跨域和协议不匹配问题。方案核心是构建一个轻量级 Python 代理脚本(监听 8080 端口)进行 OpenAI 格式与 Ollama 格式的转换,配合 Clawdbot 前端服务(监听 18789 端口)。文章涵盖了环境检查、Ollama 启动、代理脚本编写、配置文件修改、端口调试及日志分析等完整流程,并提供了开机自启和安全加固建议,帮助用户快速搭建私有大模型聊天平台。
你是不是也遇到过这样的问题:想用本地部署的大模型做聊天机器人,但发现直接调用 Ollama 的 API 在 Web 前端里跨域报错?或者 Clawdbot 配置完后一直连不上模型,控制台疯狂刷 404?又或者好不容易跑起来了,发个消息却卡在'正在思考'半天没反应?
这正是我们搭建这套环境时踩过的坑。Clawdbot 本身不直接对接 Ollama,它需要一个中间层来处理协议转换、请求转发和端口映射。而 18789 这个端口,就是整个链路里最关键的'通关密码'——它不是随便选的,而是 Clawdbot 默认监听的 Web 网关入口。
整套方案的核心逻辑其实很朴素:
http://localhost:18789,看到的是 Clawdbot 的聊天界面http://localhost:8080(Ollama API 地址)整个过程对用户完全透明,你只管打字,剩下的交给这三层接力。
我们不用 Docker Compose 写一堆 yaml,也不搞 Kubernetes 集群,就用最轻量、最可控的方式——纯命令行 + 配置文件,每一步都能看见、能改、能查。
请先在终端里运行这几条命令,确认基础环境已就绪:
# 检查 Node.js 版本(Clawdbot 需要 18.x 或更高)
node --version
# 检查 Ollama 是否已安装并运行
ollama list
curl -s http://localhost:11434/api/tags | jq '.models[] | select(.name | contains("qwen3"))'
# 检查 Python 是否可用(部分代理脚本依赖)
python3 --version
如果 ollama list 没显示 qwen3:32B,先拉取模型:
ollama pull qwen3:32B
注意:Qwen3-32B 是大模型,首次拉取可能需要 30 分钟以上,请确保磁盘空间充足(建议预留 25GB 以上)。不要用
qwen3:latest,必须明确指定:32B标签,否则可能加载错版本导致后续报错。
Ollama 默认监听 127.0.0.1:11434,但 Clawdbot 需要的是标准 HTTP API 格式。我们先手动测试一下原始接口是否通:
curl -X POST http://localhost:11434/api/chat \
-H "Content-Type: application/json" \
-d '{ "model": "qwen3:32B", "messages": [{"role": "user", "content": "你好"}], "stream": false }' | jq '.message.content'
如果返回'你好!很高兴见到你',说明 Ollama 工作正常。如果报错 Connection refused,请检查 Ollama 服务是否真的在后台运行(ps aux | grep ollama)。
Clawdbot 不能直连 Ollama 的 11434 端口,因为它的前端代码硬编码了 /v1/chat/completions 路径,而 Ollama 用的是 /api/chat。我们需要一个'翻译官'。
我们不用 Nginx 或 Caddy 这种重型网关,写一个 50 行以内的 Python 代理脚本,保存为 proxy_8080.py:
#!/usr/bin/env python3
import asyncio
import json
from aiohttp import web, ClientSession
OLLAMA_URL = "http://localhost:11434/api/chat"
TIMEOUT = 300
async def handle_chat(request):
try:
data = await request.json()
# 将 OpenAI 格式转为 Ollama 格式
ollama_data = {
"model": data.get("model", "qwen3:32B"),
"messages": [{"role": m["role"], "content": m["content"]} for m in data.get("messages", [])],
"stream": data.get("stream", False),
}
async with ClientSession() as session:
async with session.post(
OLLAMA_URL,
json=ollama_data,
timeout=asyncio.Timeout(TIMEOUT)
) as resp:
if resp.status == 200:
response_data = await resp.json()
# 转回 OpenAI 兼容格式
openai_resp = {
"id": "chat-" + str(hash(json.dumps(data)))[:8],
"object": "chat.completion",
"created": int(__import__('time').time()),
"model": ollama_data["model"],
"choices": [{
"index": 0,
"message": {"role": "assistant", "content": response_data.get("message", {}).get("content", "")},
"finish_reason": "stop"
}]
}
return web.json_response(openai_resp)
else:
return web.Response(text=await resp.text(), status=resp.status)
except Exception as e:
return web.json_response({"error": str(e)}, status=500)
app = web.Application()
app.router.add_post("/v1/chat/completions", handle_chat)
web.run_app(app, host="127.0.0.1", port=8080, print=False)
赋予执行权限并后台运行:
chmod +x proxy_8080.py
nohup python3 proxy_8080.py > proxy.log 2>&1 &
验证代理是否生效:
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "qwen3:32B", "messages": [{"role": "user", "content": "用一句话介绍你自己"}] }' | jq '.choices[0].message.content'
看到 Qwen3 的回答,说明 8080 端口代理已就位。
Clawdbot 是静态前端项目,无需编译。从官方 GitHub Release 下载最新版(截至 2026 年 1 月为 v0.8.2):
wget https://github.com/clawdbot/clawdbot/releases/download/v0.8.2/clawdbot-v0.8.2.zip
unzip clawdbot-v0.8.2.zip -d clawdbot
cd clawdbot
进入目录后,你会看到 index.html 和 config.json 两个核心文件。
打开 config.json,重点修改以下三处(其他字段保持默认):
{
"apiUrl": "http://localhost:8080/v1",
"model": "qwen3:32B",
"baseUrl": "http://localhost:18789"
}
关键点说明:
apiUrl 必须指向我们刚起的 8080 代理,不能写 11434model 字段必须和 Ollama 里 ollama list 显示的名称完全一致(包括大小写和冒号)baseUrl 是 Clawdbot 自身服务的地址,也就是我们要监听的 18789 端口Clawdbot 自带简易 HTTP 服务器,一行命令启动:
npx http-server -p 18789 -c-1
-c-1表示禁用缓存,避免配置修改后页面不刷新;-p 18789明确指定端口。不要用python3 -m http.server 18789,它不支持前端路由,会导致页面白屏。
启动成功后,终端会显示:
Starting up http-server, serving ./
Available on:
http://127.0.0.1:18789
http://192.168.1.100:18789
Hit CTRL-C to stop the server
此时打开浏览器访问 http://localhost:18789,就能看到 Clawdbot 的聊天界面。
我们把调试过程拆成三步,每步都对应一个真实报错截图(文中已引用),你可以对照自查:
第一步:浏览器能打开页面,但输入消息后无响应
→ 打开浏览器开发者工具(F12),切到 Network 标签页,发送一条消息
→ 查看 /v1/chat/completions 请求的状态码
→ 如果是 Failed to load resource: net::ERR_CONNECTION_REFUSED,说明 8080 代理没起来,回到 2.3 节重启代理
第二步:请求发出,但返回 400 Bad Request
→ 点开该请求,看 Response 内容
→ 如果是 {"error":"model not found"},说明 config.json 里的 model 名和 Ollama 不一致,重新核对 ollama list 输出
第三步:请求成功返回,但 Clawdbot 界面上显示'Error: Invalid response'
→ 这是格式不兼容的典型表现,说明代理脚本没把 Ollama 响应正确转成 OpenAI 格式
→ 检查 proxy_8080.py 中 openai_resp 构造部分,特别是 response_data.get("message", {}).get("content", "") 这一行是否取到了值
为了彻底理清数据流向,我们跳过浏览器,用 curl 手动走一遍全流程:
# 1. 模拟 Clawdbot 向代理发请求(等效于前端 AJAX)
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "qwen3:32B", "messages": [{"role": "user", "content": "今天天气怎么样?"}] }'
# 2. 模拟代理向 Ollama 发请求(等效于 proxy_8080.py 内部调用)
curl -X POST http://localhost:11434/api/chat \
-H "Content-Type: application/json" \
-d '{ "model": "qwen3:32B", "messages": [{"role": "user", "content": "今天天气怎么样?"}], "stream": false }'
如果第 2 步有返回,第 1 步没返回,问题一定出在代理脚本;如果两步都有返回,但 Clawdbot 仍报错,问题就在前端配置或网络策略。
当界面卡住时,同时查看三个日志文件:
| 日志位置 | 查看命令 | 关键线索 |
|---|---|---|
proxy.log | tail -f proxy.log | 看是否有 500 Internal Server Error 或超时记录 |
http-server 终端输出 | 直接看启动终端 | 看是否有 404 Not Found 或 CORS 警告 |
| 浏览器 Console | F12 → Console | 看是否有 Uncaught (in promise) 错误 |
举个真实案例:某次调试中,proxy.log 显示 ReadTimeoutError,但 Ollama 本身响应很快。最后发现是代理脚本里 TIMEOUT = 300 写成了 3000(单位是秒),导致等待 3000 秒才超时,前端早已放弃。改成 300 后问题解决。
把两个服务做成 systemd 服务,避免每次重启都要手动拉起:
创建 /etc/systemd/system/ollama-proxy.service:
[Unit]
Description=Ollama to OpenAI API Proxy
After=ollama.service
[Service]
Type=simple
User=$USER
WorkingDirectory=/path/to/your/proxy
ExecStart=/usr/bin/python3 /path/to/your/proxy_8080.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
启用服务:
sudo systemctl daemon-reload
sudo systemctl enable ollama-proxy
sudo systemctl start ollama-proxy
同理为 Clawdbot 创建 clawdbot-web.service,用 npx http-server 启动。
Qwen3-32B 在推理时会占用约 20GB 显存(A10G)或 35GB 内存(CPU 模式)。建议加装监控:
# 实时查看 Ollama 内存占用
ollama serve &
# 确保服务在前台运行,便于观察日志
# 在另一个终端运行
watch -n 1 'nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | head -1'
如果显存持续 95% 以上,考虑在 config.json 中添加流式响应开关(需 Clawdbot v0.8.2+):
"stream": true
这样 Ollama 会边生成边返回 token,降低内存峰值。
18789 端口默认只监听 127.0.0.1,但如果你用 http-server -a 0.0.0.0 开放了外网,务必加一层基础认证:
# 安装带认证的 http-server
npm install -g http-server-auth
# 启动时加用户名密码
http-server-auth -p 18789 -u admin -p your_secure_password
这样即使端口暴露,没有凭证也无法访问聊天界面。
回顾整个调试过程,真正卡住大家的从来不是技术多难,而是几个细节没对齐:
qwen3:32B ≠ qwen3:32b ≠ qwen3-32B,大小写和符号都要严格匹配现在,当你在浏览器里输入 http://localhost:18789,敲下'你好',看到 Qwen3-32B 用中文流畅回复时,你就已经完成了私有大模型聊天平台最关键的一步——不是调通了某个 API,而是打通了从用户输入到大模型思考的完整信任链。
下一步,你可以尝试把 config.json 里的 model 换成 qwen3:7B 做对比,感受不同参数规模下的响应速度差异;或者把代理脚本改成支持多模型路由,让一个端口服务多个大模型。
技术落地的魅力,永远在于'原来如此'的顿悟时刻,而不是堆砌术语的幻觉。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online