runloop_api_client 1.20.1__tar.gz → 1.20.3__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 (450) hide show
  1. runloop_api_client-1.20.3/.release-please-manifest.json +3 -0
  2. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/CHANGELOG.md +30 -0
  3. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/PKG-INFO +1 -1
  4. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/api.md +1 -0
  5. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/pyproject.toml +2 -2
  6. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_base_client.py +220 -20
  7. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_client.py +51 -3
  8. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_constants.py +1 -1
  9. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_qs.py +2 -6
  10. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_types.py +3 -0
  11. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_utils.py +34 -8
  12. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_version.py +1 -1
  13. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/lib/polling.py +44 -1
  14. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/lib/polling_async.py +1 -1
  15. runloop_api_client-1.20.3/src/runloop_api_client/lib/wait_for_status.py +99 -0
  16. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/agents.py +12 -8
  17. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/devboxes/devboxes.py +39 -89
  18. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/devboxes/executions.py +23 -50
  19. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/secrets.py +12 -10
  20. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/agent_create_params.py +8 -3
  21. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/agent_view.py +8 -3
  22. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_agents.py +2 -8
  23. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_secrets.py +76 -0
  24. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_client.py +5 -1
  25. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_extract_files.py +23 -5
  26. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_files.py +1 -1
  27. runloop_api_client-1.20.3/tests/test_shared_pool.py +319 -0
  28. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/uv.lock +1 -1
  29. runloop_api_client-1.20.1/.release-please-manifest.json +0 -3
  30. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/.gitignore +0 -0
  31. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/CONTRIBUTING.md +0 -0
  32. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/EXAMPLES.md +0 -0
  33. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/LICENSE +0 -0
  34. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/README-SDK.md +0 -0
  35. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/README.md +0 -0
  36. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/SECURITY.md +0 -0
  37. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/bin/check-release-environment +0 -0
  38. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/bin/publish-pypi +0 -0
  39. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/__init__.py +0 -0
  40. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/_harness.py +0 -0
  41. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/blueprint_with_build_context.py +0 -0
  42. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/devbox_from_blueprint_lifecycle.py +0 -0
  43. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/devbox_snapshot_resume.py +0 -0
  44. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/devbox_snapshots.py +0 -0
  45. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/devbox_tunnel.py +0 -0
  46. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/example_types.py +0 -0
  47. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/mcp_github_tools.py +0 -0
  48. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/registry.py +0 -0
  49. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/examples/secrets_with_devbox.py +0 -0
  50. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/release-please-config.json +0 -0
  51. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/requirements-dev.lock +0 -0
  52. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop/lib/.keep +0 -0
  53. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/__init__.py +0 -0
  54. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_compat.py +0 -0
  55. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_exceptions.py +0 -0
  56. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_files.py +0 -0
  57. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_models.py +0 -0
  58. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_resource.py +0 -0
  59. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_response.py +0 -0
  60. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_streaming.py +0 -0
  61. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/__init__.py +0 -0
  62. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_compat.py +0 -0
  63. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
  64. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_json.py +0 -0
  65. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_logs.py +0 -0
  66. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_path.py +0 -0
  67. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_proxy.py +0 -0
  68. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_reflection.py +0 -0
  69. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
  70. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_streams.py +0 -0
  71. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_sync.py +0 -0
  72. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_transform.py +0 -0
  73. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_typing.py +0 -0
  74. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/_utils/_validation.py +0 -0
  75. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/lib/.keep +0 -0
  76. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/lib/__init__.py +0 -0
  77. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/lib/_ignore.py +0 -0
  78. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/lib/context_loader.py +0 -0
  79. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/pagination.py +0 -0
  80. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/py.typed +0 -0
  81. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/__init__.py +0 -0
  82. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/apikeys.py +0 -0
  83. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/axons/__init__.py +0 -0
  84. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/axons/axons.py +0 -0
  85. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/axons/events.py +0 -0
  86. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/axons/sql.py +0 -0
  87. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/benchmark_jobs.py +0 -0
  88. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/benchmark_runs.py +0 -0
  89. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/benchmarks.py +0 -0
  90. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/blueprints.py +0 -0
  91. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
  92. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
  93. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
  94. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/gateway_configs.py +0 -0
  95. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/mcp_configs.py +0 -0
  96. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/network_policies.py +0 -0
  97. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/objects.py +0 -0
  98. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/restricted_keys.py +0 -0
  99. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
  100. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
  101. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
  102. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
  103. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/__init__.py +0 -0
  104. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/_helpers.py +0 -0
  105. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/_types.py +0 -0
  106. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/agent.py +0 -0
  107. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_.py +0 -0
  108. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_agent.py +0 -0
  109. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_axon.py +0 -0
  110. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_benchmark.py +0 -0
  111. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_benchmark_run.py +0 -0
  112. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_blueprint.py +0 -0
  113. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_devbox.py +0 -0
  114. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_execution.py +0 -0
  115. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_execution_result.py +0 -0
  116. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_gateway_config.py +0 -0
  117. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_mcp_config.py +0 -0
  118. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_network_policy.py +0 -0
  119. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_scenario.py +0 -0
  120. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_scenario_builder.py +0 -0
  121. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_scenario_run.py +0 -0
  122. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_scorer.py +0 -0
  123. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_secret.py +0 -0
  124. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_snapshot.py +0 -0
  125. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/async_storage_object.py +0 -0
  126. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/axon.py +0 -0
  127. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/benchmark.py +0 -0
  128. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/benchmark_run.py +0 -0
  129. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/blueprint.py +0 -0
  130. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/devbox.py +0 -0
  131. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/execution.py +0 -0
  132. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/execution_result.py +0 -0
  133. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/gateway_config.py +0 -0
  134. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/mcp_config.py +0 -0
  135. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/network_policy.py +0 -0
  136. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/scenario.py +0 -0
  137. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/scenario_builder.py +0 -0
  138. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/scenario_run.py +0 -0
  139. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/scorer.py +0 -0
  140. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/secret.py +0 -0
  141. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/snapshot.py +0 -0
  142. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/storage_object.py +0 -0
  143. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/sdk/sync.py +0 -0
  144. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/__init__.py +0 -0
  145. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/agent_devbox_counts_view.py +0 -0
  146. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/agent_list_params.py +0 -0
  147. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/agent_list_public_params.py +0 -0
  148. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/agent_list_view.py +0 -0
  149. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/api_key_created_view.py +0 -0
  150. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/apikey_create_params.py +0 -0
  151. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axon_create_params.py +0 -0
  152. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axon_event_view.py +0 -0
  153. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axon_list_params.py +0 -0
  154. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axon_list_view.py +0 -0
  155. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axon_publish_params.py +0 -0
  156. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axon_subscribe_sse_params.py +0 -0
  157. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axon_view.py +0 -0
  158. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/__init__.py +0 -0
  159. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/axon_event_list_view.py +0 -0
  160. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/event_list_params.py +0 -0
  161. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/sql_batch_params.py +0 -0
  162. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/sql_batch_result_view.py +0 -0
  163. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/sql_column_meta_view.py +0 -0
  164. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/sql_query_params.py +0 -0
  165. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/sql_query_result_view.py +0 -0
  166. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/sql_result_meta_view.py +0 -0
  167. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/sql_statement_params.py +0 -0
  168. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/sql_step_error_view.py +0 -0
  169. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/axons/sql_step_result_view.py +0 -0
  170. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
  171. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
  172. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_job_create_params.py +0 -0
  173. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_job_list_params.py +0 -0
  174. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_job_list_view.py +0 -0
  175. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_job_view.py +0 -0
  176. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
  177. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
  178. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_run_list_params.py +0 -0
  179. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py +0 -0
  180. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
  181. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
  182. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
  183. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
  184. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_update_scenarios_params.py +0 -0
  185. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/benchmark_view.py +0 -0
  186. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
  187. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
  188. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
  189. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_create_from_inspection_params.py +0 -0
  190. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
  191. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
  192. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
  193. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
  194. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
  195. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
  196. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/blueprint_view.py +0 -0
  197. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
  198. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_create_params.py +0 -0
  199. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
  200. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
  201. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_enable_tunnel_params.py +0 -0
  202. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
  203. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
  204. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
  205. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
  206. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
  207. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_list_params.py +0 -0
  208. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_list_view.py +0 -0
  209. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
  210. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
  211. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_resource_usage_view.py +0 -0
  212. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
  213. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_shutdown_params.py +0 -0
  214. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
  215. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
  216. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
  217. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
  218. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_update_params.py +0 -0
  219. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
  220. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_view.py +0 -0
  221. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
  222. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
  223. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
  224. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
  225. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
  226. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
  227. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
  228. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
  229. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
  230. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
  231. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
  232. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
  233. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +0 -0
  234. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +0 -0
  235. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
  236. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
  237. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/gateway_config_create_params.py +0 -0
  238. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/gateway_config_list_params.py +0 -0
  239. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/gateway_config_list_view.py +0 -0
  240. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/gateway_config_update_params.py +0 -0
  241. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/gateway_config_view.py +0 -0
  242. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/input_context.py +0 -0
  243. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/input_context_param.py +0 -0
  244. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/input_context_update_param.py +0 -0
  245. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/inspection_source_param.py +0 -0
  246. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/mcp_config_create_params.py +0 -0
  247. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/mcp_config_list_params.py +0 -0
  248. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/mcp_config_list_view.py +0 -0
  249. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/mcp_config_update_params.py +0 -0
  250. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/mcp_config_view.py +0 -0
  251. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/network_policy_create_params.py +0 -0
  252. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/network_policy_list_params.py +0 -0
  253. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/network_policy_list_view.py +0 -0
  254. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/network_policy_update_params.py +0 -0
  255. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/network_policy_view.py +0 -0
  256. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/object_create_params.py +0 -0
  257. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/object_download_params.py +0 -0
  258. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/object_download_url_view.py +0 -0
  259. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/object_list_params.py +0 -0
  260. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/object_list_public_params.py +0 -0
  261. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/object_list_view.py +0 -0
  262. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/object_view.py +0 -0
  263. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/publish_result_view.py +0 -0
  264. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/restricted_key_create_params.py +0 -0
  265. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/restricted_key_created_view.py +0 -0
  266. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_create_params.py +0 -0
  267. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
  268. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_environment.py +0 -0
  269. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
  270. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_list_params.py +0 -0
  271. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
  272. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
  273. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_run_view.py +0 -0
  274. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
  275. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_update_params.py +0 -0
  276. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenario_view.py +0 -0
  277. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
  278. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
  279. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
  280. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
  281. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
  282. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
  283. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
  284. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
  285. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
  286. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scope_entry_view.py +0 -0
  287. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scope_entry_view_param.py +0 -0
  288. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scoring_contract.py +0 -0
  289. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
  290. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
  291. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
  292. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scoring_function.py +0 -0
  293. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scoring_function_param.py +0 -0
  294. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
  295. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/secret_create_params.py +0 -0
  296. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/secret_list_params.py +0 -0
  297. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/secret_list_view.py +0 -0
  298. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/secret_update_params.py +0 -0
  299. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/secret_view.py +0 -0
  300. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared/__init__.py +0 -0
  301. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared/after_idle.py +0 -0
  302. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared/agent_mount.py +0 -0
  303. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared/agent_source.py +0 -0
  304. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared/broker_mount.py +0 -0
  305. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
  306. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared/launch_parameters.py +0 -0
  307. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared/mount.py +0 -0
  308. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared/object_mount.py +0 -0
  309. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared/run_profile.py +0 -0
  310. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
  311. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
  312. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared_params/agent_mount.py +0 -0
  313. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared_params/agent_source.py +0 -0
  314. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared_params/broker_mount.py +0 -0
  315. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
  316. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared_params/launch_parameters.py +0 -0
  317. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared_params/mount.py +0 -0
  318. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared_params/object_mount.py +0 -0
  319. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
  320. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/src/runloop_api_client/types/tunnel_view.py +0 -0
  321. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/__init__.py +0 -0
  322. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/__init__.py +0 -0
  323. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/axons/__init__.py +0 -0
  324. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/axons/test_events.py +0 -0
  325. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/axons/test_sql.py +0 -0
  326. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/devboxes/__init__.py +0 -0
  327. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
  328. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/devboxes/test_executions.py +0 -0
  329. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/devboxes/test_logs.py +0 -0
  330. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/scenarios/__init__.py +0 -0
  331. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/scenarios/test_runs.py +0 -0
  332. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/scenarios/test_scorers.py +0 -0
  333. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_apikeys.py +0 -0
  334. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_axons.py +0 -0
  335. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_benchmark_jobs.py +0 -0
  336. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_benchmark_runs.py +0 -0
  337. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_benchmarks.py +0 -0
  338. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_blueprints.py +0 -0
  339. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_devboxes.py +0 -0
  340. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_gateway_configs.py +0 -0
  341. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_mcp_configs.py +0 -0
  342. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_network_policies.py +0 -0
  343. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_objects.py +0 -0
  344. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_restricted_keys.py +0 -0
  345. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/api_resources/test_scenarios.py +0 -0
  346. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/conftest.py +0 -0
  347. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sample_file.txt +0 -0
  348. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/__init__.py +0 -0
  349. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/async_devbox/__init__.py +0 -0
  350. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/async_devbox/conftest.py +0 -0
  351. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/async_devbox/test_core.py +0 -0
  352. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/async_devbox/test_edge_cases.py +0 -0
  353. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/async_devbox/test_interfaces.py +0 -0
  354. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/async_devbox/test_streaming.py +0 -0
  355. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/conftest.py +0 -0
  356. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/devbox/__init__.py +0 -0
  357. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/devbox/conftest.py +0 -0
  358. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/devbox/test_core.py +0 -0
  359. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/devbox/test_edge_cases.py +0 -0
  360. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/devbox/test_interfaces.py +0 -0
  361. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/devbox/test_streaming.py +0 -0
  362. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_agent.py +0 -0
  363. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_agent.py +0 -0
  364. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_axon.py +0 -0
  365. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_benchmark.py +0 -0
  366. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_benchmark_run.py +0 -0
  367. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_blueprint.py +0 -0
  368. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_execution.py +0 -0
  369. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_execution_result.py +0 -0
  370. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_gateway_config.py +0 -0
  371. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_network_policy.py +0 -0
  372. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_ops.py +0 -0
  373. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_scenario.py +0 -0
  374. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_scenario_builder.py +0 -0
  375. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_scenario_run.py +0 -0
  376. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_scorer.py +0 -0
  377. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_snapshot.py +0 -0
  378. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_async_storage_object.py +0 -0
  379. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_axon.py +0 -0
  380. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_benchmark.py +0 -0
  381. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_benchmark_run.py +0 -0
  382. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_blueprint.py +0 -0
  383. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_execution.py +0 -0
  384. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_execution_result.py +0 -0
  385. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_gateway_config.py +0 -0
  386. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_helpers.py +0 -0
  387. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_network_policy.py +0 -0
  388. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_ops.py +0 -0
  389. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_scenario.py +0 -0
  390. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_scenario_builder.py +0 -0
  391. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_scenario_run.py +0 -0
  392. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_scorer.py +0 -0
  393. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_snapshot.py +0 -0
  394. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/sdk/test_storage_object.py +0 -0
  395. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/README.md +0 -0
  396. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/__init__.py +0 -0
  397. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/conftest.py +0 -0
  398. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/examples/__init__.py +0 -0
  399. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/examples/test_examples.py +0 -0
  400. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/README.md +0 -0
  401. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/__init__.py +0 -0
  402. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/conftest.py +0 -0
  403. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_agent.py +0 -0
  404. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_agent.py +0 -0
  405. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_axon.py +0 -0
  406. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_benchmark.py +0 -0
  407. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_blueprint.py +0 -0
  408. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_devbox.py +0 -0
  409. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_gateway_config.py +0 -0
  410. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_network_policy.py +0 -0
  411. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_scenario.py +0 -0
  412. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_scorer.py +0 -0
  413. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_sdk.py +0 -0
  414. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_secret.py +0 -0
  415. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_snapshot.py +0 -0
  416. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_async_storage_object.py +0 -0
  417. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_axon.py +0 -0
  418. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_benchmark.py +0 -0
  419. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_blueprint.py +0 -0
  420. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_devbox.py +0 -0
  421. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_gateway_config.py +0 -0
  422. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_mcp_config.py +0 -0
  423. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_network_policy.py +0 -0
  424. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_scenario.py +0 -0
  425. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_scorer.py +0 -0
  426. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_sdk.py +0 -0
  427. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_secret.py +0 -0
  428. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_snapshot.py +0 -0
  429. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/sdk/test_storage_object.py +0 -0
  430. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/test_blueprints.py +0 -0
  431. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/test_devboxes.py +0 -0
  432. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/test_executions.py +0 -0
  433. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
  434. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/test_snapshots.py +0 -0
  435. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/smoketests/utils.py +0 -0
  436. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_command_id.py +0 -0
  437. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_models.py +0 -0
  438. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_polling.py +0 -0
  439. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_qs.py +0 -0
  440. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_required_args.py +0 -0
  441. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_response.py +0 -0
  442. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_streaming.py +0 -0
  443. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_transform.py +0 -0
  444. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_utils/test_context_loader.py +0 -0
  445. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_utils/test_datetime_parse.py +0 -0
  446. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_utils/test_json.py +0 -0
  447. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_utils/test_path.py +0 -0
  448. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_utils/test_proxy.py +0 -0
  449. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/test_utils/test_typing.py +0 -0
  450. {runloop_api_client-1.20.1 → runloop_api_client-1.20.3}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.20.3"
3
+ }
@@ -1,5 +1,35 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.20.3 (2026-05-08)
4
+
5
+ Full Changelog: [v1.20.2...v1.20.3](https://github.com/runloopai/api-client-python/compare/v1.20.2...v1.20.3)
6
+
7
+ ### Features
8
+
9
+ * make agent version optional in API ([#8858](https://github.com/runloopai/api-client-python/issues/8858)) ([7e11a9d](https://github.com/runloopai/api-client-python/commit/7e11a9db85aff6c28dcc04b8d391979027f38549))
10
+ * share HTTP connection pool across SDK instances; refactor polling ([#797](https://github.com/runloopai/api-client-python/issues/797)) ([4f2fc4c](https://github.com/runloopai/api-client-python/commit/4f2fc4ca6d0b7a0b13b236dafb0e4e3148c2ed58))
11
+ * support setting headers via env ([54ead49](https://github.com/runloopai/api-client-python/commit/54ead49fd28a61f60e18197d727fa57216c785fd))
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * use correct field name format for multipart file arrays ([c564da8](https://github.com/runloopai/api-client-python/commit/c564da85b7dfdbb77edf347f6b25ca4ca57e470e))
17
+
18
+
19
+ ### Chores
20
+
21
+ * add get secret to stainless ([#7833](https://github.com/runloopai/api-client-python/issues/7833)) ([ce39778](https://github.com/runloopai/api-client-python/commit/ce39778de67907365c90f11ba3b3602cbc7daa2a))
22
+ * **internal:** more robust bootstrap script ([115744e](https://github.com/runloopai/api-client-python/commit/115744e3c181822a1ec172e0526684839e278899))
23
+ * **internal:** reformat pyproject.toml ([89e8401](https://github.com/runloopai/api-client-python/commit/89e8401b518f0ec15cb1e394dde66cb876bf0578))
24
+
25
+ ## 1.20.2 (2026-05-01)
26
+
27
+ Full Changelog: [v1.20.1...v1.20.2](https://github.com/runloopai/api-client-python/compare/v1.20.1...v1.20.2)
28
+
29
+ ### Bug Fixes
30
+
31
+ * additional polling updates ([#794](https://github.com/runloopai/api-client-python/issues/794)) ([26e409a](https://github.com/runloopai/api-client-python/commit/26e409ae797bfde1bdac90abfd8fc58b6971e8a8))
32
+
3
33
  ## 1.20.1 (2026-05-01)
4
34
 
5
35
  Full Changelog: [v1.20.0...v1.20.1](https://github.com/runloopai/api-client-python/compare/v1.20.0...v1.20.1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: runloop_api_client
3
- Version: 1.20.1
3
+ Version: 1.20.3
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
@@ -381,6 +381,7 @@ from runloop_api_client.types import (
381
381
  Methods:
382
382
 
383
383
  - <code title="post /v1/secrets">client.secrets.<a href="./src/runloop_api_client/resources/secrets.py">create</a>(\*\*<a href="src/runloop_api_client/types/secret_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/secret_view.py">SecretView</a></code>
384
+ - <code title="get /v1/secrets/{name}">client.secrets.<a href="./src/runloop_api_client/resources/secrets.py">retrieve</a>(name) -> <a href="./src/runloop_api_client/types/secret_view.py">SecretView</a></code>
384
385
  - <code title="post /v1/secrets/{name}">client.secrets.<a href="./src/runloop_api_client/resources/secrets.py">update</a>(name, \*\*<a href="src/runloop_api_client/types/secret_update_params.py">params</a>) -> <a href="./src/runloop_api_client/types/secret_view.py">SecretView</a></code>
385
386
  - <code title="get /v1/secrets">client.secrets.<a href="./src/runloop_api_client/resources/secrets.py">list</a>(\*\*<a href="src/runloop_api_client/types/secret_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/secret_list_view.py">SecretListView</a></code>
386
387
  - <code title="post /v1/secrets/{name}/delete">client.secrets.<a href="./src/runloop_api_client/resources/secrets.py">delete</a>(name) -> <a href="./src/runloop_api_client/types/secret_view.py">SecretView</a></code>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "runloop_api_client"
3
- version = "1.20.1"
3
+ version = "1.20.3"
4
4
  description = "The official Python library for the runloop API"
5
5
  dynamic = ["readme"]
6
6
  license = "MIT"
@@ -157,7 +157,7 @@ show_error_codes = true
157
157
  #
158
158
  # We also exclude our `tests` as mypy doesn't always infer
159
159
  # types correctly and Pyright will still catch any type errors.
160
- exclude = ['src/runloop_api_client/_files.py', '_dev/.*.py', 'tests/.*']
160
+ exclude = ["src/runloop_api_client/_files.py", "_dev/.*.py", "tests/.*"]
161
161
 
162
162
  strict_equality = true
163
163
  implicit_reexport = true
@@ -8,8 +8,10 @@ import email
8
8
  import asyncio
9
9
  import inspect
10
10
  import logging
11
+ import weakref
11
12
  import platform
12
13
  import warnings
14
+ import threading
13
15
  import email.utils
14
16
  from types import TracebackType
15
17
  from random import random
@@ -90,6 +92,88 @@ from ._utils._json import openapi_dumps
90
92
 
91
93
  log: logging.Logger = logging.getLogger(__name__)
92
94
 
95
+ # Shared HTTP transport state. We share transports (connection pools) rather
96
+ # than full httpx clients so each SDK instance keeps its own cookie jar and
97
+ # mutable client state. Refcounted wrappers close the real transport only
98
+ # when the last user releases it.
99
+ # The async transport is keyed by event loop because connections bind to the
100
+ # loop that created them and cannot be reused across asyncio.run() calls.
101
+ _pool_lock = threading.Lock()
102
+
103
+
104
+ class _SharedTransport(httpx.BaseTransport):
105
+ """Refcounted wrapper: delegates to a real transport, closes it when refcount hits 0."""
106
+
107
+ def __init__(self, transport: httpx.BaseTransport) -> None:
108
+ self._transport = transport
109
+ self._refcount = 1
110
+ self._lock = threading.Lock()
111
+
112
+ @property
113
+ def refcount(self) -> int:
114
+ return self._refcount
115
+
116
+ def acquire(self) -> bool:
117
+ with self._lock:
118
+ if self._refcount <= 0:
119
+ return False
120
+ self._refcount += 1
121
+ return True
122
+
123
+ @override
124
+ def handle_request(self, request: httpx.Request) -> httpx.Response:
125
+ return self._transport.handle_request(request)
126
+
127
+ @override
128
+ def close(self) -> None:
129
+ should_close = False
130
+ with self._lock:
131
+ self._refcount -= 1
132
+ if self._refcount <= 0:
133
+ should_close = True
134
+ if should_close:
135
+ self._transport.close()
136
+
137
+
138
+ class _SharedAsyncTransport(httpx.AsyncBaseTransport):
139
+ """Async refcounted wrapper: delegates to a real async transport."""
140
+
141
+ def __init__(self, transport: httpx.AsyncBaseTransport) -> None:
142
+ self._transport = transport
143
+ self._refcount = 1
144
+ self._lock = threading.Lock()
145
+
146
+ @property
147
+ def refcount(self) -> int:
148
+ return self._refcount
149
+
150
+ def acquire(self) -> bool:
151
+ with self._lock:
152
+ if self._refcount <= 0:
153
+ return False
154
+ self._refcount += 1
155
+ return True
156
+
157
+ @override
158
+ async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
159
+ return await self._transport.handle_async_request(request)
160
+
161
+ @override
162
+ async def aclose(self) -> None:
163
+ should_close = False
164
+ with self._lock:
165
+ self._refcount -= 1
166
+ if self._refcount <= 0:
167
+ should_close = True
168
+ if should_close:
169
+ await self._transport.aclose()
170
+
171
+
172
+ _shared_sync_transport: _SharedTransport | None = None
173
+ _shared_async_transports: weakref.WeakKeyDictionary[asyncio.AbstractEventLoop, _SharedAsyncTransport] = (
174
+ weakref.WeakKeyDictionary()
175
+ )
176
+
93
177
  # TODO: make base page type vars covariant
94
178
  SyncPageT = TypeVar("SyncPageT", bound="BaseSyncPage[Any]")
95
179
  AsyncPageT = TypeVar("AsyncPageT", bound="BaseAsyncPage[Any]")
@@ -816,6 +900,7 @@ class _DefaultHttpxClient(httpx.Client):
816
900
  kwargs.setdefault("timeout", DEFAULT_TIMEOUT)
817
901
  kwargs.setdefault("limits", DEFAULT_CONNECTION_LIMITS)
818
902
  kwargs.setdefault("follow_redirects", True)
903
+ kwargs.setdefault("http2", True)
819
904
  super().__init__(**kwargs)
820
905
 
821
906
 
@@ -845,6 +930,8 @@ class SyncHttpxClientWrapper(DefaultHttpxClient):
845
930
  class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
846
931
  _client: httpx.Client
847
932
  _default_stream_cls: type[Stream[Any]] | None = None
933
+ _uses_shared_pool: bool
934
+ _closed: bool
848
935
 
849
936
  def __init__(
850
937
  self,
@@ -857,6 +944,7 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
857
944
  custom_headers: Mapping[str, str] | None = None,
858
945
  custom_query: Mapping[str, object] | None = None,
859
946
  _strict_response_validation: bool,
947
+ shared_http_pool: bool = True,
860
948
  ) -> None:
861
949
  if not is_given(timeout):
862
950
  # if the user passed in a custom http client with a non-default
@@ -886,24 +974,46 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
886
974
  custom_headers=custom_headers,
887
975
  _strict_response_validation=_strict_response_validation,
888
976
  )
889
- self._client = http_client or SyncHttpxClientWrapper(
890
- base_url=base_url,
891
- # cast to a valid type because mypy doesn't understand our type narrowing
892
- timeout=cast(Timeout, timeout),
893
- )
977
+
978
+ self._closed = False
979
+
980
+ if http_client is not None:
981
+ self._client = http_client
982
+ self._uses_shared_pool = False
983
+ elif shared_http_pool:
984
+ global _shared_sync_transport
985
+ with _pool_lock:
986
+ if _shared_sync_transport is None or not _shared_sync_transport.acquire():
987
+ _shared_sync_transport = _SharedTransport(
988
+ httpx.HTTPTransport(limits=DEFAULT_CONNECTION_LIMITS, http2=True),
989
+ )
990
+ self._client = SyncHttpxClientWrapper(
991
+ base_url=base_url,
992
+ timeout=cast(Timeout, timeout),
993
+ transport=_shared_sync_transport,
994
+ )
995
+ self._uses_shared_pool = True
996
+ else:
997
+ self._client = SyncHttpxClientWrapper(
998
+ base_url=base_url,
999
+ timeout=cast(Timeout, timeout),
1000
+ )
1001
+ self._uses_shared_pool = False
894
1002
 
895
1003
  def is_closed(self) -> bool:
896
- return self._client.is_closed
1004
+ return self._closed or self._client.is_closed
897
1005
 
898
1006
  def close(self) -> None:
899
1007
  """Close the underlying HTTPX client.
900
1008
 
901
1009
  The client will *not* be usable after this.
902
1010
  """
903
- # If an error is thrown while constructing a client, self._client
904
- # may not be present
905
- if hasattr(self, "_client"):
906
- self._client.close()
1011
+ if not hasattr(self, "_client"):
1012
+ return
1013
+ if self._closed:
1014
+ return
1015
+ self._closed = True
1016
+ self._client.close()
907
1017
 
908
1018
  def __enter__(self: _T) -> _T:
909
1019
  return self
@@ -1018,6 +1128,7 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1018
1128
  max_retries=max_retries,
1019
1129
  options=input_options,
1020
1130
  response=None,
1131
+ error=err,
1021
1132
  )
1022
1133
  continue
1023
1134
 
@@ -1032,6 +1143,7 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1032
1143
  max_retries=max_retries,
1033
1144
  options=input_options,
1034
1145
  response=None,
1146
+ error=err,
1035
1147
  )
1036
1148
  continue
1037
1149
 
@@ -1083,7 +1195,13 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1083
1195
  )
1084
1196
 
1085
1197
  def _sleep_for_retry(
1086
- self, *, retries_taken: int, max_retries: int, options: FinalRequestOptions, response: httpx.Response | None
1198
+ self,
1199
+ *,
1200
+ retries_taken: int,
1201
+ max_retries: int,
1202
+ options: FinalRequestOptions,
1203
+ response: httpx.Response | None,
1204
+ error: BaseException | None = None,
1087
1205
  ) -> None:
1088
1206
  remaining_retries = max_retries - retries_taken
1089
1207
  if remaining_retries == 1:
@@ -1092,7 +1210,23 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1092
1210
  log.debug("%i retries left", remaining_retries)
1093
1211
 
1094
1212
  timeout = self._calculate_retry_timeout(remaining_retries, options, response.headers if response else None)
1095
- log.info("Retrying request to %s in %f seconds", options.url, timeout)
1213
+ if response is not None:
1214
+ log.info(
1215
+ "Retrying request to %s in %f seconds (status %d)",
1216
+ options.url,
1217
+ timeout,
1218
+ response.status_code,
1219
+ )
1220
+ elif error is not None:
1221
+ log.info(
1222
+ "Retrying request to %s in %f seconds (%s: %s)",
1223
+ options.url,
1224
+ timeout,
1225
+ type(error).__name__,
1226
+ error,
1227
+ )
1228
+ else:
1229
+ log.info("Retrying request to %s in %f seconds", options.url, timeout)
1096
1230
 
1097
1231
  time.sleep(timeout)
1098
1232
 
@@ -1428,6 +1562,8 @@ class AsyncHttpxClientWrapper(DefaultAsyncHttpxClient):
1428
1562
  class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1429
1563
  _client: httpx.AsyncClient
1430
1564
  _default_stream_cls: type[AsyncStream[Any]] | None = None
1565
+ _uses_shared_pool: bool
1566
+ _closed: bool
1431
1567
 
1432
1568
  def __init__(
1433
1569
  self,
@@ -1440,6 +1576,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1440
1576
  http_client: httpx.AsyncClient | None = None,
1441
1577
  custom_headers: Mapping[str, str] | None = None,
1442
1578
  custom_query: Mapping[str, object] | None = None,
1579
+ shared_http_pool: bool = True,
1443
1580
  ) -> None:
1444
1581
  if not is_given(timeout):
1445
1582
  # if the user passed in a custom http client with a non-default
@@ -1469,20 +1606,59 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1469
1606
  custom_headers=custom_headers,
1470
1607
  _strict_response_validation=_strict_response_validation,
1471
1608
  )
1472
- self._client = http_client or AsyncHttpxClientWrapper(
1473
- base_url=base_url,
1474
- # cast to a valid type because mypy doesn't understand our type narrowing
1475
- timeout=cast(Timeout, timeout),
1476
- )
1609
+
1610
+ self._closed = False
1611
+
1612
+ if http_client is not None:
1613
+ self._client = http_client
1614
+ self._uses_shared_pool = False
1615
+ elif shared_http_pool:
1616
+ try:
1617
+ loop: asyncio.AbstractEventLoop | None = asyncio.get_running_loop()
1618
+ except RuntimeError:
1619
+ loop = None
1620
+ if loop is not None:
1621
+ with _pool_lock:
1622
+ existing = _shared_async_transports.get(loop)
1623
+ if existing is not None and existing.acquire():
1624
+ transport: _SharedAsyncTransport = existing
1625
+ else:
1626
+ transport = _SharedAsyncTransport(
1627
+ httpx.AsyncHTTPTransport(limits=DEFAULT_CONNECTION_LIMITS, http2=True),
1628
+ )
1629
+ _shared_async_transports[loop] = transport
1630
+ self._client = AsyncHttpxClientWrapper(
1631
+ base_url=base_url,
1632
+ timeout=cast(Timeout, timeout),
1633
+ transport=transport,
1634
+ )
1635
+ self._uses_shared_pool = True
1636
+ else:
1637
+ self._client = AsyncHttpxClientWrapper(
1638
+ base_url=base_url,
1639
+ timeout=cast(Timeout, timeout),
1640
+ )
1641
+ self._uses_shared_pool = False
1642
+ else:
1643
+ self._client = AsyncHttpxClientWrapper(
1644
+ base_url=base_url,
1645
+ timeout=cast(Timeout, timeout),
1646
+ )
1647
+ self._uses_shared_pool = False
1477
1648
 
1478
1649
  def is_closed(self) -> bool:
1479
- return self._client.is_closed
1650
+ return self._closed or self._client.is_closed
1480
1651
 
1481
1652
  async def close(self) -> None:
1482
1653
  """Close the underlying HTTPX client.
1483
1654
 
1484
1655
  The client will *not* be usable after this.
1485
1656
  """
1657
+ if not hasattr(self, "_client"):
1658
+ return
1659
+ if self._closed:
1660
+ return
1661
+ self._closed = True
1486
1662
  await self._client.aclose()
1487
1663
 
1488
1664
  async def __aenter__(self: _T) -> _T:
@@ -1603,6 +1779,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1603
1779
  max_retries=max_retries,
1604
1780
  options=input_options,
1605
1781
  response=None,
1782
+ error=err,
1606
1783
  )
1607
1784
  continue
1608
1785
 
@@ -1617,6 +1794,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1617
1794
  max_retries=max_retries,
1618
1795
  options=input_options,
1619
1796
  response=None,
1797
+ error=err,
1620
1798
  )
1621
1799
  continue
1622
1800
 
@@ -1668,7 +1846,13 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1668
1846
  )
1669
1847
 
1670
1848
  async def _sleep_for_retry(
1671
- self, *, retries_taken: int, max_retries: int, options: FinalRequestOptions, response: httpx.Response | None
1849
+ self,
1850
+ *,
1851
+ retries_taken: int,
1852
+ max_retries: int,
1853
+ options: FinalRequestOptions,
1854
+ response: httpx.Response | None,
1855
+ error: BaseException | None = None,
1672
1856
  ) -> None:
1673
1857
  remaining_retries = max_retries - retries_taken
1674
1858
  if remaining_retries == 1:
@@ -1677,7 +1861,23 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1677
1861
  log.debug("%i retries left", remaining_retries)
1678
1862
 
1679
1863
  timeout = self._calculate_retry_timeout(remaining_retries, options, response.headers if response else None)
1680
- log.info("Retrying request to %s in %f seconds", options.url, timeout)
1864
+ if response is not None:
1865
+ log.info(
1866
+ "Retrying request to %s in %f seconds (status %d)",
1867
+ options.url,
1868
+ timeout,
1869
+ response.status_code,
1870
+ )
1871
+ elif error is not None:
1872
+ log.info(
1873
+ "Retrying request to %s in %f seconds (%s: %s)",
1874
+ options.url,
1875
+ timeout,
1876
+ type(error).__name__,
1877
+ error,
1878
+ )
1879
+ else:
1880
+ log.info("Retrying request to %s in %f seconds", options.url, timeout)
1681
1881
 
1682
1882
  await anyio.sleep(timeout)
1683
1883
 
@@ -19,7 +19,11 @@ from ._types import (
19
19
  RequestOptions,
20
20
  not_given,
21
21
  )
22
- from ._utils import is_given, get_async_library
22
+ from ._utils import (
23
+ is_given,
24
+ is_mapping_t,
25
+ get_async_library,
26
+ )
23
27
  from ._compat import cached_property
24
28
  from ._version import __version__
25
29
  from ._streaming import Stream as Stream, AsyncStream as AsyncStream
@@ -84,6 +88,10 @@ class Runloop(SyncAPIClient):
84
88
  # We provide a `DefaultHttpxClient` class that you can pass to retain the default values we use for `limits`, `timeout` & `follow_redirects`.
85
89
  # See the [httpx documentation](https://www.python-httpx.org/api/#client) for more details.
86
90
  http_client: httpx.Client | None = None,
91
+ # Share a single httpx connection pool across all Runloop client instances.
92
+ # Enables HTTP/2 multiplexing and avoids ConnectTimeout storms under high concurrency.
93
+ # Set to False to create a private connection pool (old behavior).
94
+ shared_http_pool: bool = True,
87
95
  # Enable or disable schema validation for data returned by the API.
88
96
  # When enabled an error APIResponseValidationError is raised
89
97
  # if the API responds with invalid data for the expected schema.
@@ -111,6 +119,15 @@ class Runloop(SyncAPIClient):
111
119
  if base_url is None:
112
120
  base_url = f"https://api.runloop.ai"
113
121
 
122
+ custom_headers_env = os.environ.get("RUNLOOP_CUSTOM_HEADERS")
123
+ if custom_headers_env is not None:
124
+ parsed: dict[str, str] = {}
125
+ for line in custom_headers_env.split("\n"):
126
+ colon = line.find(":")
127
+ if colon >= 0:
128
+ parsed[line[:colon].strip()] = line[colon + 1 :].strip()
129
+ default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}
130
+
114
131
  super().__init__(
115
132
  version=__version__,
116
133
  base_url=base_url,
@@ -120,6 +137,7 @@ class Runloop(SyncAPIClient):
120
137
  custom_headers=default_headers,
121
138
  custom_query=default_query,
122
139
  _strict_response_validation=_strict_response_validation,
140
+ shared_http_pool=shared_http_pool,
123
141
  )
124
142
 
125
143
  self._idempotency_header = "x-request-id"
@@ -249,6 +267,7 @@ class Runloop(SyncAPIClient):
249
267
  base_url: str | httpx.URL | None = None,
250
268
  timeout: float | Timeout | None | NotGiven = not_given,
251
269
  http_client: httpx.Client | None = None,
270
+ shared_http_pool: bool | None = None,
252
271
  max_retries: int | NotGiven = not_given,
253
272
  default_headers: Mapping[str, str] | None = None,
254
273
  set_default_headers: Mapping[str, str] | None = None,
@@ -277,12 +296,19 @@ class Runloop(SyncAPIClient):
277
296
  elif set_default_query is not None:
278
297
  params = set_default_query
279
298
 
280
- http_client = http_client or self._client
299
+ if http_client is not None:
300
+ resolved_shared = False
301
+ elif shared_http_pool is not None:
302
+ resolved_shared = shared_http_pool
303
+ else:
304
+ resolved_shared = self._uses_shared_pool
305
+
281
306
  return self.__class__(
282
307
  bearer_token=bearer_token or self.bearer_token,
283
308
  base_url=base_url or self.base_url,
284
309
  timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
285
310
  http_client=http_client,
311
+ shared_http_pool=resolved_shared,
286
312
  max_retries=max_retries if is_given(max_retries) else self.max_retries,
287
313
  default_headers=headers,
288
314
  default_query=params,
@@ -344,6 +370,10 @@ class AsyncRunloop(AsyncAPIClient):
344
370
  # We provide a `DefaultAsyncHttpxClient` class that you can pass to retain the default values we use for `limits`, `timeout` & `follow_redirects`.
345
371
  # See the [httpx documentation](https://www.python-httpx.org/api/#asyncclient) for more details.
346
372
  http_client: httpx.AsyncClient | None = None,
373
+ # Share a single httpx connection pool across all AsyncRunloop client instances.
374
+ # Enables HTTP/2 multiplexing and avoids ConnectTimeout storms under high concurrency.
375
+ # Set to False to create a private connection pool (old behavior).
376
+ shared_http_pool: bool = True,
347
377
  # Enable or disable schema validation for data returned by the API.
348
378
  # When enabled an error APIResponseValidationError is raised
349
379
  # if the API responds with invalid data for the expected schema.
@@ -371,6 +401,15 @@ class AsyncRunloop(AsyncAPIClient):
371
401
  if base_url is None:
372
402
  base_url = f"https://api.runloop.ai"
373
403
 
404
+ custom_headers_env = os.environ.get("RUNLOOP_CUSTOM_HEADERS")
405
+ if custom_headers_env is not None:
406
+ parsed: dict[str, str] = {}
407
+ for line in custom_headers_env.split("\n"):
408
+ colon = line.find(":")
409
+ if colon >= 0:
410
+ parsed[line[:colon].strip()] = line[colon + 1 :].strip()
411
+ default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}
412
+
374
413
  super().__init__(
375
414
  version=__version__,
376
415
  base_url=base_url,
@@ -380,6 +419,7 @@ class AsyncRunloop(AsyncAPIClient):
380
419
  custom_headers=default_headers,
381
420
  custom_query=default_query,
382
421
  _strict_response_validation=_strict_response_validation,
422
+ shared_http_pool=shared_http_pool,
383
423
  )
384
424
 
385
425
  self._idempotency_header = "x-request-id"
@@ -509,6 +549,7 @@ class AsyncRunloop(AsyncAPIClient):
509
549
  base_url: str | httpx.URL | None = None,
510
550
  timeout: float | Timeout | None | NotGiven = not_given,
511
551
  http_client: httpx.AsyncClient | None = None,
552
+ shared_http_pool: bool | None = None,
512
553
  max_retries: int | NotGiven = not_given,
513
554
  default_headers: Mapping[str, str] | None = None,
514
555
  set_default_headers: Mapping[str, str] | None = None,
@@ -537,12 +578,19 @@ class AsyncRunloop(AsyncAPIClient):
537
578
  elif set_default_query is not None:
538
579
  params = set_default_query
539
580
 
540
- http_client = http_client or self._client
581
+ if http_client is not None:
582
+ resolved_shared = False
583
+ elif shared_http_pool is not None:
584
+ resolved_shared = shared_http_pool
585
+ else:
586
+ resolved_shared = self._uses_shared_pool
587
+
541
588
  return self.__class__(
542
589
  bearer_token=bearer_token or self.bearer_token,
543
590
  base_url=base_url or self.base_url,
544
591
  timeout=self.timeout if isinstance(timeout, NotGiven) else timeout,
545
592
  http_client=http_client,
593
+ shared_http_pool=resolved_shared,
546
594
  max_retries=max_retries if is_given(max_retries) else self.max_retries,
547
595
  default_headers=headers,
548
596
  default_query=params,
@@ -8,7 +8,7 @@ OVERRIDE_CAST_TO_HEADER = "____stainless_override_cast_to"
8
8
  # default timeout is 30 seconds
9
9
  DEFAULT_TIMEOUT = httpx.Timeout(timeout=30, connect=5.0)
10
10
  DEFAULT_MAX_RETRIES = 5
11
- DEFAULT_CONNECTION_LIMITS = httpx.Limits(max_connections=100, max_keepalive_connections=20)
11
+ DEFAULT_CONNECTION_LIMITS = httpx.Limits(max_connections=20, max_keepalive_connections=10)
12
12
 
13
13
  INITIAL_RETRY_DELAY = 1.0
14
14
  MAX_RETRY_DELAY = 60.0
@@ -2,17 +2,13 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any, List, Tuple, Union, Mapping, TypeVar
4
4
  from urllib.parse import parse_qs, urlencode
5
- from typing_extensions import Literal, get_args
5
+ from typing_extensions import get_args
6
6
 
7
- from ._types import NotGiven, not_given
7
+ from ._types import NotGiven, ArrayFormat, NestedFormat, not_given
8
8
  from ._utils import flatten
9
9
 
10
10
  _T = TypeVar("_T")
11
11
 
12
-
13
- ArrayFormat = Literal["comma", "repeat", "indices", "brackets"]
14
- NestedFormat = Literal["dots", "brackets"]
15
-
16
12
  PrimitiveData = Union[str, int, float, bool, None]
17
13
  # this should be Data = Union[PrimitiveData, "List[Data]", "Tuple[Data]", "Mapping[str, Data]"]
18
14
  # https://github.com/microsoft/pyright/issues/3555
@@ -47,6 +47,9 @@ AnyMapping = Mapping[str, object]
47
47
  ModelT = TypeVar("ModelT", bound=pydantic.BaseModel)
48
48
  _T = TypeVar("_T")
49
49
 
50
+ ArrayFormat = Literal["comma", "repeat", "indices", "brackets"]
51
+ NestedFormat = Literal["dots", "brackets"]
52
+
50
53
 
51
54
  # Approximates httpx internal ProxiesTypes and RequestFiles types
52
55
  # while adding support for `PathLike` instances