runloop_api_client 1.24.0__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.
- runloop_api_client-1.27.0/.release-please-manifest.json +3 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/CHANGELOG.md +20 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/PKG-INFO +1 -1
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/api.md +2 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/pyproject.toml +1 -1
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_base_client.py +357 -54
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_client.py +37 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_constants.py +7 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_version.py +1 -1
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/devboxes/devboxes.py +68 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/network_policies.py +4 -2
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_.py +13 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/sync.py +13 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/__init__.py +1 -0
- runloop_api_client-1.27.0/src/runloop_api_client/types/devbox_eviction_event_view.py +16 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_devboxes.py +48 -0
- runloop_api_client-1.27.0/tests/test_h2_bulkhead_integration.py +418 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_shared_pool.py +9 -6
- runloop_api_client-1.27.0/tests/test_transfer_client.py +243 -0
- runloop_api_client-1.24.0/.release-please-manifest.json +0 -3
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/.gitignore +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/AGENTS.md +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/CLAUDE.md +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/CONTRIBUTING.md +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/EXAMPLES.md +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/LICENSE +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/README-SDK.md +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/README.md +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/SECURITY.md +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/bin/check-release-environment +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/bin/publish-pypi +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/_harness.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/blueprint_with_build_context.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/devbox_from_blueprint_lifecycle.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/devbox_snapshot_resume.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/devbox_snapshots.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/devbox_tunnel.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/example_types.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/mcp_github_tools.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/registry.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/examples/secrets_with_devbox.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/release-please-config.json +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/requirements-dev.lock +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop/lib/.keep +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_compat.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_exceptions.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_files.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_models.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_qs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_resource.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_response.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_streaming.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_types.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_compat.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_json.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_logs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_path.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_proxy.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_reflection.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_streams.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_sync.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_transform.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_typing.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_utils.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_utils/_validation.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/.keep +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/_ignore.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/context_loader.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/polling.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/polling_async.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/lib/wait_for_status.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/pagination.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/py.typed +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/accounts.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/agents.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/apikeys.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/axons/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/axons/axons.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/axons/events.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/axons/sql.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/benchmark_jobs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/benchmark_runs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/benchmarks.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/blueprints.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/devboxes/executions.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/gateway_configs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/mcp_configs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/objects.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/pty.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/restricted_keys.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/resources/secrets.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/_helpers.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/_types.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/agent.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_agent.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_axon.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_benchmark.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_benchmark_run.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_blueprint.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_devbox.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_execution.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_execution_result.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_gateway_config.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_mcp_config.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_network_policy.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_scenario.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_scenario_builder.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_scenario_run.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_scorer.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_secret.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_snapshot.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/async_storage_object.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/axon.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/benchmark.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/benchmark_run.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/blueprint.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/devbox.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/execution.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/execution_result.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/gateway_config.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/mcp_config.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/network_policy.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/scenario.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/scenario_builder.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/scenario_run.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/scorer.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/secret.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/snapshot.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/sdk/storage_object.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/account_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_devbox_counts_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_list_public_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/agent_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/allowed_cidr.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/allowed_cidr_param.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/api_key_created_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/apikey_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_event_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_publish_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_subscribe_sse_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axon_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/axon_event_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/event_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_batch_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_batch_result_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_column_meta_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_query_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_query_result_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_result_meta_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_statement_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_step_error_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/axons/sql_step_result_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_job_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_job_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_job_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_job_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_run_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_update_scenarios_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/benchmark_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/blueprint_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_enable_tunnel_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_resource_usage_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_shutdown_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_update_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/gateway_config_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/gateway_config_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/gateway_config_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/gateway_config_update_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/gateway_config_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/input_context.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/input_context_param.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/input_context_update_param.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/mcp_config_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/mcp_config_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/mcp_config_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/mcp_config_update_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/mcp_config_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/network_policy_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/network_policy_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/network_policy_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/network_policy_update_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/network_policy_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_download_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_download_url_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_list_public_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/object_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/port_rule.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/port_rule_param.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/pty_connect_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/pty_connect_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/pty_control_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/pty_control_result_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/pty_tunnel_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/publish_result_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/restricted_key_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/restricted_key_created_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_environment.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_run_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_update_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenario_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scope_entry_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scope_entry_view_param.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_contract.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_function.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_function_param.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/secret_create_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/secret_list_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/secret_list_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/secret_update_params.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/secret_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/after_idle.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/agent_mount.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/agent_source.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/broker_mount.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/launch_parameters.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/lifecycle_configuration.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/lifecycle_hooks.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/mount.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/object_mount.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/resume_triggers.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared/run_profile.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/agent_mount.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/agent_source.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/broker_mount.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/launch_parameters.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/lifecycle_configuration.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/lifecycle_hooks.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/mount.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/object_mount.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/resume_triggers.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/types/tunnel_view.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/axons/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/axons/test_events.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/axons/test_sql.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/devboxes/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/devboxes/test_executions.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/devboxes/test_logs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/scenarios/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/scenarios/test_runs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/scenarios/test_scorers.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_accounts.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_agents.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_apikeys.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_axons.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_benchmark_jobs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_benchmark_runs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_benchmarks.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_blueprints.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_gateway_configs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_mcp_configs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_network_policies.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_objects.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_pty.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_restricted_keys.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_scenarios.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/api_resources/test_secrets.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/conftest.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sample_file.txt +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/conftest.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/test_core.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/test_edge_cases.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/test_interfaces.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/async_devbox/test_streaming.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/conftest.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/devbox/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/devbox/conftest.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/devbox/test_core.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/devbox/test_edge_cases.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/devbox/test_interfaces.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/devbox/test_streaming.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_agent.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_agent.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_axon.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_benchmark.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_benchmark_run.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_blueprint.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_execution.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_execution_result.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_gateway_config.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_network_policy.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_ops.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_scenario.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_scenario_builder.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_scenario_run.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_scorer.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_snapshot.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_async_storage_object.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_axon.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_benchmark.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_benchmark_run.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_blueprint.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_execution.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_execution_result.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_gateway_config.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_helpers.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_network_policy.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_ops.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_scenario.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_scenario_builder.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_scenario_run.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_scorer.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_snapshot.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/sdk/test_storage_object.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/README.md +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/conftest.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/examples/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/examples/test_examples.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/README.md +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/__init__.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/conftest.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_agent.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_agent.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_axon.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_benchmark.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_blueprint.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_devbox.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_gateway_config.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_network_policy.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_scenario.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_scorer.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_sdk.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_secret.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_snapshot.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_async_storage_object.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_axon.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_benchmark.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_blueprint.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_devbox.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_gateway_config.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_mcp_config.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_network_policy.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_scenario.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_scorer.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_sdk.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_secret.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_snapshot.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/sdk/test_storage_object.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/test_blueprints.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/test_devboxes.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/test_executions.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/test_snapshots.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/smoketests/utils.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_client.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_command_id.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_extract_files.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_files.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_models.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_polling.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_qs.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_required_args.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_response.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_streaming.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_transform.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_utils/test_context_loader.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_utils/test_json.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_utils/test_path.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_utils/test_proxy.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/test_utils/test_typing.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/tests/utils.py +0 -0
- {runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/uv.lock +0 -0
|
@@ -1,5 +1,25 @@
|
|
|
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
|
+
|
|
3
23
|
## 1.24.0 (2026-07-22)
|
|
4
24
|
|
|
5
25
|
Full Changelog: [v1.23.3...v1.24.0](https://github.com/runloopai/api-client-python/compare/v1.23.3...v1.24.0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: runloop_api_client
|
|
3
|
-
Version: 1.
|
|
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
|
|
{runloop_api_client-1.24.0 → runloop_api_client-1.27.0}/src/runloop_api_client/_base_client.py
RENAMED
|
@@ -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
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
1890
|
+
asyncio.get_running_loop()
|
|
1618
1891
|
except RuntimeError:
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
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
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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,
|