runloop_api_client 1.0.0__tar.gz → 1.2.0__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 (354) hide show
  1. runloop_api_client-1.2.0/.release-please-manifest.json +3 -0
  2. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/CHANGELOG.md +40 -0
  3. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/CONTRIBUTING.md +38 -2
  4. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/PKG-INFO +4 -2
  5. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/README-SDK.md +65 -15
  6. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/README.md +2 -1
  7. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/api.md +0 -2
  8. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/pyproject.toml +24 -43
  9. runloop_api_client-1.2.0/requirements-dev.lock +110 -0
  10. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_streaming.py +32 -32
  11. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_version.py +1 -1
  12. runloop_api_client-1.2.0/src/runloop_api_client/lib/__init__.py +3 -0
  13. runloop_api_client-1.2.0/src/runloop_api_client/lib/_ignore.py +496 -0
  14. runloop_api_client-1.2.0/src/runloop_api_client/lib/context_loader.py +78 -0
  15. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/blueprints.py +0 -4
  16. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/__init__.py +19 -1
  17. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/_types.py +29 -0
  18. runloop_api_client-1.2.0/src/runloop_api_client/sdk/agent.py +72 -0
  19. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_.py +281 -12
  20. runloop_api_client-1.2.0/src/runloop_api_client/sdk/async_agent.py +76 -0
  21. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_devbox.py +1 -3
  22. runloop_api_client-1.2.0/src/runloop_api_client/sdk/async_scenario.py +118 -0
  23. runloop_api_client-1.2.0/src/runloop_api_client/sdk/async_scenario_run.py +242 -0
  24. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_storage_object.py +19 -2
  25. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/devbox.py +1 -3
  26. runloop_api_client-1.2.0/src/runloop_api_client/sdk/scenario.py +118 -0
  27. runloop_api_client-1.2.0/src/runloop_api_client/sdk/scenario_run.py +242 -0
  28. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/storage_object.py +19 -2
  29. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/sync.py +306 -11
  30. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/__init__.py +0 -2
  31. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +3 -0
  32. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_start_run_params.py +6 -4
  33. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_function.py +1 -1
  34. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_function_param.py +1 -1
  35. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/__init__.py +0 -2
  36. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -3
  37. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/launch_parameters.py +1 -1
  38. runloop_api_client-1.2.0/src/runloop_api_client/types/shared/mount.py +78 -0
  39. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/__init__.py +0 -2
  40. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +1 -3
  41. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/launch_parameters.py +1 -1
  42. runloop_api_client-1.2.0/src/runloop_api_client/types/shared_params/mount.py +77 -0
  43. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_blueprints.py +0 -4
  44. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_devboxes.py +0 -2
  45. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/conftest.py +55 -5
  46. runloop_api_client-1.2.0/tests/sdk/test_agent.py +43 -0
  47. runloop_api_client-1.2.0/tests/sdk/test_async_agent.py +46 -0
  48. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_ops.py +473 -1
  49. runloop_api_client-1.2.0/tests/sdk/test_async_scenario.py +121 -0
  50. runloop_api_client-1.2.0/tests/sdk/test_async_scenario_run.py +162 -0
  51. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_ops.py +422 -3
  52. runloop_api_client-1.2.0/tests/sdk/test_scenario.py +121 -0
  53. runloop_api_client-1.2.0/tests/sdk/test_scenario_run.py +157 -0
  54. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/README.md +25 -7
  55. runloop_api_client-1.2.0/tests/smoketests/sdk/test_agent.py +197 -0
  56. runloop_api_client-1.2.0/tests/smoketests/sdk/test_async_agent.py +203 -0
  57. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_devbox.py +0 -28
  58. runloop_api_client-1.2.0/tests/smoketests/sdk/test_async_scenario.py +126 -0
  59. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_storage_object.py +2 -1
  60. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_devbox.py +0 -28
  61. runloop_api_client-1.2.0/tests/smoketests/sdk/test_scenario.py +126 -0
  62. runloop_api_client-1.2.0/tests/test_utils/test_context_loader.py +207 -0
  63. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/uv.lock +740 -406
  64. runloop_api_client-1.0.0/.release-please-manifest.json +0 -3
  65. runloop_api_client-1.0.0/requirements-dev.lock +0 -94
  66. runloop_api_client-1.0.0/src/runloop_api_client/types/shared/agent_mount_parameters.py +0 -31
  67. runloop_api_client-1.0.0/src/runloop_api_client/types/shared/mount.py +0 -28
  68. runloop_api_client-1.0.0/src/runloop_api_client/types/shared/object_mount_parameters.py +0 -21
  69. runloop_api_client-1.0.0/src/runloop_api_client/types/shared_params/agent_mount_parameters.py +0 -31
  70. runloop_api_client-1.0.0/src/runloop_api_client/types/shared_params/mount.py +0 -25
  71. runloop_api_client-1.0.0/src/runloop_api_client/types/shared_params/object_mount_parameters.py +0 -21
  72. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/.gitignore +0 -0
  73. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/LICENSE +0 -0
  74. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/SECURITY.md +0 -0
  75. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/bin/check-release-environment +0 -0
  76. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/bin/publish-pypi +0 -0
  77. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/examples/.keep +0 -0
  78. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/release-please-config.json +0 -0
  79. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop/lib/.keep +0 -0
  80. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/__init__.py +0 -0
  81. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_base_client.py +0 -0
  82. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_client.py +0 -0
  83. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_compat.py +0 -0
  84. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_constants.py +0 -0
  85. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_exceptions.py +0 -0
  86. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_files.py +0 -0
  87. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_models.py +0 -0
  88. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_qs.py +0 -0
  89. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_resource.py +0 -0
  90. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_response.py +0 -0
  91. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_types.py +0 -0
  92. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/__init__.py +0 -0
  93. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_compat.py +0 -0
  94. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
  95. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_logs.py +0 -0
  96. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_proxy.py +0 -0
  97. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_reflection.py +0 -0
  98. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
  99. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_streams.py +0 -0
  100. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_sync.py +0 -0
  101. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_transform.py +0 -0
  102. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_typing.py +0 -0
  103. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_utils.py +0 -0
  104. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_validation.py +0 -0
  105. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/lib/.keep +0 -0
  106. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/lib/polling.py +0 -0
  107. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/lib/polling_async.py +0 -0
  108. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/pagination.py +0 -0
  109. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/py.typed +0 -0
  110. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/__init__.py +0 -0
  111. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/agents.py +0 -0
  112. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/benchmarks/__init__.py +0 -0
  113. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/benchmarks/benchmarks.py +0 -0
  114. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/benchmarks/runs.py +0 -0
  115. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
  116. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/browsers.py +0 -0
  117. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/computers.py +0 -0
  118. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/devboxes.py +0 -0
  119. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
  120. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/executions.py +0 -0
  121. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
  122. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/objects.py +0 -0
  123. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/repositories.py +0 -0
  124. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
  125. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
  126. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
  127. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
  128. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/secrets.py +0 -0
  129. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/_helpers.py +0 -0
  130. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_blueprint.py +0 -0
  131. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_execution.py +0 -0
  132. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_execution_result.py +0 -0
  133. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_scorer.py +0 -0
  134. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_snapshot.py +0 -0
  135. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/blueprint.py +0 -0
  136. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/execution.py +0 -0
  137. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/execution_result.py +0 -0
  138. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/scorer.py +0 -0
  139. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/snapshot.py +0 -0
  140. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/agent_create_params.py +0 -0
  141. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/agent_list_params.py +0 -0
  142. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/agent_list_view.py +0 -0
  143. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/agent_view.py +0 -0
  144. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
  145. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
  146. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
  147. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
  148. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
  149. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
  150. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
  151. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
  152. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_view.py +0 -0
  153. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmarks/__init__.py +0 -0
  154. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmarks/run_list_params.py +0 -0
  155. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmarks/run_list_scenario_runs_params.py +0 -0
  156. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
  157. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
  158. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
  159. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_create_from_inspection_params.py +0 -0
  160. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
  161. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
  162. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
  163. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
  164. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
  165. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
  166. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_view.py +0 -0
  167. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
  168. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_create_params.py +0 -0
  169. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_create_tunnel_params.py +0 -0
  170. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
  171. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
  172. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
  173. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
  174. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
  175. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
  176. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_list_params.py +0 -0
  177. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_list_view.py +0 -0
  178. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
  179. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
  180. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_remove_tunnel_params.py +0 -0
  181. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
  182. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
  183. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
  184. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
  185. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
  186. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_tunnel_view.py +0 -0
  187. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_update_params.py +0 -0
  188. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
  189. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_view.py +0 -0
  190. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
  191. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
  192. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
  193. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/browser_create_params.py +0 -0
  194. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/browser_view.py +0 -0
  195. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_create_params.py +0 -0
  196. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py +0 -0
  197. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py +0 -0
  198. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py +0 -0
  199. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py +0 -0
  200. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py +0 -0
  201. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py +0 -0
  202. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_view.py +0 -0
  203. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
  204. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
  205. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
  206. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
  207. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
  208. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
  209. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
  210. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
  211. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
  212. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +0 -0
  213. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +0 -0
  214. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
  215. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
  216. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/input_context.py +0 -0
  217. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/input_context_param.py +0 -0
  218. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/input_context_update_param.py +0 -0
  219. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/inspection_source_param.py +0 -0
  220. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_create_params.py +0 -0
  221. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_download_params.py +0 -0
  222. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_download_url_view.py +0 -0
  223. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_list_params.py +0 -0
  224. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_list_public_params.py +0 -0
  225. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_list_view.py +0 -0
  226. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_view.py +0 -0
  227. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_connection_list_view.py +0 -0
  228. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_connection_view.py +0 -0
  229. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_create_params.py +0 -0
  230. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_inspect_params.py +0 -0
  231. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_inspection_details.py +0 -0
  232. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_inspection_list_view.py +0 -0
  233. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_list_params.py +0 -0
  234. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_manifest_view.py +0 -0
  235. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_refresh_params.py +0 -0
  236. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_create_params.py +0 -0
  237. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
  238. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_environment.py +0 -0
  239. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
  240. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_list_params.py +0 -0
  241. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
  242. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
  243. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_run_view.py +0 -0
  244. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_update_params.py +0 -0
  245. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_view.py +0 -0
  246. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
  247. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
  248. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
  249. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
  250. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
  251. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
  252. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
  253. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
  254. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
  255. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_validate_params.py +0 -0
  256. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_validate_response.py +0 -0
  257. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_contract.py +0 -0
  258. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
  259. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
  260. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
  261. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
  262. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/secret_create_params.py +0 -0
  263. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/secret_list_params.py +0 -0
  264. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/secret_list_view.py +0 -0
  265. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/secret_update_params.py +0 -0
  266. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/secret_view.py +0 -0
  267. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/after_idle.py +0 -0
  268. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/agent_source.py +0 -0
  269. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/run_profile.py +0 -0
  270. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
  271. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/agent_source.py +0 -0
  272. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
  273. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/__init__.py +0 -0
  274. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/__init__.py +0 -0
  275. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/benchmarks/__init__.py +0 -0
  276. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/benchmarks/test_runs.py +0 -0
  277. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/__init__.py +0 -0
  278. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/test_browsers.py +0 -0
  279. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/test_computers.py +0 -0
  280. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
  281. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/test_executions.py +0 -0
  282. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/test_logs.py +0 -0
  283. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/scenarios/__init__.py +0 -0
  284. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/scenarios/test_runs.py +0 -0
  285. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/scenarios/test_scorers.py +0 -0
  286. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_agents.py +0 -0
  287. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_benchmarks.py +0 -0
  288. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_objects.py +0 -0
  289. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_repositories.py +0 -0
  290. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_scenarios.py +0 -0
  291. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_secrets.py +0 -0
  292. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/conftest.py +0 -0
  293. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sample_file.txt +0 -0
  294. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/__init__.py +0 -0
  295. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/__init__.py +0 -0
  296. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/conftest.py +0 -0
  297. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/test_core.py +0 -0
  298. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/test_edge_cases.py +0 -0
  299. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/test_interfaces.py +0 -0
  300. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/test_streaming.py +0 -0
  301. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/__init__.py +0 -0
  302. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/conftest.py +0 -0
  303. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/test_core.py +0 -0
  304. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/test_edge_cases.py +0 -0
  305. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/test_interfaces.py +0 -0
  306. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/test_streaming.py +0 -0
  307. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_blueprint.py +0 -0
  308. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_execution.py +0 -0
  309. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_execution_result.py +0 -0
  310. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_scorer.py +0 -0
  311. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_snapshot.py +0 -0
  312. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_storage_object.py +0 -0
  313. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_blueprint.py +0 -0
  314. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_execution.py +0 -0
  315. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_execution_result.py +0 -0
  316. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_helpers.py +0 -0
  317. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_scorer.py +0 -0
  318. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_snapshot.py +0 -0
  319. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_storage_object.py +0 -0
  320. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/README.md +0 -0
  321. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/__init__.py +0 -0
  322. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/conftest.py +0 -0
  323. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/__init__.py +0 -0
  324. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/conftest.py +0 -0
  325. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_blueprint.py +0 -0
  326. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_scorer.py +0 -0
  327. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_sdk.py +0 -0
  328. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_snapshot.py +0 -0
  329. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_blueprint.py +0 -0
  330. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_scorer.py +0 -0
  331. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_sdk.py +0 -0
  332. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_snapshot.py +0 -0
  333. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_storage_object.py +0 -0
  334. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/test_blueprints.py +0 -0
  335. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/test_devboxes.py +0 -0
  336. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/test_executions.py +0 -0
  337. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
  338. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/test_snapshots.py +0 -0
  339. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/utils.py +0 -0
  340. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_client.py +0 -0
  341. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_deepcopy.py +0 -0
  342. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_extract_files.py +0 -0
  343. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_files.py +0 -0
  344. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_models.py +0 -0
  345. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_polling.py +0 -0
  346. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_qs.py +0 -0
  347. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_required_args.py +0 -0
  348. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_response.py +0 -0
  349. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_streaming.py +0 -0
  350. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_transform.py +0 -0
  351. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_utils/test_datetime_parse.py +0 -0
  352. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_utils/test_proxy.py +0 -0
  353. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_utils/test_typing.py +0 -0
  354. {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.2.0"
3
+ }
@@ -1,5 +1,45 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.2.0 (2025-12-09)
4
+
5
+ Full Changelog: [v1.1.0...v1.2.0](https://github.com/runloopai/api-client-python/compare/v1.1.0...v1.2.0)
6
+
7
+ ### Features
8
+
9
+ * **devbox:** default to x86 arch ([501de0b](https://github.com/runloopai/api-client-python/commit/501de0bb1d76c836ff9f448513a16155641345ae))
10
+ * **devbox:** return user for createSshKey ([f094bf7](https://github.com/runloopai/api-client-python/commit/f094bf7443a0ca5bab6d47a53b7b14bade3cecd0))
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * ensure streams are always closed ([d01aae2](https://github.com/runloopai/api-client-python/commit/d01aae204d8c57ac76646df0e0e1078e64ad9891))
16
+
17
+
18
+ ### Chores
19
+
20
+ * bump required `uv` version ([8ad519f](https://github.com/runloopai/api-client-python/commit/8ad519fd26d389628d157a413a0b0f1f5d435e9e))
21
+ * **deps:** mypy 1.18.1 has a regression, pin to 1.17 ([e56582a](https://github.com/runloopai/api-client-python/commit/e56582a93590445d8e545b6123be0f14db39a8f5))
22
+ * **docs:** use environment variables for authentication in code snippets ([55cf613](https://github.com/runloopai/api-client-python/commit/55cf6131edb8d38144761c5dbbbcf9389093ed7b))
23
+ * **internal:** version bump ([2fa85c6](https://github.com/runloopai/api-client-python/commit/2fa85c6694dc468280eedb28136aadcda4f11801))
24
+ * remove some unnecessary changes to reduce diff from Stainless ([#705](https://github.com/runloopai/api-client-python/issues/705)) ([715c9d0](https://github.com/runloopai/api-client-python/commit/715c9d09f4e874032ee1d4d6c81d80ab6a72ec45))
25
+ * update lockfile ([7e0136d](https://github.com/runloopai/api-client-python/commit/7e0136dfcd62a2843138ae382bd6fedfd881e1b3))
26
+ * update requirements-dev.lock ([#707](https://github.com/runloopai/api-client-python/issues/707)) ([a2d5326](https://github.com/runloopai/api-client-python/commit/a2d5326634cad5afe6c74252d26b01916ed41bcb))
27
+ * update uv.lock ([b9e0729](https://github.com/runloopai/api-client-python/commit/b9e07291745291d16f122dbca5ef513ed134c5dd))
28
+
29
+ ## 1.1.0 (2025-12-06)
30
+
31
+ Full Changelog: [v1.0.0...v1.1.0](https://github.com/runloopai/api-client-python/compare/v1.0.0...v1.1.0)
32
+
33
+ ### Features
34
+
35
+ * **scenarios:** added scenario class to sdk ([#701](https://github.com/runloopai/api-client-python/issues/701)) ([121f0fc](https://github.com/runloopai/api-client-python/commit/121f0fc6efa779979f664a75e91d60c068358e21))
36
+ * **SDK:** Build context helpers for the python clients and SDKs ([#684](https://github.com/runloopai/api-client-python/issues/684)) ([42849d6](https://github.com/runloopai/api-client-python/commit/42849d6834098d00234e5ab345ed0d91bac00435))
37
+
38
+
39
+ ### Chores
40
+
41
+ * **smoketests:** fixed smoketests and cleaned up typing/formatting ([#699](https://github.com/runloopai/api-client-python/issues/699)) ([f57aae7](https://github.com/runloopai/api-client-python/commit/f57aae71be8eb801214c012b2ec66b9414f0365e))
42
+
3
43
  ## 1.0.0 (2025-12-02)
4
44
 
5
45
  Full Changelog: [v0.69.0...v1.0.0](https://github.com/runloopai/api-client-python/compare/v0.69.0...v1.0.0)
@@ -89,13 +89,49 @@ Most tests require you to [set up a mock server](https://github.com/stoplightio/
89
89
 
90
90
  ```sh
91
91
  # you will need npm installed
92
- $ npx prism mock path/to/your/openapi.yml
92
+ npx prism mock path/to/your/openapi.yml
93
93
  ```
94
94
 
95
95
  ```sh
96
- $ ./scripts/test
96
+ # run all tests
97
+ ./scripts/test
98
+
99
+ # pass in pytest args, eg to show info on skipped tests:
100
+ ./scripts/test -rs
101
+
102
+ # Run tests for only one python version
103
+ UV_PYTHON=3.13 ./scripts/test
104
+ ```
105
+
106
+ ### Running pytets
107
+
108
+ Assuming you have a uv virtual env set up in .venv, the following are helpful for more granular test running:
109
+
110
+ ```sh
111
+ # Run all tests pytests
112
+ .venv/bin/pytest tests/
113
+
114
+ # Run all SDK tests with verbose info
115
+ .venv/bin/pytest tests/sdk/ -v
116
+
117
+ # Run specific test class
118
+ .venv/bin/pytest tests/sdk/test_clients.py::TestAgentClient -v
119
+
120
+ # Run specific test method
121
+ .venv/bin/pytest tests/sdk/test_clients.py::TestAgentClient::test_create_from_npm -v
122
+
123
+ # Run agent smoketests (requires RUNLOOP_API_KEY)
124
+ export RUNLOOP_API_KEY=your_key_here
125
+ .venv/bin/pytest tests/smoketests/sdk/test_agent.py -v
126
+
127
+ # Run tests matching a pattern
128
+ .venv/bin/pytest tests/sdk/ -k "agent" -v
129
+
130
+ # Run with coverage
131
+ .venv/bin/pytest tests/sdk/ --cov=src/runloop_api_client/sdk --cov-report=html
97
132
  ```
98
133
 
134
+
99
135
  ## Linting and formatting
100
136
 
101
137
  This repository uses [ruff](https://github.com/astral-sh/ruff) and
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: runloop_api_client
3
- Version: 1.0.0
3
+ Version: 1.2.0
4
4
  Summary: The official Python library for the runloop API
5
5
  Project-URL: Homepage, https://github.com/runloopai/api-client-python
6
6
  Project-URL: Repository, https://github.com/runloopai/api-client-python
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
19
  Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
21
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
23
  Classifier: Typing :: Typed
23
24
  Requires-Python: >=3.9
@@ -137,6 +138,7 @@ pip install runloop_api_client[aiohttp]
137
138
  Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
138
139
 
139
140
  ```python
141
+ import os
140
142
  import asyncio
141
143
  from runloop_api_client import DefaultAioHttpClient
142
144
  from runloop_api_client import AsyncRunloop
@@ -144,7 +146,7 @@ from runloop_api_client import AsyncRunloop
144
146
 
145
147
  async def main() -> None:
146
148
  async with AsyncRunloop(
147
- bearer_token="My Bearer Token",
149
+ bearer_token=os.environ.get("RUNLOOP_API_KEY"), # This is the default and can be omitted
148
150
  http_client=DefaultAioHttpClient(),
149
151
  ) as client:
150
152
  devbox_view = await client.devboxes.create()
@@ -8,11 +8,23 @@ The `RunloopSDK` builds on top of the underlying REST client and provides a Pyth
8
8
  - [Quickstart (synchronous)](#quickstart-synchronous)
9
9
  - [Quickstart (asynchronous)](#quickstart-asynchronous)
10
10
  - [Core Concepts](#core-concepts)
11
- - [Devbox](#devbox)
12
- - [Blueprint](#blueprint)
13
- - [Snapshot](#snapshot)
14
- - [StorageObject](#storageobject)
15
- - [Mounting Storage Objects to Devboxes](#mounting-storage-objects-to-devboxes)
11
+ - [RunloopSDK](#runloopsdk)
12
+ - [Available Resources](#available-resources)
13
+ - [Devbox](#devbox)
14
+ - [Command Execution](#command-execution)
15
+ - [Execution Management](#execution-management)
16
+ - [Execution Results](#execution-results)
17
+ - [Streaming Command Output](#streaming-command-output)
18
+ - [File Operations](#file-operations)
19
+ - [Network Operations](#network-operations)
20
+ - [Snapshot Operations](#snapshot-operations)
21
+ - [Devbox Lifecycle Management](#devbox-lifecycle-management)
22
+ - [Context Manager Support](#context-manager-support)
23
+ - [Blueprint](#blueprint)
24
+ - [Snapshot](#snapshot)
25
+ - [StorageObject](#storageobject)
26
+ - [Storage Object Upload Helpers](#storage-object-upload-helpers)
27
+ - [Mounting Storage Objects to Devboxes](#mounting-storage-objects-to-devboxes)
16
28
  - [Accessing the Underlying REST Client](#accessing-the-underlying-rest-client)
17
29
  - [Error Handling](#error-handling)
18
30
  - [Advanced Configuration](#advanced-configuration)
@@ -65,6 +77,7 @@ print(obj.download_as_text())
65
77
  import asyncio
66
78
  from runloop_api_client import AsyncRunloopSDK
67
79
 
80
+
68
81
  async def main():
69
82
  runloop = AsyncRunloopSDK()
70
83
  async with await runloop.devbox.create(name="async-devbox") as devbox:
@@ -76,6 +89,7 @@ async def main():
76
89
 
77
90
  await devbox.cmd.exec("ls", stdout=capture)
78
91
 
92
+
79
93
  asyncio.run(main())
80
94
  ```
81
95
 
@@ -182,7 +196,7 @@ print("Devbox ID:", execution.devbox_id)
182
196
  # Poll for current state
183
197
  state = execution.get_state()
184
198
  print("Status:", state.status) # "running", "completed", etc.
185
- print("Exit code:", state.exit_status) # only set when execution has completed
199
+ print("Exit code:", state.exit_status) # only set when execution has completed
186
200
 
187
201
  # Wait for completion and get results
188
202
  result = execution.result()
@@ -217,7 +231,7 @@ result = execution.result()
217
231
  # Access execution results
218
232
  print("Exit code:", result.exit_code)
219
233
  print("Success:", result.success) # True if exit code is 0
220
- print("Failed:", result.failed) # True if exit code is non-zero
234
+ print("Failed:", result.failed) # True if exit code is non-zero
221
235
 
222
236
  # Get output streams
223
237
  stdout = result.stdout()
@@ -249,6 +263,7 @@ Pass callbacks into `cmd.exec` / `cmd.exec_async` to process logs in real time:
249
263
  def handle_output(line: str) -> None:
250
264
  print("LOG:", line)
251
265
 
266
+
252
267
  result = devbox.cmd.exec(
253
268
  "python train.py",
254
269
  stdout=handle_output,
@@ -266,6 +281,7 @@ def capture(line: str) -> None:
266
281
  # Use thread-safe data structures if needed
267
282
  log_queue.put_nowait(line)
268
283
 
284
+
269
285
  await devbox.cmd.exec(
270
286
  "tail -f /var/log/app.log",
271
287
  stdout=capture,
@@ -287,6 +303,7 @@ print(content)
287
303
 
288
304
  # Upload files
289
305
  from pathlib import Path
306
+
290
307
  devbox.file.upload(
291
308
  path="/home/user/upload.txt",
292
309
  file=Path("local_file.txt"),
@@ -409,6 +426,36 @@ blueprint = runloop.blueprint.create(
409
426
  system_setup_commands=["pip install numpy pandas"],
410
427
  )
411
428
 
429
+ # Or create a blueprint with a Docker build context from a local directory
430
+ from pathlib import Path
431
+ from runloop_api_client.lib.context_loader import build_docker_context_tar
432
+
433
+ context_root = Path("./my-app")
434
+ tar_bytes = build_docker_context_tar(context_root)
435
+
436
+ build_ctx_obj = runloop.storage_object.upload_from_bytes(
437
+ data=tar_bytes,
438
+ name="my-app-context.tar.gz",
439
+ content_type="tgz",
440
+ )
441
+
442
+ blueprint_with_context = runloop.blueprint.create(
443
+ name="my-blueprint-with-context",
444
+ dockerfile="""\
445
+ FROM node:22
446
+ WORKDIR /usr/src/app
447
+
448
+ # copy using the build context from the object
449
+ COPY package.json package.json
450
+ COPY src src
451
+
452
+ RUN npm install --only=production
453
+ CMD ["node", "src/app.js"]
454
+ """,
455
+ # Build context
456
+ build_context=build_ctx_obj.as_build_context(),
457
+ )
458
+
412
459
  # Or get an existing one
413
460
  blueprint = runloop.blueprint.from_id(blueprint_id="bpt_123")
414
461
 
@@ -493,6 +540,7 @@ storage_object.complete()
493
540
 
494
541
  # Upload from file
495
542
  from pathlib import Path
543
+
496
544
  uploaded = runloop.storage_object.upload_from_file(
497
545
  Path("/path/to/file.txt"),
498
546
  name="my-file.txt",
@@ -542,7 +590,7 @@ obj = runloop.storage_object.create(
542
590
  name="data.bin",
543
591
  content_type="binary",
544
592
  )
545
- obj.upload_content(b"\xDE\xAD\xBE\xEF")
593
+ obj.upload_content(b"\xde\xad\xbe\xef")
546
594
  obj.complete()
547
595
  ```
548
596
 
@@ -689,28 +737,30 @@ The async SDK has the same interface as the synchronous version, but all I/O ope
689
737
  import asyncio
690
738
  from runloop_api_client import AsyncRunloopSDK
691
739
 
740
+
692
741
  async def main():
693
742
  runloop = AsyncRunloopSDK()
694
-
743
+
695
744
  # All the same operations, but with await
696
745
  async with await runloop.devbox.create(name="async-devbox") as devbox:
697
746
  result = await devbox.cmd.exec("pwd")
698
747
  print(await result.stdout())
699
-
748
+
700
749
  # Streaming (note: callbacks must be synchronous)
701
750
  def capture(line: str) -> None:
702
751
  print(">>", line)
703
-
752
+
704
753
  await devbox.cmd.exec("ls", stdout=capture)
705
-
754
+
706
755
  # Async file operations
707
756
  await devbox.file.write(path="/tmp/test.txt", contents="Hello")
708
757
  content = await devbox.file.read(path="/tmp/test.txt")
709
-
758
+
710
759
  # Async network operations
711
760
  tunnel = await devbox.net.create_tunnel(port=8080)
712
761
  print("Tunnel URL:", tunnel.url)
713
762
 
763
+
714
764
  asyncio.run(main())
715
765
  ```
716
766
 
@@ -726,7 +776,7 @@ devbox = runloop.devbox.create(
726
776
  name="my-devbox",
727
777
  polling_config=PollingConfig(
728
778
  timeout_seconds=300.0, # Wait up to 5 minutes
729
- interval_seconds=2.0, # Poll every 2 seconds
779
+ interval_seconds=2.0, # Poll every 2 seconds
730
780
  ),
731
781
  )
732
782
 
@@ -734,7 +784,7 @@ devbox = runloop.devbox.create(
734
784
  snapshot.await_completed(
735
785
  polling_config=PollingConfig(
736
786
  timeout_seconds=600.0, # Wait up to 10 minutes
737
- interval_seconds=5.0, # Poll every 5 seconds
787
+ interval_seconds=5.0, # Poll every 5 seconds
738
788
  ),
739
789
  )
740
790
  ```
@@ -102,6 +102,7 @@ pip install runloop_api_client[aiohttp]
102
102
  Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
103
103
 
104
104
  ```python
105
+ import os
105
106
  import asyncio
106
107
  from runloop_api_client import DefaultAioHttpClient
107
108
  from runloop_api_client import AsyncRunloop
@@ -109,7 +110,7 @@ from runloop_api_client import AsyncRunloop
109
110
 
110
111
  async def main() -> None:
111
112
  async with AsyncRunloop(
112
- bearer_token="My Bearer Token",
113
+ bearer_token=os.environ.get("RUNLOOP_API_KEY"), # This is the default and can be omitted
113
114
  http_client=DefaultAioHttpClient(),
114
115
  ) as client:
115
116
  devbox_view = await client.devboxes.create()
@@ -3,12 +3,10 @@
3
3
  ```python
4
4
  from runloop_api_client.types import (
5
5
  AfterIdle,
6
- AgentMountParameters,
7
6
  AgentSource,
8
7
  CodeMountParameters,
9
8
  LaunchParameters,
10
9
  Mount,
11
- ObjectMountParameters,
12
10
  RunProfile,
13
11
  )
14
12
  ```
@@ -1,19 +1,20 @@
1
1
  [project]
2
2
  name = "runloop_api_client"
3
- version = "1.0.0"
3
+ version = "1.2.0"
4
4
  description = "The official Python library for the runloop API"
5
5
  dynamic = ["readme"]
6
6
  license = "MIT"
7
7
  authors = [
8
8
  { name = "Runloop", email = "support@runloop.ai" },
9
9
  ]
10
+
10
11
  dependencies = [
11
- "httpx>=0.23.0, <1",
12
- "pydantic>=1.9.0, <3",
13
- "typing-extensions>=4.10, <5",
14
- "anyio>=3.5.0, <5",
15
- "distro>=1.7.0, <2",
16
- "sniffio",
12
+ "httpx>=0.23.0, <1",
13
+ "pydantic>=1.9.0, <3",
14
+ "typing-extensions>=4.10, <5",
15
+ "anyio>=3.5.0, <5",
16
+ "distro>=1.7.0, <2",
17
+ "sniffio",
17
18
  "uuid-utils>=0.11.0",
18
19
  ]
19
20
 
@@ -26,6 +27,7 @@ classifiers = [
26
27
  "Programming Language :: Python :: 3.11",
27
28
  "Programming Language :: Python :: 3.12",
28
29
  "Programming Language :: Python :: 3.13",
30
+ "Programming Language :: Python :: 3.14",
29
31
  "Operating System :: OS Independent",
30
32
  "Operating System :: POSIX",
31
33
  "Operating System :: MacOS",
@@ -44,13 +46,19 @@ aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
44
46
 
45
47
  [tool.uv]
46
48
  managed = true
47
- required-version = ">=0.5.0"
49
+ required-version = ">=0.9"
50
+ conflicts = [
51
+ [
52
+ { group = "pydantic-v1" },
53
+ { group = "pydantic-v2" },
54
+ ],
55
+ ]
48
56
 
49
57
  [dependency-groups]
50
58
  # version pins are in uv.lock
51
59
  dev = [
52
60
  "pyright==1.1.399",
53
- "mypy",
61
+ "mypy==1.17",
54
62
  "respx",
55
63
  "pytest",
56
64
  "pytest-asyncio",
@@ -64,51 +72,24 @@ dev = [
64
72
  "uuid-utils>=0.11.0",
65
73
  "pytest-cov>=7.0.0",
66
74
  ]
75
+ pydantic-v1 = [
76
+ "pydantic>=1.9.0,<2",
77
+ ]
78
+ pydantic-v2 = [
79
+ "pydantic~=2.0 ; python_full_version < '3.14'",
80
+ "pydantic~=2.12 ; python_full_version >= '3.14'",
81
+ ]
67
82
  docs = [
68
83
  "furo>=2025.9.25",
69
84
  "sphinx>=7.4.7",
70
85
  "sphinx-autodoc-typehints>=2.3.0",
71
86
  "sphinx-toolbox>=4.0.0",
72
87
  ]
73
- pydantic-v1 = [
74
- "pydantic>=1.9.0, <2",
75
- ]
76
-
77
- [tool.rye.scripts]
78
- format = { chain = [
79
- "format:ruff",
80
- "format:docs",
81
- "fix:ruff",
82
- # run formatting again to fix any inconsistencies when imports are stripped
83
- "format:ruff",
84
- ]}
85
- "format:docs" = "python scripts/utils/ruffen-docs.py README.md api.md"
86
- "format:ruff" = "ruff format"
87
-
88
- "lint" = { chain = [
89
- "check:ruff",
90
- "typecheck",
91
- "check:importable",
92
- ]}
93
- "check:ruff" = "ruff check ."
94
- "fix:ruff" = "ruff check --fix ."
95
-
96
- "check:importable" = "python -c 'import runloop_api_client'"
97
-
98
- typecheck = { chain = [
99
- "typecheck:pyright",
100
- "typecheck:mypy"
101
- ]}
102
-
103
- "typecheck:pyright" = "pyright"
104
- "typecheck:verify-types" = "pyright --verifytypes runloop_api_client --ignoreexternal"
105
- "typecheck:mypy" = "mypy ."
106
88
 
107
89
  [build-system]
108
90
  requires = ["hatchling==1.26.3", "hatch-fancy-pypi-readme"]
109
91
  build-backend = "hatchling.build"
110
92
 
111
-
112
93
  [tool.hatch.build]
113
94
  include = [
114
95
  "src/*"
@@ -0,0 +1,110 @@
1
+ # This file was autogenerated by uv via the following command:
2
+ # uv export -o requirements-dev.lock --no-hashes
3
+ -e .
4
+ annotated-types==0.7.0
5
+ # via pydantic
6
+ anyio==4.12.0
7
+ # via
8
+ # httpx
9
+ # runloop-api-client
10
+ backports-asyncio-runner==1.2.0 ; python_full_version < '3.11'
11
+ # via pytest-asyncio
12
+ certifi==2025.11.12
13
+ # via
14
+ # httpcore
15
+ # httpx
16
+ colorama==0.4.6 ; sys_platform == 'win32'
17
+ # via pytest
18
+ dirty-equals==0.11
19
+ distro==1.9.0
20
+ # via runloop-api-client
21
+ exceptiongroup==1.3.1 ; python_full_version < '3.11'
22
+ # via
23
+ # anyio
24
+ # pytest
25
+ execnet==2.1.2
26
+ # via pytest-xdist
27
+ h11==0.16.0
28
+ # via httpcore
29
+ httpcore==1.0.9
30
+ # via httpx
31
+ httpx==0.28.1
32
+ # via
33
+ # respx
34
+ # runloop-api-client
35
+ idna==3.11
36
+ # via
37
+ # anyio
38
+ # httpx
39
+ importlib-metadata==8.7.0
40
+ iniconfig==2.1.0 ; python_full_version < '3.10'
41
+ # via pytest
42
+ iniconfig==2.3.0 ; python_full_version >= '3.10'
43
+ # via pytest
44
+ markdown-it-py==3.0.0 ; python_full_version < '3.10'
45
+ # via rich
46
+ markdown-it-py==4.0.0 ; python_full_version >= '3.10'
47
+ # via rich
48
+ mdurl==0.1.2
49
+ # via markdown-it-py
50
+ mypy==1.17.0
51
+ mypy-extensions==1.1.0
52
+ # via mypy
53
+ nodeenv==1.9.1
54
+ # via pyright
55
+ packaging==25.0
56
+ # via pytest
57
+ pathspec==0.12.1
58
+ # via mypy
59
+ pluggy==1.6.0
60
+ # via pytest
61
+ pydantic==2.12.5
62
+ # via runloop-api-client
63
+ pydantic-core==2.41.5
64
+ # via pydantic
65
+ pygments==2.19.2
66
+ # via
67
+ # pytest
68
+ # rich
69
+ pyright==1.1.399
70
+ pytest==8.4.2 ; python_full_version < '3.10'
71
+ # via
72
+ # pytest-asyncio
73
+ # pytest-xdist
74
+ pytest==9.0.1 ; python_full_version >= '3.10'
75
+ # via
76
+ # pytest-asyncio
77
+ # pytest-xdist
78
+ pytest-asyncio==1.2.0 ; python_full_version < '3.10'
79
+ pytest-asyncio==1.3.0 ; python_full_version >= '3.10'
80
+ pytest-xdist==3.8.0
81
+ python-dateutil==2.9.0.post0 ; python_full_version < '3.10'
82
+ # via time-machine
83
+ respx==0.22.0
84
+ rich==14.2.0
85
+ ruff==0.14.7
86
+ six==1.17.0 ; python_full_version < '3.10'
87
+ # via python-dateutil
88
+ sniffio==1.3.1
89
+ # via runloop-api-client
90
+ time-machine==2.19.0 ; python_full_version < '3.10'
91
+ time-machine==3.1.0 ; python_full_version >= '3.10'
92
+ tomli==2.3.0 ; python_full_version < '3.11'
93
+ # via
94
+ # mypy
95
+ # pytest
96
+ typing-extensions==4.15.0
97
+ # via
98
+ # anyio
99
+ # exceptiongroup
100
+ # mypy
101
+ # pydantic
102
+ # pydantic-core
103
+ # pyright
104
+ # pytest-asyncio
105
+ # runloop-api-client
106
+ # typing-inspection
107
+ typing-inspection==0.4.2
108
+ # via pydantic
109
+ zipp==3.23.0
110
+ # via importlib-metadata
@@ -73,22 +73,22 @@ class Stream(Generic[_T]):
73
73
  process_data = self._client._process_response_data
74
74
  iterator = self._iter_events()
75
75
 
76
- for sse in iterator:
77
- # Surface server-sent error events as API errors to allow callers to handle/retry
78
- if sse.event == "error":
79
- try:
80
- error_obj = json.loads(sse.data)
81
- status_code = int(error_obj.get("code", 500))
82
- # Build a synthetic response to mirror normal error handling
83
- fake_resp = httpx.Response(status_code, request=response.request, content=sse.data)
84
- except Exception:
85
- fake_resp = httpx.Response(500, request=response.request, content=sse.data)
86
- raise self._client._make_status_error_from_response(fake_resp)
87
-
88
- yield process_data(data=sse.json(), cast_to=cast_to, response=response)
89
-
90
- # As we might not fully consume the response stream, we need to close it explicitly
91
- response.close()
76
+ try:
77
+ for sse in iterator:
78
+ # Surface server-sent error events as API errors to allow callers to handle/retry
79
+ if sse.event == "error":
80
+ try:
81
+ error_obj = json.loads(sse.data)
82
+ status_code = int(error_obj.get("code", 500))
83
+ fake_resp = httpx.Response(status_code, request=response.request, content=sse.data)
84
+ except Exception:
85
+ fake_resp = httpx.Response(500, request=response.request, content=sse.data)
86
+ raise self._client._make_status_error_from_response(fake_resp)
87
+
88
+ yield process_data(data=sse.json(), cast_to=cast_to, response=response)
89
+ finally:
90
+ # Ensure the response is closed even if the consumer doesn't read all data
91
+ response.close()
92
92
 
93
93
  def __enter__(self) -> Self:
94
94
  return self
@@ -147,22 +147,22 @@ class AsyncStream(Generic[_T]):
147
147
  process_data = self._client._process_response_data
148
148
  iterator = self._iter_events()
149
149
 
150
- async for sse in iterator:
151
- # Surface server-sent error events as API errors to allow callers to handle/retry
152
- if sse.event == "error":
153
- try:
154
- error_obj = json.loads(sse.data)
155
- status_code = int(error_obj.get("code", 500))
156
- # Build a synthetic response to mirror normal error handling
157
- fake_resp = httpx.Response(status_code, request=response.request, content=sse.data)
158
- except Exception:
159
- fake_resp = httpx.Response(500, request=response.request, content=sse.data)
160
- raise self._client._make_status_error_from_response(fake_resp)
161
-
162
- yield process_data(data=sse.json(), cast_to=cast_to, response=response)
163
-
164
- # As we might not fully consume the response stream, we need to close it explicitly
165
- await response.aclose()
150
+ try:
151
+ async for sse in iterator:
152
+ # Surface server-sent error events as API errors to allow callers to handle/retry
153
+ if sse.event == "error":
154
+ try:
155
+ error_obj = json.loads(sse.data)
156
+ status_code = int(error_obj.get("code", 500))
157
+ fake_resp = httpx.Response(status_code, request=response.request, content=sse.data)
158
+ except Exception:
159
+ fake_resp = httpx.Response(500, request=response.request, content=sse.data)
160
+ raise self._client._make_status_error_from_response(fake_resp)
161
+
162
+ yield process_data(data=sse.json(), cast_to=cast_to, response=response)
163
+ finally:
164
+ # Ensure the response is closed even if the consumer doesn't read all data
165
+ await response.aclose()
166
166
 
167
167
  async def __aenter__(self) -> Self:
168
168
  return self
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "runloop_api_client"
4
- __version__ = "1.0.0" # x-release-please-version
4
+ __version__ = "1.2.0" # x-release-please-version
@@ -0,0 +1,3 @@
1
+ """
2
+ Helpers for `runloop_api_client`.
3
+ """