runloop_api_client 1.10.2__tar.gz → 1.11.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 (421) hide show
  1. runloop_api_client-1.11.0/.release-please-manifest.json +3 -0
  2. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/CHANGELOG.md +35 -0
  3. runloop_api_client-1.11.0/EXAMPLES.md +137 -0
  4. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/PKG-INFO +29 -1
  5. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/README-SDK.md +21 -2
  6. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/README.md +28 -0
  7. runloop_api_client-1.11.0/examples/__init__.py +1 -0
  8. runloop_api_client-1.11.0/examples/_harness.py +172 -0
  9. runloop_api_client-1.11.0/examples/blueprint_with_build_context.py +130 -0
  10. runloop_api_client-1.11.0/examples/devbox_from_blueprint_lifecycle.py +101 -0
  11. runloop_api_client-1.11.0/examples/devbox_snapshot_resume.py +134 -0
  12. runloop_api_client-1.11.0/examples/example_types.py +64 -0
  13. runloop_api_client-1.11.0/examples/mcp_github_tools.py +184 -0
  14. runloop_api_client-1.11.0/examples/registry.py +55 -0
  15. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/pyproject.toml +2 -1
  16. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_version.py +1 -1
  17. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/devboxes/devboxes.py +30 -20
  18. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_devbox.py +34 -0
  19. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/devbox.py +34 -0
  20. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_create_params.py +5 -4
  21. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_view.py +5 -5
  22. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_devboxes.py +8 -8
  23. runloop_api_client-1.11.0/tests/smoketests/examples/__init__.py +1 -0
  24. runloop_api_client-1.11.0/tests/smoketests/examples/test_examples.py +107 -0
  25. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_devbox.py +64 -6
  26. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_devbox.py +64 -6
  27. runloop_api_client-1.11.0/tests/test_command_id.py +94 -0
  28. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/uv.lock +88 -1
  29. runloop_api_client-1.10.2/.release-please-manifest.json +0 -3
  30. runloop_api_client-1.10.2/examples/.keep +0 -4
  31. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/.gitignore +0 -0
  32. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/CONTRIBUTING.md +0 -0
  33. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/LICENSE +0 -0
  34. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/SECURITY.md +0 -0
  35. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/api.md +0 -0
  36. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/bin/check-release-environment +0 -0
  37. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/bin/publish-pypi +0 -0
  38. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/release-please-config.json +0 -0
  39. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/requirements-dev.lock +0 -0
  40. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop/lib/.keep +0 -0
  41. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/__init__.py +0 -0
  42. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_base_client.py +0 -0
  43. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_client.py +0 -0
  44. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_compat.py +0 -0
  45. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_constants.py +0 -0
  46. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_exceptions.py +0 -0
  47. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_files.py +0 -0
  48. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_models.py +0 -0
  49. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_qs.py +0 -0
  50. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_resource.py +0 -0
  51. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_response.py +0 -0
  52. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_streaming.py +0 -0
  53. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_types.py +0 -0
  54. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/__init__.py +0 -0
  55. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_compat.py +0 -0
  56. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
  57. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_json.py +0 -0
  58. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_logs.py +0 -0
  59. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_proxy.py +0 -0
  60. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_reflection.py +0 -0
  61. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
  62. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_streams.py +0 -0
  63. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_sync.py +0 -0
  64. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_transform.py +0 -0
  65. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_typing.py +0 -0
  66. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_utils.py +0 -0
  67. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/_utils/_validation.py +0 -0
  68. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/lib/.keep +0 -0
  69. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/lib/__init__.py +0 -0
  70. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/lib/_ignore.py +0 -0
  71. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/lib/context_loader.py +0 -0
  72. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/lib/polling.py +0 -0
  73. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/lib/polling_async.py +0 -0
  74. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/pagination.py +0 -0
  75. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/py.typed +0 -0
  76. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/__init__.py +0 -0
  77. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/agents.py +0 -0
  78. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/benchmark_jobs.py +0 -0
  79. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/benchmark_runs.py +0 -0
  80. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/benchmarks.py +0 -0
  81. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/blueprints.py +0 -0
  82. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
  83. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/devboxes/browsers.py +0 -0
  84. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/devboxes/computers.py +0 -0
  85. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
  86. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/devboxes/executions.py +0 -0
  87. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
  88. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/gateway_configs.py +0 -0
  89. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/mcp_configs.py +0 -0
  90. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/network_policies.py +0 -0
  91. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/objects.py +0 -0
  92. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/repositories.py +0 -0
  93. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
  94. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
  95. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
  96. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
  97. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/resources/secrets.py +0 -0
  98. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/__init__.py +0 -0
  99. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/_helpers.py +0 -0
  100. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/_types.py +0 -0
  101. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/agent.py +0 -0
  102. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_.py +0 -0
  103. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_agent.py +0 -0
  104. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_benchmark.py +0 -0
  105. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_benchmark_run.py +0 -0
  106. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_blueprint.py +0 -0
  107. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_execution.py +0 -0
  108. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_execution_result.py +0 -0
  109. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_gateway_config.py +0 -0
  110. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_mcp_config.py +0 -0
  111. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_network_policy.py +0 -0
  112. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_scenario.py +0 -0
  113. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_scenario_builder.py +0 -0
  114. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_scenario_run.py +0 -0
  115. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_scorer.py +0 -0
  116. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_snapshot.py +0 -0
  117. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/async_storage_object.py +0 -0
  118. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/benchmark.py +0 -0
  119. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/benchmark_run.py +0 -0
  120. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/blueprint.py +0 -0
  121. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/execution.py +0 -0
  122. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/execution_result.py +0 -0
  123. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/gateway_config.py +0 -0
  124. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/mcp_config.py +0 -0
  125. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/network_policy.py +0 -0
  126. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/scenario.py +0 -0
  127. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/scenario_builder.py +0 -0
  128. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/scenario_run.py +0 -0
  129. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/scorer.py +0 -0
  130. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/snapshot.py +0 -0
  131. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/storage_object.py +0 -0
  132. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/sdk/sync.py +0 -0
  133. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/__init__.py +0 -0
  134. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/agent_create_params.py +0 -0
  135. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/agent_list_params.py +0 -0
  136. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/agent_list_view.py +0 -0
  137. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/agent_view.py +0 -0
  138. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
  139. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
  140. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_job_create_params.py +0 -0
  141. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_job_list_params.py +0 -0
  142. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_job_list_view.py +0 -0
  143. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_job_view.py +0 -0
  144. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
  145. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
  146. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_run_list_params.py +0 -0
  147. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py +0 -0
  148. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
  149. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
  150. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
  151. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
  152. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_update_scenarios_params.py +0 -0
  153. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/benchmark_view.py +0 -0
  154. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
  155. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
  156. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
  157. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_create_from_inspection_params.py +0 -0
  158. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
  159. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
  160. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
  161. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
  162. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
  163. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
  164. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/blueprint_view.py +0 -0
  165. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
  166. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
  167. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_create_tunnel_params.py +0 -0
  168. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
  169. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_enable_tunnel_params.py +0 -0
  170. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
  171. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
  172. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
  173. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
  174. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
  175. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_list_params.py +0 -0
  176. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_list_view.py +0 -0
  177. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
  178. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
  179. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_remove_tunnel_params.py +0 -0
  180. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_resource_usage_view.py +0 -0
  181. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
  182. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_shutdown_params.py +0 -0
  183. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
  184. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
  185. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
  186. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
  187. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_tunnel_view.py +0 -0
  188. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_update_params.py +0 -0
  189. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
  190. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
  191. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
  192. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
  193. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/browser_create_params.py +0 -0
  194. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/browser_view.py +0 -0
  195. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/computer_create_params.py +0 -0
  196. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py +0 -0
  197. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py +0 -0
  198. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py +0 -0
  199. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py +0 -0
  200. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py +0 -0
  201. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py +0 -0
  202. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/computer_view.py +0 -0
  203. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
  204. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
  205. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
  206. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
  207. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
  208. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
  209. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
  210. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
  211. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
  212. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +0 -0
  213. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +0 -0
  214. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
  215. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
  216. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/gateway_config_create_params.py +0 -0
  217. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/gateway_config_list_params.py +0 -0
  218. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/gateway_config_list_view.py +0 -0
  219. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/gateway_config_update_params.py +0 -0
  220. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/gateway_config_view.py +0 -0
  221. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/input_context.py +0 -0
  222. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/input_context_param.py +0 -0
  223. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/input_context_update_param.py +0 -0
  224. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/inspection_source_param.py +0 -0
  225. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/mcp_config_create_params.py +0 -0
  226. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/mcp_config_list_params.py +0 -0
  227. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/mcp_config_list_view.py +0 -0
  228. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/mcp_config_update_params.py +0 -0
  229. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/mcp_config_view.py +0 -0
  230. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/network_policy_create_params.py +0 -0
  231. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/network_policy_list_params.py +0 -0
  232. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/network_policy_list_view.py +0 -0
  233. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/network_policy_update_params.py +0 -0
  234. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/network_policy_view.py +0 -0
  235. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/object_create_params.py +0 -0
  236. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/object_download_params.py +0 -0
  237. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/object_download_url_view.py +0 -0
  238. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/object_list_params.py +0 -0
  239. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/object_list_public_params.py +0 -0
  240. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/object_list_view.py +0 -0
  241. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/object_view.py +0 -0
  242. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/repository_connection_list_view.py +0 -0
  243. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/repository_connection_view.py +0 -0
  244. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/repository_create_params.py +0 -0
  245. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/repository_inspect_params.py +0 -0
  246. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/repository_inspection_details.py +0 -0
  247. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/repository_inspection_list_view.py +0 -0
  248. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/repository_list_params.py +0 -0
  249. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/repository_manifest_view.py +0 -0
  250. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/repository_refresh_params.py +0 -0
  251. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_create_params.py +0 -0
  252. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
  253. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_environment.py +0 -0
  254. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
  255. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_list_params.py +0 -0
  256. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
  257. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
  258. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_run_view.py +0 -0
  259. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
  260. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_update_params.py +0 -0
  261. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenario_view.py +0 -0
  262. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
  263. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
  264. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
  265. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
  266. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
  267. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
  268. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
  269. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
  270. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
  271. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scoring_contract.py +0 -0
  272. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
  273. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
  274. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
  275. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scoring_function.py +0 -0
  276. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scoring_function_param.py +0 -0
  277. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
  278. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/secret_create_params.py +0 -0
  279. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/secret_list_params.py +0 -0
  280. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/secret_list_view.py +0 -0
  281. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/secret_update_params.py +0 -0
  282. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/secret_view.py +0 -0
  283. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared/__init__.py +0 -0
  284. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared/after_idle.py +0 -0
  285. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared/agent_mount.py +0 -0
  286. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared/agent_source.py +0 -0
  287. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
  288. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared/launch_parameters.py +0 -0
  289. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared/mount.py +0 -0
  290. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared/object_mount.py +0 -0
  291. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared/run_profile.py +0 -0
  292. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
  293. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
  294. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared_params/agent_mount.py +0 -0
  295. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared_params/agent_source.py +0 -0
  296. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
  297. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared_params/launch_parameters.py +0 -0
  298. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared_params/mount.py +0 -0
  299. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared_params/object_mount.py +0 -0
  300. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
  301. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/src/runloop_api_client/types/tunnel_view.py +0 -0
  302. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/__init__.py +0 -0
  303. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/__init__.py +0 -0
  304. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/devboxes/__init__.py +0 -0
  305. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/devboxes/test_browsers.py +0 -0
  306. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/devboxes/test_computers.py +0 -0
  307. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
  308. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/devboxes/test_executions.py +0 -0
  309. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/devboxes/test_logs.py +0 -0
  310. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/scenarios/__init__.py +0 -0
  311. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/scenarios/test_runs.py +0 -0
  312. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/scenarios/test_scorers.py +0 -0
  313. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_agents.py +0 -0
  314. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_benchmark_jobs.py +0 -0
  315. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_benchmark_runs.py +0 -0
  316. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_benchmarks.py +0 -0
  317. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_blueprints.py +0 -0
  318. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_gateway_configs.py +0 -0
  319. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_mcp_configs.py +0 -0
  320. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_network_policies.py +0 -0
  321. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_objects.py +0 -0
  322. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_repositories.py +0 -0
  323. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_scenarios.py +0 -0
  324. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/api_resources/test_secrets.py +0 -0
  325. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/conftest.py +0 -0
  326. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sample_file.txt +0 -0
  327. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/__init__.py +0 -0
  328. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/async_devbox/__init__.py +0 -0
  329. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/async_devbox/conftest.py +0 -0
  330. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/async_devbox/test_core.py +0 -0
  331. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/async_devbox/test_edge_cases.py +0 -0
  332. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/async_devbox/test_interfaces.py +0 -0
  333. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/async_devbox/test_streaming.py +0 -0
  334. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/conftest.py +0 -0
  335. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/devbox/__init__.py +0 -0
  336. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/devbox/conftest.py +0 -0
  337. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/devbox/test_core.py +0 -0
  338. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/devbox/test_edge_cases.py +0 -0
  339. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/devbox/test_interfaces.py +0 -0
  340. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/devbox/test_streaming.py +0 -0
  341. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_agent.py +0 -0
  342. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_agent.py +0 -0
  343. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_benchmark.py +0 -0
  344. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_benchmark_run.py +0 -0
  345. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_blueprint.py +0 -0
  346. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_execution.py +0 -0
  347. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_execution_result.py +0 -0
  348. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_gateway_config.py +0 -0
  349. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_network_policy.py +0 -0
  350. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_ops.py +0 -0
  351. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_scenario.py +0 -0
  352. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_scenario_builder.py +0 -0
  353. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_scenario_run.py +0 -0
  354. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_scorer.py +0 -0
  355. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_snapshot.py +0 -0
  356. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_async_storage_object.py +0 -0
  357. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_benchmark.py +0 -0
  358. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_benchmark_run.py +0 -0
  359. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_blueprint.py +0 -0
  360. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_execution.py +0 -0
  361. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_execution_result.py +0 -0
  362. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_gateway_config.py +0 -0
  363. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_helpers.py +0 -0
  364. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_network_policy.py +0 -0
  365. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_ops.py +0 -0
  366. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_scenario.py +0 -0
  367. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_scenario_builder.py +0 -0
  368. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_scenario_run.py +0 -0
  369. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_scorer.py +0 -0
  370. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_snapshot.py +0 -0
  371. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/sdk/test_storage_object.py +0 -0
  372. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/README.md +0 -0
  373. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/__init__.py +0 -0
  374. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/conftest.py +0 -0
  375. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/README.md +0 -0
  376. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/__init__.py +0 -0
  377. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/conftest.py +0 -0
  378. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_agent.py +0 -0
  379. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_agent.py +0 -0
  380. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_benchmark.py +0 -0
  381. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_blueprint.py +0 -0
  382. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_gateway_config.py +0 -0
  383. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_network_policy.py +0 -0
  384. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_scenario.py +0 -0
  385. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_scorer.py +0 -0
  386. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_sdk.py +0 -0
  387. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_snapshot.py +0 -0
  388. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_async_storage_object.py +0 -0
  389. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_benchmark.py +0 -0
  390. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_blueprint.py +0 -0
  391. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_gateway_config.py +0 -0
  392. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_mcp_config.py +0 -0
  393. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_network_policy.py +0 -0
  394. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_scenario.py +0 -0
  395. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_scorer.py +0 -0
  396. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_sdk.py +0 -0
  397. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_snapshot.py +0 -0
  398. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/sdk/test_storage_object.py +0 -0
  399. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/test_blueprints.py +0 -0
  400. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/test_devboxes.py +0 -0
  401. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/test_executions.py +0 -0
  402. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
  403. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/test_snapshots.py +0 -0
  404. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/smoketests/utils.py +0 -0
  405. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_client.py +0 -0
  406. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_deepcopy.py +0 -0
  407. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_extract_files.py +0 -0
  408. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_files.py +0 -0
  409. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_models.py +0 -0
  410. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_polling.py +0 -0
  411. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_qs.py +0 -0
  412. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_required_args.py +0 -0
  413. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_response.py +0 -0
  414. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_streaming.py +0 -0
  415. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_transform.py +0 -0
  416. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_utils/test_context_loader.py +0 -0
  417. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_utils/test_datetime_parse.py +0 -0
  418. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_utils/test_json.py +0 -0
  419. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_utils/test_proxy.py +0 -0
  420. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/test_utils/test_typing.py +0 -0
  421. {runloop_api_client-1.10.2 → runloop_api_client-1.11.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.11.0"
3
+ }
@@ -1,5 +1,40 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.11.0 (2026-03-10)
4
+
5
+ Full Changelog: [v1.10.3...v1.11.0](https://github.com/runloopai/api-client-python/compare/v1.10.3...v1.11.0)
6
+
7
+ ### Features
8
+
9
+ * add snapshots example ([#753](https://github.com/runloopai/api-client-python/issues/753)) ([f13916a](https://github.com/runloopai/api-client-python/commit/f13916a570fe708aef56c6fbfd5c06b9e0dc158e))
10
+ * **documentation:** added llms.txt, examples and referenced these artifacts via README ([#748](https://github.com/runloopai/api-client-python/issues/748)) ([bceb953](https://github.com/runloopai/api-client-python/commit/bceb953c8486bec6bbe5bca1276ed54d625eda5d))
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * add logs to devboxes, smoke tests & examples ([#755](https://github.com/runloopai/api-client-python/issues/755)) ([da5faa4](https://github.com/runloopai/api-client-python/commit/da5faa4e69348dd6f034a538046ab9ff2ff4831b))
16
+
17
+
18
+ ### Chores
19
+
20
+ * **ci:** skip uploading artifacts on stainless-internal branches ([6874252](https://github.com/runloopai/api-client-python/commit/6874252fe355ac8a44be6bc57cd6bb15a3f035be))
21
+ * **documentation:** correct exec advice ([#752](https://github.com/runloopai/api-client-python/issues/752)) ([fa16c1d](https://github.com/runloopai/api-client-python/commit/fa16c1d602ec301200e82a48fe23c2218ae82a08))
22
+ * **test:** do not count install time for mock server timeout ([f6fde05](https://github.com/runloopai/api-client-python/commit/f6fde050a5f4b985c01003cd7593c1619ede028f))
23
+ * update placeholder string ([5dfcd93](https://github.com/runloopai/api-client-python/commit/5dfcd93bb05cda783901377ee7fc03a6acffe0ae))
24
+
25
+ ## 1.10.3 (2026-02-27)
26
+
27
+ Full Changelog: [v1.10.2...v1.10.3](https://github.com/runloopai/api-client-python/compare/v1.10.2...v1.10.3)
28
+
29
+ ### Bug Fixes
30
+
31
+ * switching to MCP definition to specify a secret name per MCP server ([#7715](https://github.com/runloopai/api-client-python/issues/7715)) ([01f4b3d](https://github.com/runloopai/api-client-python/commit/01f4b3dc66f20126adf6737554e42ce1a1b19fe0))
32
+
33
+
34
+ ### Chores
35
+
36
+ * **ci:** bump uv version ([b0fad50](https://github.com/runloopai/api-client-python/commit/b0fad503bde3ad7c472e6aac71073a01e92b7a6a))
37
+
3
38
  ## 1.10.2 (2026-02-26)
4
39
 
5
40
  Full Changelog: [v1.10.1...v1.10.2](https://github.com/runloopai/api-client-python/compare/v1.10.1...v1.10.2)
@@ -0,0 +1,137 @@
1
+ # Examples
2
+
3
+ > This file is auto-generated from metadata in `examples/*.py`.
4
+ > Do not edit this file manually. Run `uv run python scripts/generate_examples_md.py` instead.
5
+
6
+ Runnable examples live in [`examples/`](./examples).
7
+
8
+ ## Table of Contents
9
+
10
+ - [Blueprint with Build Context](#blueprint-with-build-context)
11
+ - [Devbox From Blueprint (Run Command, Shutdown)](#devbox-from-blueprint-lifecycle)
12
+ - [Devbox Snapshot and Resume](#devbox-snapshot-resume)
13
+ - [MCP Hub + Claude Code + GitHub](#mcp-github-tools)
14
+
15
+ <a id="blueprint-with-build-context"></a>
16
+ ## Blueprint with Build Context
17
+
18
+ **Use case:** Create a blueprint using the object store to provide docker build context files, then verify files are copied into the image. Uses the async SDK.
19
+
20
+ **Tags:** `blueprint`, `object-store`, `build-context`, `devbox`, `cleanup`, `async`
21
+
22
+ ### Workflow
23
+ - Create a temporary directory with sample application files
24
+ - Upload the directory to object storage as build context
25
+ - Create a blueprint with a Dockerfile that copies the context files
26
+ - Create a devbox from the blueprint
27
+ - Verify the files were copied into the image
28
+ - Shutdown devbox and delete blueprint and storage object
29
+
30
+ ### Prerequisites
31
+ - `RUNLOOP_API_KEY`
32
+
33
+ ### Run
34
+ ```sh
35
+ uv run python -m examples.blueprint_with_build_context
36
+ ```
37
+
38
+ ### Test
39
+ ```sh
40
+ uv run pytest -m smoketest tests/smoketests/examples/
41
+ ```
42
+
43
+ **Source:** [`examples/blueprint_with_build_context.py`](./examples/blueprint_with_build_context.py)
44
+
45
+ <a id="devbox-from-blueprint-lifecycle"></a>
46
+ ## Devbox From Blueprint (Run Command, Shutdown)
47
+
48
+ **Use case:** Create a devbox from a blueprint, run a command, fetch logs, validate output, and cleanly tear everything down.
49
+
50
+ **Tags:** `devbox`, `blueprint`, `commands`, `logs`, `cleanup`
51
+
52
+ ### Workflow
53
+ - Create a blueprint
54
+ - Fetch blueprint build logs
55
+ - Create a devbox from the blueprint
56
+ - Execute a command in the devbox
57
+ - Fetch devbox logs
58
+ - Validate exit code, stdout, and logs
59
+ - Shutdown devbox and delete blueprint
60
+
61
+ ### Prerequisites
62
+ - `RUNLOOP_API_KEY`
63
+
64
+ ### Run
65
+ ```sh
66
+ uv run python -m examples.devbox_from_blueprint_lifecycle
67
+ ```
68
+
69
+ ### Test
70
+ ```sh
71
+ uv run pytest -m smoketest tests/smoketests/examples/
72
+ ```
73
+
74
+ **Source:** [`examples/devbox_from_blueprint_lifecycle.py`](./examples/devbox_from_blueprint_lifecycle.py)
75
+
76
+ <a id="devbox-snapshot-resume"></a>
77
+ ## Devbox Snapshot and Resume
78
+
79
+ **Use case:** Create a devbox, snapshot its disk, resume from the snapshot, and demonstrate that changes in the original devbox do not affect the clone. Uses the async SDK.
80
+
81
+ **Tags:** `devbox`, `snapshot`, `resume`, `cleanup`, `async`
82
+
83
+ ### Workflow
84
+ - Create a devbox
85
+ - Write a file to the devbox
86
+ - Create a disk snapshot
87
+ - Create a new devbox from the snapshot
88
+ - Modify the file on the original devbox
89
+ - Verify the clone has the original content
90
+ - Shutdown both devboxes and delete the snapshot
91
+
92
+ ### Prerequisites
93
+ - `RUNLOOP_API_KEY`
94
+
95
+ ### Run
96
+ ```sh
97
+ uv run python -m examples.devbox_snapshot_resume
98
+ ```
99
+
100
+ ### Test
101
+ ```sh
102
+ uv run pytest -m smoketest tests/smoketests/examples/
103
+ ```
104
+
105
+ **Source:** [`examples/devbox_snapshot_resume.py`](./examples/devbox_snapshot_resume.py)
106
+
107
+ <a id="mcp-github-tools"></a>
108
+ ## MCP Hub + Claude Code + GitHub
109
+
110
+ **Use case:** Connect Claude Code running in a devbox to GitHub tools through MCP Hub without exposing raw GitHub credentials to the devbox.
111
+
112
+ **Tags:** `mcp`, `devbox`, `github`, `commands`, `cleanup`
113
+
114
+ ### Workflow
115
+ - Create an MCP config for GitHub
116
+ - Store GitHub token as a Runloop secret
117
+ - Launch a devbox with MCP Hub wiring
118
+ - Install Claude Code and register MCP endpoint
119
+ - Run a Claude prompt through MCP tools
120
+ - Shutdown devbox and clean up cloud resources
121
+
122
+ ### Prerequisites
123
+ - `RUNLOOP_API_KEY`
124
+ - `GITHUB_TOKEN (GitHub PAT with repo scope)`
125
+ - `ANTHROPIC_API_KEY`
126
+
127
+ ### Run
128
+ ```sh
129
+ GITHUB_TOKEN=ghp_xxx ANTHROPIC_API_KEY=sk-ant-xxx uv run python -m examples.mcp_github_tools
130
+ ```
131
+
132
+ ### Test
133
+ ```sh
134
+ uv run pytest -m smoketest tests/smoketests/examples/
135
+ ```
136
+
137
+ **Source:** [`examples/mcp_github_tools.py`](./examples/mcp_github_tools.py)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: runloop_api_client
3
- Version: 1.10.2
3
+ Version: 1.11.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
@@ -125,6 +125,23 @@ asyncio.run(main())
125
125
 
126
126
  Functionality between the synchronous and asynchronous clients is otherwise identical.
127
127
 
128
+ ## Examples
129
+
130
+ Workflow-oriented runnable examples are documented in [`EXAMPLES.md`](./EXAMPLES.md).
131
+
132
+ `EXAMPLES.md` is generated from metadata in `examples/*.py` and should not be edited manually.
133
+ Regenerate it with:
134
+
135
+ ```sh
136
+ uv run python scripts/generate_examples_md.py
137
+ ```
138
+
139
+ ## Agent Guidance
140
+
141
+ Detailed agent-specific instructions for developing using this package live in [`llms.txt`](./llms.txt). Consolidated recipes for frequent tasks are in [`EXAMPLES.md`](./EXAMPLES.md).
142
+
143
+ After completing any modifications to this project, ensure `llms.txt` and `README.md` are kept in sync.
144
+
128
145
  ### With aiohttp
129
146
 
130
147
  By default, the async client uses `httpx` for HTTP requests. However, for improved concurrency performance you may also use `aiohttp` as the HTTP backend.
@@ -517,6 +534,17 @@ print(runloop_api_client.__version__)
517
534
 
518
535
  Python 3.9 or higher.
519
536
 
537
+ ## Development
538
+
539
+ After cloning the repository, run the bootstrap script and install git hooks:
540
+
541
+ ```sh
542
+ ./scripts/bootstrap
543
+ ./scripts/install-hooks
544
+ ```
545
+
546
+ This installs pre-push hooks that run linting and verify generated files are up to date.
547
+
520
548
  ## Contributing
521
549
 
522
550
  See [the contributing documentation](./CONTRIBUTING.md).
@@ -160,13 +160,13 @@ print(f"Devbox {info.name} is {info.status}")
160
160
  Execute commands synchronously or asynchronously:
161
161
 
162
162
  ```python
163
- # Synchronous command execution (waits for completion)
163
+ # exec blocks until completion - use for commands that return immediately
164
164
  result = devbox.cmd.exec("ls -la")
165
165
  print("Output:", result.stdout())
166
166
  print("Exit code:", result.exit_code)
167
167
  print("Success:", result.success)
168
168
 
169
- # Asynchronous command execution (returns immediately)
169
+ # exec_async returns immediately - use for long-running processes
170
170
  execution = devbox.cmd.exec_async("npm run dev")
171
171
 
172
172
  # Check execution status
@@ -393,11 +393,30 @@ async with await runloop.devbox.create(name="temp-devbox") as devbox:
393
393
  # devbox is automatically shutdown when exiting the context
394
394
  ```
395
395
 
396
+ #### Devbox Logs
397
+
398
+ Retrieve logs from a devbox, optionally filtered by execution ID or shell name:
399
+
400
+ ```python
401
+ # Get all devbox logs
402
+ logs = devbox.logs()
403
+ for log in logs.logs:
404
+ print(f"[{log.level}] {log.message}")
405
+
406
+ # Filter logs by execution ID
407
+ result = devbox.cmd.exec('echo "hello"')
408
+ exec_logs = devbox.logs(execution_id=result.execution_id)
409
+
410
+ # Filter logs by shell name
411
+ shell_logs = devbox.logs(shell_name="my-shell")
412
+ ```
413
+
396
414
  **Key methods:**
397
415
 
398
416
  - `devbox.get_info()` - Get devbox details and status
399
417
  - `devbox.cmd.exec()` - Execute commands synchronously
400
418
  - `devbox.cmd.exec_async()` - Execute commands asynchronously
419
+ - `devbox.logs()` - Retrieve devbox logs (optionally filter by execution_id or shell_name)
401
420
  - `devbox.file.read()` - Read file contents
402
421
  - `devbox.file.write()` - Write file contents
403
422
  - `devbox.file.upload()` - Upload files
@@ -88,6 +88,23 @@ asyncio.run(main())
88
88
 
89
89
  Functionality between the synchronous and asynchronous clients is otherwise identical.
90
90
 
91
+ ## Examples
92
+
93
+ Workflow-oriented runnable examples are documented in [`EXAMPLES.md`](./EXAMPLES.md).
94
+
95
+ `EXAMPLES.md` is generated from metadata in `examples/*.py` and should not be edited manually.
96
+ Regenerate it with:
97
+
98
+ ```sh
99
+ uv run python scripts/generate_examples_md.py
100
+ ```
101
+
102
+ ## Agent Guidance
103
+
104
+ Detailed agent-specific instructions for developing using this package live in [`llms.txt`](./llms.txt). Consolidated recipes for frequent tasks are in [`EXAMPLES.md`](./EXAMPLES.md).
105
+
106
+ After completing any modifications to this project, ensure `llms.txt` and `README.md` are kept in sync.
107
+
91
108
  ### With aiohttp
92
109
 
93
110
  By default, the async client uses `httpx` for HTTP requests. However, for improved concurrency performance you may also use `aiohttp` as the HTTP backend.
@@ -480,6 +497,17 @@ print(runloop_api_client.__version__)
480
497
 
481
498
  Python 3.9 or higher.
482
499
 
500
+ ## Development
501
+
502
+ After cloning the repository, run the bootstrap script and install git hooks:
503
+
504
+ ```sh
505
+ ./scripts/bootstrap
506
+ ./scripts/install-hooks
507
+ ```
508
+
509
+ This installs pre-push hooks that run linting and verify generated files are up to date.
510
+
483
511
  ## Contributing
484
512
 
485
513
  See [the contributing documentation](./CONTRIBUTING.md).
@@ -0,0 +1 @@
1
+ # Examples package for Runloop Python SDK
@@ -0,0 +1,172 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+ import json
5
+ import time
6
+ import asyncio
7
+ from typing import Any, TypeVar, Callable, Awaitable
8
+ from dataclasses import asdict
9
+
10
+ from .example_types import (
11
+ ExampleCheck,
12
+ RecipeOutput,
13
+ ExampleResult,
14
+ RecipeContext,
15
+ ExampleCleanupStatus,
16
+ ExampleCleanupFailure,
17
+ )
18
+
19
+ T = TypeVar("T")
20
+
21
+
22
+ def unique_name(prefix: str) -> str:
23
+ """Generate a unique name with timestamp and random suffix."""
24
+ return f"{prefix}-{int(time.time())}-{hex(int(time.time() * 1000) % 0xFFFFFF)[2:]}"
25
+
26
+
27
+ class _CleanupTracker:
28
+ """Tracks cleanup actions and executes them in LIFO order."""
29
+
30
+ def __init__(self, status: ExampleCleanupStatus) -> None:
31
+ self._status = status
32
+ self._actions: list[tuple[str, Callable[[], Any]]] = []
33
+
34
+ def add(self, resource: str, action: Callable[[], Any]) -> None:
35
+ """Register a cleanup action for a resource."""
36
+ self._actions.append((resource, action))
37
+
38
+ async def run(self) -> None:
39
+ """Execute all cleanup actions in reverse order."""
40
+ while self._actions:
41
+ resource, action = self._actions.pop()
42
+ self._status.attempted.append(resource)
43
+ try:
44
+ result = action()
45
+ if asyncio.iscoroutine(result):
46
+ await result
47
+ self._status.succeeded.append(resource)
48
+ except Exception as e:
49
+ self._status.failed.append(ExampleCleanupFailure(resource, str(e)))
50
+
51
+ if self._status.attempted:
52
+ if not self._status.failed:
53
+ print("Cleanup completed.") # noqa: T201
54
+ else:
55
+ print("Cleanup finished with errors.") # noqa: T201
56
+
57
+
58
+ def _should_fail_process(result: ExampleResult) -> bool:
59
+ """Determine if the process should exit with failure."""
60
+ has_failed_checks = any(not check.passed for check in result.checks)
61
+ return result.skipped or has_failed_checks or len(result.cleanup_status.failed) > 0
62
+
63
+
64
+ def _run_recipe_impl(
65
+ recipe_call: Callable[[], RecipeOutput | Awaitable[RecipeOutput]],
66
+ cleanup: _CleanupTracker,
67
+ cleanup_status: ExampleCleanupStatus,
68
+ ) -> ExampleResult:
69
+ """Shared implementation for running recipes with cleanup."""
70
+
71
+ async def _run_async() -> RecipeOutput:
72
+ try:
73
+ result = recipe_call()
74
+ if asyncio.iscoroutine(result):
75
+ output: RecipeOutput = await result
76
+ return output
77
+ return result # type: ignore[return-value]
78
+ finally:
79
+ await cleanup.run()
80
+
81
+ loop = asyncio.new_event_loop()
82
+ try:
83
+ output = loop.run_until_complete(_run_async())
84
+ return ExampleResult(
85
+ resources_created=output.resources_created,
86
+ checks=output.checks,
87
+ cleanup_status=cleanup_status,
88
+ )
89
+ finally:
90
+ loop.close()
91
+
92
+
93
+ def wrap_recipe(
94
+ recipe: Callable[[RecipeContext], RecipeOutput] | Callable[[RecipeContext], Awaitable[RecipeOutput]],
95
+ validate_env: Callable[[], tuple[bool, list[ExampleCheck]]] | None = None,
96
+ ) -> Callable[[], ExampleResult]:
97
+ """Wrap a recipe function with cleanup tracking and result handling.
98
+
99
+ Args:
100
+ recipe: The recipe function to wrap. Can be sync or async.
101
+ validate_env: Optional function to validate environment before running.
102
+ Returns (skip, checks) tuple.
103
+
104
+ Returns:
105
+ A callable that runs the recipe and returns ExampleResult.
106
+ """
107
+
108
+ def run() -> ExampleResult:
109
+ cleanup_status = ExampleCleanupStatus()
110
+ cleanup = _CleanupTracker(cleanup_status)
111
+
112
+ if validate_env is not None:
113
+ skip, checks = validate_env()
114
+ if skip:
115
+ return ExampleResult(
116
+ resources_created=[],
117
+ checks=checks,
118
+ cleanup_status=cleanup_status,
119
+ skipped=True,
120
+ )
121
+
122
+ ctx = RecipeContext(cleanup=cleanup)
123
+ return _run_recipe_impl(lambda: recipe(ctx), cleanup, cleanup_status)
124
+
125
+ return run
126
+
127
+
128
+ def wrap_recipe_with_options(
129
+ recipe: Callable[[RecipeContext, T], RecipeOutput] | Callable[[RecipeContext, T], Awaitable[RecipeOutput]],
130
+ validate_env: Callable[[T], tuple[bool, list[ExampleCheck]]] | None = None,
131
+ ) -> Callable[[T], ExampleResult]:
132
+ """Wrap a recipe function that takes options with cleanup tracking.
133
+
134
+ Args:
135
+ recipe: The recipe function to wrap. Can be sync or async. Takes options parameter.
136
+ validate_env: Optional function to validate environment before running.
137
+ Takes options and returns (skip, checks) tuple.
138
+
139
+ Returns:
140
+ A callable that runs the recipe with options and returns ExampleResult.
141
+ """
142
+
143
+ def run(options: T) -> ExampleResult:
144
+ cleanup_status = ExampleCleanupStatus()
145
+ cleanup = _CleanupTracker(cleanup_status)
146
+
147
+ if validate_env is not None:
148
+ skip, checks = validate_env(options)
149
+ if skip:
150
+ return ExampleResult(
151
+ resources_created=[],
152
+ checks=checks,
153
+ cleanup_status=cleanup_status,
154
+ skipped=True,
155
+ )
156
+
157
+ ctx = RecipeContext(cleanup=cleanup)
158
+ return _run_recipe_impl(lambda: recipe(ctx, options), cleanup, cleanup_status)
159
+
160
+ return run
161
+
162
+
163
+ def run_as_cli(run: Callable[[], ExampleResult]) -> None:
164
+ """Run an example and exit with appropriate status code."""
165
+ try:
166
+ result = run()
167
+ print(json.dumps(asdict(result), indent=2)) # noqa: T201
168
+ if _should_fail_process(result):
169
+ sys.exit(1)
170
+ except Exception as e:
171
+ print(f"Error: {e}") # noqa: T201
172
+ sys.exit(1)
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env -S uv run python
2
+ """
3
+ ---
4
+ title: Blueprint with Build Context
5
+ slug: blueprint-with-build-context
6
+ use_case: Create a blueprint using the object store to provide docker build context files, then verify files are copied into the image. Uses the async SDK.
7
+ workflow:
8
+ - Create a temporary directory with sample application files
9
+ - Upload the directory to object storage as build context
10
+ - Create a blueprint with a Dockerfile that copies the context files
11
+ - Create a devbox from the blueprint
12
+ - Verify the files were copied into the image
13
+ - Shutdown devbox and delete blueprint and storage object
14
+ tags:
15
+ - blueprint
16
+ - object-store
17
+ - build-context
18
+ - devbox
19
+ - cleanup
20
+ - async
21
+ prerequisites:
22
+ - RUNLOOP_API_KEY
23
+ run: uv run python -m examples.blueprint_with_build_context
24
+ test: uv run pytest -m smoketest tests/smoketests/examples/
25
+ ---
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import tempfile
31
+ from pathlib import Path
32
+ from datetime import timedelta
33
+
34
+ from runloop_api_client import AsyncRunloopSDK
35
+ from runloop_api_client.lib.polling import PollingConfig
36
+
37
+ from ._harness import run_as_cli, unique_name, wrap_recipe
38
+ from .example_types import ExampleCheck, RecipeOutput, RecipeContext
39
+
40
+ # building can take time: make sure to set a long blueprint build timeout
41
+ BLUEPRINT_POLL_TIMEOUT_S = 10 * 60
42
+ BLUEPRINT_POLL_MAX_ATTEMPTS = 600
43
+
44
+ # configure object storage ttl for the build context
45
+ BUILD_CONTEXT_TTL = timedelta(hours=1)
46
+
47
+
48
+ async def recipe(ctx: RecipeContext) -> RecipeOutput:
49
+ """Create a blueprint with build context from object storage, then verify files in a devbox."""
50
+ cleanup = ctx.cleanup
51
+
52
+ sdk = AsyncRunloopSDK()
53
+
54
+ # setup: create a temporary directory with sample application files to use as build context
55
+ with tempfile.TemporaryDirectory() as tmp_dir:
56
+ tmp_path = Path(tmp_dir)
57
+ (tmp_path / "app.py").write_text('print("Hello from app")')
58
+ (tmp_path / "config.txt").write_text("key=value")
59
+
60
+ # upload the build context to object storage
61
+ storage_obj = await sdk.storage_object.upload_from_dir(
62
+ tmp_path,
63
+ name=unique_name("example-build-context"),
64
+ ttl=BUILD_CONTEXT_TTL,
65
+ )
66
+ cleanup.add(f"storage_object:{storage_obj.id}", storage_obj.delete)
67
+
68
+ # create a blueprint with the build context
69
+ blueprint = await sdk.blueprint.create(
70
+ name=unique_name("example-blueprint-context"),
71
+ dockerfile="FROM ubuntu:22.04\nWORKDIR /app\nCOPY . .",
72
+ build_context=storage_obj.as_build_context(),
73
+ polling_config=PollingConfig(
74
+ timeout_seconds=BLUEPRINT_POLL_TIMEOUT_S,
75
+ max_attempts=BLUEPRINT_POLL_MAX_ATTEMPTS,
76
+ ),
77
+ )
78
+ cleanup.add(f"blueprint:{blueprint.id}", blueprint.delete)
79
+
80
+ devbox = await blueprint.create_devbox(
81
+ name=unique_name("example-devbox"),
82
+ launch_parameters={
83
+ "resource_size_request": "X_SMALL",
84
+ "keep_alive_time_seconds": 60 * 5,
85
+ },
86
+ )
87
+ cleanup.add(f"devbox:{devbox.id}", devbox.shutdown)
88
+
89
+ app_result = await devbox.cmd.exec("cat /app/app.py")
90
+ app_stdout = await app_result.stdout()
91
+
92
+ config_result = await devbox.cmd.exec("cat /app/config.txt")
93
+ config_stdout = await config_result.stdout()
94
+
95
+ return RecipeOutput(
96
+ resources_created=[
97
+ f"storage_object:{storage_obj.id}",
98
+ f"blueprint:{blueprint.id}",
99
+ f"devbox:{devbox.id}",
100
+ ],
101
+ checks=[
102
+ ExampleCheck(
103
+ name="app.py exists and readable",
104
+ passed=app_result.exit_code == 0,
105
+ details=f"exitCode={app_result.exit_code}",
106
+ ),
107
+ ExampleCheck(
108
+ name="app.py contains expected content",
109
+ passed='print("Hello from app")' in app_stdout,
110
+ details=app_stdout.strip(),
111
+ ),
112
+ ExampleCheck(
113
+ name="config.txt exists and readable",
114
+ passed=config_result.exit_code == 0,
115
+ details=f"exitCode={config_result.exit_code}",
116
+ ),
117
+ ExampleCheck(
118
+ name="config.txt contains expected content",
119
+ passed="key=value" in config_stdout,
120
+ details=config_stdout.strip(),
121
+ ),
122
+ ],
123
+ )
124
+
125
+
126
+ run_blueprint_with_build_context_example = wrap_recipe(recipe)
127
+
128
+
129
+ if __name__ == "__main__":
130
+ run_as_cli(run_blueprint_with_build_context_example)