跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonNode.jsAI大前端

Clawdbot 整合 Qwen3-32B 本地部署与 18789 端口调试指南

通过构建轻量级 Python 代理层,实现 Clawdbot 前端与本地 Ollama 服务及 Qwen3-32B 模型的无缝对接。方案涵盖环境检查、API 协议转换、端口映射配置及链路调试全流程。重点解决跨域报错、模型连接失败及响应格式不兼容问题,提供 systemd 自启与安全加固建议,确保私有化大模型聊天平台的稳定运行。

WenxuanMa发布于 2026/4/8更新于 2026/5/2212 浏览

Clawdbot 整合 Qwen3-32B 本地部署与 18789 端口调试指南

为什么需要这个整合方案

你是否遇到过这样的问题:想用本地部署的大模型做聊天机器人,但直接调用 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 集群,就用最轻量、最可控的方式——纯命令行加配置文件,每一步都能看见、能改、能查。

环境准备与基础服务启动

确认系统前提条件

请先在终端里运行这几条命令,确认基础环境已就绪:

# 检查 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 服务并验证 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)。

创建轻量代理层(关键步骤)

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 部署与 18789 端口配置

下载并解压 Clawdbot

Clawdbot 是静态前端项目,无需编译。从官方 GitHub Release 下载最新版:

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 适配本地环境

打开 config.json,重点修改以下三处(其他字段保持默认):

{
  "apiUrl": "http://localhost:8080/v1",
  "model": "qwen3:32B",
  "baseUrl": "http://localhost:18789"
}

关键点说明:

  • apiUrl 必须指向我们刚起的 8080 代理,不能写 11434
  • model 字段必须和 Ollama 里 ollama list 显示的名称完全一致(包括大小写和冒号)
  • baseUrl 是 Clawdbot 自身服务的地址,也就是我们要监听的 18789 端口
启动 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://127.0.0.1:18789
  http://192.168.1.100:18789
Hit CTRL-C to stop the server

此时打开浏览器访问 http://localhost:18789,就能看到 Clawdbot 的聊天界面。

18789 端口调试全流程实录

常见连接失败的三种典型场景

我们把调试过程拆成三步,每步都对应一个真实报错截图(文中已引用),你可以对照自查:

第一步:浏览器能打开页面,但输入消息后无响应
→ 打开浏览器开发者工具(F12),切到 Network 标签页,发送一条消息
→ 查看 /v1/chat/completions 请求的状态码
→ 如果是 Failed to load resource: net::ERR_CONNECTION_REFUSED,说明 8080 代理没起来,回到上节重启代理

第二步:请求发出,但返回 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 模拟)

为了彻底理清数据流向,我们跳过浏览器,用 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.logtail -f proxy.log看是否有 500 Internal Server Error 或超时记录
http-server 终端输出直接看启动终端看是否有 404 Not Found 或 CORS 警告
浏览器 ConsoleF12 → Console看是否有 Uncaught (in promise) 错误

举个真实案例:某次调试中,proxy.log 显示 ReadTimeoutError,但 Ollama 本身响应很快。最后发现是代理脚本里 TIMEOUT = 300 写成了 3000(单位是秒),导致等待 3000 秒才超时,前端早已放弃。改成 300 后问题解决。

进阶优化与稳定性加固

让服务开机自启(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 启动。

内存与显存监控(Qwen3-32B 专属)

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

这样即使端口暴露,没有凭证也无法访问聊天界面。

总结:从连不上到丝滑对话的六个关键点

回顾整个调试过程,真正卡住大家的从来不是技术多难,而是几个细节没对齐:

  1. 端口不是数字游戏:18789 是 Clawdbot 约定,8080 是代理中转站,11434 是 Ollama 原生端口——三者缺一不可,且不能互换
  2. 模型名必须一字不差:qwen3:32B ≠ qwen3:32b ≠ qwen3-32B,大小写和符号都要严格匹配
  3. 代理是协议翻译器:不是简单端口转发,必须把 OpenAI 的 JSON 结构转成 Ollama 能懂的格式
  4. 日志要三端联动看:前端 Console、代理 log、Ollama 终端,漏掉任何一环都可能误判
  5. 超时设置要合理:Qwen3-32B 首 token 延迟可能达 8 秒,代理 timeout 至少设为 30 秒
  6. 验证要分层进行:先测 Ollama 原生 API → 再测代理层 → 最后测 Clawdbot 界面,层层递进

现在,当你在浏览器里输入 http://localhost:18789,敲下'你好',看到 Qwen3-32B 用中文流畅回复时,你就已经完成了私有大模型聊天平台最关键的一步——不是调通了某个 API,而是打通了从用户输入到大模型思考的完整信任链。

下一步,你可以尝试把 config.json 里的 model 换成 qwen3:7B 做对比,感受不同参数规模下的响应速度差异;或者把代理脚本改成支持多模型路由,让一个端口服务多个大模型。

技术落地的魅力,永远在于'原来如此'的顿悟时刻,而不是堆砌术语的幻觉。

目录

  1. Clawdbot 整合 Qwen3-32B 本地部署与 18789 端口调试指南
  2. 为什么需要这个整合方案
  3. 环境准备与基础服务启动
  4. 确认系统前提条件
  5. 检查 Node.js 版本(Clawdbot 需要 18.x 或更高)
  6. 检查 Ollama 是否已安装并运行
  7. 检查 Python 是否可用(部分代理脚本依赖)
  8. 启动 Ollama 服务并验证 API
  9. 创建轻量代理层(关键步骤)
  10. Clawdbot 部署与 18789 端口配置
  11. 下载并解压 Clawdbot
  12. 修改 config.json 适配本地环境
  13. 启动 Clawdbot Web 服务
  14. 18789 端口调试全流程实录
  15. 常见连接失败的三种典型场景
  16. 抓包验证完整链路(推荐用 curl 模拟)
  17. 1. 模拟 Clawdbot 向代理发请求(等效于前端 AJAX)
  18. 2. 模拟代理向 Ollama 发请求(等效于 proxy_8080.py 内部调用)
  19. 日志定位法:三日志联动分析
  20. 进阶优化与稳定性加固
  21. 让服务开机自启(Linux/macOS)
  22. 内存与显存监控(Qwen3-32B 专属)
  23. 实时查看 Ollama 内存占用
  24. 确保服务在前台运行,便于观察日志
  25. 在另一个终端运行
  26. 安全加固:限制本地访问
  27. 安装带认证的 http-server
  28. 启动时加用户名密码
  29. 总结:从连不上到丝滑对话的六个关键点
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 自学笔记:从基础语法到深度学习与量化分析完整指南
  • ClawdBot 本地化语音翻译工作流:Whisper 转写与多语言支持
  • Ubuntu 22.04 安装向日葵远程控制
  • Turnitin 检测机制与文本优化策略分析
  • JavaScript 数组常用方法:是否修改原数组归纳
  • Python 基于 Transformer 的时序数据建模与实现详解
  • C++ 函数与成员函数声明机制深度剖析与演进
  • C++ 关联式容器详解:set、map 及其变体
  • VS Code 内置聊天与 GitHub Copilot Chat 的区别及使用指南
  • 2026 年主流 AI 编程工具深度评测与选型指南
  • C++ 继承中同名成员的隐藏规则与重载辨析
  • C++ 位图与布隆过滤器实现及应用
  • 半小时搭建 AI 量化系统:OpenClaw 与开源三件套实战
  • MySQL 迁移至金仓:高兼容自动化与低成本落地实战
  • 基于 SSM 和 Vue 的在线投稿系统设计与实现
  • AI 辅助钱包开发:生成 imToken 生态合约交互与监控脚本
  • 银河麒麟 V10 服务器版 Docker 部署 .NET 8 WebAPI 指南
  • AI 时代创作者的核心身份与生存法则
  • Flutter 状态管理为何走上“百家争鸣”之路?
  • HarmonyOS6 RcInput 组件核心架构与类型系统设计

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online