修改代码前:
- 保留最近一次成功的 v0.2 evaluation run,以便对比。
- 使用 Python 3.12 或更高版本。
- 修改 SDK requirement 后,重新创建 rollout environment 和 lockfile。
- 迁移前后都搜索一次已移除的 API。
升级到 0.3.3
如果已在使用 0.3.0–0.3.2,请先完成本节,再参考后面的 backend 迁移指南。虽然 0.3.3 仍属于 0.3 发布线,它仍变更了 rollout protocol 和自定义 backend contract。- 将 CLI/调用方环境与所有 rollout server 环境同时升级到
osmosis-ai>=0.3.3,<0.4,保留项目需要的 extras,并更新各自的 lockfile。内置AgentWorkflow、Grader和 backend constructor 的接口保持不变。 - 用
RolloutClient替换HttpRolloutDriver和 callback request/response models。Completion 改用带 lease 的长轮询;请移除 completion callback URL。每次尝试提供唯一rollout_id,chat endpoint 要求认证时提供llm_api_key。await run_rollout_async()返回可等待的RolloutHandle,提供状态和阶段等待方法。 - 将自定义 backend 更新为
async execute(request) -> ExecutionOutcome。返回ExecutionOutcome(workflow=workflow_result, grader=grader_result),不再调用 completion callback;通过 activeRolloutContext上的await rollout_ctx.set_status(RolloutStatus.GRADING)发布进度。遵循request.grade;不需要 grading 的运行使用grade=False。 - 将本地 LLM bridge 的 import 从
osmosis_ai.rollout.controller移到osmosis_ai.eval.local。后者需要evalextra;RolloutClient只需要基础 package。 - 如果已有 local eval run 使用旧 protocol 记录,请用新的 run name 启动运行。Local eval protocol fingerprint 现为
0.4;这些旧 run 无法在 0.3.3 下 resume。需要 resume 时使用之前的 SDK。 - 将 managed SkyPilot placement 替换为
EnvironmentConfig(type=EnvironmentType.DAYTONA),并配置DAYTONA_API_KEY。HARBOR_SKYPILOT_CONTEXT不再读取。凭据与 Daytona inactivity cleanup 说明见托管与自托管环境。
LocalBackend 用户
LocalBackend 在 v0.3 中保留相同的 keyword-only constructor:
1. 升级 Package 并选择功能
基础 distribution 包含 CLI 和 framework-neutral rollout core。只添加 rollout 实际 import 的 extras:openai-agents、harbor、rubric 和 parquet。验证 Parquet dataset 时,请用 parquet 替换以前的 platform extra。对于 source checkout,请使用仓库的 dev dependency group,而不是 published dev extra。
2. 更新 Public Import 和 Workflow Return
Rollout package root 现在只导出 framework-neutral core types。请从对应的 public submodule import 每项 optional feature:osmosis_ai.rollout.backend.harbor import HarborBackend。不要再依赖 from osmosis_ai import *,也不要使用以前由 osmosis_ai.rollout re-export 的 optional name。
AgentWorkflow.run() 现在返回一个 message history,而不是 samples mapping。可以返回 AgentWorkflowOutput、返回由 SDK 包装为 messages 的 bare message list,或返回 None 以使用 active RolloutContext 收集的 sample:
metrics 中的每个 value 都必须是有限值;NaN、正无穷和负无穷都会被拒绝。只有当 integration 或 custom source 已为该 execution 注册 ambient sample 时,才应返回 None。
3. 从多个 Sample 改为一个 Sample
每次 workflow execution 现在最多生成一个RolloutSample,grader 为它分配一个标量 reward。
将遍历 samples 的 grader 改为显式检查一个 sample:
set_reward() 会抛出 ValueError。在评分前显式抛出错误,通常能提供更清晰的 evaluation failure。
4. 每次 Execution 只注册一个 Agent 或 Session
在AgentWorkflow.run() 内只构造一个已注册的 OsmosisStrandsAgent 或 OsmosisMemorySession。第二次 registration 会抛出 ValueError。
对于 OpenAI Agents,v0.3 session 不再接收 name 或 sample-ID 参数:
5. 更新自定义 Sample Source
内置 integrations 已使用 v0.3 API。自定义 integration 必须实现单数形式的 source contract:RolloutSample 设置 id。如需控制标准化的 ATIF transcript,请设置 trajectory_messages;将其设为 None 会关闭该 sample 的 trajectory 持久化。
6. 更新自定义 Routing 和 Backend Adapter
如果只使用内置 integrations 和LocalBackend,请跳过此步骤。
将 execution 提供的 chat-completions URL 视为不透明的 rollout-scoped endpoint。Completion callback URL 已在 0.3.3 中移除。不要追加 rollout ID,也不要附加已移除的 x-sample-id 和 x-rollout-id routing headers。
自定义 backend 返回 ExecutionOutcome,包含 workflow 和可选 grader 的 ExecutionResult,每个 result 至多包含一个 sample。如果直接读取 container exchange files,请将 reader 更新为单数 file names 和 payloads:
sample.json
reward.json
7. 迁移 Dataset Schema
从0.3.0rc3 开始,是否存在 metadata column 会为整个 dataset 选择一种统一的 schema mode:
不要混用 prompt-mode 和 metadata-mode rows。JSONL rows 必须使用一致的 field set,metadata value 在整个 file 中也必须有效且 type-consistent。Upload 或 submission 前请在本地验证 JSONL、CSV 或 Parquet:
8. 迁移 Per-Run Secret
在 run config 中只声明 secret name,绝不要填写 value:--secrets-file、process environment 或隐藏的 interactive prompt:
osmosis train submit 和 osmosis benchmark submit 的行为相同。对于 benchmark run,只有 [secrets].required 中的 name 可以接收 per-run value;model、harness、judge 和 verifier secret reference 必须已存在于 platform secret store 中。
9. 验证 LocalBackend 迁移
-
确认 rollout 中不再出现已移除的 API:
-
重新创建 rollout environment,确保 lockfile 中包含
osmosis-ai>=0.3.3,<0.4和所选 extras。 - 在本地运行 workflow,确认每次成功的 execution 都生成一个 sample。
- 提交一次 evaluation run,确认每个已评分 sample 都有一个标量 reward。
- 在提交 training 前,将 reward 和最终 messages 与最近一次成功的 v0.2 evaluation 进行对比。
LocalBackend 常见问题
第二个 agent 或 session 触发 registration error
第二个 agent 或 session 触发 registration error
该 workflow execution 已经注册了 sample source。请复用一个 agent 或 session 完成 conversation,或者将独立 candidates 拆分到不同的 workflow executions。
Grader 没有 sample
Grader 没有 sample
请在
AgentWorkflow.run() 内构造受支持的 agent 或 session。在模块 import 时创建的 object 无法向 active rollout context 注册。无法导入可选 integration
无法导入可选 integration
在 rollout-local environment 中安装对应的 extra,然后重新生成 lockfile。
Model call 到达了错误的 rollout
Model call 到达了错误的 rollout
将提供的 chat-completions URL 直接传给 integration。移除重新构造 URL、追加 rollout path segment 或附加旧 routing headers 的代码。
HarborBackend 用户
Harbor 用户必须先完成 LocalBackend 用户中的共享 dependency、import、workflow、grader、sample-source、routing、dataset 和 secret 变更,然后再迁移 Harbor class 和 constructor。1. 升级 Package 和 Import
安装 v0.3 Harbor 和 server 功能:harbor extra 已包含 Daytona dependencies。对于 managed rollout,请显式选择 EnvironmentType.DAYTONA,并按照托管与自托管环境中的说明配置 DAYTONA_API_KEY。HarborBackendV2,只需修改 class name,并保留其 v2 constructor arguments:
HarborBackendV2 不会作为 alias 保留。
2. 替换 Pre-v0.3 Constructor
旧 backend 会把 source tree 和 SDK mount 到 task environment。v0.3 backend 会把 workflow project 打包为 wheel,并安装到 task container 内。
如果 harness 使用了 private
_sdk_source_dir argument,请将其移除。
v0.3 constructor 还新增了以下控制项:
3. 选择 Task Mode
要最接近地替代旧的单个task_dir,请使用 template mode:
instruction.md。这会保留与 LocalBackend 相同的 prompt ownership,同时增加 Harbor trial environment。
当 tasks_dir 中每个 task 都有独立目录时,请使用 dataset mode:
metadata["harbor_task_id"];选中的 task 会保留自己的 instruction.md。需要保留已编写 Harbor tasks,或已经可以逐 task 运行的本地 Harbor dataset 时,请使用此 mode。
无论使用哪种 mode,metadata["harbor_task"] 都可以选择 per-rollout 本地路径、"org/name@ref" 形式的 Harbor registry package,或 Git task。Git task 还需要设置 metadata["git_url"],并应固定 metadata["git_commit_id"]。
如果旧 backend 使用 custom_tests_dir,请把这些 tests 移入每个 task:
grader=,task-native verifier 仍然是权威来源;只有缺少 tests/test.sh 时,backend 才会生成 Osmosis grader verifier。传入 grader=None 可明确选择 task-native reward path。
4. 打包 Workflow 代码,而不是 Mount
对于AgentWorkflow,backend 会从 code_dir 构建 wheel,并在 trial 启动时安装到 container。该目录必须包含 pyproject.toml 和一个可导入的 top-level Python package。省略 code_dir 时,backend 会尝试定位包含 workflow class 的 project。
如果 build system 会提前创建 Osmosis bundle wheel,请使用 bundle=。不要同时传入两个路径并期望它们合并;提供 bundle 后会直接使用它。
旧的 HarborAgentWorkflowContext.environment adapter 已移除。Workflow 现在会在 task container 内运行,接收标准 AgentWorkflowContext,并通过普通 Python API 访问文件或 processes:
OsmosisInstalledAgent 也已移除。不要实例化或继承它;请通过 agent= 传入 AgentWorkflow,或选择已注册的原生 Harbor agent name。
5. 选择 Agent 和 Reward Source
agent= 接受 AgentWorkflow class/import path,或以下已注册的原生名称之一:"terminus-2"、"mini-swe-agent" 和 "oracle"。
"oracle" 会运行 reference solution 来验证 dataset 或 verifier。它不会生成 model trajectory,不能用于 training。6. 添加 Prewarming 和 Lifecycle Controls
在 rollout server 接收流量前,prewarm 所选 task images 和 agent setup:max_queue_depth 后,queue 已满时 POST /rollout 会返回带 Retry-After: 5 的 429。v0.3 还提供:
GET /rollout/{rollout_id}/statusPOST /rollout/cancelHarborBackend.rollout_status()HarborBackend.cancel_rollouts()
7. 验证 HarborBackend 迁移
-
确认旧 class 和 constructor keywords 不再出现:
-
确认
tasks_dir指向有效的 template task 或 dataset root。 - 构建 workflow bundle,并修复 package layout 或缺少 dependency 的错误。
-
Template mode 运行
await backend.prewarm();dataset mode 则传入 task IDs。 - 提交一个 rollout,并检查 workflow sample、reward source、Harbor logs 和已归档 artifacts。
- 如果 calling controller 依赖 status 和 cancellation,请实际验证这些功能。
- 在 training 前运行 evaluation,并将 reward 和最终 messages 与最近一次成功的 v0.2 run 对比。
HarborBackend 常见问题
HarborBackend 拒绝 task_dir、user_code_dir 或 workflow
HarborBackend 拒绝 task_dir、user_code_dir 或 workflow
Import 已解析到 v0.3 backend,但调用仍使用已移除的 constructor。请按照上表替换所有旧 parameters。
无法打包 workflow project
无法打包 workflow project
将
code_dir 指向包含 pyproject.toml 和一个可导入 package 的目录。确保 workflow 和 grader 可以通过该 package 的 import path 寻址。Dataset-mode request 找不到 task
Dataset-mode request 找不到 task
将
metadata["harbor_task_id"] 设为 tasks_dir 下的目录,或将 metadata["harbor_task"] 设为受支持的本地、package 或 Git reference。Trial 完成后没有 reward
Trial 完成后没有 reward
如果 task 包含
tests/test.sh,请修复该 verifier,并确认它会输出 Harbor 的 reward channel;Osmosis grader 不会覆盖它。如果 task 没有 verifier,则改为传入 Osmosis grader。Rollout 代码仍依赖 ctx.environment
Rollout 代码仍依赖 ctx.environment
移除 legacy adapter 调用。Workflow 现在运行在 container 内,因此请使用普通 filesystem、subprocess 和 network API。