Skip to content
WanderingssPublic

About

通用 LLM 后端会话亲和调度池:任意 OpenAI/Anthropic 兼容服务(vLLM / llama.cpp / Ollama / LM Studio…)入池。纯 Python 标准库,单文件零依赖。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

12 Commits

Folders and files

Repository files navigation

llm-pool

自建 LLM 服务群的会话亲和调度池:纯 Python 标准库、单文件、零 pip 依赖,Linux / Windows 都能跑。 任何 OpenAI / Anthropic 兼容后端(vLLM、llama.cpp server、Ollama、LM Studio、TGI……)用 --backend 指进来就能组池;一个文件拷到机器上就是全部部署。

会话亲和 会话 key → 后端钉住。KV/prefix cache 活在那台机器的显存里,动一次会话 = 整段重灌(分钟级),所以能不挪就不挪
模型名不参与路由 GET /v1/models 只用来判存活并把列表显示在 /pool/status;请求点名什么都不改变去向(2026-10-20)。理由:后端根本不校验 model 字段,拿已加载的权重答任何名字,那句自报只是广告,不能当调度依据
手动钉(唯一按名路由) --model-pin MODEL=NAME 硬路由:命中名 → 该后端(借道,不改会话归属);它 down 就 503,绝不换个模型答你。没钉的名字一律按负载放置
只故障改钉 连续 3 次探测失败标 down,会话挪走;它复活后不搬回,没有乒乓
生命周期日志 append-only 的"谁杀了它"证据链(START / BEAT / CTRL / CRASH / EXIT + 启动器代写 WATCH)
/pool/status 只读诊断:每个后端的 up/down、模型列表、in-flight、busy_for、钉住了几条会话
/pool/ui 看板 同一份快照的页面版(2026-10-21):每台一张卡(上/down、探测连败 n/3、in-flight、busy_for、钉住会话数、自报模型、绑在它身上的 pin 与 MODEL-MISMATCH)+ 负载分布条 + pin 表 + 可过滤的会话图。页面内嵌在这一个文件里、零外链、带 CSP,断网的 GPU 机上也照样渲染;只读,不预扣名额、不给后端发任何请求

快速开始

python pool_proxy.py --backend node-a=http://127.0.0.1:8080 --backend node-b=http://127.0.0.1:8081 --local node-a

客户端指向 http://127.0.0.1:8124/v1(默认端口 8124)即可,就像直连一台服务器。看一眼池子——浏览器打开看板,或者直接读那份 JSON(同一个数据源,两个面孔):

http://127.0.0.1:8124/pool/ui          # 看板:每台一张卡 + 负载分布 + 会话图(别名 /pool/dashboard)
curl -s http://127.0.0.1:8124/pool/status | python -m json.tool

看板是只读的:它不预扣 in-flight 名额,也不给后端发任何请求,所以"开着看板看"不会改变下一个会话落在哪台。

多机生产:--listen-host 0.0.0.0 前务必确认这台机器只在可信网络(见下"它不是什么")。

它不是什么

  • 不是通用 HTTP 负载均衡器:分流单位是"会话",不是请求。会话亲和就是它存在的全部理由。
  • 不是网关:不做认证、TLS、密钥管理、限流。把这些放在你已有的反代层(nginx / Caddy / frp tailnet), 或只在可信网段里暴露它。
  • 不启动后端、不搬状态:--backend 指的是你已经在跑的服务。后端挂了,它的会话被挪到别人 那里重灌——这是亲和设计的代价,不是缺陷:它保证没有任何跨机的会话文件、共享目录或数据通道。
  • 不碰后端内部:探测只读公开的 /v1/models(退化时 /health),转发只转发。没有任何 "让后端 save/restore 一下"的私有协议。

跑测试

python test_pool_proxy.py     # 60 条断言:亲和、并发摊平、故障转移、名字不路由、pin 借道、挂起客户端回收、状态文件残缺可见、看板只读且自包含

假后端全在 127.0.0.1 回环上,不需要任何真引擎。要在空闲机器上跑:burst / in-flight 断言靠 墙钟窗口,机器忙时会"正确地"错放。

原理与运维

配置与部署全手册(每种后端怎么接、六种典型部署、暴露与安全配方、启动器模板、FAQ)在 docs/usage.md;机制全文(决策树、key 定义、探测语义、生命周期契约、配置参考、排障手册)在 docs/design.md。改代码前读 AGENTS.md。

来历

本库从一套私有双机池(曾用名 strata-pool,本地目录可能仍叫这个)演进而成,2026-10-18 起通用化: 对原引擎的私有协议依赖(/slots/、engine.version、会话文件指纹)已全部移除, 现在的探测与路由只讲 OpenAI 兼容层的公开语义。旧部署的真实运行手册不在本仓库。

待定

  • 闲置会话浮动 + 释放钉:长会话闲置后是否允许被下一次故障"顺手"挪走、以及何时归还计数名额。 观察期到 2026-10-22,在此之前不引入"主动搬"这个动词。

About

通用 LLM 后端会话亲和调度池:任意 OpenAI/Anthropic 兼容服务(vLLM / llama.cpp / Ollama / LM Studio…)入池。纯 Python 标准库,单文件零依赖。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages