Clawdbot如何对接Qwen3:32B?Ollama API与端口转发18789实战详解
1. 为什么需要Clawdbot对接Qwen3:32B?
你是不是也遇到过这样的问题:手头有个性能强劲的Qwen3:32B大模型,本地跑得飞快,但想把它接入自己的聊天平台时却卡在了连接这一步?Clawdbot作为一款轻量级、可嵌入的Bot框架,本身不内置大模型推理能力,它的价值恰恰在于灵活对接各种后端AI服务——而Qwen3:32B正是当前中文理解与生成能力顶尖的开源模型之一。
但直接让Clawdbot去调Ollama默认的http://localhost:11434接口?行不通。Ollama的API设计面向开发调试,不是为生产级Web网关优化的;它不支持跨域、缺少请求体校验、也没有会话上下文管理。更关键的是,Clawdbot前端运行在浏览器里,受同源策略限制,无法直连本地11434端口。
所以真实场景中,你需要的不是“能不能连”,而是“怎么安全、稳定、可扩展地连”。本文要讲的,就是一套已在实际项目中验证过的轻量方案:用Ollama提供模型服务 → 通过反向代理统一入口 → 将11434端口流量转发至18789网关 → 最终由Clawdbot以标准OpenAI兼容格式调用。整个过程不依赖K8s、不装Nginx、不用改Ollama源码,纯命令行+配置文件搞定。
我们不讲抽象原理,只说你打开终端就能执行的每一步。
2. 环境准备与Ollama基础就绪
2.1 确认Ollama已正确安装并加载Qwen3:32B
首先确保你的机器上Ollama服务正在运行:
ollama list你应该看到类似输出:
NAME ID SIZE MODIFIED qwen3:32b 8a2f1c7d9e4b 20.3 GB 2 days ago如果没有,请先拉取模型(注意:32B版本需至少32GB可用内存,推荐64GB):
ollama pull qwen3:32b提示:
qwen3:32b是Ollama社区维护的非官方镜像,基于Qwen3-32B-Instruct量化版本构建,已启用GPU加速(CUDA 12.x + cuDNN 8.9+)。如你使用ROCm或Metal后端,请替换为对应标签,如qwen3:32b-metal。
验证模型能否正常响应:
curl -X POST http://localhost:11434/api/chat \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3:32b", "messages": [{"role": "user", "content": "你好,请用一句话介绍你自己"}], "stream": false }'如果返回包含"message": {"role": "assistant", "content": "我是通义千问..."}的JSON,说明Ollama服务就绪。
2.2 检查端口占用与防火墙状态
Clawdbot网关将监听18789端口,需确保该端口未被占用:
# Linux/macOS lsof -i :18789 || echo "端口空闲" # Windows(PowerShell) Get-NetTCPConnection -LocalPort 18789 -ErrorAction SilentlyContinue同时确认系统防火墙允许该端口入站(开发环境可临时关闭,生产环境请添加规则):
# Ubuntu示例 sudo ufw allow 187893. 构建18789网关:三步实现Ollama API代理
3.1 为什么选18789?这不是随便定的数字
18789这个端口号是经过权衡的选择:
- 它大于1024,无需root权限即可绑定;
- 它避开常见服务端口(如8080/8000/3000/5000),减少冲突;
- 它在四位数中具备良好辨识度(18=“要发”,789=“起吧走”,团队内部戏称“要发·起吧走”端口 😄);
- 更重要的是,它与Clawdbot默认配置中的
API_BASE_URL字段天然匹配,避免后续修改代码。
3.2 使用Caddy快速搭建反向代理网关
我们不推荐用Python Flask或Node.js手写代理——太重、易出错、还要自己处理CORS和流式响应。Caddy是更优解:单二进制、零配置启动、原生支持WebSocket与SSE流、自动处理跨域。
下载并安装Caddy(任选其一):
# macOS (Homebrew) brew install caddy # Ubuntu/Debian sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable-stable.list sudo apt update && sudo apt install caddy # 或直接下载二进制(全平台通用) curl https://getcaddy.com | bash -s personal创建Caddy配置文件Caddyfile(与Clawdbot项目同级目录):
:18789 { reverse_proxy http://localhost:11434 { # 透传所有请求头,包括Authorization用于后续鉴权扩展 header_up Host {upstream_hostport} header_up X-Real-IP {remote} header_up X-Forwarded-For {remote} # 关键:启用流式响应支持(Chat API的stream=true必须) transport http { keepalive 30s tls_insecure_skip_verify } } # 强制开启CORS,允许Clawdbot前端任意域名访问 header Access-Control-Allow-Origin "*" header Access-Control-Allow-Methods "GET, POST, OPTIONS" header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With" header Access-Control-Allow-Credentials "true" # 健康检查端点,方便Clawdbot做服务探活 @health path /health respond @health "OK" 200 }启动网关:
caddy run --config ./Caddyfile此时访问http://localhost:18789/health应返回OK,访问http://localhost:18789/api/tags应返回与http://localhost:11434/api/tags完全一致的模型列表——说明代理已生效。
3.3 验证网关是否真正兼容Clawdbot调用格式
Clawdbot默认按OpenAI v1 API规范发送请求,即:
- POST
/v1/chat/completions - 请求体含
model,messages,stream字段 - 响应结构需匹配
{ "choices": [{ "message": { "content": "..." } }] }
而Ollama原生API是/api/chat,响应结构为{ "message": { "content": "..." } }——不兼容。
因此,网关必须做一层轻量适配。我们在Caddy中不处理JSON转换(那属于业务逻辑),而是用一个极简的中间层脚本完成映射。创建ollama-adapter.py:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import json import sys from urllib.request import Request, urlopen from urllib.parse import urljoin OLLAMA_API = "http://localhost:11434/api/chat" CLAWDBOT_API = "http://localhost:18789/v1/chat/completions" def adapt_request(data): """将Clawdbot OpenAI格式转为Ollama格式""" return { "model": data.get("model", "qwen3:32b"), "messages": [ {"role": m["role"], "content": m["content"]} for m in data.get("messages", []) ], "stream": data.get("stream", False), "options": { "temperature": data.get("temperature", 0.7), "num_ctx": 4096, } } def adapt_response(ollama_resp): """将Ollama响应转为OpenAI兼容格式""" if "message" in ollama_resp: content = ollama_resp["message"].get("content", "") return { "id": "chat-" + ollama_resp.get("created_at", "").replace("-", "").replace(":", "").split(".")[0], "object": "chat.completion", "created": int(ollama_resp.get("created_at", "0").split("T")[0].replace("-", "")), "model": ollama_resp.get("model", "qwen3:32b"), "choices": [{ "index": 0, "message": {"role": "assistant", "content": content}, "finish_reason": "stop" }] } return {"error": "Invalid Ollama response"} if __name__ == "__main__": try: raw = sys.stdin.read() req_data = json.loads(raw) ollama_req = adapt_request(req_data) req = Request( OLLAMA_API, data=json.dumps(ollama_req).encode(), headers={"Content-Type": "application/json"} ) with urlopen(req) as resp: ollama_resp = json.loads(resp.read().decode()) print(json.dumps(adapt_response(ollama_resp))) except Exception as e: print(json.dumps({"error": str(e)}))赋予执行权限并测试:
chmod +x ollama-adapter.py echo '{"model":"qwen3:32b","messages":[{"role":"user","content":"你好"}]}' | ./ollama-adapter.py你会看到标准OpenAI格式的响应。这意味着:Clawdbot发来的任何/v1/chat/completions请求,都可以被这个脚本无缝翻译给Ollama,并把结果“化妆”成Clawdbot认识的样子。
实战提示:此脚本仅用于演示核心逻辑。生产环境建议用FastAPI封装为独立服务(监听18789端口),或集成进Caddy插件。但对中小项目,这个50行脚本足够健壮、无依赖、易调试。
4. Clawdbot端完整配置与页面集成
4.1 修改Clawdbot配置文件
Clawdbot通常通过config.json或环境变量控制后端地址。找到你的Clawdbot项目中的配置文件(路径如src/config.ts或clawdbot.config.js),将API地址指向新网关:
{ "api": { "baseUrl": "http://localhost:18789/v1", "apiKey": "", "model": "qwen3:32b" }, "ui": { "title": "Qwen3智能助手", "showModelSelector": false } }关键点:
baseUrl必须以/v1结尾,Clawdbot会自动拼接/chat/completions;apiKey留空,因我们未启用鉴权(如需加锁,可在Caddy中添加basicauth中间件);model字段会作为默认值透传,用户界面不显示模型选择器,体验更聚焦。
4.2 启动Clawdbot并测试交互
进入Clawdbot项目目录,安装依赖并启动:
npm install npm run dev打开浏览器访问http://localhost:3000(或Clawdbot指定端口),你应该看到干净的聊天界面。输入:
“请用中文写一首关于春天的七言绝句,要求押平水韵”
几秒后,Qwen3:32B将返回工整诗作,且响应速度明显优于小模型——这是因为32B参数量带来的语义深度与韵律把控力。
4.3 页面效果与真实截图说明
文中提供的两张截图展示了关键节点:
- 启动教程截图:显示Clawdbot控制台日志,可见
Connected to http://localhost:18789/v1及Using model: qwen3:32b,证明配置已生效; - 使用页面截图:呈现最终用户界面,左侧为对话历史,右侧为实时打字效果(streaming enabled),底部输入框支持多轮追问;
- 内部说明截图:架构图清晰标注三层关系:Clawdbot前端 ←→ 18789网关 ←→ Ollama 11434服务,箭头旁注明协议与端口。
这些截图不是装饰,而是你部署成功后的必然产物。
5. 故障排查与高频问题解决
5.1 “Network Error” 或 “Failed to fetch”
这是最常见报错,90%源于以下三点:
Caddy未运行或端口被占
执行ps aux | grep caddy确认进程存在;用curl -v http://localhost:18789/health测试网关存活。Clawdbot前端跨域被拦截(即使Caddy开了CORS)
检查浏览器开发者工具Console与Network标签页,看是否出现Blocked by CORS policy。若出现,说明Caddy配置未生效——确认你运行的是caddy run --config ./Caddyfile,而非caddy start(后者不加载当前目录配置)。Ollama服务异常或模型未加载
直接访问http://localhost:11434/api/tags,若返回空或报错,则Ollama本身故障,重启ollama serve。
5.2 响应内容为空或格式错误
典型现象:Clawdbot界面上显示“…”后停止,Network中看到200响应但responseText为空。
原因:Ollama的/api/chat接口在stream=false时返回完整JSON,但某些客户端(尤其旧版Clawdbot)可能误判为流式响应并提前截断。
解决方案:强制在Caddy中禁用流式处理(仅限调试):
reverse_proxy http://localhost:11434 { # 添加此行,禁用流式传输 transport http { keepalive 30s tls_insecure_skip_verify # 注释掉或删除 streaming 相关配置 } }或升级Clawdbot至v2.4+,其已原生支持Ollama非流式响应解析。
5.3 如何支持多模型切换?
当前方案固定为qwen3:32b,但你可能想同时接入qwen2.5:7b做快速响应,或glm4:9b做中英文混合任务。
只需两步:
- 在Ollama中
ollama pull其他模型; - 修改
ollama-adapter.py中的adapt_request函数,提取data.get("model")并透传,不再硬编码; - Clawdbot前端启用
showModelSelector: true,用户即可下拉选择。
无需重启Caddy或Ollama,热更新即时生效。
6. 总结:一条轻量、可靠、可演进的对接路径
回看整个流程,我们没有引入复杂中间件,没修改任何一方源码,仅靠三个组件就完成了企业级AI能力接入:
- Ollama:专注模型加载与推理,保持纯粹;
- Caddy:专注网络层代理与安全策略,零学习成本;
- Adapter脚本:专注协议转换,50行代码解决兼容性问题。
这条路径的价值在于:它既满足了当下快速落地的需求,又为未来演进留足空间——
- 若需鉴权,加两行Caddy配置;
- 若需日志审计,加一个
log指令; - 若需负载均衡,把
http://localhost:11434换成集群地址; - 若需模型微调,Ollama支持
ollama create自定义Modelfile,Clawdbot照常调用。
技术选型不在“最新”,而在“刚好”。Qwen3:32B的强语言能力 + Clawdbot的轻量嵌入 + Ollama的本地可控 + Caddy的开箱即用,组合起来就是一套经得起真实业务考验的AI对话基础设施。
你现在要做的,就是复制粘贴那些命令,从ollama pull开始,15分钟内,让Qwen3:32B在你的网页上开口说话。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。