Skip to main content
Osmosis SDK v0.3 contains two independent breaking changes. All rollouts move to a one-execution, one-sample, one-reward contract. Separately, the pre-v0.3 HarborBackend is removed and HarborBackendV2 becomes the new HarborBackend with a different constructor and execution model.
Upgrade the package requirement, workflow, grader, integrations, and backend entrypoint together. Mixing v0.2 rollout code with a v0.3 backend usually fails at runtime.
Use the section that matches your backend: Before changing code:
  • Keep the last successful v0.2 evaluation run for comparison.
  • Use Python 3.12 or later.
  • Recreate the rollout environment and lockfile after changing the SDK requirement.
  • Search for removed APIs before and after the migration.

LocalBackend Users

LocalBackend keeps the same keyword-only constructor in v0.3:
The migration work is in the workflow, grader, integrations, and any custom protocol code around the backend.

1. Upgrade the Package and Select Features

The base distribution contains the CLI and framework-neutral rollout core. Add only the extras your rollout imports:
Combine extras when needed. For example, a server entrypoint using Strands should declare:
Other extras include openai-agents, harbor, rubric, and parquet.

2. Move from Many Samples to One Sample

Each workflow execution now produces at most one RolloutSample, and its grader assigns one scalar reward. Update graders from a loop over samples to one explicit sample check:
set_reward() raises ValueError when the workflow produced no sample. Raising an explicit error before scoring generally gives a clearer evaluation failure.

3. Register One Agent or Session per Execution

Construct exactly one registered OsmosisStrandsAgent or OsmosisMemorySession inside AgentWorkflow.run(). A second registration raises ValueError. For OpenAI Agents, the v0.3 session has no name or sample-ID argument:
Handoffs and tool calls can remain inside that one agent run. If you need several candidate answers for one prompt, configure evaluation or training to execute the workflow several times.

4. Update Custom Sample Sources

Built-in integrations already use the v0.3 API. A custom integration must implement the singular source contract:
Do not set an id on RolloutSample. To control the normalized ATIF transcript, set trajectory_messages; setting it to None disables trajectory persistence for that sample.

5. Update Custom Routing and Backend Adapters

Skip this step if you only use the built-in integrations and LocalBackend. Treat the chat-completions and callback URLs supplied for an execution as opaque, rollout-scoped endpoints. Do not append a rollout ID or attach the removed x-sample-id and x-rollout-id routing headers. Custom backends return one sample in ExecutionResult. If you read the container exchange files directly, update readers to the singular file names and payloads:
sample.json
reward.json

6. Verify a LocalBackend Migration

  1. Confirm that removed APIs no longer appear in the rollout:
  2. Recreate the rollout environment so its lockfile contains v0.3 and the selected extras.
  3. Run the workflow locally and confirm that each successful execution produces one sample.
  4. Submit an evaluation run and confirm that each graded sample has one scalar reward.
  5. Compare rewards and final messages with the last successful v0.2 evaluation before submitting training.

Common LocalBackend Problems

The workflow execution already registered its sample source. Reuse one agent or session for the conversation, or move independent candidates into separate workflow executions.
Construct the supported agent or session inside AgentWorkflow.run(). Objects created at module import time cannot register with the active rollout context.
Install the matching extra in the rollout-local environment and regenerate its lockfile.
Pass the supplied chat-completions URL directly to the integration. Remove code that reconstructs the URL, adds a rollout path segment, or attaches legacy routing headers.

HarborBackend Users

Harbor users must first apply the shared workflow, grader, sample-source, and routing changes in LocalBackend Users. Then migrate the Harbor class and constructor.
The name HarborBackend still imports in v0.3, but it now refers to the implementation previously called HarborBackendV2. A pre-v0.3 call using task_dir, user_code_dir, or workflow raises TypeError; there is no legacy compatibility mode.

1. Upgrade the Package and Import

Install the v0.3 Harbor and server features:
Install osmosis-ai[harbor], not Harbor’s skypilot extra. The managed rollout runtime supplies the compatible SkyPilot SDK.
Use the Harbor submodule import:
If you already use HarborBackendV2, change only the class name and keep its v2 constructor arguments:
HarborBackendV2 is not retained as an alias.

2. Replace the Pre-v0.3 Constructor

The old backend mounted your source tree and SDK into a task environment. The v0.3 backend packages the workflow project into a wheel and installs it inside the task container.
Migrate every old constructor parameter with this table: Remove the private _sdk_source_dir argument if your harness used it. The v0.3 constructor also adds these controls:

3. Choose a Task Mode

For the closest replacement of the old single task_dir, use template mode:
The request prompt replaces instruction.md in a per-rollout copy of that task. Use dataset mode when tasks_dir contains one directory per task:
Each request must set metadata["harbor_task_id"]; the selected task keeps its own instruction.md. For either mode, metadata["harbor_task"] can select a per-rollout local path, Harbor registry package such as "org/name@ref", or Git task. Git tasks also set metadata["git_url"] and should pin metadata["git_commit_id"]. If the old backend used custom_tests_dir, move those tests into each task:
Then pass grader=None to use the task-native verifier.

4. Package Workflow Code Instead of Mounting It

For an AgentWorkflow, the backend builds a wheel from code_dir and installs it in the container at trial start. The directory must contain pyproject.toml and one importable top-level Python package. When code_dir is omitted, the backend tries to locate the project containing the workflow class. Use bundle= when your build system creates the Osmosis bundle wheel ahead of time. Do not pass both paths expecting them to be merged; a supplied bundle is used directly. The old HarborAgentWorkflowContext.environment adapter is gone. The workflow itself now runs inside the task container, receives a standard AgentWorkflowContext, and accesses files or processes through normal Python APIs:
OsmosisInstalledAgent is also removed. Do not instantiate or subclass it; pass an AgentWorkflow through agent=, or select a registered native Harbor agent name.

5. Choose an Agent and Reward Source

agent= accepts an AgentWorkflow class/import path or one of the registered native names: "terminus-2", "mini-swe-agent", and "oracle".
"oracle" runs a reference solution to validate a dataset or verifier. It does not emit a model trajectory and must not be used for training.
Choose one reward path:

6. Add Prewarming and Lifecycle Controls

Prewarm the selected task images and agent setup before the rollout server accepts traffic:
Dataset mode requires explicit task IDs:
If you set max_queue_depth, POST /rollout returns 429 with Retry-After: 5 when the queue is full. v0.3 also exposes:
  • GET /rollout/{rollout_id}/status
  • POST /rollout/cancel
  • HarborBackend.rollout_status()
  • HarborBackend.cancel_rollouts()

7. Verify a HarborBackend Migration

  1. Confirm that the old class and constructor keywords no longer appear:
  2. Confirm that tasks_dir points to a valid template task or dataset root.
  3. Build the workflow bundle and fix any package-layout or missing-dependency errors.
  4. Run await backend.prewarm() for template mode, or pass task IDs in dataset mode.
  5. Submit one rollout and check the workflow sample, reward source, Harbor logs, and archived artifacts.
  6. Exercise status and cancellation if the calling controller depends on them.
  7. Run an evaluation and compare rewards and final messages with the last successful v0.2 run before training.

Common HarborBackend Problems

The import resolves to the v0.3 backend, but the call still uses the removed constructor. Replace all stale parameters with the table above.
Point code_dir at the directory containing pyproject.toml and one importable package. Ensure the workflow and grader can be addressed as import paths from that package.
Set metadata["harbor_task_id"] to a directory beneath tasks_dir, or set metadata["harbor_task"] to a supported local, package, or Git reference.
Pass an Osmosis grader, or set grader=None and confirm that the selected task contains a working tests/ verifier.
Remove the legacy adapter calls. The workflow now runs inside the container, so use normal filesystem, subprocess, and network APIs.