自建 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,在此之前不引入"主动搬"这个动词。