Skip to main content
POST
/
api
/
v1
/
online
/
sessions
from synth_ai import AsyncSynthClient

client = AsyncSynthClient(api_key="sk_live_...")
session = await client.optimization.online.create(
    kind="mipro_online",
    config_body={
        "policy_optimization": {
            "algorithm": "mipro",
            "container_url": "http://localhost:8103",
            "policy": {"model": "gpt-4o-mini", "provider": "openai"},
            "mipro": {
                "mode": "online",
                "bootstrap_train_seeds": [0, 1, 2, 3, 4],
                "val_seeds": [100, 101, 102],
            },
        }
    },
)

# Run rollouts and report rewards
for seed in range(100):
    result = await session.rollout(seed)
    await session.update_reward(seed, result.reward)
{
  "job_id": "po_abc123",
  "status": "running"
}
MIPRO Online optimizes prompts while you control the rollout loop locally. No tunneling required.
Online mode is ideal for local development—you control rollouts, no public URL needed.
Set algorithm: "mipro" and mipro.mode: "online" in your request.

Lever/Sensor Telemetry

MIPRO online now records optimizer state using canonical lever and sensor primitives:
  • lever_summary — prompt lever id, per-candidate lever versions, baseline/best candidate ids, and lever lineage counts.
  • lever_versions — resolved lever version map used for the best/selected candidate.
  • best_lever_version — resolved best prompt lever version.
  • sensor_frames — frame summaries (kinds/count/trace ids/lever versions) emitted during rollouts.
These fields are returned by:
  • GET /api/v1/online/sessions/{job_id}
  • GET /api/v1/online/sessions/{job_id}/results
For richer rollout diagnostics, request full sensor payloads:
  • sensor_detail=full (or include_sensor_frames_full=1)
  • sensor_full_limit=<n> (defaults to 20)
  • sensor_limit=<n> for summary frame count (defaults to 200)

MIPRO Online Configuration

mipro.mode
string
required
Must be "online" for this mode.
mipro.bootstrap_train_seeds
array
required
Initial training seeds for the bootstrap phase.
mipro.val_seeds
array
required
Validation seeds for evaluation.
mipro.online_pool
array
required
Pool of seeds for online optimization.
mipro.online_proposer_mode
string
required
Proposer mode. Use "inline" for proposals during optimization.
mipro.online_proposer_min_rollouts
integer
required
Minimum rollouts before generating new proposals.
mipro.online_rollouts_per_candidate
integer
required
Rollouts per candidate before switching.
mipro.proposer
object
required
Proposer configuration.
from synth_ai import AsyncSynthClient

client = AsyncSynthClient(api_key="sk_live_...")
session = await client.optimization.online.create(
    kind="mipro_online",
    config_body={
        "policy_optimization": {
            "algorithm": "mipro",
            "container_url": "http://localhost:8103",
            "policy": {"model": "gpt-4o-mini", "provider": "openai"},
            "mipro": {
                "mode": "online",
                "bootstrap_train_seeds": [0, 1, 2, 3, 4],
                "val_seeds": [100, 101, 102],
            },
        }
    },
)

# Run rollouts and report rewards
for seed in range(100):
    result = await session.rollout(seed)
    await session.update_reward(seed, result.reward)
{
  "job_id": "po_abc123",
  "status": "running"
}

Full Example

Request
{
  "policy_optimization": {
    "algorithm": "mipro",
    "container_url": "https://your-container.example.com",
    "policy": {
      "model": "gpt-4o-mini",
      "provider": "openai"
    },
    "mipro": {
      "mode": "online",
      "bootstrap_train_seeds": [0, 1, 2, 3, 4],
      "val_seeds": [100, 101, 102],
      "online_pool": [0, 1, 2, 3, 4],
      "online_proposer_mode": "inline",
      "online_proposer_min_rollouts": 20,
      "online_rollouts_per_candidate": 10,
      "proposer": {
        "mode": "instruction_only",
        "model": "gpt-4o-mini",
        "provider": "openai",
        "temperature": 0.7
      }
    }
  }
}

How Online Mode Works

  1. Create job — Submit MIPRO job with mode: "online"
  2. Get proxy URL — Backend returns a proxy URL via optimization.online.create(...)
  3. Run rollouts — Call proxy URL, execute LLM, report rewards
  4. Automatic evolution — Backend generates new proposals based on rewards
No tunneling required. Backend never calls your container—you drive the rollout loop.

Status Payload Example

Response
{
  "job_id": "po_abc123",
  "status": "running",
  "best_reward": 0.91,
  "lever_summary": {
    "prompt_lever_id": "mipro.prompt.sys_abc",
    "candidate_lever_versions": {
      "baseline": 1,
      "candidate_9b12": 4
    },
    "best_candidate_id": "candidate_9b12",
    "selected_candidate_id": "candidate_9b12",
    "baseline_candidate_id": "baseline",
    "lever_count": 4,
    "mutation_count": 3,
    "latest_version": 4
  },
  "lever_versions": {
    "mipro.prompt.sys_abc": 4
  },
  "best_lever_version": 4,
  "sensor_frames": [
    {
      "frame_id": "frame_01hzk...",
      "created_at": "2026-02-12T18:44:00Z",
      "sensor_count": 3,
      "sensor_kinds": ["rollout", "reward", "resource"],
      "trace_ids": ["trace_abc"],
      "lever_versions": {
        "mipro.prompt.sys_abc": 4
      }
    }
  ]
}

MIPRO Offline

For server-driven optimization where the backend executes rollouts.