runloop_api_client 0.66.0__tar.gz → 0.67.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 (261) hide show
  1. runloop_api_client-0.67.0/.release-please-manifest.json +3 -0
  2. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/CHANGELOG.md +25 -0
  3. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/PKG-INFO +6 -4
  4. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/README.md +5 -3
  5. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/pyproject.toml +1 -1
  6. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/requirements-dev.lock +11 -40
  7. runloop_api_client-0.67.0/src/runloop_api_client/_constants.py +23 -0
  8. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_streaming.py +4 -6
  9. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/__init__.py +1 -0
  10. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_sync.py +3 -31
  11. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_utils.py +1 -1
  12. runloop_api_client-0.67.0/src/runloop_api_client/_utils/_validation.py +31 -0
  13. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_version.py +1 -1
  14. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/blueprints.py +92 -14
  15. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/devboxes.py +57 -39
  16. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/executions.py +8 -4
  17. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_view.py +1 -1
  18. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +6 -0
  19. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +4 -1
  20. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +4 -1
  21. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/launch_parameters.py +1 -1
  22. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/launch_parameters.py +1 -1
  23. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_blueprints.py +44 -0
  24. runloop_api_client-0.67.0/tests/smoketests/test_blueprints.py +107 -0
  25. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/test_devboxes.py +2 -2
  26. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/test_snapshots.py +11 -7
  27. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_client.py +210 -174
  28. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/uv.lock +92 -117
  29. runloop_api_client-0.66.0/.release-please-manifest.json +0 -3
  30. runloop_api_client-0.66.0/src/runloop_api_client/_constants.py +0 -14
  31. runloop_api_client-0.66.0/tests/smoketests/test_blueprints.py +0 -65
  32. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/.gitignore +0 -0
  33. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/CONTRIBUTING.md +0 -0
  34. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/LICENSE +0 -0
  35. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/SECURITY.md +0 -0
  36. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/api.md +0 -0
  37. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/bin/check-release-environment +0 -0
  38. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/bin/publish-pypi +0 -0
  39. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/examples/.keep +0 -0
  40. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/release-please-config.json +0 -0
  41. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop/lib/.keep +0 -0
  42. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/__init__.py +0 -0
  43. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_base_client.py +0 -0
  44. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_client.py +0 -0
  45. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_compat.py +0 -0
  46. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_exceptions.py +0 -0
  47. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_files.py +0 -0
  48. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_models.py +0 -0
  49. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_qs.py +0 -0
  50. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_resource.py +0 -0
  51. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_response.py +0 -0
  52. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_types.py +0 -0
  53. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_compat.py +0 -0
  54. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
  55. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_logs.py +0 -0
  56. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_proxy.py +0 -0
  57. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_reflection.py +0 -0
  58. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
  59. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_streams.py +0 -0
  60. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_transform.py +0 -0
  61. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_typing.py +0 -0
  62. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/lib/.keep +0 -0
  63. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/lib/polling.py +0 -0
  64. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/lib/polling_async.py +0 -0
  65. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/pagination.py +0 -0
  66. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/py.typed +0 -0
  67. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/__init__.py +0 -0
  68. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/benchmarks/__init__.py +0 -0
  69. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/benchmarks/benchmarks.py +0 -0
  70. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/benchmarks/runs.py +0 -0
  71. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
  72. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/browsers.py +0 -0
  73. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/computers.py +0 -0
  74. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
  75. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
  76. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/objects.py +0 -0
  77. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/repositories.py +0 -0
  78. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
  79. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
  80. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
  81. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
  82. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/secrets.py +0 -0
  83. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/__init__.py +0 -0
  84. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
  85. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
  86. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
  87. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
  88. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
  89. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
  90. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
  91. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
  92. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_view.py +0 -0
  93. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmarks/__init__.py +0 -0
  94. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmarks/run_list_params.py +0 -0
  95. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmarks/run_list_scenario_runs_params.py +0 -0
  96. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
  97. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
  98. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
  99. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_create_from_inspection_params.py +0 -0
  100. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
  101. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
  102. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
  103. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
  104. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
  105. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
  106. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_create_params.py +0 -0
  107. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
  108. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_create_tunnel_params.py +0 -0
  109. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
  110. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
  111. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
  112. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
  113. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
  114. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
  115. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_list_params.py +0 -0
  116. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_list_view.py +0 -0
  117. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
  118. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
  119. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_remove_tunnel_params.py +0 -0
  120. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
  121. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
  122. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
  123. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
  124. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
  125. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_tunnel_view.py +0 -0
  126. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_update_params.py +0 -0
  127. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
  128. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_view.py +0 -0
  129. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
  130. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
  131. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
  132. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/browser_create_params.py +0 -0
  133. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/browser_view.py +0 -0
  134. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_create_params.py +0 -0
  135. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py +0 -0
  136. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py +0 -0
  137. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py +0 -0
  138. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py +0 -0
  139. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py +0 -0
  140. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py +0 -0
  141. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_view.py +0 -0
  142. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
  143. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
  144. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
  145. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
  146. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
  147. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
  148. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
  149. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
  150. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
  151. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
  152. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
  153. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/input_context.py +0 -0
  154. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/input_context_param.py +0 -0
  155. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/input_context_update_param.py +0 -0
  156. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/inspection_source_param.py +0 -0
  157. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_create_params.py +0 -0
  158. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_download_params.py +0 -0
  159. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_download_url_view.py +0 -0
  160. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_list_params.py +0 -0
  161. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_list_public_params.py +0 -0
  162. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_list_view.py +0 -0
  163. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_view.py +0 -0
  164. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_connection_list_view.py +0 -0
  165. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_connection_view.py +0 -0
  166. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_create_params.py +0 -0
  167. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_inspect_params.py +0 -0
  168. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_inspection_details.py +0 -0
  169. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_inspection_list_view.py +0 -0
  170. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_list_params.py +0 -0
  171. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_manifest_view.py +0 -0
  172. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_refresh_params.py +0 -0
  173. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_create_params.py +0 -0
  174. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
  175. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_environment.py +0 -0
  176. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
  177. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_list_params.py +0 -0
  178. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
  179. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
  180. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_run_view.py +0 -0
  181. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
  182. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_update_params.py +0 -0
  183. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_view.py +0 -0
  184. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
  185. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
  186. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
  187. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
  188. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
  189. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
  190. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
  191. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
  192. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
  193. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_validate_params.py +0 -0
  194. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_validate_response.py +0 -0
  195. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_contract.py +0 -0
  196. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
  197. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
  198. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
  199. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_function.py +0 -0
  200. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_function_param.py +0 -0
  201. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
  202. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/secret_create_params.py +0 -0
  203. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/secret_list_params.py +0 -0
  204. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/secret_list_view.py +0 -0
  205. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/secret_update_params.py +0 -0
  206. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/secret_view.py +0 -0
  207. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/__init__.py +0 -0
  208. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/after_idle.py +0 -0
  209. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/agent_mount_parameters.py +0 -0
  210. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
  211. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/mount.py +0 -0
  212. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/object_mount_parameters.py +0 -0
  213. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/run_profile.py +0 -0
  214. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
  215. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
  216. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/agent_mount_parameters.py +0 -0
  217. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
  218. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/mount.py +0 -0
  219. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/object_mount_parameters.py +0 -0
  220. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
  221. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/__init__.py +0 -0
  222. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/__init__.py +0 -0
  223. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/benchmarks/__init__.py +0 -0
  224. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/benchmarks/test_runs.py +0 -0
  225. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/__init__.py +0 -0
  226. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/test_browsers.py +0 -0
  227. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/test_computers.py +0 -0
  228. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
  229. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/test_executions.py +0 -0
  230. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/test_logs.py +0 -0
  231. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/scenarios/__init__.py +0 -0
  232. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/scenarios/test_runs.py +0 -0
  233. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/scenarios/test_scorers.py +0 -0
  234. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_benchmarks.py +0 -0
  235. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_devboxes.py +0 -0
  236. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_objects.py +0 -0
  237. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_repositories.py +0 -0
  238. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_scenarios.py +0 -0
  239. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_secrets.py +0 -0
  240. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/conftest.py +0 -0
  241. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/sample_file.txt +0 -0
  242. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/README.md +0 -0
  243. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/__init__.py +0 -0
  244. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/conftest.py +0 -0
  245. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/test_executions.py +0 -0
  246. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
  247. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/utils.py +0 -0
  248. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_deepcopy.py +0 -0
  249. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_extract_files.py +0 -0
  250. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_files.py +0 -0
  251. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_models.py +0 -0
  252. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_polling.py +0 -0
  253. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_qs.py +0 -0
  254. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_required_args.py +0 -0
  255. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_response.py +0 -0
  256. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_streaming.py +0 -0
  257. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_transform.py +0 -0
  258. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_utils/test_datetime_parse.py +0 -0
  259. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_utils/test_proxy.py +0 -0
  260. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_utils/test_typing.py +0 -0
  261. {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.67.0"
3
+ }
@@ -1,5 +1,30 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.67.0 (2025-11-14)
4
+
5
+ Full Changelog: [v0.66.1...v0.67.0](https://github.com/runloopai/api-client-python/compare/v0.66.1...v0.67.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** api update ([516c20b](https://github.com/runloopai/api-client-python/commit/516c20b3095d7e75b0e15647621bf92e0d79f5f4))
10
+ * **blueprint:** adds queued state ([5893559](https://github.com/runloopai/api-client-python/commit/5893559e8839260876947d31f1090dd343f1cf43))
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **client:** close streams without requiring full consumption ([30f9ee5](https://github.com/runloopai/api-client-python/commit/30f9ee5b6cc5f42ce642b918c4e0194a4ab8bc7a))
16
+
17
+
18
+ ### Chores
19
+
20
+ * **internal/tests:** avoid race condition with implicit client cleanup ([7152280](https://github.com/runloopai/api-client-python/commit/71522809d211f5bbad89be807559ca2de591729f))
21
+ * **internal:** grammar fix (it's -> its) ([fd6963f](https://github.com/runloopai/api-client-python/commit/fd6963f1777dedc2db5b86dc222a5e70521134ba))
22
+ * **package:** drop Python 3.8 support ([5026669](https://github.com/runloopai/api-client-python/commit/50266693caae9b3c6e6506cb58f096f1d439dcd0))
23
+
24
+ ## 0.66.1 (2025-10-23)
25
+
26
+ Full Changelog: [v0.66.0...v0.66.1](https://github.com/runloopai/api-client-python/compare/v0.66.0...v0.66.1)
27
+
3
28
  ## 0.66.0 (2025-10-23)
4
29
 
5
30
  Full Changelog: [v0.65.0...v0.66.0](https://github.com/runloopai/api-client-python/compare/v0.65.0...v0.66.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: runloop_api_client
3
- Version: 0.66.0
3
+ Version: 0.67.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
@@ -38,7 +38,7 @@ Description-Content-Type: text/markdown
38
38
  <!-- prettier-ignore -->
39
39
  [![PyPI version](https://img.shields.io/pypi/v/runloop_api_client.svg?label=pypi%20(stable))](https://pypi.org/project/runloop_api_client/)
40
40
 
41
- The Runloop Python library provides convenient access to the Runloop REST API from any Python 3.8+
41
+ The Runloop Python library provides convenient access to the Runloop REST API from any Python 3.9+
42
42
  application. The library includes type definitions for all request params and response fields,
43
43
  and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
44
44
 
@@ -46,7 +46,9 @@ It is generated with [Stainless](https://www.stainless.com/).
46
46
 
47
47
  ## Documentation
48
48
 
49
- The REST API documentation can be found on [runloop.ai](https://runloop.ai). The full API of this library can be found in [api.md](api.md).
49
+ The REST API documentation can be found on
50
+ [runloop.ai](https://runloop.ai). The full API of this library can be found in
51
+ [api.md](https://github.com/runloopai/api-client-python/blob/main/api.md).
50
52
 
51
53
  ## Installation
52
54
 
@@ -489,7 +491,7 @@ print(runloop_api_client.__version__)
489
491
 
490
492
  ## Requirements
491
493
 
492
- Python 3.8 or higher.
494
+ Python 3.9 or higher.
493
495
 
494
496
  ## Contributing
495
497
 
@@ -3,7 +3,7 @@
3
3
  <!-- prettier-ignore -->
4
4
  [![PyPI version](https://img.shields.io/pypi/v/runloop_api_client.svg?label=pypi%20(stable))](https://pypi.org/project/runloop_api_client/)
5
5
 
6
- The Runloop Python library provides convenient access to the Runloop REST API from any Python 3.8+
6
+ The Runloop Python library provides convenient access to the Runloop REST API from any Python 3.9+
7
7
  application. The library includes type definitions for all request params and response fields,
8
8
  and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
9
9
 
@@ -11,7 +11,9 @@ It is generated with [Stainless](https://www.stainless.com/).
11
11
 
12
12
  ## Documentation
13
13
 
14
- The REST API documentation can be found on [runloop.ai](https://runloop.ai). The full API of this library can be found in [api.md](api.md).
14
+ The REST API documentation can be found on
15
+ [runloop.ai](https://runloop.ai). The full API of this library can be found in
16
+ [api.md](https://github.com/runloopai/api-client-python/blob/main/api.md).
15
17
 
16
18
  ## Installation
17
19
 
@@ -454,7 +456,7 @@ print(runloop_api_client.__version__)
454
456
 
455
457
  ## Requirements
456
458
 
457
- Python 3.8 or higher.
459
+ Python 3.9 or higher.
458
460
 
459
461
  ## Contributing
460
462
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "runloop_api_client"
3
- version = "0.66.0"
3
+ version = "0.67.0"
4
4
  description = "The official Python library for the runloop API"
5
5
  dynamic = ["readme"]
6
6
  license = "MIT"
@@ -3,11 +3,7 @@
3
3
  -e .
4
4
  annotated-types==0.7.0
5
5
  # via pydantic
6
- anyio==4.5.2 ; python_full_version < '3.9'
7
- # via
8
- # httpx
9
- # runloop-api-client
10
- anyio==4.8.0 ; python_full_version >= '3.9'
6
+ anyio==4.8.0
11
7
  # via
12
8
  # httpx
13
9
  # runloop-api-client
@@ -38,8 +34,7 @@ idna==3.10
38
34
  # via
39
35
  # anyio
40
36
  # httpx
41
- importlib-metadata==8.5.0 ; python_full_version < '3.9'
42
- importlib-metadata==8.6.1 ; python_full_version >= '3.9'
37
+ importlib-metadata==8.6.1
43
38
  iniconfig==2.0.0
44
39
  # via pytest
45
40
  markdown-it-py==3.0.0
@@ -55,30 +50,23 @@ packaging==24.2
55
50
  # via pytest
56
51
  pluggy==1.5.0
57
52
  # via pytest
58
- pydantic==2.10.6 ; python_full_version < '3.9'
53
+ pydantic==2.10.3
59
54
  # via runloop-api-client
60
- pydantic==2.11.9 ; python_full_version >= '3.9'
61
- # via runloop-api-client
62
- pydantic-core==2.27.2 ; python_full_version < '3.9'
63
- # via pydantic
64
- pydantic-core==2.33.2 ; python_full_version >= '3.9'
55
+ pydantic-core==2.27.1
65
56
  # via pydantic
66
57
  pygments==2.19.1
67
58
  # via
68
59
  # pytest
69
60
  # rich
70
61
  pyright==1.1.399
71
- pytest==8.3.3
72
- # via pytest-asyncio
73
- # via pytest-timeout
74
- # via pytest-xdist
62
+ pytest==8.4.1
63
+ # via
64
+ # pytest-asyncio
65
+ # pytest-xdist
75
66
  pytest-asyncio==0.24.0
76
- pytest-timeout==2.3.1
77
67
  pytest-xdist==3.7.0
78
- python-dateutil==2.8.2
68
+ python-dateutil==2.9.0.post0
79
69
  # via time-machine
80
- pytz==2024.2 ; python_full_version < '3.9'
81
- # via dirty-equals
82
70
  respx==0.22.0
83
71
  rich==13.9.4
84
72
  ruff==0.9.4
@@ -88,15 +76,13 @@ sniffio==1.3.1
88
76
  # via
89
77
  # anyio
90
78
  # runloop-api-client
91
- time-machine==2.15.0 ; python_full_version < '3.9'
92
- time-machine==2.16.0 ; python_full_version >= '3.9'
79
+ time-machine==2.16.0
93
80
  tomli==2.2.1 ; python_full_version < '3.11'
94
81
  # via
95
82
  # mypy
96
83
  # pytest
97
84
  typing-extensions==4.12.2
98
85
  # via
99
- # annotated-types
100
86
  # anyio
101
87
  # mypy
102
88
  # pydantic
@@ -104,20 +90,5 @@ typing-extensions==4.12.2
104
90
  # pyright
105
91
  # rich
106
92
  # runloop-api-client
107
- # typing-inspection
108
- typing-inspection==0.4.1 ; python_full_version >= '3.9'
109
- # via pydantic
110
- # via pydantic-core
111
- # via pyright
112
- # via runloop-api-client
113
- # via typing-inspection
114
- typing-inspection==0.4.1
115
- # via pydantic
116
- uuid-utils==0.11.0
117
- # via runloop-api-client
118
- virtualenv==20.24.5
119
- # via nox
120
- yarl==1.20.0
121
- # via aiohttp
122
- zipp==3.17.0
93
+ zipp==3.21.0
123
94
  # via importlib-metadata
@@ -0,0 +1,23 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ import httpx
4
+
5
+ RAW_RESPONSE_HEADER = "X-Stainless-Raw-Response"
6
+ OVERRIDE_CAST_TO_HEADER = "____stainless_override_cast_to"
7
+
8
+ # default timeout is 30 seconds
9
+ DEFAULT_TIMEOUT = httpx.Timeout(timeout=30, connect=5.0)
10
+ DEFAULT_MAX_RETRIES = 5
11
+ DEFAULT_CONNECTION_LIMITS = httpx.Limits(max_connections=100, max_keepalive_connections=20)
12
+
13
+ INITIAL_RETRY_DELAY = 1.0
14
+ MAX_RETRY_DELAY = 60.0
15
+
16
+ # Maximum allowed size (in bytes) for individual entries in `file_mounts` when creating Blueprints
17
+ # NOTE: Empirically, ~131,000 is the maximum command length after
18
+ # base64 encoding; 98,250 is the pre-encoded limit that stays within that bound.
19
+ # We measure size in bytes using UTF-8 encoding; base64 output is ASCII.
20
+ FILE_MOUNT_MAX_SIZE_BYTES = 98_250
21
+
22
+ # Maximum allowed total size (in bytes) across all `file_mounts` when creating Blueprints
23
+ FILE_MOUNT_TOTAL_MAX_SIZE_BYTES = 786_000 * 10 # ~10 mb
@@ -87,9 +87,8 @@ class Stream(Generic[_T]):
87
87
 
88
88
  yield process_data(data=sse.json(), cast_to=cast_to, response=response)
89
89
 
90
- # Ensure the entire stream is consumed
91
- for _sse in iterator:
92
- ...
90
+ # As we might not fully consume the response stream, we need to close it explicitly
91
+ response.close()
93
92
 
94
93
  def __enter__(self) -> Self:
95
94
  return self
@@ -162,9 +161,8 @@ class AsyncStream(Generic[_T]):
162
161
 
163
162
  yield process_data(data=sse.json(), cast_to=cast_to, response=response)
164
163
 
165
- # Ensure the entire stream is consumed
166
- async for _sse in iterator:
167
- ...
164
+ # As we might not fully consume the response stream, we need to close it explicitly
165
+ await response.aclose()
168
166
 
169
167
  async def __aenter__(self) -> Self:
170
168
  return self
@@ -1,3 +1,4 @@
1
+ # isort: skip_file
1
2
  from ._sync import asyncify as asyncify
2
3
  from ._proxy import LazyProxy as LazyProxy
3
4
  from ._utils import (
@@ -1,10 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
- import sys
4
3
  import asyncio
5
4
  import functools
6
- import contextvars
7
- from typing import Any, TypeVar, Callable, Awaitable
5
+ from typing import TypeVar, Callable, Awaitable
8
6
  from typing_extensions import ParamSpec
9
7
 
10
8
  import anyio
@@ -15,34 +13,11 @@ T_Retval = TypeVar("T_Retval")
15
13
  T_ParamSpec = ParamSpec("T_ParamSpec")
16
14
 
17
15
 
18
- if sys.version_info >= (3, 9):
19
- _asyncio_to_thread = asyncio.to_thread
20
- else:
21
- # backport of https://docs.python.org/3/library/asyncio-task.html#asyncio.to_thread
22
- # for Python 3.8 support
23
- async def _asyncio_to_thread(
24
- func: Callable[T_ParamSpec, T_Retval], /, *args: T_ParamSpec.args, **kwargs: T_ParamSpec.kwargs
25
- ) -> Any:
26
- """Asynchronously run function *func* in a separate thread.
27
-
28
- Any *args and **kwargs supplied for this function are directly passed
29
- to *func*. Also, the current :class:`contextvars.Context` is propagated,
30
- allowing context variables from the main thread to be accessed in the
31
- separate thread.
32
-
33
- Returns a coroutine that can be awaited to get the eventual result of *func*.
34
- """
35
- loop = asyncio.events.get_running_loop()
36
- ctx = contextvars.copy_context()
37
- func_call = functools.partial(ctx.run, func, *args, **kwargs)
38
- return await loop.run_in_executor(None, func_call)
39
-
40
-
41
16
  async def to_thread(
42
17
  func: Callable[T_ParamSpec, T_Retval], /, *args: T_ParamSpec.args, **kwargs: T_ParamSpec.kwargs
43
18
  ) -> T_Retval:
44
19
  if sniffio.current_async_library() == "asyncio":
45
- return await _asyncio_to_thread(func, *args, **kwargs)
20
+ return await asyncio.to_thread(func, *args, **kwargs)
46
21
 
47
22
  return await anyio.to_thread.run_sync(
48
23
  functools.partial(func, *args, **kwargs),
@@ -53,10 +28,7 @@ async def to_thread(
53
28
  def asyncify(function: Callable[T_ParamSpec, T_Retval]) -> Callable[T_ParamSpec, Awaitable[T_Retval]]:
54
29
  """
55
30
  Take a blocking function and create an async one that receives the same
56
- positional and keyword arguments. For python version 3.9 and above, it uses
57
- asyncio.to_thread to run the function in a separate thread. For python version
58
- 3.8, it uses locally defined copy of the asyncio.to_thread function which was
59
- introduced in python 3.9.
31
+ positional and keyword arguments.
60
32
 
61
33
  Usage:
62
34
 
@@ -133,7 +133,7 @@ def is_given(obj: _T | NotGiven | Omit) -> TypeGuard[_T]:
133
133
  # Type safe methods for narrowing types with TypeVars.
134
134
  # The default narrowing for isinstance(obj, dict) is dict[unknown, unknown],
135
135
  # however this cause Pyright to rightfully report errors. As we know we don't
136
- # care about the contained types we can safely use `object` in it's place.
136
+ # care about the contained types we can safely use `object` in its place.
137
137
  #
138
138
  # There are two separate functions defined, `is_*` and `is_*_t` for different use cases.
139
139
  # `is_*` is for when you're dealing with an unknown input
@@ -0,0 +1,31 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import List, Optional
4
+
5
+
6
+ class ValidationNotification:
7
+ """Collects validation errors without raising exceptions.
8
+
9
+ This follows the notification pattern: validations append errors, and callers
10
+ decide how to react (e.g., surface all messages at once or abort).
11
+ """
12
+
13
+ def __init__(self) -> None:
14
+ self._errors: List[str] = []
15
+ self._causes: List[Optional[Exception]] = []
16
+
17
+ def add_error(self, message: str, cause: Optional[Exception] = None) -> None:
18
+ self._errors.append(message)
19
+ self._causes.append(cause)
20
+
21
+ def has_errors(self) -> bool:
22
+ return len(self._errors) > 0
23
+
24
+ @property
25
+ def errors(self) -> List[str]:
26
+ # Return a copy to avoid external mutation
27
+ return list(self._errors)
28
+
29
+ def error_message(self) -> str:
30
+ # Join with semicolons to present multiple issues succinctly
31
+ return "; ".join(self._errors)
@@ -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__ = "0.66.0" # x-release-please-version
4
+ __version__ = "0.67.0" # x-release-please-version
@@ -1,4 +1,5 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+ # isort: skip_file
2
3
 
3
4
  from __future__ import annotations
4
5
 
@@ -15,6 +16,7 @@ from ..types import (
15
16
  )
16
17
  from .._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given
17
18
  from .._utils import maybe_transform, async_maybe_transform
19
+ from .._utils._validation import ValidationNotification
18
20
  from .._compat import cached_property
19
21
  from .._resource import SyncAPIResource, AsyncAPIResource
20
22
  from .._response import (
@@ -23,6 +25,7 @@ from .._response import (
23
25
  async_to_raw_response_wrapper,
24
26
  async_to_streamed_response_wrapper,
25
27
  )
28
+ from .._constants import FILE_MOUNT_MAX_SIZE_BYTES, FILE_MOUNT_TOTAL_MAX_SIZE_BYTES
26
29
  from ..pagination import SyncBlueprintsCursorIDPage, AsyncBlueprintsCursorIDPage
27
30
  from .._exceptions import RunloopError
28
31
  from ..lib.polling import PollingConfig, poll_until
@@ -50,6 +53,57 @@ class BlueprintRequestArgs(TypedDict, total=False):
50
53
  __all__ = ["BlueprintsResource", "AsyncBlueprintsResource", "BlueprintRequestArgs"]
51
54
 
52
55
 
56
+ def _format_bytes(num_bytes: int) -> str:
57
+ """Format a byte count in a human-friendly way (KB/MB/GB).
58
+
59
+ Uses binary units (1024). Avoids decimals when exact.
60
+ """
61
+ if num_bytes < 1024:
62
+ return f"{num_bytes} bytes"
63
+ for factor, unit in ((1 << 30, "GB"), (1 << 20, "MB"), (1 << 10, "KB")):
64
+ if num_bytes >= factor:
65
+ value = num_bytes / factor
66
+ if float(value).is_integer():
67
+ return f"{int(value)} {unit}"
68
+ return f"{value:.1f} {unit}"
69
+ return f"{num_bytes} bytes"
70
+
71
+
72
+ def _validate_file_mounts(file_mounts: Optional[Dict[str, str]] | Omit) -> ValidationNotification:
73
+ """Validate file_mounts are within size constraints: returns validation failures.
74
+
75
+ Currently enforces a maximum per-file size to avoid server-side issues with
76
+ large inline file contents. Also enforces a maximum total size across all
77
+ file_mounts.
78
+ """
79
+
80
+ note = ValidationNotification()
81
+
82
+ if file_mounts is omit or file_mounts is None:
83
+ return note
84
+
85
+ total_size_bytes = 0
86
+ for mount_path, content in file_mounts.items():
87
+ # Measure size in bytes using UTF-8 encoding since payloads are JSON strings
88
+ size_bytes = len(content.encode("utf-8"))
89
+ if size_bytes > FILE_MOUNT_MAX_SIZE_BYTES:
90
+ over = size_bytes - FILE_MOUNT_MAX_SIZE_BYTES
91
+ note.add_error(
92
+ f"file_mount '{mount_path}' is {_format_bytes(over)} over the limit "
93
+ f"({_format_bytes(size_bytes)} / {_format_bytes(FILE_MOUNT_MAX_SIZE_BYTES)}). Use object_mounts instead."
94
+ )
95
+ total_size_bytes += size_bytes
96
+
97
+ if total_size_bytes > FILE_MOUNT_TOTAL_MAX_SIZE_BYTES:
98
+ total_over = total_size_bytes - FILE_MOUNT_TOTAL_MAX_SIZE_BYTES
99
+ note.add_error(
100
+ f"total file_mounts size is {_format_bytes(total_over)} over the limit "
101
+ f"({_format_bytes(total_size_bytes)} / {_format_bytes(FILE_MOUNT_TOTAL_MAX_SIZE_BYTES)}). Use object_mounts instead."
102
+ )
103
+
104
+ return note
105
+
106
+
53
107
  class BlueprintsResource(SyncAPIResource):
54
108
  @cached_property
55
109
  def with_raw_response(self) -> BlueprintsResourceWithRawResponse:
@@ -144,6 +198,10 @@ class BlueprintsResource(SyncAPIResource):
144
198
 
145
199
  idempotency_key: Specify a custom idempotency key for this request
146
200
  """
201
+ note = _validate_file_mounts(file_mounts)
202
+ if note.has_errors():
203
+ raise ValueError(note.error_message())
204
+
147
205
  return self._post(
148
206
  "/v1/blueprints",
149
207
  body=maybe_transform(
@@ -255,14 +313,18 @@ class BlueprintsResource(SyncAPIResource):
255
313
  self,
256
314
  *,
257
315
  name: str,
258
- base_blueprint_id: Optional[str] | NotGiven = NOT_GIVEN,
259
- code_mounts: Optional[Iterable[CodeMountParameters]] | NotGiven = NOT_GIVEN,
260
- dockerfile: Optional[str] | NotGiven = NOT_GIVEN,
261
- file_mounts: Optional[Dict[str, str]] | NotGiven = NOT_GIVEN,
262
- launch_parameters: Optional[LaunchParameters] | NotGiven = NOT_GIVEN,
316
+ base_blueprint_id: Optional[str] | Omit = omit,
317
+ base_blueprint_name: Optional[str] | Omit = omit,
318
+ build_args: Optional[Dict[str, str]] | Omit = omit,
319
+ code_mounts: Optional[Iterable[CodeMountParameters]] | Omit = omit,
320
+ dockerfile: Optional[str] | Omit = omit,
321
+ file_mounts: Optional[Dict[str, str]] | Omit = omit,
322
+ launch_parameters: Optional[LaunchParameters] | Omit = omit,
323
+ metadata: Optional[Dict[str, str]] | Omit = omit,
324
+ secrets: Optional[Dict[str, str]] | Omit = omit,
325
+ services: Optional[Iterable[blueprint_create_params.Service]] | Omit = omit,
326
+ system_setup_commands: Optional[SequenceNotStr[str]] | Omit = omit,
263
327
  polling_config: PollingConfig | None = None,
264
- services: Optional[Iterable[blueprint_create_params.Service]] | NotGiven = NOT_GIVEN,
265
- system_setup_commands: Optional[SequenceNotStr[str]] | NotGiven = NOT_GIVEN,
266
328
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
267
329
  # The extra values given here take precedence over values defined on the client or passed to this method.
268
330
  extra_headers: Headers | None = None,
@@ -290,10 +352,14 @@ class BlueprintsResource(SyncAPIResource):
290
352
  blueprint = self.create(
291
353
  name=name,
292
354
  base_blueprint_id=base_blueprint_id,
355
+ base_blueprint_name=base_blueprint_name,
356
+ build_args=build_args,
293
357
  code_mounts=code_mounts,
294
358
  dockerfile=dockerfile,
295
359
  file_mounts=file_mounts,
296
360
  launch_parameters=launch_parameters,
361
+ metadata=metadata,
362
+ secrets=secrets,
297
363
  services=services,
298
364
  system_setup_commands=system_setup_commands,
299
365
  extra_headers=extra_headers,
@@ -758,6 +824,10 @@ class AsyncBlueprintsResource(AsyncAPIResource):
758
824
 
759
825
  idempotency_key: Specify a custom idempotency key for this request
760
826
  """
827
+ note = _validate_file_mounts(file_mounts)
828
+ if note.has_errors():
829
+ raise ValueError(note.error_message())
830
+
761
831
  return await self._post(
762
832
  "/v1/blueprints",
763
833
  body=await async_maybe_transform(
@@ -869,14 +939,18 @@ class AsyncBlueprintsResource(AsyncAPIResource):
869
939
  self,
870
940
  *,
871
941
  name: str,
872
- base_blueprint_id: Optional[str] | NotGiven = NOT_GIVEN,
873
- code_mounts: Optional[Iterable[CodeMountParameters]] | NotGiven = NOT_GIVEN,
874
- dockerfile: Optional[str] | NotGiven = NOT_GIVEN,
875
- file_mounts: Optional[Dict[str, str]] | NotGiven = NOT_GIVEN,
876
- launch_parameters: Optional[LaunchParameters] | NotGiven = NOT_GIVEN,
942
+ base_blueprint_id: Optional[str] | Omit = omit,
943
+ base_blueprint_name: Optional[str] | Omit = omit,
944
+ build_args: Optional[Dict[str, str]] | Omit = omit,
945
+ code_mounts: Optional[Iterable[CodeMountParameters]] | Omit = omit,
946
+ dockerfile: Optional[str] | Omit = omit,
947
+ file_mounts: Optional[Dict[str, str]] | Omit = omit,
948
+ launch_parameters: Optional[LaunchParameters] | Omit = omit,
949
+ metadata: Optional[Dict[str, str]] | Omit = omit,
950
+ secrets: Optional[Dict[str, str]] | Omit = omit,
951
+ services: Optional[Iterable[blueprint_create_params.Service]] | Omit = omit,
952
+ system_setup_commands: Optional[SequenceNotStr[str]] | Omit = omit,
877
953
  polling_config: PollingConfig | None = None,
878
- services: Optional[Iterable[blueprint_create_params.Service]] | NotGiven = NOT_GIVEN,
879
- system_setup_commands: Optional[SequenceNotStr[str]] | NotGiven = NOT_GIVEN,
880
954
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
881
955
  # The extra values given here take precedence over values defined on the client or passed to this method.
882
956
  extra_headers: Headers | None = None,
@@ -904,10 +978,14 @@ class AsyncBlueprintsResource(AsyncAPIResource):
904
978
  blueprint = await self.create(
905
979
  name=name,
906
980
  base_blueprint_id=base_blueprint_id,
981
+ base_blueprint_name=base_blueprint_name,
982
+ build_args=build_args,
907
983
  code_mounts=code_mounts,
908
984
  dockerfile=dockerfile,
909
985
  file_mounts=file_mounts,
910
986
  launch_parameters=launch_parameters,
987
+ metadata=metadata,
988
+ secrets=secrets,
911
989
  services=services,
912
990
  system_setup_commands=system_setup_commands,
913
991
  extra_headers=extra_headers,