Skip to main content
The Python SDK is the customer-facing entry point for Hardsim.

Install

pip install hardsim

Core Methods

  • submit(...): create a cloud simulation job.
  • submit_assets(...): strict real-mode submit using local files, managed URIs, or asset IDs.
  • step(...): alias for submit-oriented cloud simulation call.
  • status(job_id): get current job state.
  • wait(job_id): poll until terminal state.
  • watch_job(job_id): stream live terminal-friendly status updates.
  • download(job_id, out_dir): download generated artifacts.
  • cancel(job_id): cancel queued/running jobs.
  • upload_input(local_path): upload local files and return a managed input URI.
  • upload_input_asset(local_path): upload local file and return stable asset_id.
  • register_input_asset(...): register an existing managed input URI into asset catalog.
  • list_input_assets(...) / get_input_asset(asset_id): query catalog.
  • create_training_run(...): create a managed rollout-train run.
  • list_training_runs(limit=..., submission_group_id=...): list runs (optional group filter).
  • get_training_run(run_id) / wait_training_run(run_id): monitor managed run lifecycle.
  • watch_training_run(run_id): stream live run status + events.
  • pause_training_run(run_id) / resume_training_run(run_id) / cancel_training_run(run_id).
  • list_run_checkpoints(run_id) / get_latest_checkpoint(run_id).
  • submit_many_jobs(...) / submit_many_training_runs(...): batch submit with one group ID.
  • watch_submission_group(group_id): live group progress in terminal.
For custom Isaac Lab workloads, use submit_assets(...) with:
  • runtime_profile="isaac_lab_rollout"
  • an isaac_lab={...} config block
  • a task package uploaded as asset_kind="isaac_lab_task_package"

Terminal Monitoring Patterns

You can monitor from terminal in two ways:
  1. Manual status checks anytime
job_state = client.status(job_id)
run_state = client.get_training_run(run_id)
events = client.list_training_events(run_id, limit=20)
  1. Live watch stream
# Simulation job
client.watch_job(job_id, poll_interval_s=2.0, timeout_s=36000)

# Managed training run
client.watch_training_run(run_id, poll_interval_s=5.0, timeout_s=24*3600)
timeout_s is configurable. If you want a full watch, set a large timeout. Submission group watch:
group = client.submit_many_jobs(name="batch-10", jobs=[...])
client.watch_submission_group(group["group_id"], poll_interval_s=2.0, timeout_s=3600)

Environment Variables

  • HARDSIM_API_KEY (required)
  • HARDSIM_API_URL (production: https://api-sim.hardlightsim.com)
  • HARDSIM_HTTP_TIMEOUT_S
  • HARDSIM_HTTP_RETRIES
  • HARDSIM_HTTP_BACKOFF_S
client = hs.HardsimClient.from_env()
robot_asset_id = client.upload_input_asset("./assets/franka.urdf", asset_kind="robot")
scene_asset_id = client.upload_input_asset("./assets/cabinet_scene.usd", asset_kind="scene")

job = client.submit_assets(
    robot_asset_id=robot_asset_id,
    scene_asset_id=scene_asset_id,
    robot_asset_type="urdf",
    num_envs=64,
    steps=2000,
    control={"task_mode": "fr3_pick_lift_block_v1", "fix_base": True},
    idempotency_key="train-run-42-shard-0001",
)

One-Call Real Asset Submit

import hardsim as hs

client = hs.HardsimClient.from_env()
job = client.submit_assets(
    robot_asset="./assets/franka.urdf",      # local path or managed URI
    scene_usd="./assets/cabinet_scene.usd",  # local path or managed URI
    num_envs=64,
    steps=2000,
    scene_id="franka_cabinet_oige_v1",
    control={"task_mode": "fr3_pick_lift_block_v1", "fix_base": True},
)
submit_assets(...) auto-uploads local files through the presigned upload API and then submits the job with strict real asset references.
import hardsim as hs

client = hs.HardsimClient.from_env()

robot_asset_id = client.upload_input_asset("./assets/franka.urdf", asset_kind="robot")
scene_asset_id = client.upload_input_asset("./assets/cabinet_scene.usd", asset_kind="scene")

job = client.submit_assets(
    robot_asset_id=robot_asset_id,
    scene_asset_id=scene_asset_id,
    robot_asset_type="urdf",
    num_envs=64,
    steps=2000,
    control={"task_mode": "fr3_pick_lift_block_v1", "fix_base": True},
)

Managed Training

For containerized trainer testing, use the reference image + payload in:
  • managed-training-quickstart
create_training_run(...) also supports checkpoint_init_asset_id.

More Detail