cllama:搜罗万象当LLM api server
TL;DR cllama
先别急着看代码。我想先讲个故事。
这一切是从"抠门"开始的
我有一台很普通的服务器------没有 GPU,只有 CPU,但它在公网上,有个公网 IP,可以连着腾讯的 IMA。这台机器常年安静地跑着 bge-m3 做 embedding,把知识库向量化,等着被检索。
问题来了:IMA 需要一个能对话的模型,啥?每天100算力,我可是薅了一个月,每天领100然后尽量用到100把伤寒论的书自动看了一遍,总结了各种知识。但是只要不够了它会自己停下来比如用了70,另30死活不让用就过期了;我的公网服务器又跑不动大模型,但是IMA偏偏需要指定公网api。而我手头有台游戏本 Windows,能跑 qwen3.8:27b------但它在家里的 NAT 后面,没有公网地址,IMA 够不着它。薅不动算力了,还是自建infra吧。
这就像家里有台好车,但车库门只朝内开。怎么办?
于是 cllama 出生了
cllama 是一个轻量的 LLM API 转换器。它挡在一堆 LLM 后端前面(Ollama、任何 OpenAI 兼容服务器、任何 Anthropic 兼容服务器),然后把这些后端统一重新暴露成 Ollama API、OpenAI API 和 Anthropic Messages API 三套接口。你注册一个后端,三套客户端就都能用了------一个只有 Ollama 的服务器,瞬间被 OpenAI 和 Anthropic 的客户端接管。
┌──────────────────────────────┐
Ollama/OpenAI ─▶│ 公网 cllama(对外暴露) │
客户端 │ -name qwen3.8:27b,embeddings│
└─────────────┬────────────────┘
│ 链式(outbound SSE)
┌─────────────▼─────────────┐
│ Windows 上的 cllama 子节点 │
│ (NAT 后面,无需入站连接) │
└─────────────┬─────────────┘
│
本地 ollama: qwen3.8:27b
子 cllama 主动拨出连接到父 cllama,用自己本地的 GPU 来服务父节点的流量。子节点永远不需要公网地址------连接是长连接的 SSE 隧道,断了自动重连。于是我的 Windows 开机后,跑一句:
sh
./cllama -listen :11435 -name local-qwen \
-parent 'https://token@public.example.com:11434/qwen3.8:27b'
再把自己的本地 Ollama 注册成它的后端:
sh
curl -X POST http://localhost:11435/admin/backends -d '{
"type": "ollama", "endpoint": "http://127.0.0.1:11434",
"model": "qwen3.8:27b", "upstream_model": "qwen3.8:27b"
}'
完事。现在公网服务器上的 qwen3.8 这个"虚拟模型",任何请求都会顺着隧道被转发到 Windows 上真正跑着的 qwen3.8:27b。家里那台车,终于从车库后门开出去了。额,我是不是造了一个写着mock名字qwen3.8:plus然后后面注册一个qwen3.8:27b的东西出来了 -_-///
消费级设备 vibe coding 生成 cllama
说实话,cllama 是我用 qwen3.6:35b + qwen3.8:flash-next 两个模型"vibe coding"出来的。过程没什么高深的东西,就是不停地把问题丢给模型,让它们干活:
- qwen3.6:35b 负责快速生成第一个demo版本,以最快的速度把代码写好。按照我设想的cllama有哪些go文件,它往里面填就好了。
- qwen3.8:flash-next 负责认真写代码,先擦好qwen3.6:35b留下来的问题,比如编译不通过等,再一点一点bug fix和重构。
你别说,qwen3.6:35b 的速度刚刚的,最快到120 token/s,最慢么 40 token/s。到了qwen3.8:flash-next,最快大概20 token/s,最慢大概 13 token/s,比antirez的混合2-4bit量化的deepseek-v4-flash稍微慢一点。这次是纯尝试下qwen3.8:flash-next,所以就没让deepseek登场。因为vibe coding,bug肯定还是不少的...我就顺手修过2行的2个bug。但是有一说一,qwen3.8的编译错误基本上很少,确实和opus 4.6有点比头了。本地现在能有这么聪明的模型,我觉得后面agent的外置知识和搜索引擎是相当重要的东西了。
小插曲是前段时间研究qwen3.6:35b给agent跑,然后关了flash attention;等3.8 flash next一出来下载完,再编译好llama.cpp一跑,Q4的80GB直接报内存不够,大哥我是128GB内存啊!啊,是了,flash attention O(N^2) 惹的祸。不过qwen迟迟不给qwen3.8:35b是不是怕大家都买本地设备去了哈...
实用的地方
- 一个注册,三套 API 。注册一个 Ollama 后端,OpenAI 客户端能调、Anthropic 客户端能调、Ollama CLI 也能调。
ollama run和ollama list甚至能对着 cllama 直接跑。 - Claude Code 兼容 。把
ANTHROPIC_BASE_URL指向 cllama 的/api/anthropic,Claude Code 就能驱动任何后端,不管上游是不是 Anthropic 原生。 - Web UI 内嵌在二进制里 。
/ui打开就是一个单页面板:实时请求队列、模型↔后端映射、系统设置,全走 SSE 实时刷新,不用轮询。 - 能力声明。每个后端可以声明自己能干什么(chat / vision / tools / thinking / embedding),代理按交集对外承诺,绝不吹牛。
无缝接入:IMA 直连你自己的模型
现在回到那个场景,把整条链拼起来:
- 服务器 (公网、纯 CPU):跑 cllama 父节点 + bge-m3 embedding,对外暴露
qwen3.8和embeddings两个模型,带上-token和-parentauth做认证。 - Windows(NAT 后面、有 GPU):开机后作为 cllama 子节点反向隧道注册 qwen3.8:27b 给服务器。关掉,隧道自动断开,服务器上的请求排队等它回来。
- 腾讯 IMA(面向公网的智能体,连着知识库):它需要的不是"连到 cllama 服务器"------它需要一个 OpenAI 格式的 API 地址。
手机端的IMA里把 API 地址填成 cllama 的 /api/openai,再配上 token,IMA 就直接以 OpenAI 客户端身份访问你自己的模型了。再写个skill让它查询vector知识库里的检索由 bge-m3 在服务器上本地完成并投影到postgres里;而真正"会说话"的推理,则顺着隧道落到 Windows 的 qwen3.8:27b 上。
于是生活变成了这样:平时 Windows 关着,IMA 和服务器安静地待机;等我有空,把 Windows 一开,隧道自动接上,IMA 立刻就能通过公网 API token 直连我的私有模型去处理知识,中间只靠 cllama 这条隧道牵着。没有 GPU 租赁,没有复杂的端口映射,直接开始大规模学习新知识,探索新世界咯。从今天起,关心粮食和蔬菜,中医和种地我来啦...
好了,用了这么长时间大模型,第一次开始用模型提速写文章,之前怎么都在手搓我也很是诧异;看到ASCII的流程图,一眼AI哈。这篇文章先让3.6生成了一遍,就是技术description,再用3.8也不太行,切成deepseek重写了,结果还是给我一顿胡扯,尤其是IMA的部分。