修改代码前:
- 保留最近一次成功的 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.10,<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 替换为受支持的 Harbor 环境。预构建任务镜像请选择 OpenSandbox,基于 Dockerfile 的任务请选择 Daytona。
HARBOR_SKYPILOT_CONTEXT不再读取。配置与凭据说明见托管与自托管环境。
从 0.3.3–0.3.6 升级到 0.3.7
- 将 CLI、rollout 调用方以及每个 rollout 的
pyproject.toml依赖升级到osmosis-ai>=0.3.7,<0.4,保留原有 extras。更新各自的 lockfile 并重新构建受影响的运行时镜像,以包含依赖安全修复。仅升级 CLI 不会更新 rollout 或 sandbox 中的包。osmosis rollout init生成的 rollout scaffold 声明的是osmosis-ai[server]>=0.3.0,<0.4,请一并提高该下限。 - 移除
0.3.5引入、0.3.6删除的RolloutClient.drain()、POST /drain以及 drain 请求和响应模型。使用health()和wait_idle(process_id=...)观察任务,通过 SIGTERM 停机。wait_idle()不阻止新的 admission,也不验证外部上传是否完成。 - 为 host 预留足够的时间,让 backend 完成停机和 Harbor sandbox 清理;参见 Harbor server 停机。拥有资源的自定义 backend 可以实现
ExecutionBackend.shutdown()。 - 在已有 Uvicorn entrypoint 中添加
timeout_keep_alive=2160,参见安装示例。0.3.7新生成的 scaffold 已包含此设置;升级包不会改写已有 entrypoint。 - Harbor 用户请查看版本兼容性与 OpenSandbox 配置。已有子类保留
build_trial_config、build_agent_config和harness_agent_config的原有签名;请勿向这些 hook 添加preview_path参数。打包的 workflow 需要更新 sandbox 内的 SDK 才能支持实时轨迹预览。自0.3.5起,Harbor rollout ID 不能包含冒号或控制字符,请使用可移植的 ID。 - 移除调用公开
osmosis dev server、osmosis images命令或其专用OsmosisClient方法的脚本;这些功能已在0.3.5中删除。各版本详情见更新日志。
从 0.3.7 升级到 0.3.8
- 将 CLI、rollout 和 sandbox 的依赖下限提高到
osmosis-ai>=0.3.8,<0.4,保留原有 extras。调整冲突的版本限制,更新每份 lockfile,并重新构建受影响的运行时镜像。仅升级 CLI 不会更新已有镜像中的包或 CA bundle。 - 移除对
RolloutInfo.is_active的读取、is_activeconstructor 参数,以及对osmosis rollout list --json中is_active字段的依赖。这个始终为 true 的字段已被删除。新增的description和last_synced_at是元数据,不代表活动状态。 - 如果
osmosis train info --output <path>需要替换已有文件,请加上--overwrite。否则命令会保留该文件并报告保存警告。参见train info。 - 查看 Harbor prewarm 模式。Dataset mode 可以自动发现 task,无需显式 ID;个别 prewarm 失败可能导致相应 task 不可用;Harbor extra 现支持 Harbor
>=0.20.0,<0.25。
full extra 包含上述要求。完整发布说明见 0.3.8 更新日志。
从 0.3.8 升级到 0.3.9
- 升级前,请使用创建 run 的 SDK 版本完成被中断的命名本地 eval run。即使 rollout 文件没有变化,新 source digest 也会改变。因此,
0.3.9会拒绝恢复或对0.3.8及更早版本创建的 run 使用--retry-failed,并报告Changed: rollout。 - 将 CLI、调用方和 rollout 依赖升级到
osmosis-ai>=0.3.9,<0.4,保留原有 extras。解决冲突的版本限制,更新 lockfile,并重新构建受影响的运行时镜像。相关 extras 现在要求 LiteLLM>=1.103.1,<2.0.0(排除1.104.0rc1)、filelock>=4.2.1、Strands Agents>=1.48.0,<2.0.0和 OpenTelemetry API>=1.45.1,<2.0.0;各项要求所属的 extra 见更新日志。 - 升级后,使用新的 run 名称,或传入
--fresh归档原目录并重新开始。被拒绝的恢复会保留旧 manifest 和结果,已完成的旧结果仍然可以上传。请勿手动修改manifest.json中的 digest,它也绑定了平台导入身份。参见 Source digest upgrades。
dataset_rows.jsonl,以支持 prompt 和 ground truth 搜索。已完成的旧 run 仍可在没有该文件的情况下上传;升级不会将该文件补充到旧结果中。Digest 升级后,Harbor bundle cache 会重建一次。
Rollout 结果新增 agent_started_at。在使用 None 识别准备阶段失败之前,请同时升级 server 和调用方;旧 server 会省略该字段。内置 OpenSandbox 环境还支持通过 OPENSANDBOX_REQUEST_TIMEOUT_SEC 设置默认值。
从 0.3.9 升级到 0.3.10
- 升级 CLI 之前,请确认您的 Osmosis 平台支持 archive import。在
0.3.10中,osmosis eval upload和osmosis eval run --upload会将已完成的 run 作为单个流式 archive 上传。没有逐文件上传的回退方式。 - 将 CLI、调用方和 rollout 依赖升级到
osmosis-ai>=0.3.10,<0.4,保留原有 extras,然后更新 lockfile。Strands rollout 需要更新rollouts/<name>/pyproject.toml,才能在后续请求和 trajectory 中保留先前的 assistant reasoning。 - 如果您不通过 CLI,而是直接调用
OsmosisClient.start_eval_run_import(),请用archive=替换files=。将files.jsonl和run.zip上传到返回的 slot,然后调用start_eval_run_import_extraction(),并轮询get_eval_run_import_extraction(),直到 extraction 达到ready后再完成导入。 - 更新构造或读取 eval-import 结果的代码。
upload_mode现在为必填字段,archive import 会在files中列出上传 slot,且 slot 的sha256可以为None。
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.10,<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 和 OpenSandbox 依赖。请在 entrypoint 中选择环境:OpenSandbox 使用预构建任务镜像,Daytona 可以构建任务的 Dockerfile。配置与凭据说明见托管与自托管环境。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:0.3.8 起,dataset mode 在省略 ID 时会自动发现 tasks_dir 下的 task。若只需预热部分 task,请传入其 ID:
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 的错误。
-
运行
await backend.prewarm()预热 template 或自动发现 dataset task。若只需预热部分 dataset task,或使用0.3.8之前的 SDK,请传入 task ID。 - 提交一个 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。