自托管 Laya:Jev 兼容 HTTP API、命令行、Docker 与 MCP Server
用 laya-serve 把 Laya 部署成自己的 API:兼容 Jev 的 POST /v1/systemone 接口、环境变量、API Key、Docker、NixOS、laya 命令行与 MCP Server。
上游 laya Python 包不只能在你自己的脚本里调用。它还自带一个与 TypeSafe 托管版 Jev API 协议一致的自托管 HTTP 服务、一个用于快速测试的命令行工具,以及一个可选的 MCP Server,供 Agent 客户端调用。
本文把这些方式集中整理在一起。一手资料:Laya GitHub 仓库。
方式一:兼容 Jev 的 HTTP 服务(laya-serve)
laya.serve 通过 POST /v1/systemone 对外提供 Router。上游说明 Laya 的返回结构与 Jev 完全一致(choice / score / noul 答案加上 {input_tokens, output_tokens} usage 字段),因此现有的 Jev 客户端只需要改一下 base URL。
pip install "laya[serve]" # 额外安装 fastapi、uvicorn、python-multipart
LAYA_DEVICE=cuda LAYA_PRELOAD=1 laya-serve # 监听 0.0.0.0:8000,预加载全部 3 个 checkpoint
发送请求:
curl -s localhost:8000/v1/systemone -H 'content-type: application/json' -d '{
"state": {"body": "billed twice, refund please or we cancel"},
"questions": {"dept": {"type": "choice", "instructions": "which team?",
"criteria": {"billing": "refunds", "tech": "bugs"}}}
}'
配置项
| 环境变量 | 作用 |
|---|---|
LAYA_HOST、LAYA_PORT | 监听地址与端口(默认 0.0.0.0:8000) |
LAYA_DEVICE | cuda、cpu 或 mps,直接传给 torch |
LAYA_PRELOAD | 启动时就构建 checkpoint,而不是等第一次请求 |
LAYA_MODELS | 需要预加载的 checkpoint,逗号分隔 |
LAYA_THREADS | 限制 CPU 推理时 torch 的线程数(不超过物理核数) |
LAYA_AUTO_TASK | 开启自动任务识别 |
LAYA_API_KEY | 设置后,客户端必须携带 Authorization: Bearer <key> |
如果客户端请求里的 model 字段是 Laya 的 checkpoint 名(english、multilingual、typed-decisions),就按指定的来;否则由 Router 根据文字脚本和语言自动选择。
安全默认值
从 0.3.11 起,服务端使用防时序攻击的 API Key 校验,限制请求大小和问题数量(超限返回 413),JSON 格式错误返回 400,报错信息不泄露路径;0.3.12 还对 chunked 上传也强制执行了大小限制。如果服务要暴露到 localhost 之外,务必设置 LAYA_API_KEY,并放在你常用的 TLS 反向代理之后。
方式二:Docker
上游在 docs/docker.md 维护了 Docker Compose 快速上手:在 CPU 上跑一个示例请求,并在多次运行之间保留已下载的模型。Compose 默认只把 laya-serve 绑定到 loopback,并带有健康检查。另外还提供原生 ARM64 和 DGX Spark 的容器构建。
方式三:NixOS
仓库本身是一个 Nix flake。在带 NVIDIA GPU 的机器上执行 nix run .#laya-serve 即可构建并启动服务。NixOS 主机可以导入 laya.nixosModules.default 并启用 services.laya-serve:它会以加固过的 DynamicUser systemd 单元运行,权重缓存在 /var/lib/laya-serve,可选的 bearer token 通过 LoadCredential 读取。
方式四:本地 Web 界面
不想写客户端、只想手动测试的话,上游仓库里的 examples/server.py 是一个独立的 FastAPI 应用:提供请求构建器,把 choice / score / noul 结果渲染成进度条,同时提供 /predict 和 /predict/batch 两个 JSON 接口:
pip install "laya[serve]"
python examples/server.py # http://127.0.0.1:8000
--no-preload 改为按需加载 checkpoint,--device cuda|cpu|mps 指定设备。
方式五:laya 命令行
安装包后会同时装上 laya 命令:
laya "I was charged twice, please refund" # 只做路由判断;离线可用,不下载模型
laya "Refactor this service" --predict # 完整预测(首次会下载 checkpoint)
laya "Mein Konto wurde zweimal belastet" --lang de # 强制指定语言
laya "My payment failed twice" --preset triage # 预设:triage、email、guard、moderation、router
只做路由判断时不会下载任何 checkpoint,毫秒级返回。
方式六:给 Agent 客户端用的 MCP Server
Laya 可以作为 MCP stdio server 运行,让 Claude Desktop、Cursor 等 MCP 客户端直接把 typed decision 当作工具调用(laya_predict、laya_route、laya_preset、laya_status):
pip install "laya[mcp]"
laya-mcp-server
{
"mcpServers": {
"laya": {
"command": "laya-mcp-server",
"env": { "LAYA_DEVICE": "cpu" }
}
}
}
MCP Server 默认预加载 english,multilingual,typed-decisions 按需加载。和 SDK 一样,它只适合结构化决策,不适合开放式问答。
资源规划:延迟与内存
上游在 Router(preload=True) 下的实测:T4 GPU 每次请求 32.8 ms,CPU 上 193–464 ms。惰性的 Router() 默认常驻两个 checkpoint;设置 max_loaded=1 会在每次语言切换时重新加载,实测中位数 CPU 7.4 秒、T4 10.3 秒。部署服务时,需要用到的 checkpoint 都应预加载。
模型卡给出的下载体积:英文 checkpoint 约 808 MB,多语言 checkpoint 约 647 MB。
社区服务层
如果官方服务不够用,可以看看 Arbiter(checkpoint 路由、batch、metrics 和 Playground)或 macOS MPS 运行时。Runtimes 总览 对比了所有方案。
相关阅读
最后核实:2026 年 9 月 24 日。