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

Clawdbot 集成 Qwen3-32B 本地部署与 18789 端口调试

Clawdbot 集成 Qwen3-32B 本地部署涉及 Ollama 服务搭建、Python 协议代理层编写及前端配置。通过 8080 端口代理转换 OpenAI 与 Ollama 接口格式,实现 18789 端口 Web 界面调用。文档涵盖环境检查、服务启动、config.json 配置、网络调试及日志分析方法,并提供 systemd 自启与安全加固方案,解决跨域报错与连接失败问题。

未来可期发布于 2026/4/7更新于 2026/10/19109 浏览

Clawdbot 集成 Qwen3-32B 本地部署与 18789 端口调试

1. 为什么需要这个整合方案

在本地部署大模型做聊天机器人时,直接调用 Ollama API 常遇到 Web 前端跨域报错或 Clawdbot 配置后连不上模型的问题。Clawdbot 本身不直接对接 Ollama,需要一个中间层处理协议转换、请求转发和端口映射。

整套方案的核心逻辑如下:

  • 浏览器访问 http://localhost:18789 进入 Clawdbot 聊天界面
  • Clawdbot 将消息请求转给内部代理
  • 代理转发至 http://localhost:8080(Ollama API 地址)
  • Ollama 调用本地 Qwen3-32B 模型生成回复并返回

整个过程无需 Docker Compose 或 Kubernetes,采用纯命令行加配置文件方式,轻量可控。

2. 环境准备与基础服务启动

2.1 确认系统前提条件

请在终端运行以下命令确认基础环境已就绪:

# 检查 Node.js 版本(Clawdbot 需要 18.x 或更高)
node --version

# 检查 Ollama 是否已安装并运行
ollama list

# 检查 Python 是否可用
python3 --version

如果 ollama list 未显示 qwen3:32B,请先拉取模型:

ollama pull qwen3:32B

注意:Qwen3-32B 为大模型,首次拉取可能需要 30 分钟以上,请确保磁盘空间充足(建议预留 25GB 以上)。必须明确指定 :32B 标签,否则可能加载错版本导致后续报错。

2.2 启动 Ollama 服务并验证 API

Ollama 默认监听 127.0.0.1:11434,先手动测试原始接口是否通:

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。我们需要一个协议翻译器。

编写一个 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 端口代理已就位。

3. Clawdbot 部署与 18789 端口配置

3.1 下载并解压 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 两个核心文件。

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://127.0.0.1:18789
  http://192.168.1.100:18789
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 手动走一遍全流程:

# 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 仍报错,问题就在前端配置或网络策略。

4.3 日志定位法:三日志联动分析

当界面卡住时,同时查看三个日志文件:

日志位置查看命令关键线索
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 后问题解决。

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 内存占用
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,降低内存峰值。

5.3 安全加固:限制本地访问

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

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

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

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

  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. 1. 为什么需要这个整合方案
  3. 2. 环境准备与基础服务启动
  4. 2.1 确认系统前提条件
  5. 检查 Node.js 版本(Clawdbot 需要 18.x 或更高)
  6. 检查 Ollama 是否已安装并运行
  7. 检查 Python 是否可用
  8. 2.2 启动 Ollama 服务并验证 API
  9. 2.3 创建轻量代理层(关键步骤)
  10. 3. Clawdbot 部署与 18789 端口配置
  11. 3.1 下载并解压 Clawdbot
  12. 3.2 修改 config.json 适配本地环境
  13. 3.3 启动 Clawdbot Web 服务
  14. 4. 18789 端口调试全流程实录
  15. 4.1 常见连接失败的三种典型场景
  16. 4.2 抓包验证完整链路(推荐用 curl 模拟)
  17. 1. 模拟 Clawdbot 向代理发请求(等效于前端 AJAX)
  18. 2. 模拟代理向 Ollama 发请求(等效于 proxy_8080.py 内部调用)
  19. 4.3 日志定位法:三日志联动分析
  20. 5. 进阶优化与稳定性加固
  21. 5.1 让服务开机自启(Linux/macOS)
  22. 5.2 内存与显存监控(Qwen3-32B 专属)
  23. 实时查看 Ollama 内存占用
  24. 确保服务在前台运行,便于观察日志
  25. 在另一个终端运行
  26. 5.3 安全加固:限制本地访问
  27. 安装带认证的 http-server
  28. 启动时加用户名密码
  29. 6. 总结:从连不上到丝滑对话的六个关键点

更多推荐文章

查看全部
  • FPGA Vivado 下载及烧录流程详解
  • Java 面试题及答案汇总
  • 前缀和算法实战:连续数组与矩阵区域和
  • 分治算法详解:快速排序、归并排序与快速选择
  • CVE-2026-21962 Oracle WebLogic 代理插件未授权 RCE 漏洞分析
  • AMD显卡AI绘画终极指南:解锁ComfyUI-Zluda隐藏性能
  • 文心一言 4.5 开源模型 ERNIE-4.5-0.3B 轻量化部署与优化
  • 大语言模型(LLM)技术深度解析与架构演进
  • Claude Code 本地化部署教程:基于 Ollama 实现离线开发
  • STM32 HAL 库软件 IIC 驱动 AT24C02/AT24C32 时序与读写
  • Java 生成 1 到 1000 范围内的 900 个不重复随机数
  • 2023 年 Android 开发岗位核心面试题汇总
  • 英文论文 AI 率检测:IThenticate 与 Turnitin 系统对比
  • 二分算法实战:查找元素首尾位置与区间查询
  • C++ 进阶:哈希表原理与实现
  • Python 读取 CSV 数据并筛选股票记录
  • Selenium 自动化中如何获取折叠面板内的内容
  • MATLAB 实现基于天牛须搜索算法(BAS)的无人机三维路径规划
  • ZeroClaw:零开销全 Rust 自主 AI 助手基础设施,与 OpenClaw 对比
  • 模拟算法实战:替换问号、提莫攻击、Z 字形变换等五题详解

相关免费在线工具

  • 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