simulo 0.31.0__tar.gz → 0.31.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {simulo-0.31.0/src/simulo.egg-info → simulo-0.31.1}/PKG-INFO +1 -1
- {simulo-0.31.0 → simulo-0.31.1}/pyproject.toml +1 -1
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/cli.py +26 -7
- {simulo-0.31.0 → simulo-0.31.1/src/simulo.egg-info}/PKG-INFO +1 -1
- {simulo-0.31.0 → simulo-0.31.1}/MANIFEST.in +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/PYPI.md +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/setup.cfg +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/__init__.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/__init__.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/_arguments.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/_mounts.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/_runner.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/_secure_downloads.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/app.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/asset.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/asset_api.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/asset_package.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/asset_pins.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/builtin_aliases.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/bundle.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/cancel_api.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/config.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/credentials.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/discovery.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/export_api.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/facades.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/http.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/identity_api.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/install_samples.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/jobs_api.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/learning.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/login.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/mode.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/onnx_bundle.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/outputs.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/packaging.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/policies_api.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/preflight_api.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/preflight_render.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/preview_report.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/registry.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/runtime.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/runtime_display.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/stub.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/submit_api.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/__init__.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/training/play.py.tmpl +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/training/preview.py.tmpl +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/training/simuloignore.tmpl +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/training/task.py.tmpl +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/training/train.py.tmpl +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/view_fragment.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/view_session_api.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/volume.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/callbacks.py +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo/py.typed +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo.egg-info/SOURCES.txt +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo.egg-info/dependency_links.txt +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo.egg-info/entry_points.txt +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo.egg-info/requires.txt +0 -0
- {simulo-0.31.0 → simulo-0.31.1}/src/simulo.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: simulo
|
|
3
|
-
Version: 0.31.
|
|
3
|
+
Version: 0.31.1
|
|
4
4
|
Summary: Python SDK and CLI for cloud-native robotics simulation, reinforcement learning, and robot policy training on managed GPUs.
|
|
5
5
|
Author-email: Simulo Team <team@simulo.ai>
|
|
6
6
|
License: BSD-3-Clause
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "simulo"
|
|
7
|
-
version = "0.31.
|
|
7
|
+
version = "0.31.1"
|
|
8
8
|
description = "Python SDK and CLI for cloud-native robotics simulation, reinforcement learning, and robot policy training on managed GPUs."
|
|
9
9
|
readme = "PYPI.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -673,6 +673,14 @@ def _resolve_client_context() -> tuple[str, Optional[str]]:
|
|
|
673
673
|
return base_url, token
|
|
674
674
|
|
|
675
675
|
|
|
676
|
+
def _client_with_fresh_token(client: JobsApiClient) -> JobsApiClient:
|
|
677
|
+
"""Return a client with current stored credentials, preserving its target."""
|
|
678
|
+
creds = credentials.try_get_valid_credentials(base_url=client.base_url)
|
|
679
|
+
if creds is None:
|
|
680
|
+
return client
|
|
681
|
+
return JobsApiClient(client.base_url, token=str(creds["access_token"]))
|
|
682
|
+
|
|
683
|
+
|
|
676
684
|
def _is_uuid_text(value: Any) -> bool:
|
|
677
685
|
try:
|
|
678
686
|
UUID(str(value))
|
|
@@ -1470,10 +1478,16 @@ def _follow_and_report(handle: JobHandle, app_path: str) -> int:
|
|
|
1470
1478
|
job_ref = str(getattr(handle, "public_id", None) or handle.job_id)
|
|
1471
1479
|
exit_code = _drain_logs(client, job_ref, follow=True, scope=JOB_SCOPE_MINE)
|
|
1472
1480
|
if handle.job_type is JobType.PREVIEW:
|
|
1481
|
+
client = _client_with_fresh_token(client)
|
|
1473
1482
|
return _report_preview(client, job_ref, display_id, app_path, fallback_exit_code=exit_code)
|
|
1474
1483
|
if exit_code == 0:
|
|
1475
1484
|
if handle.job_type is JobType.TRAIN:
|
|
1476
|
-
|
|
1485
|
+
client = _client_with_fresh_token(client)
|
|
1486
|
+
_print_training_next_steps(
|
|
1487
|
+
PoliciesApiClient(client.base_url, token=client._token),
|
|
1488
|
+
handle,
|
|
1489
|
+
app_path,
|
|
1490
|
+
)
|
|
1477
1491
|
elif handle.job_type is JobType.PLAY:
|
|
1478
1492
|
print(f"Next: simulo recordings {display_id}")
|
|
1479
1493
|
return exit_code
|
|
@@ -1566,12 +1580,11 @@ def _checkpoint_iteration(handle: JobHandle, checkpoint_ref: str) -> Optional[in
|
|
|
1566
1580
|
return None
|
|
1567
1581
|
|
|
1568
1582
|
|
|
1569
|
-
def _print_training_next_steps(handle: JobHandle, app_path: str) -> None:
|
|
1583
|
+
def _print_training_next_steps(client: PoliciesApiClient, handle: JobHandle, app_path: str) -> None:
|
|
1570
1584
|
"""Print the sealed policy's checkpoints and the three canonical next steps."""
|
|
1571
|
-
assert handle.base_url is not None
|
|
1572
1585
|
policy_id = str(policy_id_for_job(_handle_display_id(handle)))
|
|
1573
1586
|
try:
|
|
1574
|
-
record =
|
|
1587
|
+
record = client.get_policy(policy_id)
|
|
1575
1588
|
except http.HttpError:
|
|
1576
1589
|
return
|
|
1577
1590
|
rendered: list[str] = []
|
|
@@ -2386,6 +2399,7 @@ def _wait_for_job(client: JobsApiClient, job_id: str, *, scope: str = JOB_SCOPE_
|
|
|
2386
2399
|
"""Poll until ``job_id`` exists — lets a user arm the tail BEFORE the job is created."""
|
|
2387
2400
|
waiting_announced = False
|
|
2388
2401
|
while True:
|
|
2402
|
+
client = _client_with_fresh_token(client)
|
|
2389
2403
|
try:
|
|
2390
2404
|
return client.get_job(job_id, scope=scope)
|
|
2391
2405
|
except JobsApiHTTPError as exc:
|
|
@@ -2414,6 +2428,7 @@ def _wait_for_latest_job(client: JobsApiClient) -> dict[str, Any]:
|
|
|
2414
2428
|
"""
|
|
2415
2429
|
waiting_announced = False
|
|
2416
2430
|
while True:
|
|
2431
|
+
client = _client_with_fresh_token(client)
|
|
2417
2432
|
try:
|
|
2418
2433
|
latest = client.get_latest_job()
|
|
2419
2434
|
except JobsApiHTTPError as exc:
|
|
@@ -2608,6 +2623,8 @@ def _drain_logs(
|
|
|
2608
2623
|
post-``simulo run`` default follow — one follow loop, one
|
|
2609
2624
|
exit-code-mirrors-outcome rule.
|
|
2610
2625
|
"""
|
|
2626
|
+
if follow:
|
|
2627
|
+
client = _client_with_fresh_token(client)
|
|
2611
2628
|
offset = 0
|
|
2612
2629
|
if tail_lines is not None:
|
|
2613
2630
|
try:
|
|
@@ -2633,6 +2650,8 @@ def _drain_logs(
|
|
|
2633
2650
|
# Not honored (old server): the loop below simply continues the full
|
|
2634
2651
|
# history from where the server's offset-0 answer left off.
|
|
2635
2652
|
while True:
|
|
2653
|
+
if follow:
|
|
2654
|
+
client = _client_with_fresh_token(client)
|
|
2636
2655
|
try:
|
|
2637
2656
|
chunk, offset, status, _ = client.get_log_chunk(job_id, offset, scope=scope)
|
|
2638
2657
|
except JobsApiHTTPError as exc:
|
|
@@ -2770,9 +2789,9 @@ def _cmd_result(args: argparse.Namespace) -> int:
|
|
|
2770
2789
|
announced on stderr.
|
|
2771
2790
|
A job whose run announced typed outputs gets a second
|
|
2772
2791
|
stderr line, ``⚠ 1 anomaly (non_finite_reward)`` (:func:`_outputs_flag_summary`)
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2792
|
+
while built-in training results omit anomaly-capture paths. Those paths
|
|
2793
|
+
are exposed through the recordings and outputs commands instead. Both
|
|
2794
|
+
lines print to
|
|
2776
2795
|
stderr so stdout stays pure result JSON for pipelines. Best-effort: for
|
|
2777
2796
|
an explicit JOB_ID this needs one extra ``get_job`` call, and a failure
|
|
2778
2797
|
there (e.g. an older control plane) skips both lines rather than failing a
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: simulo
|
|
3
|
-
Version: 0.31.
|
|
3
|
+
Version: 0.31.1
|
|
4
4
|
Summary: Python SDK and CLI for cloud-native robotics simulation, reinforcement learning, and robot policy training on managed GPUs.
|
|
5
5
|
Author-email: Simulo Team <team@simulo.ai>
|
|
6
6
|
License: BSD-3-Clause
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|