RolloutAgentLoop 基类定义了 Agent 与 Osmosis 训练集群之间的接口约定。本指南详细介绍该接口、必需方法以及生产级实现的最佳模式。
必需与可选功能
在深入了解之前,以下是必需和可选功能的快速概览:必需
| 功能 | 描述 |
|---|---|
name 属性 | Agent 的唯一标识符 |
get_tools(request) 方法 | 当 /v1/rollout/init 被调用时返回工具列表。训练集群需要此信息来了解有哪些可用工具。 |
run(ctx) 方法 | 执行您的 Agent 循环逻辑 |
可选
| 功能 | 描述 |
|---|---|
ctx.log_event() | 调试日志 - 仅在启用 --log 标志时写入 |
ctx.record_tool_call() | 用于分析的指标跟踪 |
get_last_assistant_content() | 用于日志/奖励的辅助函数 - 非 SDK 组成部分 |
compute_reward_from_messages() | 仅在平台配置为在 Remote Rollout 中计算奖励时才需要 |
RolloutAgentLoop 基类
每个 Agent 必须继承RolloutAgentLoop 并实现两个必需的方法:
必需属性
| 属性 | 类型 | 描述 |
|---|---|---|
name | string | Agent 的唯一标识符 |
必需方法
| 方法 | 描述 |
|---|---|
get_tools(request) | 以 OpenAI function 格式返回工具列表。在收到 /v1/rollout/init 时被调用,返回的工具会包含在发送给训练集群的响应中。 |
run(ctx) | 执行 Agent 循环并返回结果 |
当训练集群向
/v1/rollout/init 发送请求时,SDK 会自动调用您的 get_tools() 方法,并在 InitResponse 中返回工具列表。这告知训练集群此次 Rollout 有哪些可用工具。RolloutContext
ctx 参数提供运行 Agent 所需的一切:
属性
| 属性 | 类型 | 描述 |
|---|---|---|
ctx.request | RolloutRequest | 包含消息和参数的原始请求 |
ctx.tools | list | get_tools() 返回的工具 |
方法
| 方法 | 描述 |
|---|---|
ctx.chat(messages, **kwargs) | 调用 LLM |
ctx.complete(messages, finish_reason, reward) | 返回成功结果 |
ctx.error(message) | 返回错误结果 |
ctx.record_tool_call(latency_ms) | 跟踪工具执行指标 |
ctx.log_event(event_name, **data) | 记录调试事件(启用日志时) |
RolloutRequest
请求包含来自训练集群的所有信息:| 字段 | 类型 | 描述 |
|---|---|---|
messages | list | 初始对话消息 |
max_turns | int | 允许的最大 Agent 轮次 |
max_tokens_total | int | 整个 Rollout 的 Token 限制 |
completion_params | dict | LLM 参数(temperature 等) |
metadata | dict | 自定义元数据(如 ground_truth) |
实现工具
工具 Schema 格式
工具使用 OpenAI 的 function calling 格式:工具执行辅助函数
SDK 提供了用于执行工具的实用工具:并行工具执行
并发执行多个工具:完整 Agent 示例
以下是一个包含多个工具的完整 Agent 实现。请注意必需和可选功能的区别:服务器配置
create_app() 参数
create_app() 函数接受多个可选参数,用于微调服务器行为:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
agent_loop | RolloutAgentLoop | 必需 | 您的 Agent 循环实现 |
max_concurrent | int | None | None | 最大并发 Rollout 数(None = 无限制) |
record_ttl_seconds | float | None | 3600.0 | Rollout 记录的 TTL(秒) |
settings | RolloutSettings | None | None | 自定义配置设置 |
debug_dir | str | None | None | 调试日志目录 |
on_startup | Callable[[], Awaitable[None]] | None | None | 异步启动回调 |
on_shutdown | Callable[[], Awaitable[None]] | None | None | 异步关闭回调 |
credentials | WorkspaceCredentials | None | None | 平台凭据(从 osmosis login 自动加载) |
server_host | str | None | None | 用于平台注册的主机地址 |
server_port | int | None | None | 用于平台注册的端口 |
api_key | str | None | None | 用于 TrainGate 认证的 API 密钥(省略则自动生成) |
RolloutSettings 配置
对于高级配置,使用RolloutSettings 和 RolloutClientSettings:
环境变量
所有客户端设置都可以通过环境变量进行配置:| 环境变量 | 描述 | 默认值 |
|---|---|---|
OSMOSIS_ROLLOUT_CLIENT_TIMEOUT_SECONDS | HTTP 超时时间 | 300.0 |
OSMOSIS_ROLLOUT_CLIENT_MAX_RETRIES | 最大重试次数 | 3 |
OSMOSIS_ROLLOUT_CLIENT_COMPLETE_ROLLOUT_RETRIES | /completed 端点重试次数 | 2 |
OSMOSIS_ROLLOUT_CLIENT_RETRY_BASE_DELAY | 初始重试延迟 | 1.0 |
OSMOSIS_ROLLOUT_CLIENT_RETRY_MAX_DELAY | 最大重试延迟 | 30.0 |
OSMOSIS_ROLLOUT_CLIENT_MAX_CONNECTIONS | 连接池大小 | 100 |
OSMOSIS_ROLLOUT_CLIENT_MAX_KEEPALIVE_CONNECTIONS | Keep-alive 连接数 | 20 |
get_last_assistant_content 辅助函数(在某些示例中出现)是完全可选的 - 它仅对日志记录或奖励计算有用,SDK 并不要求使用它。处理奖励
Remote Rollout 中的奖励计算是有条件的 - 是否需要返回奖励取决于您的平台配置:| 平台配置 | 奖励要求 |
|---|---|
| 奖励在平台侧计算 | 返回 None - 无需奖励 |
| 奖励在 Remote Rollout 中计算 | 必须返回一个 float 值 |
需要奖励的情况
如果您的平台配置为在 Remote Rollout 服务器中计算奖励,您的run() 方法必须通过 ctx.complete() 返回奖励值:
奖励可选的情况
如果奖励计算在其他地方处理(例如平台侧),您可以简单地返回None:
辅助函数(可选)
以下辅助函数是完全可选的 - 它们对日志记录和奖励计算有用,但 SDK 并不要求使用:提取解答
提取答案的常见模式:调试日志
使用ctx.log_event() 来跟踪执行过程:
错误处理
优雅地返回错误:最佳实践
尽早验证
尽早验证
在部署之前始终运行
osmosis validate,以尽早发现问题。处理 Token 限制
处理 Token 限制
检查
ctx.request.max_tokens_total 并在超出时提前中断。跟踪指标
跟踪指标
使用
ctx.record_tool_call() 来跟踪工具执行情况以进行分析。本地测试
本地测试
使用
osmosis test 配合 --interactive 来调试 Agent 行为。策略性记录日志
策略性记录日志
在关键点使用
ctx.log_event()(LLM 调用前、工具执行后、完成时)。