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.
Files changed (61) hide show
  1. {simulo-0.31.0/src/simulo.egg-info → simulo-0.31.1}/PKG-INFO +1 -1
  2. {simulo-0.31.0 → simulo-0.31.1}/pyproject.toml +1 -1
  3. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/cli.py +26 -7
  4. {simulo-0.31.0 → simulo-0.31.1/src/simulo.egg-info}/PKG-INFO +1 -1
  5. {simulo-0.31.0 → simulo-0.31.1}/MANIFEST.in +0 -0
  6. {simulo-0.31.0 → simulo-0.31.1}/PYPI.md +0 -0
  7. {simulo-0.31.0 → simulo-0.31.1}/setup.cfg +0 -0
  8. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/__init__.py +0 -0
  9. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/__init__.py +0 -0
  10. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/_arguments.py +0 -0
  11. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/_mounts.py +0 -0
  12. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/_runner.py +0 -0
  13. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/_secure_downloads.py +0 -0
  14. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/app.py +0 -0
  15. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/asset.py +0 -0
  16. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/asset_api.py +0 -0
  17. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/asset_package.py +0 -0
  18. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/asset_pins.py +0 -0
  19. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/builtin_aliases.py +0 -0
  20. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/bundle.py +0 -0
  21. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/cancel_api.py +0 -0
  22. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/config.py +0 -0
  23. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/credentials.py +0 -0
  24. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/discovery.py +0 -0
  25. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/export_api.py +0 -0
  26. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/facades.py +0 -0
  27. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/http.py +0 -0
  28. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/identity_api.py +0 -0
  29. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/install_samples.py +0 -0
  30. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/jobs_api.py +0 -0
  31. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/learning.py +0 -0
  32. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/login.py +0 -0
  33. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/mode.py +0 -0
  34. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/onnx_bundle.py +0 -0
  35. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/outputs.py +0 -0
  36. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/packaging.py +0 -0
  37. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/policies_api.py +0 -0
  38. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/preflight_api.py +0 -0
  39. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/preflight_render.py +0 -0
  40. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/preview_report.py +0 -0
  41. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/registry.py +0 -0
  42. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/runtime.py +0 -0
  43. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/runtime_display.py +0 -0
  44. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/stub.py +0 -0
  45. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/submit_api.py +0 -0
  46. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/__init__.py +0 -0
  47. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/training/play.py.tmpl +0 -0
  48. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/training/preview.py.tmpl +0 -0
  49. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/training/simuloignore.tmpl +0 -0
  50. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/training/task.py.tmpl +0 -0
  51. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/templates/training/train.py.tmpl +0 -0
  52. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/view_fragment.py +0 -0
  53. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/view_session_api.py +0 -0
  54. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/_client/volume.py +0 -0
  55. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/callbacks.py +0 -0
  56. {simulo-0.31.0 → simulo-0.31.1}/src/simulo/py.typed +0 -0
  57. {simulo-0.31.0 → simulo-0.31.1}/src/simulo.egg-info/SOURCES.txt +0 -0
  58. {simulo-0.31.0 → simulo-0.31.1}/src/simulo.egg-info/dependency_links.txt +0 -0
  59. {simulo-0.31.0 → simulo-0.31.1}/src/simulo.egg-info/entry_points.txt +0 -0
  60. {simulo-0.31.0 → simulo-0.31.1}/src/simulo.egg-info/requires.txt +0 -0
  61. {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.0
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.0"
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
- _print_training_next_steps(handle, app_path)
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 = PoliciesApiClient(handle.base_url, token=handle.token).get_policy(policy_id)
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
- — the result JSON itself is untouched (``stats["anomaly_captures"]`` stays
2774
- byte-identical; a byte stream is an output, a JSON scalar is a metric,
2775
- surfaced together but never merged). Both lines print to
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.0
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