跳转至

生产部署

上线前,先划清四个边界:谁能调用 Agent、它能访问什么、一次请求最多消耗多少资源, 以及进程崩溃后能恢复哪些状态。

建议从“只监听本机、Workspace 只读、设置预算、无高风险 Tool”开始,再逐项开放能力。 每开放一项,都应同时补上认证、审批、隔离或恢复策略,而不是最后一次性加固。

部署清单

边界 生产环境选择
身份认证 serve() 在非回环地址上从不匿名开放 API(自动生成或固定的 token);按用户区分身份需要 auth= 或带认证的网关
网络 除非前方已有受保护的代理,否则保持默认的 Loopback 绑定
Workspace 从 readonly 或关闭状态开始;本地可写 Workspace 等同于宿主机代码执行能力
密钥 只传入必要的环境变量;Workspace Shell 默认使用最小环境,除非设置 inherit_env=True
资源限制 设置 max_turns、RunBudget、Provider 超时、Tool 超时和输出上限
高风险操作 写入、外部副作用、定时任务和特权调用应要求人工审批
持久化 Session 保存对话,Checkpointer 恢复进行中的 Run,并备份相应存储
可观测性 记录终止事件、失败、耗时、Token 用量和审批决定
并发 内置 Web 服务保持单 Worker;托管 Run 和审批状态属于进程内状态
TLS 与代理 显式配置 CA Bundle 和代理信任;生产环境不要关闭证书校验

保守的起始配置

from lovia import Agent, RunBudget
from lovia.workspace import Workspace

agent = Agent(
    name="service-agent",
    model="<model>",
    workspace=Workspace.local("./data", mode="readonly"),
    default_tool_timeout=30,
    max_tool_output_chars=50_000,
)

budget = RunBudget(max_total_tokens=1_000_000, max_tool_calls=50)

在应用边界传入预算和持久化配置:

result = await agent.run(
    "分析最新报告。",
    max_turns=12,
    budget=budget,
    session=session,
    session_id=user_conversation_id,
    checkpoint=checkpoint,
)

具体上限取决于工作负载;关键在于流量到来前就明确设置边界。

安全地提供服务

token 是一份共享凭据

create_app() 本身信任所有请求;serve() 拒绝在非回环地址上运行这样的应用,并为直接传入的 Agent 自动生成 token。这个 token 是一份共享密钥:持有它就能访问全部 API,若 Workspace 可写, 还等于能以服务端用户身份执行代码。需要按用户区分身份时,请使用 auth=(见 Web 服务端)或带认证的反向代理,并加上限流。

内置服务按单进程设计。SQLite 数据可以持久化,但正在运行的 Run、审批、SSE 订阅者和定时任务 协调状态都保存在进程内。请使用 workers=1;需要扩展时,应运行相互隔离的应用实例,并明确 设计路由和存储所有权。

失败与恢复

  • 使用 RetryPolicy 在 Run 内重试 Provider 的瞬时故障。
  • Worker 可能在 Run 中途重启时,使用 Checkpoint。
  • Session 用于保存已经完成的对话;不要把完成过的 run_id 用于下一条用户消息。
  • 崩溃恢复下,Tool 副作用应按“至少一次”处理,除非 Tool 使用 ctx.run_id 和调用参数实现幂等。
  • 备份 SQLite 或自定义 Store,并在依赖它们前实际演练恢复流程。

延伸阅读