runloop_api_client 1.23.3__tar.gz → 1.27.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 (473) hide show
  1. runloop_api_client-1.27.0/.release-please-manifest.json +3 -0
  2. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/CHANGELOG.md +40 -0
  3. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/PKG-INFO +1 -1
  4. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/api.md +4 -0
  5. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/pyproject.toml +2 -1
  6. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_base_client.py +357 -54
  7. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_client.py +37 -0
  8. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_constants.py +7 -0
  9. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_version.py +1 -1
  10. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/axons/axons.py +8 -0
  11. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/benchmark_jobs.py +8 -0
  12. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/benchmark_runs.py +16 -0
  13. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/benchmarks.py +24 -0
  14. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/devboxes/devboxes.py +70 -0
  15. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/gateway_configs.py +8 -0
  16. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/mcp_configs.py +8 -0
  17. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/network_policies.py +56 -3
  18. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/scenarios/runs.py +8 -0
  19. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/scenarios/scenarios.py +16 -0
  20. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/scenarios/scorers.py +8 -0
  21. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_.py +13 -0
  22. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/sync.py +13 -0
  23. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/__init__.py +5 -0
  24. runloop_api_client-1.27.0/src/runloop_api_client/types/allowed_cidr.py +21 -0
  25. runloop_api_client-1.27.0/src/runloop_api_client/types/allowed_cidr_param.py +23 -0
  26. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_list_params.py +3 -0
  27. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_job_list_params.py +3 -0
  28. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_list_params.py +3 -0
  29. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_list_public_params.py +6 -0
  30. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_run_list_params.py +3 -0
  31. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py +3 -0
  32. runloop_api_client-1.27.0/src/runloop_api_client/types/devbox_eviction_event_view.py +16 -0
  33. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_list_params.py +1 -0
  34. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_view.py +5 -2
  35. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/gateway_config_list_params.py +3 -0
  36. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/mcp_config_list_params.py +3 -0
  37. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/network_policy_create_params.py +15 -1
  38. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/network_policy_list_params.py +3 -0
  39. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/network_policy_update_params.py +14 -1
  40. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/network_policy_view.py +13 -0
  41. runloop_api_client-1.27.0/src/runloop_api_client/types/port_rule.py +24 -0
  42. runloop_api_client-1.27.0/src/runloop_api_client/types/port_rule_param.py +24 -0
  43. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_list_params.py +3 -0
  44. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_list_public_params.py +3 -0
  45. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/run_list_params.py +3 -0
  46. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_list_params.py +3 -0
  47. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/broker_mount.py +3 -3
  48. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/broker_mount.py +3 -3
  49. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/scenarios/test_runs.py +2 -0
  50. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/scenarios/test_scorers.py +2 -0
  51. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_axons.py +2 -0
  52. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_benchmark_jobs.py +2 -0
  53. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_benchmark_runs.py +4 -0
  54. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_benchmarks.py +6 -0
  55. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_devboxes.py +48 -0
  56. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_gateway_configs.py +2 -0
  57. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_mcp_configs.py +2 -0
  58. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_network_policies.py +54 -0
  59. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_scenarios.py +4 -0
  60. runloop_api_client-1.27.0/tests/test_h2_bulkhead_integration.py +418 -0
  61. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_shared_pool.py +9 -6
  62. runloop_api_client-1.27.0/tests/test_transfer_client.py +243 -0
  63. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/uv.lock +1 -1
  64. runloop_api_client-1.23.3/.release-please-manifest.json +0 -3
  65. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/.gitignore +0 -0
  66. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/AGENTS.md +0 -0
  67. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/CLAUDE.md +0 -0
  68. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/CONTRIBUTING.md +0 -0
  69. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/EXAMPLES.md +0 -0
  70. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/LICENSE +0 -0
  71. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/README-SDK.md +0 -0
  72. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/README.md +0 -0
  73. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/SECURITY.md +0 -0
  74. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/bin/check-release-environment +0 -0
  75. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/bin/publish-pypi +0 -0
  76. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/__init__.py +0 -0
  77. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/_harness.py +0 -0
  78. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/blueprint_with_build_context.py +0 -0
  79. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/devbox_from_blueprint_lifecycle.py +0 -0
  80. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/devbox_snapshot_resume.py +0 -0
  81. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/devbox_snapshots.py +0 -0
  82. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/devbox_tunnel.py +0 -0
  83. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/example_types.py +0 -0
  84. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/mcp_github_tools.py +0 -0
  85. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/registry.py +0 -0
  86. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/examples/secrets_with_devbox.py +0 -0
  87. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/release-please-config.json +0 -0
  88. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/requirements-dev.lock +0 -0
  89. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop/lib/.keep +0 -0
  90. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/__init__.py +0 -0
  91. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_compat.py +0 -0
  92. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_exceptions.py +0 -0
  93. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_files.py +0 -0
  94. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_models.py +0 -0
  95. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_qs.py +0 -0
  96. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_resource.py +0 -0
  97. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_response.py +0 -0
  98. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_streaming.py +0 -0
  99. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_types.py +0 -0
  100. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/__init__.py +0 -0
  101. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_compat.py +0 -0
  102. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
  103. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_json.py +0 -0
  104. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_logs.py +0 -0
  105. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_path.py +0 -0
  106. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_proxy.py +0 -0
  107. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_reflection.py +0 -0
  108. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
  109. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_streams.py +0 -0
  110. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_sync.py +0 -0
  111. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_transform.py +0 -0
  112. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_typing.py +0 -0
  113. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_utils.py +0 -0
  114. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_validation.py +0 -0
  115. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/.keep +0 -0
  116. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/__init__.py +0 -0
  117. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/_ignore.py +0 -0
  118. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/context_loader.py +0 -0
  119. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/polling.py +0 -0
  120. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/polling_async.py +0 -0
  121. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/wait_for_status.py +0 -0
  122. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/pagination.py +0 -0
  123. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/py.typed +0 -0
  124. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/__init__.py +0 -0
  125. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/accounts.py +0 -0
  126. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/agents.py +0 -0
  127. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/apikeys.py +0 -0
  128. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/axons/__init__.py +0 -0
  129. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/axons/events.py +0 -0
  130. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/axons/sql.py +0 -0
  131. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/blueprints.py +0 -0
  132. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
  133. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
  134. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/devboxes/executions.py +0 -0
  135. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
  136. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/objects.py +0 -0
  137. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/pty.py +0 -0
  138. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/restricted_keys.py +0 -0
  139. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
  140. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/secrets.py +0 -0
  141. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/__init__.py +0 -0
  142. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/_helpers.py +0 -0
  143. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/_types.py +0 -0
  144. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/agent.py +0 -0
  145. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_agent.py +0 -0
  146. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_axon.py +0 -0
  147. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_benchmark.py +0 -0
  148. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_benchmark_run.py +0 -0
  149. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_blueprint.py +0 -0
  150. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_devbox.py +0 -0
  151. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_execution.py +0 -0
  152. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_execution_result.py +0 -0
  153. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_gateway_config.py +0 -0
  154. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_mcp_config.py +0 -0
  155. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_network_policy.py +0 -0
  156. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_scenario.py +0 -0
  157. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_scenario_builder.py +0 -0
  158. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_scenario_run.py +0 -0
  159. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_scorer.py +0 -0
  160. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_secret.py +0 -0
  161. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_snapshot.py +0 -0
  162. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_storage_object.py +0 -0
  163. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/axon.py +0 -0
  164. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/benchmark.py +0 -0
  165. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/benchmark_run.py +0 -0
  166. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/blueprint.py +0 -0
  167. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/devbox.py +0 -0
  168. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/execution.py +0 -0
  169. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/execution_result.py +0 -0
  170. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/gateway_config.py +0 -0
  171. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/mcp_config.py +0 -0
  172. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/network_policy.py +0 -0
  173. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/scenario.py +0 -0
  174. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/scenario_builder.py +0 -0
  175. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/scenario_run.py +0 -0
  176. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/scorer.py +0 -0
  177. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/secret.py +0 -0
  178. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/snapshot.py +0 -0
  179. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/storage_object.py +0 -0
  180. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/account_view.py +0 -0
  181. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_create_params.py +0 -0
  182. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_devbox_counts_view.py +0 -0
  183. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_list_params.py +0 -0
  184. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_list_public_params.py +0 -0
  185. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_list_view.py +0 -0
  186. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_view.py +0 -0
  187. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/api_key_created_view.py +0 -0
  188. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/apikey_create_params.py +0 -0
  189. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_create_params.py +0 -0
  190. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_event_view.py +0 -0
  191. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_list_view.py +0 -0
  192. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_publish_params.py +0 -0
  193. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_subscribe_sse_params.py +0 -0
  194. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_view.py +0 -0
  195. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/__init__.py +0 -0
  196. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/axon_event_list_view.py +0 -0
  197. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/event_list_params.py +0 -0
  198. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_batch_params.py +0 -0
  199. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_batch_result_view.py +0 -0
  200. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_column_meta_view.py +0 -0
  201. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_query_params.py +0 -0
  202. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_query_result_view.py +0 -0
  203. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_result_meta_view.py +0 -0
  204. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_statement_params.py +0 -0
  205. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_step_error_view.py +0 -0
  206. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_step_result_view.py +0 -0
  207. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
  208. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
  209. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_job_create_params.py +0 -0
  210. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_job_list_view.py +0 -0
  211. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_job_view.py +0 -0
  212. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
  213. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
  214. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
  215. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
  216. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_update_scenarios_params.py +0 -0
  217. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_view.py +0 -0
  218. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
  219. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
  220. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
  221. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
  222. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
  223. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
  224. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
  225. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
  226. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
  227. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_view.py +0 -0
  228. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
  229. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_create_params.py +0 -0
  230. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
  231. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
  232. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_enable_tunnel_params.py +0 -0
  233. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
  234. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
  235. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
  236. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
  237. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
  238. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_list_view.py +0 -0
  239. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
  240. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
  241. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_resource_usage_view.py +0 -0
  242. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
  243. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_shutdown_params.py +0 -0
  244. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
  245. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
  246. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
  247. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
  248. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_update_params.py +0 -0
  249. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
  250. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
  251. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
  252. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
  253. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
  254. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
  255. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
  256. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
  257. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
  258. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
  259. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
  260. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
  261. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
  262. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +0 -0
  263. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +0 -0
  264. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
  265. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
  266. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/gateway_config_create_params.py +0 -0
  267. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/gateway_config_list_view.py +0 -0
  268. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/gateway_config_update_params.py +0 -0
  269. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/gateway_config_view.py +0 -0
  270. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/input_context.py +0 -0
  271. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/input_context_param.py +0 -0
  272. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/input_context_update_param.py +0 -0
  273. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/mcp_config_create_params.py +0 -0
  274. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/mcp_config_list_view.py +0 -0
  275. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/mcp_config_update_params.py +0 -0
  276. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/mcp_config_view.py +0 -0
  277. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/network_policy_list_view.py +0 -0
  278. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_create_params.py +0 -0
  279. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_download_params.py +0 -0
  280. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_download_url_view.py +0 -0
  281. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_list_params.py +0 -0
  282. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_list_public_params.py +0 -0
  283. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_list_view.py +0 -0
  284. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_view.py +0 -0
  285. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/pty_connect_params.py +0 -0
  286. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/pty_connect_view.py +0 -0
  287. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/pty_control_params.py +0 -0
  288. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/pty_control_result_view.py +0 -0
  289. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/pty_tunnel_view.py +0 -0
  290. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/publish_result_view.py +0 -0
  291. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/restricted_key_create_params.py +0 -0
  292. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/restricted_key_created_view.py +0 -0
  293. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_create_params.py +0 -0
  294. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
  295. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_environment.py +0 -0
  296. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
  297. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
  298. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_run_view.py +0 -0
  299. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
  300. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_update_params.py +0 -0
  301. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_view.py +0 -0
  302. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
  303. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
  304. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
  305. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
  306. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
  307. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
  308. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
  309. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scope_entry_view.py +0 -0
  310. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scope_entry_view_param.py +0 -0
  311. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_contract.py +0 -0
  312. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
  313. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
  314. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
  315. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_function.py +0 -0
  316. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_function_param.py +0 -0
  317. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
  318. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/secret_create_params.py +0 -0
  319. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/secret_list_params.py +0 -0
  320. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/secret_list_view.py +0 -0
  321. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/secret_update_params.py +0 -0
  322. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/secret_view.py +0 -0
  323. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/__init__.py +0 -0
  324. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/after_idle.py +0 -0
  325. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/agent_mount.py +0 -0
  326. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/agent_source.py +0 -0
  327. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
  328. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/launch_parameters.py +0 -0
  329. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/lifecycle_configuration.py +0 -0
  330. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/lifecycle_hooks.py +0 -0
  331. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/mount.py +0 -0
  332. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/object_mount.py +0 -0
  333. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/resume_triggers.py +0 -0
  334. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/run_profile.py +0 -0
  335. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
  336. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
  337. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/agent_mount.py +0 -0
  338. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/agent_source.py +0 -0
  339. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
  340. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/launch_parameters.py +0 -0
  341. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/lifecycle_configuration.py +0 -0
  342. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/lifecycle_hooks.py +0 -0
  343. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/mount.py +0 -0
  344. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/object_mount.py +0 -0
  345. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/resume_triggers.py +0 -0
  346. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
  347. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/src/runloop_api_client/types/tunnel_view.py +0 -0
  348. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/__init__.py +0 -0
  349. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/__init__.py +0 -0
  350. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/axons/__init__.py +0 -0
  351. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/axons/test_events.py +0 -0
  352. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/axons/test_sql.py +0 -0
  353. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/devboxes/__init__.py +0 -0
  354. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
  355. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/devboxes/test_executions.py +0 -0
  356. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/devboxes/test_logs.py +0 -0
  357. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/scenarios/__init__.py +0 -0
  358. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_accounts.py +0 -0
  359. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_agents.py +0 -0
  360. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_apikeys.py +0 -0
  361. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_blueprints.py +0 -0
  362. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_objects.py +0 -0
  363. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_pty.py +0 -0
  364. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_restricted_keys.py +0 -0
  365. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/api_resources/test_secrets.py +0 -0
  366. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/conftest.py +0 -0
  367. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sample_file.txt +0 -0
  368. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/__init__.py +0 -0
  369. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/__init__.py +0 -0
  370. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/conftest.py +0 -0
  371. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/test_core.py +0 -0
  372. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/test_edge_cases.py +0 -0
  373. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/test_interfaces.py +0 -0
  374. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/test_streaming.py +0 -0
  375. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/conftest.py +0 -0
  376. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/devbox/__init__.py +0 -0
  377. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/devbox/conftest.py +0 -0
  378. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/devbox/test_core.py +0 -0
  379. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/devbox/test_edge_cases.py +0 -0
  380. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/devbox/test_interfaces.py +0 -0
  381. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/devbox/test_streaming.py +0 -0
  382. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_agent.py +0 -0
  383. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_agent.py +0 -0
  384. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_axon.py +0 -0
  385. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_benchmark.py +0 -0
  386. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_benchmark_run.py +0 -0
  387. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_blueprint.py +0 -0
  388. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_execution.py +0 -0
  389. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_execution_result.py +0 -0
  390. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_gateway_config.py +0 -0
  391. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_network_policy.py +0 -0
  392. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_ops.py +0 -0
  393. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_scenario.py +0 -0
  394. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_scenario_builder.py +0 -0
  395. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_scenario_run.py +0 -0
  396. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_scorer.py +0 -0
  397. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_snapshot.py +0 -0
  398. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_async_storage_object.py +0 -0
  399. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_axon.py +0 -0
  400. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_benchmark.py +0 -0
  401. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_benchmark_run.py +0 -0
  402. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_blueprint.py +0 -0
  403. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_execution.py +0 -0
  404. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_execution_result.py +0 -0
  405. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_gateway_config.py +0 -0
  406. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_helpers.py +0 -0
  407. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_network_policy.py +0 -0
  408. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_ops.py +0 -0
  409. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_scenario.py +0 -0
  410. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_scenario_builder.py +0 -0
  411. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_scenario_run.py +0 -0
  412. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_scorer.py +0 -0
  413. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_snapshot.py +0 -0
  414. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/sdk/test_storage_object.py +0 -0
  415. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/README.md +0 -0
  416. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/__init__.py +0 -0
  417. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/conftest.py +0 -0
  418. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/examples/__init__.py +0 -0
  419. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/examples/test_examples.py +0 -0
  420. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/README.md +0 -0
  421. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/__init__.py +0 -0
  422. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/conftest.py +0 -0
  423. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_agent.py +0 -0
  424. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_agent.py +0 -0
  425. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_axon.py +0 -0
  426. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_benchmark.py +0 -0
  427. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_blueprint.py +0 -0
  428. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_devbox.py +0 -0
  429. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_gateway_config.py +0 -0
  430. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_network_policy.py +0 -0
  431. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_scenario.py +0 -0
  432. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_scorer.py +0 -0
  433. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_sdk.py +0 -0
  434. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_secret.py +0 -0
  435. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_snapshot.py +0 -0
  436. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_storage_object.py +0 -0
  437. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_axon.py +0 -0
  438. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_benchmark.py +0 -0
  439. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_blueprint.py +0 -0
  440. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_devbox.py +0 -0
  441. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_gateway_config.py +0 -0
  442. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_mcp_config.py +0 -0
  443. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_network_policy.py +0 -0
  444. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_scenario.py +0 -0
  445. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_scorer.py +0 -0
  446. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_sdk.py +0 -0
  447. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_secret.py +0 -0
  448. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_snapshot.py +0 -0
  449. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_storage_object.py +0 -0
  450. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/test_blueprints.py +0 -0
  451. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/test_devboxes.py +0 -0
  452. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/test_executions.py +0 -0
  453. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
  454. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/test_snapshots.py +0 -0
  455. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/smoketests/utils.py +0 -0
  456. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_client.py +0 -0
  457. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_command_id.py +0 -0
  458. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_extract_files.py +0 -0
  459. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_files.py +0 -0
  460. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_models.py +0 -0
  461. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_polling.py +0 -0
  462. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_qs.py +0 -0
  463. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_required_args.py +0 -0
  464. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_response.py +0 -0
  465. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_streaming.py +0 -0
  466. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_transform.py +0 -0
  467. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_utils/test_context_loader.py +0 -0
  468. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_utils/test_datetime_parse.py +0 -0
  469. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_utils/test_json.py +0 -0
  470. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_utils/test_path.py +0 -0
  471. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_utils/test_proxy.py +0 -0
  472. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/test_utils/test_typing.py +0 -0
  473. {runloop_api_client-1.23.3 → runloop_api_client-1.27.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.27.0"
3
+ }
@@ -1,5 +1,45 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.27.0 (2026-07-28)
4
+
5
+ Full Changelog: [v1.24.0...v1.27.0](https://github.com/runloopai/api-client-python/compare/v1.24.0...v1.27.0)
6
+
7
+ ### Features
8
+
9
+ * **mux:** wait_for_eviction endpoint for flex eviction notifications ([#10325](https://github.com/runloopai/api-client-python/issues/10325)) ([7e86af9](https://github.com/runloopai/api-client-python/commit/7e86af9421218becca73ebaf0aa110c40c2a2e1a))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * isolate long-polls and file transfers on separate HTTP/2 pools ([#825](https://github.com/runloopai/api-client-python/issues/825)) ([d316188](https://github.com/runloopai/api-client-python/commit/d3161880b655904c31664975bb6f210c4df623b7))
15
+ * **mux:** field-level merge on network policy egress updates ([#10338](https://github.com/runloopai/api-client-python/issues/10338)) ([366a3ee](https://github.com/runloopai/api-client-python/commit/366a3eefecb5239ccd7842c7b333c77740fbe8bc))
16
+ * **mux:** move eviction-watch SSE route off the /{id} slot ([#10409](https://github.com/runloopai/api-client-python/issues/10409)) ([61f4143](https://github.com/runloopai/api-client-python/commit/61f4143ae27b6efd1d1abda4a2ceceb725a1709d))
17
+
18
+
19
+ ### Chores
20
+
21
+ * **stainless:** generate watch_evictions as an SSE stream ([#10404](https://github.com/runloopai/api-client-python/issues/10404)) ([cb82bca](https://github.com/runloopai/api-client-python/commit/cb82bca1fe679a72499256738b18e2d270a321f8))
22
+
23
+ ## 1.24.0 (2026-07-22)
24
+
25
+ Full Changelog: [v1.23.3...v1.24.0](https://github.com/runloopai/api-client-python/compare/v1.23.3...v1.24.0)
26
+
27
+ ### Features
28
+
29
+ * add HTTP/2 load testing infrastructure ([#819](https://github.com/runloopai/api-client-python/issues/819)) ([4ef3c65](https://github.com/runloopai/api-client-python/commit/4ef3c65a2643a093f6589a45428ebd4f1a2bf79e))
30
+ * **api:** add codex broker mount protocol and axon attach enum value ([#10186](https://github.com/runloopai/api-client-python/issues/10186)) ([b3a0a91](https://github.com/runloopai/api-client-python/commit/b3a0a91b5463e47787cce33aa6ad803446e41ecd))
31
+ * **devbox:** rename scheduled -> queued ([#10217](https://github.com/runloopai/api-client-python/issues/10217)) ([f6cc5b7](https://github.com/runloopai/api-client-python/commit/f6cc5b714771564aaa7c5424b21fbd3c87286306))
32
+ * **loadtest:** add pool_check.py to verify shared sync connection pool ([#822](https://github.com/runloopai/api-client-python/issues/822)) ([0000c52](https://github.com/runloopai/api-client-python/commit/0000c52205bb8942942b8dec9f91972e89eebafb))
33
+ * **mux:** expose CIDR egress rules on the network policy API ([#10269](https://github.com/runloopai/api-client-python/issues/10269)) ([b77a065](https://github.com/runloopai/api-client-python/commit/b77a065422042d3a7717c02208e16b72fdddc5e3))
34
+ * **network:** add allow_runloop_mirrors egress flag to network policies ([#10350](https://github.com/runloopai/api-client-python/issues/10350)) ([c042398](https://github.com/runloopai/api-client-python/commit/c04239892931cd1b80d926af8664a461ea426aab))
35
+ * **stlc:** configurable CI runner and private-production-repo support in workflow templates ([6a762cb](https://github.com/runloopai/api-client-python/commit/6a762cb53fbf1b6a2d113874227d0b68caa979dc))
36
+
37
+
38
+ ### Bug Fixes
39
+
40
+ * **internal:** resolve build failures ([a5b61f3](https://github.com/runloopai/api-client-python/commit/a5b61f3b981d74f4707d132513d59beb4bdb33c2))
41
+ * **mux:** uniform id/name search across list endpoints, close cross-tenant IDOR ([#10267](https://github.com/runloopai/api-client-python/issues/10267)) ([4a40176](https://github.com/runloopai/api-client-python/commit/4a401768ae50e1047d4c6f80384c059112299463))
42
+
3
43
  ## 1.23.3 (2026-07-10)
4
44
 
5
45
  Full Changelog: [v1.23.2...v1.23.3](https://github.com/runloopai/api-client-python/compare/v1.23.2...v1.23.3)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: runloop_api_client
3
- Version: 1.23.3
3
+ Version: 1.27.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
@@ -201,6 +201,7 @@ Types:
201
201
  ```python
202
202
  from runloop_api_client.types import (
203
203
  DevboxAsyncExecutionDetailView,
204
+ DevboxEvictionEventView,
204
205
  DevboxExecutionDetailView,
205
206
  DevboxKillExecutionRequest,
206
207
  DevboxListView,
@@ -244,6 +245,7 @@ Methods:
244
245
  - <code title="post /v1/devboxes/{id}/suspend">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">suspend</a>(id) -> <a href="./src/runloop_api_client/types/devbox_view.py">DevboxView</a></code>
245
246
  - <code title="post /v1/devboxes/{id}/upload_file">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">upload_file</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_upload_file_params.py">params</a>) -> object</code>
246
247
  - <code title="post /v1/devboxes/{devbox_id}/executions/{execution_id}/wait_for_status">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">wait_for_command</a>(execution_id, \*, devbox_id, \*\*<a href="src/runloop_api_client/types/devbox_wait_for_command_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_async_execution_detail_view.py">DevboxAsyncExecutionDetailView</a></code>
248
+ - <code title="get /v1/devboxes/evictions/watch">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">watch_evictions</a>() -> <a href="./src/runloop_api_client/types/devbox_eviction_event_view.py">DevboxEvictionEventView</a></code>
247
249
  - <code title="post /v1/devboxes/{id}/write_file_contents">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">write_file_contents</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_write_file_contents_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_execution_detail_view.py">DevboxExecutionDetailView</a></code>
248
250
 
249
251
 
@@ -419,10 +421,12 @@ Types:
419
421
 
420
422
  ```python
421
423
  from runloop_api_client.types import (
424
+ AllowedCidr,
422
425
  NetworkPolicyCreateParameters,
423
426
  NetworkPolicyListView,
424
427
  NetworkPolicyUpdateParameters,
425
428
  NetworkPolicyView,
429
+ PortRule,
426
430
  )
427
431
  ```
428
432
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "runloop_api_client"
3
- version = "1.23.3"
3
+ version = "1.27.0"
4
4
  description = "The official Python library for the runloop API"
5
5
  dynamic = ["readme"]
6
6
  license = "MIT"
@@ -256,3 +256,4 @@ known-first-party = ["runloop_api_client", "tests"]
256
256
  "scripts/**.py" = ["T201", "T203"]
257
257
  "tests/**.py" = ["T201", "T203"]
258
258
  "examples/**.py" = ["T201", "T203"]
259
+ "loadtest/**.py" = ["T201", "T203"]
@@ -8,6 +8,7 @@ import email
8
8
  import asyncio
9
9
  import inspect
10
10
  import logging
11
+ import secrets
11
12
  import weakref
12
13
  import platform
13
14
  import warnings
@@ -24,6 +25,7 @@ from typing import (
24
25
  Generic,
25
26
  Mapping,
26
27
  TypeVar,
28
+ Callable,
27
29
  Iterable,
28
30
  Iterator,
29
31
  Optional,
@@ -78,8 +80,11 @@ from ._constants import (
78
80
  DEFAULT_MAX_RETRIES,
79
81
  INITIAL_RETRY_DELAY,
80
82
  RAW_RESPONSE_HEADER,
83
+ DEFAULT_API_POOL_SHARDS,
81
84
  OVERRIDE_CAST_TO_HEADER,
82
85
  DEFAULT_CONNECTION_LIMITS,
86
+ DEFAULT_TRANSFER_POOL_SHARDS,
87
+ DEFAULT_BACKGROUND_POOL_SHARDS,
83
88
  )
84
89
  from ._streaming import Stream, SSEDecoder, AsyncStream, SSEBytesDecoder
85
90
  from ._exceptions import (
@@ -98,6 +103,10 @@ log: logging.Logger = logging.getLogger(__name__)
98
103
  # when the last user releases it.
99
104
  # The async transport is keyed by event loop because connections bind to the
100
105
  # loop that created them and cannot be reused across asyncio.run() calls.
106
+ #
107
+ # httpx/httpcore use a single H2 connection per transport, so each workload
108
+ # category uses a sharded Registry of SharedTransport instances. Per-client
109
+ # round-robin spreads requests across shards.
101
110
  _pool_lock = threading.Lock()
102
111
 
103
112
 
@@ -134,6 +143,35 @@ class _SharedTransport(httpx.BaseTransport):
134
143
  if should_close:
135
144
  self._transport.close()
136
145
 
146
+ class Registry:
147
+ """Process-global map of shard index → shared H2 transport."""
148
+
149
+ def __init__(self) -> None:
150
+ self._shards: dict[int, _SharedTransport] = {}
151
+
152
+ def acquire(self, shard: int) -> _SharedTransport:
153
+ with _pool_lock:
154
+ existing = self._shards.get(shard)
155
+ if existing is not None and existing.acquire():
156
+ return existing
157
+ transport = _SharedTransport(
158
+ httpx.HTTPTransport(limits=DEFAULT_CONNECTION_LIMITS, http2=True),
159
+ )
160
+ self._shards[shard] = transport
161
+ return transport
162
+
163
+ def take_all(self) -> list[_SharedTransport]:
164
+ """Test-only: remove and return all transports for fixture cleanup."""
165
+ with _pool_lock:
166
+ values = list(self._shards.values())
167
+ self._shards.clear()
168
+ return values
169
+
170
+ def shard_ids(self) -> set[int]:
171
+ """Test-only: which shard indexes currently hold a shared transport."""
172
+ with _pool_lock:
173
+ return set(self._shards)
174
+
137
175
 
138
176
  class _SharedAsyncTransport(httpx.AsyncBaseTransport):
139
177
  """Async refcounted wrapper: delegates to a real async transport."""
@@ -168,11 +206,150 @@ class _SharedAsyncTransport(httpx.AsyncBaseTransport):
168
206
  if should_close:
169
207
  await self._transport.aclose()
170
208
 
209
+ class Registry:
210
+ """Per-event-loop map of shard index → shared async H2 transport."""
211
+
212
+ def __init__(self) -> None:
213
+ self._by_loop: weakref.WeakKeyDictionary[asyncio.AbstractEventLoop, dict[int, _SharedAsyncTransport]] = (
214
+ weakref.WeakKeyDictionary()
215
+ )
216
+
217
+ def acquire(self, loop: asyncio.AbstractEventLoop, shard: int) -> _SharedAsyncTransport:
218
+ with _pool_lock:
219
+ bucket = self._by_loop.get(loop)
220
+ if bucket is None:
221
+ bucket = {}
222
+ self._by_loop[loop] = bucket
223
+ existing = bucket.get(shard)
224
+ if existing is not None and existing.acquire():
225
+ return existing
226
+ transport = _SharedAsyncTransport(
227
+ httpx.AsyncHTTPTransport(limits=DEFAULT_CONNECTION_LIMITS, http2=True),
228
+ )
229
+ bucket[shard] = transport
230
+ return transport
231
+
232
+ def clear(self) -> None:
233
+ """Test-only: drop all per-loop shard maps (does not close transports)."""
234
+ with _pool_lock:
235
+ self._by_loop.clear()
236
+
237
+
238
+ # Process-global sharded registries (one ≈ H2 connection per shard index).
239
+ _shared_sync_api_transports = _SharedTransport.Registry()
240
+ _shared_sync_background_transports = _SharedTransport.Registry()
241
+ _shared_sync_transfer_transports = _SharedTransport.Registry()
242
+ _shared_async_api_transports = _SharedAsyncTransport.Registry()
243
+ _shared_async_background_transports = _SharedAsyncTransport.Registry()
244
+ _shared_async_transfer_transports = _SharedAsyncTransport.Registry()
245
+
246
+ _BACKGROUND_PATH_SUFFIXES = ("/wait_for_status",)
247
+ _TRANSFER_PATH_SUFFIXES = ("/upload_file", "/download_file")
248
+
249
+
250
+ def _is_background_path(path: str) -> bool:
251
+ return path.endswith(_BACKGROUND_PATH_SUFFIXES)
252
+
253
+
254
+ def _is_transfer_path(path: str) -> bool:
255
+ return path.endswith(_TRANSFER_PATH_SUFFIXES)
256
+
257
+
258
+ class _SyncClientPool:
259
+ """Per-SDK-client round-robin over sharded httpx.Client wrappers."""
260
+
261
+ def __init__(
262
+ self,
263
+ *,
264
+ shards: int,
265
+ shared: bool,
266
+ registry: _SharedTransport.Registry | None,
267
+ make_client: Callable[[httpx.BaseTransport | None], httpx.Client],
268
+ ) -> None:
269
+ if shards < 1:
270
+ raise ValueError("shards must be >= 1")
271
+ self.shards = shards
272
+ self._shared = shared
273
+ self._registry = registry
274
+ self._make_client = make_client
275
+ self._clients: dict[int, httpx.Client] = {}
276
+ self._lock = threading.Lock()
277
+ self._next = secrets.randbelow(shards)
278
+
279
+ def ensure(self, shard: int) -> httpx.Client:
280
+ existing = self._clients.get(shard)
281
+ if existing is not None:
282
+ return existing
283
+ with self._lock:
284
+ existing = self._clients.get(shard)
285
+ if existing is not None:
286
+ return existing
287
+ transport: httpx.BaseTransport | None = None
288
+ if self._shared and self._registry is not None:
289
+ transport = self._registry.acquire(shard)
290
+ client = self._make_client(transport)
291
+ self._clients[shard] = client
292
+ return client
293
+
294
+ def next_client(self) -> httpx.Client:
295
+ with self._lock:
296
+ shard = self._next % self.shards
297
+ self._next += 1
298
+ return self.ensure(shard)
299
+
300
+ def close(self) -> None:
301
+ for client in self._clients.values():
302
+ client.close()
303
+ self._clients.clear()
304
+
305
+
306
+ class _AsyncClientPool:
307
+ """Per-SDK-client round-robin over sharded httpx.AsyncClient wrappers."""
308
+
309
+ def __init__(
310
+ self,
311
+ *,
312
+ shards: int,
313
+ shared: bool,
314
+ registry: _SharedAsyncTransport.Registry | None,
315
+ make_client: Callable[[httpx.AsyncBaseTransport | None], httpx.AsyncClient],
316
+ ) -> None:
317
+ if shards < 1:
318
+ raise ValueError("shards must be >= 1")
319
+ self.shards = shards
320
+ self._shared = shared
321
+ self._registry = registry
322
+ self._make_client = make_client
323
+ self._clients: dict[int, httpx.AsyncClient] = {}
324
+ self._next = secrets.randbelow(shards)
325
+
326
+ def ensure(self, shard: int) -> httpx.AsyncClient:
327
+ existing = self._clients.get(shard)
328
+ if existing is not None:
329
+ return existing
330
+ transport: httpx.AsyncBaseTransport | None = None
331
+ if self._shared and self._registry is not None:
332
+ try:
333
+ loop: asyncio.AbstractEventLoop | None = asyncio.get_running_loop()
334
+ except RuntimeError:
335
+ loop = None
336
+ if loop is not None:
337
+ transport = self._registry.acquire(loop, shard)
338
+ client = self._make_client(transport)
339
+ self._clients[shard] = client
340
+ return client
341
+
342
+ def next_client(self) -> httpx.AsyncClient:
343
+ # Single-threaded event loop: counter bump needs no lock when there is no await.
344
+ shard = self._next % self.shards
345
+ self._next += 1
346
+ return self.ensure(shard)
347
+
348
+ async def aclose(self) -> None:
349
+ for client in self._clients.values():
350
+ await client.aclose()
351
+ self._clients.clear()
171
352
 
172
- _shared_sync_transport: _SharedTransport | None = None
173
- _shared_async_transports: weakref.WeakKeyDictionary[asyncio.AbstractEventLoop, _SharedAsyncTransport] = (
174
- weakref.WeakKeyDictionary()
175
- )
176
353
 
177
354
  # TODO: make base page type vars covariant
178
355
  SyncPageT = TypeVar("SyncPageT", bound="BaseSyncPage[Any]")
@@ -929,8 +1106,15 @@ class SyncHttpxClientWrapper(DefaultHttpxClient):
929
1106
 
930
1107
  class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
931
1108
  _client: httpx.Client
1109
+ _api_pool: _SyncClientPool | None
1110
+ _background_pool: _SyncClientPool | None
1111
+ _transfer_pool: _SyncClientPool | None
932
1112
  _default_stream_cls: type[Stream[Any]] | None = None
933
1113
  _uses_shared_pool: bool
1114
+ _isolate_workload_pools: bool
1115
+ _api_pool_shards: int
1116
+ _background_pool_shards: int
1117
+ _transfer_pool_shards: int
934
1118
  _closed: bool
935
1119
 
936
1120
  def __init__(
@@ -945,6 +1129,9 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
945
1129
  custom_query: Mapping[str, object] | None = None,
946
1130
  _strict_response_validation: bool,
947
1131
  shared_http_pool: bool = True,
1132
+ api_pool_shards: int = DEFAULT_API_POOL_SHARDS,
1133
+ background_pool_shards: int = DEFAULT_BACKGROUND_POOL_SHARDS,
1134
+ transfer_pool_shards: int = DEFAULT_TRANSFER_POOL_SHARDS,
948
1135
  ) -> None:
949
1136
  if not is_given(timeout):
950
1137
  # if the user passed in a custom http client with a non-default
@@ -964,6 +1151,13 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
964
1151
  f"Invalid `http_client` argument; Expected an instance of `httpx.Client` but got {type(http_client)}"
965
1152
  )
966
1153
 
1154
+ if api_pool_shards < 1:
1155
+ raise ValueError("api_pool_shards must be >= 1")
1156
+ if background_pool_shards < 1:
1157
+ raise ValueError("background_pool_shards must be >= 1")
1158
+ if transfer_pool_shards < 1:
1159
+ raise ValueError("transfer_pool_shards must be >= 1")
1160
+
967
1161
  super().__init__(
968
1162
  version=version,
969
1163
  # cast to a valid type because mypy doesn't understand our type narrowing
@@ -976,29 +1170,72 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
976
1170
  )
977
1171
 
978
1172
  self._closed = False
1173
+ self._api_pool_shards = api_pool_shards
1174
+ self._background_pool_shards = background_pool_shards
1175
+ self._transfer_pool_shards = transfer_pool_shards
1176
+ # Custom http_client owns the full transport stack; don't invent sibling pools.
1177
+ self._isolate_workload_pools = http_client is None
979
1178
 
980
1179
  if http_client is not None:
981
1180
  self._client = http_client
982
1181
  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),
1182
+ self._api_pool = None
1183
+ self._background_pool = None
1184
+ self._transfer_pool = None
1185
+ return
1186
+
1187
+ self._uses_shared_pool = shared_http_pool
1188
+
1189
+ def make_client(transport: httpx.BaseTransport | None) -> httpx.Client:
1190
+ timeout_ = cast(Timeout, self.timeout)
1191
+ if transport is not None:
1192
+ return SyncHttpxClientWrapper(
1193
+ base_url=self._base_url,
1194
+ timeout=timeout_,
1195
+ transport=transport,
1196
+ )
1197
+ return SyncHttpxClientWrapper(
1198
+ base_url=self._base_url,
1199
+ timeout=timeout_,
1000
1200
  )
1001
- self._uses_shared_pool = False
1201
+
1202
+ api_registry = _shared_sync_api_transports if shared_http_pool else None
1203
+ bg_registry = _shared_sync_background_transports if shared_http_pool else None
1204
+ xfer_registry = _shared_sync_transfer_transports if shared_http_pool else None
1205
+
1206
+ self._api_pool = _SyncClientPool(
1207
+ shards=api_pool_shards,
1208
+ shared=shared_http_pool,
1209
+ registry=api_registry,
1210
+ make_client=make_client,
1211
+ )
1212
+ self._background_pool = _SyncClientPool(
1213
+ shards=background_pool_shards,
1214
+ shared=shared_http_pool,
1215
+ registry=bg_registry,
1216
+ make_client=make_client,
1217
+ )
1218
+ self._transfer_pool = _SyncClientPool(
1219
+ shards=transfer_pool_shards,
1220
+ shared=shared_http_pool,
1221
+ registry=xfer_registry,
1222
+ make_client=make_client,
1223
+ )
1224
+ # Eager primary client (shard 0) for lifecycle / cookie-jar compatibility.
1225
+ self._client = self._api_pool.ensure(0)
1226
+
1227
+ def _get_client_for_path(self, path: str) -> httpx.Client:
1228
+ if not self._isolate_workload_pools or self._api_pool is None:
1229
+ return self._client
1230
+ assert self._background_pool is not None and self._transfer_pool is not None
1231
+ if _is_background_path(path):
1232
+ return self._background_pool.next_client()
1233
+ if _is_transfer_path(path):
1234
+ return self._transfer_pool.next_client()
1235
+ return self._api_pool.next_client()
1236
+
1237
+ def _send_client_for_request(self, request: httpx.Request) -> httpx.Client:
1238
+ return self._get_client_for_path(request.url.path)
1002
1239
 
1003
1240
  def is_closed(self) -> bool:
1004
1241
  return self._closed or self._client.is_closed
@@ -1013,7 +1250,14 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1013
1250
  if self._closed:
1014
1251
  return
1015
1252
  self._closed = True
1016
- self._client.close()
1253
+ if self._api_pool is not None:
1254
+ # Closes _client (api shard 0) along with any other API shards.
1255
+ self._api_pool.close()
1256
+ assert self._background_pool is not None and self._transfer_pool is not None
1257
+ self._background_pool.close()
1258
+ self._transfer_pool.close()
1259
+ else:
1260
+ self._client.close()
1017
1261
 
1018
1262
  def __enter__(self: _T) -> _T:
1019
1263
  return self
@@ -1114,7 +1358,7 @@ class SyncAPIClient(BaseClient[httpx.Client, Stream[Any]]):
1114
1358
 
1115
1359
  response = None
1116
1360
  try:
1117
- response = self._client.send(
1361
+ response = self._send_client_for_request(request).send(
1118
1362
  request,
1119
1363
  stream=stream or self._should_stream_response_body(request=request),
1120
1364
  **kwargs,
@@ -1561,8 +1805,15 @@ class AsyncHttpxClientWrapper(DefaultAsyncHttpxClient):
1561
1805
 
1562
1806
  class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1563
1807
  _client: httpx.AsyncClient
1808
+ _api_pool: _AsyncClientPool | None
1809
+ _background_pool: _AsyncClientPool | None
1810
+ _transfer_pool: _AsyncClientPool | None
1564
1811
  _default_stream_cls: type[AsyncStream[Any]] | None = None
1565
1812
  _uses_shared_pool: bool
1813
+ _isolate_workload_pools: bool
1814
+ _api_pool_shards: int
1815
+ _background_pool_shards: int
1816
+ _transfer_pool_shards: int
1566
1817
  _closed: bool
1567
1818
 
1568
1819
  def __init__(
@@ -1577,6 +1828,9 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1577
1828
  custom_headers: Mapping[str, str] | None = None,
1578
1829
  custom_query: Mapping[str, object] | None = None,
1579
1830
  shared_http_pool: bool = True,
1831
+ api_pool_shards: int = DEFAULT_API_POOL_SHARDS,
1832
+ background_pool_shards: int = DEFAULT_BACKGROUND_POOL_SHARDS,
1833
+ transfer_pool_shards: int = DEFAULT_TRANSFER_POOL_SHARDS,
1580
1834
  ) -> None:
1581
1835
  if not is_given(timeout):
1582
1836
  # if the user passed in a custom http client with a non-default
@@ -1596,6 +1850,13 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1596
1850
  f"Invalid `http_client` argument; Expected an instance of `httpx.AsyncClient` but got {type(http_client)}"
1597
1851
  )
1598
1852
 
1853
+ if api_pool_shards < 1:
1854
+ raise ValueError("api_pool_shards must be >= 1")
1855
+ if background_pool_shards < 1:
1856
+ raise ValueError("background_pool_shards must be >= 1")
1857
+ if transfer_pool_shards < 1:
1858
+ raise ValueError("transfer_pool_shards must be >= 1")
1859
+
1599
1860
  super().__init__(
1600
1861
  version=version,
1601
1862
  base_url=base_url,
@@ -1608,43 +1869,79 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1608
1869
  )
1609
1870
 
1610
1871
  self._closed = False
1872
+ self._api_pool_shards = api_pool_shards
1873
+ self._background_pool_shards = background_pool_shards
1874
+ self._transfer_pool_shards = transfer_pool_shards
1875
+ # Custom http_client owns the full transport stack; don't invent sibling pools.
1876
+ self._isolate_workload_pools = http_client is None
1611
1877
 
1612
1878
  if http_client is not None:
1613
1879
  self._client = http_client
1614
1880
  self._uses_shared_pool = False
1615
- elif shared_http_pool:
1881
+ self._api_pool = None
1882
+ self._background_pool = None
1883
+ self._transfer_pool = None
1884
+ return
1885
+
1886
+ # Async shared transports require a running loop; without one, fall back to private.
1887
+ can_share = shared_http_pool
1888
+ if shared_http_pool:
1616
1889
  try:
1617
- loop: asyncio.AbstractEventLoop | None = asyncio.get_running_loop()
1890
+ asyncio.get_running_loop()
1618
1891
  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),
1892
+ can_share = False
1893
+
1894
+ self._uses_shared_pool = can_share
1895
+
1896
+ def make_client(transport: httpx.AsyncBaseTransport | None) -> httpx.AsyncClient:
1897
+ timeout_ = cast(Timeout, self.timeout)
1898
+ if transport is not None:
1899
+ return AsyncHttpxClientWrapper(
1900
+ base_url=self._base_url,
1901
+ timeout=timeout_,
1633
1902
  transport=transport,
1634
1903
  )
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),
1904
+ return AsyncHttpxClientWrapper(
1905
+ base_url=self._base_url,
1906
+ timeout=timeout_,
1646
1907
  )
1647
- self._uses_shared_pool = False
1908
+
1909
+ api_registry = _shared_async_api_transports if can_share else None
1910
+ bg_registry = _shared_async_background_transports if can_share else None
1911
+ xfer_registry = _shared_async_transfer_transports if can_share else None
1912
+
1913
+ self._api_pool = _AsyncClientPool(
1914
+ shards=api_pool_shards,
1915
+ shared=can_share,
1916
+ registry=api_registry,
1917
+ make_client=make_client,
1918
+ )
1919
+ self._background_pool = _AsyncClientPool(
1920
+ shards=background_pool_shards,
1921
+ shared=can_share,
1922
+ registry=bg_registry,
1923
+ make_client=make_client,
1924
+ )
1925
+ self._transfer_pool = _AsyncClientPool(
1926
+ shards=transfer_pool_shards,
1927
+ shared=can_share,
1928
+ registry=xfer_registry,
1929
+ make_client=make_client,
1930
+ )
1931
+ self._client = self._api_pool.ensure(0)
1932
+
1933
+ def _get_client_for_path(self, path: str) -> httpx.AsyncClient:
1934
+ if not self._isolate_workload_pools or self._api_pool is None:
1935
+ return self._client
1936
+ assert self._background_pool is not None and self._transfer_pool is not None
1937
+ if _is_background_path(path):
1938
+ return self._background_pool.next_client()
1939
+ if _is_transfer_path(path):
1940
+ return self._transfer_pool.next_client()
1941
+ return self._api_pool.next_client()
1942
+
1943
+ def _send_client_for_request(self, request: httpx.Request) -> httpx.AsyncClient:
1944
+ return self._get_client_for_path(request.url.path)
1648
1945
 
1649
1946
  def is_closed(self) -> bool:
1650
1947
  return self._closed or self._client.is_closed
@@ -1659,7 +1956,13 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1659
1956
  if self._closed:
1660
1957
  return
1661
1958
  self._closed = True
1662
- await self._client.aclose()
1959
+ if self._api_pool is not None:
1960
+ await self._api_pool.aclose()
1961
+ assert self._background_pool is not None and self._transfer_pool is not None
1962
+ await self._background_pool.aclose()
1963
+ await self._transfer_pool.aclose()
1964
+ else:
1965
+ await self._client.aclose()
1663
1966
 
1664
1967
  async def __aenter__(self: _T) -> _T:
1665
1968
  return self
@@ -1765,7 +2068,7 @@ class AsyncAPIClient(BaseClient[httpx.AsyncClient, AsyncStream[Any]]):
1765
2068
 
1766
2069
  response = None
1767
2070
  try:
1768
- response = await self._client.send(
2071
+ response = await self._send_client_for_request(request).send(
1769
2072
  request,
1770
2073
  stream=stream or self._should_stream_response_body(request=request),
1771
2074
  **kwargs,