跳到主要内容Clawdbot 整合 Qwen3-32B 本地部署与 18789 端口调试指南 | 极客日志PythonNode.jsAI大前端算法
Clawdbot 整合 Qwen3-32B 本地部署与 18789 端口调试指南
综述由AI生成介绍如何将 Clawdbot 与本地部署的 Qwen3-32B 模型通过 Ollama 进行整合。主要解决了 Clawdbot 前端跨域及协议不匹配问题,通过编写 Python 代理脚本实现 OpenAI 格式到 Ollama 格式的转换。配置步骤包括环境检查、代理服务启动(8080 端口)、Clawdbot 部署(18789 端口)及调试方法。重点在于端口映射、模型名称一致性验证及日志分析,最终实现本地大模型聊天功能。
CoderByte30 浏览 Clawdbot 整合 Qwen3-32B 本地部署与 18789 端口调试指南
1. 为什么需要这个整合方案
你是不是也遇到过这样的问题:想用本地部署的大模型做聊天机器人,但发现直接调用 Ollama 的 API 在 Web 前端里跨域报错?或者 Clawdbot 配置完后一直连不上模型,控制台疯狂刷 404?又或者好不容易跑起来了,发个消息却卡在'正在思考'半天没反应?
这正是我们搭建这套环境时踩过的坑。Clawdbot 本身不直接对接 Ollama,它需要一个中间层来处理协议转换、请求转发和端口映射。而 18789 这个端口,就是整个链路里最关键的'通关密码'——它不是随便选的,而是 Clawdbot 默认监听的 Web 网关入口。
整套方案的核心逻辑其实很朴素:
- 你在浏览器里访问
http://localhost:18789,看到的是 Clawdbot 的聊天界面
- Clawdbot 收到你的消息后,不自己去算答案,而是把请求转给内部代理
- 代理再把请求发到
http://localhost:8080(Ollama API 地址)
- Ollama 调用本地的 Qwen3-32B 模型生成回复,原路返回
整个过程对用户完全透明,你只管打字,剩下的交给这三层接力。
我们不用 Docker Compose 写一堆 yaml,也不搞 Kubernetes 集群,就用最轻量、最可控的方式——纯命令行 + 配置文件,每一步都能看见、能改、能查。
2. 环境准备与基础服务启动
2.1 确认系统前提条件
请先在终端里运行这几条命令,确认基础环境已就绪:
node --version
ollama list
curl -s http://localhost:11434/api/tags | jq '.models[] | select(.name | contains("qwen3"))'
python3 --version
如果 ollama list 没显示 qwen3:32B,先拉取模型:
ollama pull qwen3:32B
注意:Qwen3-32B 是大模型,首次拉取可能需要 30 分钟以上,请确保磁盘空间充足(建议预留 25GB 以上)。不要用 qwen3:latest,必须明确指定 :32B 标签,否则可能加载错版本导致后续报错。
2.2 启动 Ollama 服务并验证 API
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)。
2.3 创建轻量代理层(关键步骤)
Clawdbot 不能直连 Ollama 的 11434 端口,因为它的前端代码硬编码了 /v1/chat/completions 路径,而 Ollama 用的是 。我们需要一个'翻译官'。
/api/chat
我们不用 Nginx 或 Caddy 这种重型网关,写一个 50 行以内的 Python 代理脚本,保存为 proxy_8080.py:
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()
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_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 端口代理已就位。
3. Clawdbot 部署与 18789 端口配置
3.1 下载并解压 Clawdbot
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 两个核心文件。
3.2 修改 config.json 适配本地环境
打开 config.json,重点修改以下三处(其他字段保持默认):
{
"apiUrl": "http://localhost:8080/v1",
"model": "qwen3:32B",
"baseUrl": "http://localhost:18789"
}
apiUrl 必须指向我们刚起的 8080 代理,不能写 11434
model 字段必须和 Ollama 里 ollama list 显示的名称完全一致(包括大小写和冒号)
baseUrl 是 Clawdbot 自身服务的地址,也就是我们要监听的 18789 端口
3.3 启动 Clawdbot Web 服务
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:
http:
Hit CTRL-C to stop the server
此时打开浏览器访问 http://localhost:18789,就能看到 Clawdbot 的聊天界面。
4. 18789 端口调试全流程实录
4.1 常见连接失败的三种典型场景
我们把调试过程拆成三步,每步都对应一个真实报错截图(文中已引用),你可以对照自查:
第一步:浏览器能打开页面,但输入消息后无响应
→ 打开浏览器开发者工具(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", "") 这一行是否取到了值
4.2 抓包验证完整链路(推荐用 curl 模拟)
为了彻底理清数据流向,我们跳过浏览器,用 curl 手动走一遍全流程:
curl -X POST http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "qwen3:32B", "messages": [{"role": "user", "content": "今天天气怎么样?"}] }'
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 仍报错,问题就在前端配置或网络策略。
4.3 日志定位法:三日志联动分析
| 日志位置 | 查看命令 | 关键线索 |
|---|
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 后问题解决。
5. 进阶优化与稳定性加固
5.1 让服务开机自启(Linux/macOS)
把两个服务做成 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 启动。
5.2 内存与显存监控(Qwen3-32B 专属)
Qwen3-32B 在推理时会占用约 20GB 显存(A10G)或 35GB 内存(CPU 模式)。建议加装监控:
ollama serve &
watch -n 1 'nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits | head -1'
如果显存持续 95% 以上,考虑在 config.json 中添加流式响应开关(需 Clawdbot v0.8.2+):
这样 Ollama 会边生成边返回 token,降低内存峰值。
5.3 安全加固:限制本地访问
18789 端口默认只监听 127.0.0.1,但如果你用 http-server -a 0.0.0.0 开放了外网,务必加一层基础认证:
npm install -g http-server-auth
http-server-auth -p 18789 -u admin -p your_secure_password
6. 总结:从连不上到丝滑对话的六个关键点
回顾整个调试过程,真正卡住大家的从来不是技术多难,而是几个细节没对齐:
- 端口不是数字游戏:18789 是 Clawdbot 约定,8080 是代理中转站,11434 是 Ollama 原生端口——三者缺一不可,且不能互换
- 模型名必须一字不差:
qwen3:32B ≠ qwen3:32b ≠ qwen3-32B,大小写和符号都要严格匹配
- 代理是协议翻译器:不是简单端口转发,必须把 OpenAI 的 JSON 结构转成 Ollama 能懂的格式
- 日志要三端联动看:前端 Console、代理 log、Ollama 终端,漏掉任何一环都可能误判
- 超时设置要合理:Qwen3-32B 首 token 延迟可能达 8 秒,代理 timeout 至少设为 30 秒
- 验证要分层进行:先测 Ollama 原生 API → 再测代理层 → 最后测 Clawdbot 界面,层层递进
现在,当你在浏览器里输入 http://localhost:18789,敲下'你好',看到 Qwen3-32B 用中文流畅回复时,你就已经完成了私有大模型聊天平台最关键的一步——不是调通了某个 API,而是打通了从用户输入到大模型思考的完整信任链。
下一步,你可以尝试把 config.json 里的 model 换成 qwen3:7B 做对比,感受不同参数规模下的响应速度差异;或者把代理脚本改成支持多模型路由,让一个端口服务多个大模型。
技术落地的魅力,永远在于'原来如此'的顿悟时刻,而不是堆砌术语的幻觉。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online