自托管 Laya:Jev 兼容 HTTP API、命令行、Docker 与 MCP Server

用 laya-serve 把 Laya 部署成自己的 API:兼容 Jev 的 POST /v1/systemone 接口、环境变量、API Key、Docker、NixOS、laya 命令行与 MCP Server。

最后更新: 2026/9/24

上游 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_HOSTLAYA_PORT监听地址与端口(默认 0.0.0.0:8000
LAYA_DEVICEcudacpumps,直接传给 torch
LAYA_PRELOAD启动时就构建 checkpoint,而不是等第一次请求
LAYA_MODELS需要预加载的 checkpoint,逗号分隔
LAYA_THREADS限制 CPU 推理时 torch 的线程数(不超过物理核数)
LAYA_AUTO_TASK开启自动任务识别
LAYA_API_KEY设置后,客户端必须携带 Authorization: Bearer <key>

如果客户端请求里的 model 字段是 Laya 的 checkpoint 名(englishmultilingualtyped-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_predictlaya_routelaya_presetlaya_status):

pip install "laya[mcp]"
laya-mcp-server
{
  "mcpServers": {
    "laya": {
      "command": "laya-mcp-server",
      "env": { "LAYA_DEVICE": "cpu" }
    }
  }
}

MCP Server 默认预加载 english,multilingualtyped-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 日。