在 One API 里接入 Ollama 作为后备 LLM 渠道

起因

我用 One API 作为 LLM 网关,给 n8n 工作流提供模型调用。主力是 NVIDIA 的免费 API(nemotron-3-ultrakimi-k3),质量好、速度快。

但有个问题:NVIDIA 免费层有限流。一旦触发 429,n8n 工作流就断了。我需要一个后备方案。

目标:给 One API 加两层后备——Ollama Cloud(云端大模型)和本地 Ollama(完全离线兜底)。

架构设计

最终的 One API 渠道架构:

优先级渠道模型特点
1NVIDIA APInemotron、kimi质量最高,但可能限流
2Ollama Cloudgpt-oss:120b云端大模型,不占本地资源
3Local Ollamagemma:2b完全本地,最终兜底

三层降级,任何一层出问题都有下一层顶上。

第一部分:本地 Ollama 作为最终兜底

让 Ollama 监听所有网卡

One API 是 Docker 容器,Ollama 是宿主机进程。默认情况下 Ollama 只监听 127.0.0.1,容器访问不到。

bash

export OLLAMA_HOST=0.0.0.0
export OLLAMA_ORIGINS=*

pkill -f "ollama serve"
sleep 2
nohup ollama serve > /var/log/ollama.log 2>&1 &
sleep 3

# 确认监听地址
ss -tlnp | grep 11434

应该看到 *:11434 而不是 127.0.0.1:11434

放行 iptables

这是最容易踩的坑。你的 VPS 上 K3s 和 UFW 把 INPUT 链的策略设成了 DROP,Docker 容器到宿主机的流量会被拦截。

bash

iptables -I INPUT 1 -s 172.17.0.0/16 -p tcp --dport 11434 -j ACCEPT
iptables -I INPUT 1 -s 172.18.0.0/16 -p tcp --dport 11434 -j ACCEPT
iptables -I INPUT 1 -s 172.19.0.0/16 -p tcp --dport 11434 -j ACCEPT
iptables -I INPUT 1 -s 172.20.0.0/16 -p tcp --dport 11434 -j ACCEPT
netfilter-persistent save

验证连通性

bash

docker exec one-api sh -c "wget -qO- http://172.17.0.1:11434/api/tags 2>&1 | head -c 200"

应该返回模型列表的 JSON。

在 One API 添加渠道

字段
类型Ollama
名称Local-Ollama-Backup
代理地址http://172.17.0.1:11434
密钥ollama(随便填,Ollama 不鉴权)
模型gemma:2b

⚠️ 代理地址不要加 /v1

内存优化

gemma:2b 加载后占用约 1.6GiB 内存。我的 VPS 只有 5.8GiB,可用约 2GiB。为了不让它常驻,设置了空闲自动卸载:

bash

export OLLAMA_KEEP_ALIVE=5m

这样模型在空闲 5 分钟后自动从内存卸载。

第二部分:Ollama Cloud 作为云端后备

本地 gemma:2b 是 20 亿参数的小模型,中文能力有限。更好的后备是 Ollama Cloud,它提供 120B 级别的大模型,而且不占本地资源。

获取 API Key

访问 ollama.com/settings/keys,注册后生成一个 API Key。

确认哪些模型在免费范围内

不是所有 Ollama Cloud 模型都免费。我测试了几个:

模型状态
gpt-oss:20b✅ 免费
gpt-oss:120b✅ 免费
gemma4:31b✅ 免费
deepseek-v4-flash❌ 需要订阅

测试方式:

bash

curl -s -X POST "https://ollama.com/api/chat" \
  -H "Authorization: Bearer 你的KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-oss:120b","messages":[{"role":"user","content":"hi"}],"stream":false}' | head -c 200

返回 "content" 字段的就是可用;返回 "this model requires a subscription" 的就是需要付费。

在 One API 添加渠道

字段
类型Ollama
名称Ollama-Cloud-Backup
代理地址https://ollama.com不要加 /v1
密钥你的 Ollama Cloud API Key
模型gpt-oss:120b,gpt-oss:20b,gemma4:31b

多个模型用逗号分隔。

踩坑:402 Payment Required

第一次配置后测试,返回 402。原因是渠道里填的模型(deepseek-v4-flash)不在免费范围内。改成 gpt-oss:120b 后测试通过。

注意:如果 Ollama Cloud 返回 402,One API 可能会把整个渠道标记为”信用耗尽”,导致后续即使调用免费模型也失败。需要在 One API 后台手动重新启用渠道。

验证三层渠道

在 VPS 上用 curl 测试:

bash

# 测试 Ollama Cloud
curl -s -X POST http://172.17.0.1:3000/v1/chat/completions \
  -H "Authorization: Bearer sk-你的OneAPI令牌" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-oss:120b",
    "messages": [{"role": "user", "content": "说你好"}],
    "max_tokens": 1024,
    "stream": false
  }' | python3 -m json.tool

# 测试本地 Ollama
curl -s -X POST http://172.17.0.1:3000/v1/chat/completions \
  -H "Authorization: Bearer sk-你的OneAPI令牌" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemma:2b",
    "messages": [{"role": "user", "content": "说你好"}],
    "max_tokens": 50,
    "stream": false
  }' | python3 -m json.tool

两个都返回正常回答,说明配置成功。

在 n8n 里实现降级

有了三层渠道,n8n 工作流可以这样配置:

text

HTTP Request(调 NVIDIA nemotron)
    ↓
IF(status != 200 或 content 为空)
    ↓ 是
HTTP Request(调 Ollama Cloud gpt-oss:120b)
    ↓
继续后续流程

这样当 NVIDIA 限流时,自动切到 Ollama Cloud,工作流不中断。

踩坑记录

1. iptables 拦截 Docker 到宿主机的流量
K3s 和 UFW 把 INPUT 链设为 DROP,导致 One API 容器访问不到宿主机的 Ollama。需要显式放行 Docker 网段到 11434 端口。

2. Ollama Cloud 的 402 错误
不是所有模型都在免费范围内。部分大模型(如 deepseek-v4-flash)需要订阅。配置前先用 curl 测试哪些模型可用。

3. 推理模型需要更大的 max_tokens
gpt-oss:120b 是推理模型,会在 thinking 字段消耗 token。max_tokens: 50 会导致 content 被截断。建议设 1024 或更高。

4. 本地 Ollama 的内存占用
gemma:2b 加载后占用约 1.6GiB,对内存紧张的 VPS 是负担。用 OLLAMA_KEEP_ALIVE=5m 让模型空闲后自动卸载。

5. One API 的 Ollama 渠道不支持流式
已知问题:One API 通过 stream 方式调用 Ollama 时可能返回空白。用 "stream": false 即可。

最终架构

优先级渠道模型用途
1NVIDIA APInemotron、kimi主力
2Ollama Cloudgpt-oss:120b第一后备
3Local Ollamagemma:2b最终兜底

核心价值:主力 LLM 限流或宕机时,n8n 工作流自动降级到后备渠道,服务不中断。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注