runloop-api-client 0.36.0__tar.gz → 0.38.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 (277) hide show
  1. runloop_api_client-0.38.0/.release-please-manifest.json +3 -0
  2. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/CHANGELOG.md +23 -0
  3. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/CONTRIBUTING.md +1 -2
  4. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/PKG-INFO +2 -18
  5. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/README.md +1 -17
  6. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/api.md +1 -0
  7. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/pyproject.toml +1 -1
  8. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_base_client.py +6 -0
  9. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_models.py +2 -0
  10. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_types.py +2 -0
  11. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_version.py +1 -1
  12. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/benchmarks/runs.py +126 -1
  13. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/benchmarks/__init__.py +1 -0
  14. runloop_api_client-0.38.0/src/runloop_api_client/types/benchmarks/run_list_scenario_runs_params.py +18 -0
  15. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/benchmarks/test_runs.py +97 -1
  16. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_client.py +54 -0
  17. runloop_api_client-0.36.0/.release-please-manifest.json +0 -3
  18. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/.gitignore +0 -0
  19. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/LICENSE +0 -0
  20. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/SECURITY.md +0 -0
  21. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/bin/check-release-environment +0 -0
  22. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/bin/publish-pypi +0 -0
  23. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/examples/.keep +0 -0
  24. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/mypy.ini +0 -0
  25. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/noxfile.py +0 -0
  26. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/release-please-config.json +0 -0
  27. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/requirements-dev.lock +0 -0
  28. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/requirements.lock +0 -0
  29. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop/lib/.keep +0 -0
  30. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/__init__.py +0 -0
  31. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_client.py +0 -0
  32. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_compat.py +0 -0
  33. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_constants.py +0 -0
  34. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_exceptions.py +0 -0
  35. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_files.py +0 -0
  36. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_qs.py +0 -0
  37. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_resource.py +0 -0
  38. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_response.py +0 -0
  39. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_streaming.py +0 -0
  40. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_utils/__init__.py +0 -0
  41. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_utils/_logs.py +0 -0
  42. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_utils/_proxy.py +0 -0
  43. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_utils/_reflection.py +0 -0
  44. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
  45. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_utils/_streams.py +0 -0
  46. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_utils/_sync.py +0 -0
  47. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_utils/_transform.py +0 -0
  48. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_utils/_typing.py +0 -0
  49. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/_utils/_utils.py +0 -0
  50. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/lib/.keep +0 -0
  51. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/lib/polling.py +0 -0
  52. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/lib/polling_async.py +0 -0
  53. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/pagination.py +0 -0
  54. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/py.typed +0 -0
  55. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/__init__.py +0 -0
  56. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/benchmarks/__init__.py +0 -0
  57. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/benchmarks/benchmarks.py +0 -0
  58. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/blueprints.py +0 -0
  59. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
  60. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/devboxes/browsers.py +0 -0
  61. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/devboxes/computers.py +0 -0
  62. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/devboxes/devboxes.py +0 -0
  63. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
  64. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/devboxes/executions.py +0 -0
  65. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
  66. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/devboxes/lsp.py +0 -0
  67. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/repositories.py +0 -0
  68. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
  69. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
  70. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
  71. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
  72. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/__init__.py +0 -0
  73. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
  74. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
  75. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
  76. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
  77. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
  78. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
  79. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
  80. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/benchmark_view.py +0 -0
  81. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/benchmarks/run_list_params.py +0 -0
  82. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
  83. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
  84. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
  85. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
  86. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
  87. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
  88. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
  89. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
  90. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/blueprint_view.py +0 -0
  91. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
  92. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_create_params.py +0 -0
  93. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
  94. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_create_tunnel_params.py +0 -0
  95. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
  96. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
  97. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
  98. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
  99. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
  100. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_list_params.py +0 -0
  101. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_list_view.py +0 -0
  102. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
  103. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
  104. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_remove_tunnel_params.py +0 -0
  105. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
  106. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
  107. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
  108. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
  109. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_tunnel_view.py +0 -0
  110. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_update_params.py +0 -0
  111. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
  112. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_view.py +0 -0
  113. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
  114. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
  115. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_code_action.py +0 -0
  116. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_command.py +0 -0
  117. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_command_param.py +0 -0
  118. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_diagnostic.py +0 -0
  119. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_diagnostic_param.py +0 -0
  120. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_location.py +0 -0
  121. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_markup_content.py +0 -0
  122. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_parameter_information.py +0 -0
  123. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_range.py +0 -0
  124. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_range_param.py +0 -0
  125. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_signature.py +0 -0
  126. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_workspace_edit.py +0 -0
  127. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/base_workspace_edit_param.py +0 -0
  128. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/browser_create_params.py +0 -0
  129. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/browser_view.py +0 -0
  130. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/code_action_application_result.py +0 -0
  131. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/code_action_context_param.py +0 -0
  132. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/code_action_kind.py +0 -0
  133. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/code_action_trigger_kind.py +0 -0
  134. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/code_actions_response.py +0 -0
  135. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/code_description_param.py +0 -0
  136. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/code_segment_info_response.py +0 -0
  137. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/computer_create_params.py +0 -0
  138. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py +0 -0
  139. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py +0 -0
  140. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py +0 -0
  141. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py +0 -0
  142. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py +0 -0
  143. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py +0 -0
  144. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/computer_view.py +0 -0
  145. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
  146. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
  147. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/diagnostic_param.py +0 -0
  148. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/diagnostic_related_information_param.py +0 -0
  149. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/diagnostic_severity.py +0 -0
  150. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/diagnostic_tag.py +0 -0
  151. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/diagnostics_response.py +0 -0
  152. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
  153. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
  154. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/document_symbol.py +0 -0
  155. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/document_symbol_response.py +0 -0
  156. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/document_uri.py +0 -0
  157. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
  158. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
  159. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
  160. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/file_contents_response.py +0 -0
  161. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/file_definition_response.py +0 -0
  162. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/file_path.py +0 -0
  163. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/file_uri.py +0 -0
  164. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/formatting_response.py +0 -0
  165. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/health_status_response.py +0 -0
  166. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/integer.py +0 -0
  167. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/l_sp_any_param.py +0 -0
  168. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/location_param.py +0 -0
  169. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
  170. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_apply_code_action_params.py +0 -0
  171. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_code_actions_params.py +0 -0
  172. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_diagnostics_params.py +0 -0
  173. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_document_symbols_params.py +0 -0
  174. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_file_definition_params.py +0 -0
  175. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_file_params.py +0 -0
  176. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_files_response.py +0 -0
  177. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_formatting_params.py +0 -0
  178. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_get_code_actions_for_diagnostic_params.py +0 -0
  179. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_get_code_actions_for_diagnostic_response.py +0 -0
  180. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_get_code_segment_info_params.py +0 -0
  181. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_get_signature_help_params.py +0 -0
  182. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_references_params.py +0 -0
  183. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_set_watch_directory_params.py +0 -0
  184. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/lsp_set_watch_directory_response.py +0 -0
  185. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/position.py +0 -0
  186. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/position_param.py +0 -0
  187. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/range.py +0 -0
  188. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/range_param.py +0 -0
  189. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/record_string_text_edit_array.py +0 -0
  190. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/record_string_text_edit_array_param.py +0 -0
  191. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/references_response.py +0 -0
  192. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/signature_help_response.py +0 -0
  193. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/symbol_kind.py +0 -0
  194. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/symbol_tag.py +0 -0
  195. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/symbol_type.py +0 -0
  196. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/text_edit.py +0 -0
  197. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/text_edit_param.py +0 -0
  198. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/u_ri.py +0 -0
  199. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/uinteger.py +0 -0
  200. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/devboxes/watched_file_response.py +0 -0
  201. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/input_context.py +0 -0
  202. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/input_context_param.py +0 -0
  203. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/repository_connection_list_view.py +0 -0
  204. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/repository_connection_view.py +0 -0
  205. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/repository_create_params.py +0 -0
  206. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/repository_inspection_details.py +0 -0
  207. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/repository_inspection_list_view.py +0 -0
  208. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/repository_list_params.py +0 -0
  209. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/repository_manifest_view.py +0 -0
  210. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenario_create_params.py +0 -0
  211. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenario_environment.py +0 -0
  212. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
  213. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenario_list_params.py +0 -0
  214. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
  215. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
  216. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenario_run_view.py +0 -0
  217. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
  218. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenario_update_params.py +0 -0
  219. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenario_view.py +0 -0
  220. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
  221. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
  222. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
  223. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
  224. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
  225. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
  226. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
  227. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
  228. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
  229. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/scorer_validate_params.py +0 -0
  230. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scenarios/scorer_validate_response.py +0 -0
  231. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scoring_contract.py +0 -0
  232. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
  233. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
  234. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scoring_function.py +0 -0
  235. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scoring_function_param.py +0 -0
  236. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
  237. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/shared/__init__.py +0 -0
  238. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/shared/after_idle.py +0 -0
  239. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
  240. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/shared/launch_parameters.py +0 -0
  241. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
  242. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
  243. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
  244. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/src/runloop_api_client/types/shared_params/launch_parameters.py +0 -0
  245. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/__init__.py +0 -0
  246. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/__init__.py +0 -0
  247. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/benchmarks/__init__.py +0 -0
  248. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/devboxes/__init__.py +0 -0
  249. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/devboxes/test_browsers.py +0 -0
  250. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/devboxes/test_computers.py +0 -0
  251. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
  252. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/devboxes/test_executions.py +0 -0
  253. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/devboxes/test_logs.py +0 -0
  254. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/devboxes/test_lsp.py +0 -0
  255. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/scenarios/__init__.py +0 -0
  256. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/scenarios/test_runs.py +0 -0
  257. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/scenarios/test_scorers.py +0 -0
  258. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/test_benchmarks.py +0 -0
  259. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/test_blueprints.py +0 -0
  260. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/test_devboxes.py +0 -0
  261. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/test_repositories.py +0 -0
  262. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/api_resources/test_scenarios.py +0 -0
  263. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/conftest.py +0 -0
  264. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/sample_file.txt +0 -0
  265. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_deepcopy.py +0 -0
  266. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_extract_files.py +0 -0
  267. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_files.py +0 -0
  268. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_models.py +0 -0
  269. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_qs.py +0 -0
  270. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_required_args.py +0 -0
  271. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_response.py +0 -0
  272. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_streaming.py +0 -0
  273. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_transform.py +0 -0
  274. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_utils/test_proxy.py +0 -0
  275. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/test_utils/test_typing.py +0 -0
  276. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/tests/utils.py +0 -0
  277. {runloop_api_client-0.36.0 → runloop_api_client-0.38.0}/uv.lock +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.38.0"
3
+ }
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.38.0 (2025-06-04)
4
+
5
+ Full Changelog: [v0.37.0...v0.38.0](https://github.com/runloopai/api-client-python/compare/v0.37.0...v0.38.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** api update ([ecb87bd](https://github.com/runloopai/api-client-python/commit/ecb87bdf471fffd90e742ff3021859eb3e94db8c))
10
+
11
+ ## 0.37.0 (2025-06-04)
12
+
13
+ Full Changelog: [v0.36.0...v0.37.0](https://github.com/runloopai/api-client-python/compare/v0.36.0...v0.37.0)
14
+
15
+ ### Features
16
+
17
+ * **api:** api update ([a167d0b](https://github.com/runloopai/api-client-python/commit/a167d0b2dbab59cb4ffbb029ea6dae22d0d7c2f4))
18
+ * **client:** add follow_redirects request option ([c29d24c](https://github.com/runloopai/api-client-python/commit/c29d24c5483ee2ca7e4d53dfdf8d40278f04f1fe))
19
+
20
+
21
+ ### Chores
22
+
23
+ * **docs:** remove reference to rye shell ([af51a95](https://github.com/runloopai/api-client-python/commit/af51a958afb08cc728959b154c52d0ca31f4206c))
24
+ * **docs:** remove unnecessary param examples ([a29553d](https://github.com/runloopai/api-client-python/commit/a29553d048fa85207e28e5b3dbc4ad9ea326ad86))
25
+
3
26
  ## 0.36.0 (2025-06-02)
4
27
 
5
28
  Full Changelog: [v0.35.0...v0.36.0](https://github.com/runloopai/api-client-python/compare/v0.35.0...v0.36.0)
@@ -17,8 +17,7 @@ $ rye sync --all-features
17
17
  You can then run scripts using `rye run python script.py` or by activating the virtual environment:
18
18
 
19
19
  ```sh
20
- $ rye shell
21
- # or manually activate - https://docs.python.org/3/library/venv.html#how-venvs-work
20
+ # Activate the virtual environment - https://docs.python.org/3/library/venv.html#how-venvs-work
22
21
  $ source .venv/bin/activate
23
22
 
24
23
  # now you can omit the `rye run` prefix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: runloop_api_client
3
- Version: 0.36.0
3
+ Version: 0.38.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
@@ -177,23 +177,7 @@ from runloop_api_client import Runloop
177
177
  client = Runloop()
178
178
 
179
179
  devbox_view = client.devboxes.create(
180
- launch_parameters={
181
- "after_idle": {
182
- "idle_time_seconds": 0,
183
- "on_idle": "shutdown",
184
- },
185
- "architecture": "x86_64",
186
- "available_ports": [0],
187
- "custom_cpu_cores": 0,
188
- "custom_gb_memory": 0,
189
- "keep_alive_time_seconds": 0,
190
- "launch_commands": ["string"],
191
- "resource_size_request": "X_SMALL",
192
- "user_parameters": {
193
- "uid": 0,
194
- "username": "username",
195
- },
196
- },
180
+ launch_parameters={},
197
181
  )
198
182
  print(devbox_view.launch_parameters)
199
183
  ```
@@ -146,23 +146,7 @@ from runloop_api_client import Runloop
146
146
  client = Runloop()
147
147
 
148
148
  devbox_view = client.devboxes.create(
149
- launch_parameters={
150
- "after_idle": {
151
- "idle_time_seconds": 0,
152
- "on_idle": "shutdown",
153
- },
154
- "architecture": "x86_64",
155
- "available_ports": [0],
156
- "custom_cpu_cores": 0,
157
- "custom_gb_memory": 0,
158
- "keep_alive_time_seconds": 0,
159
- "launch_commands": ["string"],
160
- "resource_size_request": "X_SMALL",
161
- "user_parameters": {
162
- "uid": 0,
163
- "username": "username",
164
- },
165
- },
149
+ launch_parameters={},
166
150
  )
167
151
  print(devbox_view.launch_parameters)
168
152
  ```
@@ -35,6 +35,7 @@ Methods:
35
35
  - <code title="get /v1/benchmarks/runs">client.benchmarks.runs.<a href="./src/runloop_api_client/resources/benchmarks/runs.py">list</a>(\*\*<a href="src/runloop_api_client/types/benchmarks/run_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/benchmark_run_view.py">SyncBenchmarkRunsCursorIDPage[BenchmarkRunView]</a></code>
36
36
  - <code title="post /v1/benchmarks/runs/{id}/cancel">client.benchmarks.runs.<a href="./src/runloop_api_client/resources/benchmarks/runs.py">cancel</a>(id) -> <a href="./src/runloop_api_client/types/benchmark_run_view.py">BenchmarkRunView</a></code>
37
37
  - <code title="post /v1/benchmarks/runs/{id}/complete">client.benchmarks.runs.<a href="./src/runloop_api_client/resources/benchmarks/runs.py">complete</a>(id) -> <a href="./src/runloop_api_client/types/benchmark_run_view.py">BenchmarkRunView</a></code>
38
+ - <code title="get /v1/benchmarks/runs/{id}/scenario_runs">client.benchmarks.runs.<a href="./src/runloop_api_client/resources/benchmarks/runs.py">list_scenario_runs</a>(id, \*\*<a href="src/runloop_api_client/types/benchmarks/run_list_scenario_runs_params.py">params</a>) -> <a href="./src/runloop_api_client/types/scenario_run_view.py">SyncBenchmarkRunsCursorIDPage[ScenarioRunView]</a></code>
38
39
 
39
40
  # Blueprints
40
41
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "runloop_api_client"
3
- version = "0.36.0"
3
+ version = "0.38.0"
4
4
  description = "The official Python library for the runloop API"
5
5
  dynamic = ["readme"]
6
6
  license = "MIT"
@@ -960,6 +960,9 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
960
960
  if self.custom_auth is not None:
961
961
  kwargs["auth"] = self.custom_auth
962
962
 
963
+ if options.follow_redirects is not None:
964
+ kwargs["follow_redirects"] = options.follow_redirects
965
+
963
966
  log.debug("Sending HTTP Request: %s %s", request.method, request.url)
964
967
 
965
968
  response = None
@@ -1460,6 +1463,9 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1460
1463
  if self.custom_auth is not None:
1461
1464
  kwargs["auth"] = self.custom_auth
1462
1465
 
1466
+ if options.follow_redirects is not None:
1467
+ kwargs["follow_redirects"] = options.follow_redirects
1468
+
1463
1469
  log.debug("Sending HTTP Request: %s %s", request.method, request.url)
1464
1470
 
1465
1471
  response = None
@@ -737,6 +737,7 @@ class FinalRequestOptionsInput(TypedDict, total=False):
737
737
  idempotency_key: str
738
738
  json_data: Body
739
739
  extra_json: AnyMapping
740
+ follow_redirects: bool
740
741
 
741
742
 
742
743
  @final
@@ -750,6 +751,7 @@ class FinalRequestOptions(pydantic.BaseModel):
750
751
  files: Union[HttpxRequestFiles, None] = None
751
752
  idempotency_key: Union[str, None] = None
752
753
  post_parser: Union[Callable[[Any], Any], NotGiven] = NotGiven()
754
+ follow_redirects: Union[bool, None] = None
753
755
 
754
756
  # It should be noted that we cannot use `json` here as that would override
755
757
  # a BaseModel method in an incompatible fashion.
@@ -100,6 +100,7 @@ class RequestOptions(TypedDict, total=False):
100
100
  params: Query
101
101
  extra_json: AnyMapping
102
102
  idempotency_key: str
103
+ follow_redirects: bool
103
104
 
104
105
 
105
106
  # Sentinel class used until PEP 0661 is accepted
@@ -215,3 +216,4 @@ class _GenericAlias(Protocol):
215
216
 
216
217
  class HttpxSendArgs(TypedDict, total=False):
217
218
  auth: httpx.Auth
219
+ follow_redirects: bool
@@ -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.36.0" # x-release-please-version
4
+ __version__ = "0.38.0" # x-release-please-version
@@ -2,6 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from typing_extensions import Literal
6
+
5
7
  import httpx
6
8
 
7
9
  from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven
@@ -16,7 +18,8 @@ from ..._response import (
16
18
  )
17
19
  from ...pagination import SyncBenchmarkRunsCursorIDPage, AsyncBenchmarkRunsCursorIDPage
18
20
  from ..._base_client import AsyncPaginator, make_request_options
19
- from ...types.benchmarks import run_list_params
21
+ from ...types.benchmarks import run_list_params, run_list_scenario_runs_params
22
+ from ...types.scenario_run_view import ScenarioRunView
20
23
  from ...types.benchmark_run_view import BenchmarkRunView
21
24
 
22
25
  __all__ = ["RunsResource", "AsyncRunsResource"]
@@ -206,6 +209,61 @@ class RunsResource(SyncAPIResource):
206
209
  cast_to=BenchmarkRunView,
207
210
  )
208
211
 
212
+ def list_scenario_runs(
213
+ self,
214
+ id: str,
215
+ *,
216
+ limit: int | NotGiven = NOT_GIVEN,
217
+ starting_after: str | NotGiven = NOT_GIVEN,
218
+ state: Literal["running", "scoring", "scored", "completed", "canceled", "timeout", "failed"]
219
+ | NotGiven = NOT_GIVEN,
220
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
221
+ # The extra values given here take precedence over values defined on the client or passed to this method.
222
+ extra_headers: Headers | None = None,
223
+ extra_query: Query | None = None,
224
+ extra_body: Body | None = None,
225
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
226
+ ) -> SyncBenchmarkRunsCursorIDPage[ScenarioRunView]:
227
+ """
228
+ List started scenario runs for a benchmark run.
229
+
230
+ Args:
231
+ limit: The limit of items to return. Default is 20.
232
+
233
+ starting_after: Load the next page of data starting after the item with the given ID.
234
+
235
+ state: Filter by Scenario Run state
236
+
237
+ extra_headers: Send extra headers
238
+
239
+ extra_query: Add additional query parameters to the request
240
+
241
+ extra_body: Add additional JSON properties to the request
242
+
243
+ timeout: Override the client-level default timeout for this request, in seconds
244
+ """
245
+ if not id:
246
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
247
+ return self._get_api_list(
248
+ f"/v1/benchmarks/runs/{id}/scenario_runs",
249
+ page=SyncBenchmarkRunsCursorIDPage[ScenarioRunView],
250
+ options=make_request_options(
251
+ extra_headers=extra_headers,
252
+ extra_query=extra_query,
253
+ extra_body=extra_body,
254
+ timeout=timeout,
255
+ query=maybe_transform(
256
+ {
257
+ "limit": limit,
258
+ "starting_after": starting_after,
259
+ "state": state,
260
+ },
261
+ run_list_scenario_runs_params.RunListScenarioRunsParams,
262
+ ),
263
+ ),
264
+ model=ScenarioRunView,
265
+ )
266
+
209
267
 
210
268
  class AsyncRunsResource(AsyncAPIResource):
211
269
  @cached_property
@@ -391,6 +449,61 @@ class AsyncRunsResource(AsyncAPIResource):
391
449
  cast_to=BenchmarkRunView,
392
450
  )
393
451
 
452
+ def list_scenario_runs(
453
+ self,
454
+ id: str,
455
+ *,
456
+ limit: int | NotGiven = NOT_GIVEN,
457
+ starting_after: str | NotGiven = NOT_GIVEN,
458
+ state: Literal["running", "scoring", "scored", "completed", "canceled", "timeout", "failed"]
459
+ | NotGiven = NOT_GIVEN,
460
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
461
+ # The extra values given here take precedence over values defined on the client or passed to this method.
462
+ extra_headers: Headers | None = None,
463
+ extra_query: Query | None = None,
464
+ extra_body: Body | None = None,
465
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
466
+ ) -> AsyncPaginator[ScenarioRunView, AsyncBenchmarkRunsCursorIDPage[ScenarioRunView]]:
467
+ """
468
+ List started scenario runs for a benchmark run.
469
+
470
+ Args:
471
+ limit: The limit of items to return. Default is 20.
472
+
473
+ starting_after: Load the next page of data starting after the item with the given ID.
474
+
475
+ state: Filter by Scenario Run state
476
+
477
+ extra_headers: Send extra headers
478
+
479
+ extra_query: Add additional query parameters to the request
480
+
481
+ extra_body: Add additional JSON properties to the request
482
+
483
+ timeout: Override the client-level default timeout for this request, in seconds
484
+ """
485
+ if not id:
486
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
487
+ return self._get_api_list(
488
+ f"/v1/benchmarks/runs/{id}/scenario_runs",
489
+ page=AsyncBenchmarkRunsCursorIDPage[ScenarioRunView],
490
+ options=make_request_options(
491
+ extra_headers=extra_headers,
492
+ extra_query=extra_query,
493
+ extra_body=extra_body,
494
+ timeout=timeout,
495
+ query=maybe_transform(
496
+ {
497
+ "limit": limit,
498
+ "starting_after": starting_after,
499
+ "state": state,
500
+ },
501
+ run_list_scenario_runs_params.RunListScenarioRunsParams,
502
+ ),
503
+ ),
504
+ model=ScenarioRunView,
505
+ )
506
+
394
507
 
395
508
  class RunsResourceWithRawResponse:
396
509
  def __init__(self, runs: RunsResource) -> None:
@@ -408,6 +521,9 @@ class RunsResourceWithRawResponse:
408
521
  self.complete = to_raw_response_wrapper(
409
522
  runs.complete,
410
523
  )
524
+ self.list_scenario_runs = to_raw_response_wrapper(
525
+ runs.list_scenario_runs,
526
+ )
411
527
 
412
528
 
413
529
  class AsyncRunsResourceWithRawResponse:
@@ -426,6 +542,9 @@ class AsyncRunsResourceWithRawResponse:
426
542
  self.complete = async_to_raw_response_wrapper(
427
543
  runs.complete,
428
544
  )
545
+ self.list_scenario_runs = async_to_raw_response_wrapper(
546
+ runs.list_scenario_runs,
547
+ )
429
548
 
430
549
 
431
550
  class RunsResourceWithStreamingResponse:
@@ -444,6 +563,9 @@ class RunsResourceWithStreamingResponse:
444
563
  self.complete = to_streamed_response_wrapper(
445
564
  runs.complete,
446
565
  )
566
+ self.list_scenario_runs = to_streamed_response_wrapper(
567
+ runs.list_scenario_runs,
568
+ )
447
569
 
448
570
 
449
571
  class AsyncRunsResourceWithStreamingResponse:
@@ -462,3 +584,6 @@ class AsyncRunsResourceWithStreamingResponse:
462
584
  self.complete = async_to_streamed_response_wrapper(
463
585
  runs.complete,
464
586
  )
587
+ self.list_scenario_runs = async_to_streamed_response_wrapper(
588
+ runs.list_scenario_runs,
589
+ )
@@ -3,3 +3,4 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from .run_list_params import RunListParams as RunListParams
6
+ from .run_list_scenario_runs_params import RunListScenarioRunsParams as RunListScenarioRunsParams
@@ -0,0 +1,18 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing_extensions import Literal, TypedDict
6
+
7
+ __all__ = ["RunListScenarioRunsParams"]
8
+
9
+
10
+ class RunListScenarioRunsParams(TypedDict, total=False):
11
+ limit: int
12
+ """The limit of items to return. Default is 20."""
13
+
14
+ starting_after: str
15
+ """Load the next page of data starting after the item with the given ID."""
16
+
17
+ state: Literal["running", "scoring", "scored", "completed", "canceled", "timeout", "failed"]
18
+ """Filter by Scenario Run state"""
@@ -9,7 +9,7 @@ import pytest
9
9
 
10
10
  from tests.utils import assert_matches_type
11
11
  from runloop_api_client import Runloop, AsyncRunloop
12
- from runloop_api_client.types import BenchmarkRunView
12
+ from runloop_api_client.types import ScenarioRunView, BenchmarkRunView
13
13
  from runloop_api_client.pagination import SyncBenchmarkRunsCursorIDPage, AsyncBenchmarkRunsCursorIDPage
14
14
 
15
15
  base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -166,6 +166,54 @@ class TestRuns:
166
166
  "",
167
167
  )
168
168
 
169
+ @parametrize
170
+ def test_method_list_scenario_runs(self, client: Runloop) -> None:
171
+ run = client.benchmarks.runs.list_scenario_runs(
172
+ id="id",
173
+ )
174
+ assert_matches_type(SyncBenchmarkRunsCursorIDPage[ScenarioRunView], run, path=["response"])
175
+
176
+ @parametrize
177
+ def test_method_list_scenario_runs_with_all_params(self, client: Runloop) -> None:
178
+ run = client.benchmarks.runs.list_scenario_runs(
179
+ id="id",
180
+ limit=0,
181
+ starting_after="starting_after",
182
+ state="running",
183
+ )
184
+ assert_matches_type(SyncBenchmarkRunsCursorIDPage[ScenarioRunView], run, path=["response"])
185
+
186
+ @parametrize
187
+ def test_raw_response_list_scenario_runs(self, client: Runloop) -> None:
188
+ response = client.benchmarks.runs.with_raw_response.list_scenario_runs(
189
+ id="id",
190
+ )
191
+
192
+ assert response.is_closed is True
193
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
194
+ run = response.parse()
195
+ assert_matches_type(SyncBenchmarkRunsCursorIDPage[ScenarioRunView], run, path=["response"])
196
+
197
+ @parametrize
198
+ def test_streaming_response_list_scenario_runs(self, client: Runloop) -> None:
199
+ with client.benchmarks.runs.with_streaming_response.list_scenario_runs(
200
+ id="id",
201
+ ) as response:
202
+ assert not response.is_closed
203
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
204
+
205
+ run = response.parse()
206
+ assert_matches_type(SyncBenchmarkRunsCursorIDPage[ScenarioRunView], run, path=["response"])
207
+
208
+ assert cast(Any, response.is_closed) is True
209
+
210
+ @parametrize
211
+ def test_path_params_list_scenario_runs(self, client: Runloop) -> None:
212
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
213
+ client.benchmarks.runs.with_raw_response.list_scenario_runs(
214
+ id="",
215
+ )
216
+
169
217
 
170
218
  class TestAsyncRuns:
171
219
  parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"])
@@ -317,3 +365,51 @@ class TestAsyncRuns:
317
365
  await async_client.benchmarks.runs.with_raw_response.complete(
318
366
  "",
319
367
  )
368
+
369
+ @parametrize
370
+ async def test_method_list_scenario_runs(self, async_client: AsyncRunloop) -> None:
371
+ run = await async_client.benchmarks.runs.list_scenario_runs(
372
+ id="id",
373
+ )
374
+ assert_matches_type(AsyncBenchmarkRunsCursorIDPage[ScenarioRunView], run, path=["response"])
375
+
376
+ @parametrize
377
+ async def test_method_list_scenario_runs_with_all_params(self, async_client: AsyncRunloop) -> None:
378
+ run = await async_client.benchmarks.runs.list_scenario_runs(
379
+ id="id",
380
+ limit=0,
381
+ starting_after="starting_after",
382
+ state="running",
383
+ )
384
+ assert_matches_type(AsyncBenchmarkRunsCursorIDPage[ScenarioRunView], run, path=["response"])
385
+
386
+ @parametrize
387
+ async def test_raw_response_list_scenario_runs(self, async_client: AsyncRunloop) -> None:
388
+ response = await async_client.benchmarks.runs.with_raw_response.list_scenario_runs(
389
+ id="id",
390
+ )
391
+
392
+ assert response.is_closed is True
393
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
394
+ run = await response.parse()
395
+ assert_matches_type(AsyncBenchmarkRunsCursorIDPage[ScenarioRunView], run, path=["response"])
396
+
397
+ @parametrize
398
+ async def test_streaming_response_list_scenario_runs(self, async_client: AsyncRunloop) -> None:
399
+ async with async_client.benchmarks.runs.with_streaming_response.list_scenario_runs(
400
+ id="id",
401
+ ) as response:
402
+ assert not response.is_closed
403
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
404
+
405
+ run = await response.parse()
406
+ assert_matches_type(AsyncBenchmarkRunsCursorIDPage[ScenarioRunView], run, path=["response"])
407
+
408
+ assert cast(Any, response.is_closed) is True
409
+
410
+ @parametrize
411
+ async def test_path_params_list_scenario_runs(self, async_client: AsyncRunloop) -> None:
412
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
413
+ await async_client.benchmarks.runs.with_raw_response.list_scenario_runs(
414
+ id="",
415
+ )
@@ -873,6 +873,33 @@ class TestRunloop:
873
873
 
874
874
  assert response.http_request.headers.get("x-stainless-retry-count") == "42"
875
875
 
876
+ @pytest.mark.respx(base_url=base_url)
877
+ def test_follow_redirects(self, respx_mock: MockRouter) -> None:
878
+ # Test that the default follow_redirects=True allows following redirects
879
+ respx_mock.post("/redirect").mock(
880
+ return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
881
+ )
882
+ respx_mock.get("/redirected").mock(return_value=httpx.Response(200, json={"status": "ok"}))
883
+
884
+ response = self.client.post("/redirect", body={"key": "value"}, cast_to=httpx.Response)
885
+ assert response.status_code == 200
886
+ assert response.json() == {"status": "ok"}
887
+
888
+ @pytest.mark.respx(base_url=base_url)
889
+ def test_follow_redirects_disabled(self, respx_mock: MockRouter) -> None:
890
+ # Test that follow_redirects=False prevents following redirects
891
+ respx_mock.post("/redirect").mock(
892
+ return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
893
+ )
894
+
895
+ with pytest.raises(APIStatusError) as exc_info:
896
+ self.client.post(
897
+ "/redirect", body={"key": "value"}, options={"follow_redirects": False}, cast_to=httpx.Response
898
+ )
899
+
900
+ assert exc_info.value.response.status_code == 302
901
+ assert exc_info.value.response.headers["Location"] == f"{base_url}/redirected"
902
+
876
903
 
877
904
  class TestAsyncRunloop:
878
905
  client = AsyncRunloop(base_url=base_url, bearer_token=bearer_token, _strict_response_validation=True)
@@ -1741,3 +1768,30 @@ class TestAsyncRunloop:
1741
1768
  raise AssertionError("calling get_platform using asyncify resulted in a hung process")
1742
1769
 
1743
1770
  time.sleep(0.1)
1771
+
1772
+ @pytest.mark.respx(base_url=base_url)
1773
+ async def test_follow_redirects(self, respx_mock: MockRouter) -> None:
1774
+ # Test that the default follow_redirects=True allows following redirects
1775
+ respx_mock.post("/redirect").mock(
1776
+ return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
1777
+ )
1778
+ respx_mock.get("/redirected").mock(return_value=httpx.Response(200, json={"status": "ok"}))
1779
+
1780
+ response = await self.client.post("/redirect", body={"key": "value"}, cast_to=httpx.Response)
1781
+ assert response.status_code == 200
1782
+ assert response.json() == {"status": "ok"}
1783
+
1784
+ @pytest.mark.respx(base_url=base_url)
1785
+ async def test_follow_redirects_disabled(self, respx_mock: MockRouter) -> None:
1786
+ # Test that follow_redirects=False prevents following redirects
1787
+ respx_mock.post("/redirect").mock(
1788
+ return_value=httpx.Response(302, headers={"Location": f"{base_url}/redirected"})
1789
+ )
1790
+
1791
+ with pytest.raises(APIStatusError) as exc_info:
1792
+ await self.client.post(
1793
+ "/redirect", body={"key": "value"}, options={"follow_redirects": False}, cast_to=httpx.Response
1794
+ )
1795
+
1796
+ assert exc_info.value.response.status_code == 302
1797
+ assert exc_info.value.response.headers["Location"] == f"{base_url}/redirected"
@@ -1,3 +0,0 @@
1
- {
2
- ".": "0.36.0"
3
- }