runloop_api_client 1.18.1__tar.gz → 1.20.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.20.0/.release-please-manifest.json +3 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/CHANGELOG.md +42 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/EXAMPLES.md +32 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/PKG-INFO +2 -2
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/README.md +1 -1
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/api.md +37 -1
- runloop_api_client-1.20.0/examples/devbox_snapshots.py +172 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/examples/registry.py +8 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/pyproject.toml +2 -1
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_client.py +76 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_files.py +53 -3
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/__init__.py +0 -1
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_utils.py +3 -17
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_version.py +1 -1
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/__init__.py +28 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/agents.py +296 -1
- runloop_api_client-1.20.0/src/runloop_api_client/resources/apikeys.py +197 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/devboxes/devboxes.py +8 -5
- runloop_api_client-1.20.0/src/runloop_api_client/resources/restricted_keys.py +202 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/_types.py +5 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/agent.py +16 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_.py +32 -1
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_agent.py +16 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/sync.py +32 -1
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/__init__.py +8 -0
- runloop_api_client-1.20.0/src/runloop_api_client/types/agent_devbox_counts_view.py +24 -0
- runloop_api_client-1.20.0/src/runloop_api_client/types/agent_list_public_params.py +30 -0
- runloop_api_client-1.20.0/src/runloop_api_client/types/api_key_created_view.py +17 -0
- runloop_api_client-1.20.0/src/runloop_api_client/types/apikey_create_params.py +14 -0
- runloop_api_client-1.20.0/src/runloop_api_client/types/restricted_key_create_params.py +18 -0
- runloop_api_client-1.20.0/src/runloop_api_client/types/restricted_key_created_view.py +20 -0
- runloop_api_client-1.20.0/src/runloop_api_client/types/scope_entry_view.py +26 -0
- runloop_api_client-1.20.0/src/runloop_api_client/types/scope_entry_view_param.py +23 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared/broker_mount.py +6 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared/launch_parameters.py +3 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared_params/broker_mount.py +6 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared_params/launch_parameters.py +3 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_agents.py +204 -1
- runloop_api_client-1.20.0/tests/api_resources/test_apikeys.py +90 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_benchmarks.py +8 -2
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_blueprints.py +24 -6
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_devboxes.py +8 -2
- runloop_api_client-1.20.0/tests/api_resources/test_restricted_keys.py +102 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_scenarios.py +24 -6
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_extract_files.py +9 -0
- runloop_api_client-1.20.0/tests/test_files.py +148 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/uv.lock +3 -1
- runloop_api_client-1.18.1/.release-please-manifest.json +0 -3
- runloop_api_client-1.18.1/tests/test_deepcopy.py +0 -58
- runloop_api_client-1.18.1/tests/test_files.py +0 -51
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/.gitignore +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/CONTRIBUTING.md +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/LICENSE +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/README-SDK.md +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/SECURITY.md +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/bin/check-release-environment +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/bin/publish-pypi +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/examples/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/examples/_harness.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/examples/blueprint_with_build_context.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/examples/devbox_from_blueprint_lifecycle.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/examples/devbox_snapshot_resume.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/examples/devbox_tunnel.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/examples/example_types.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/examples/mcp_github_tools.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/examples/secrets_with_devbox.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/release-please-config.json +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/requirements-dev.lock +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop/lib/.keep +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_base_client.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_compat.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_constants.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_exceptions.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_models.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_qs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_resource.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_response.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_streaming.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_types.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_compat.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_json.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_logs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_path.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_proxy.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_reflection.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_streams.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_sync.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_transform.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_typing.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_validation.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/lib/.keep +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/lib/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/lib/_ignore.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/lib/context_loader.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/lib/polling.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/lib/polling_async.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/pagination.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/py.typed +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/axons/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/axons/axons.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/axons/events.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/axons/sql.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/benchmark_jobs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/benchmark_runs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/benchmarks.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/blueprints.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/devboxes/executions.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/gateway_configs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/mcp_configs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/network_policies.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/objects.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/resources/secrets.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/_helpers.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_axon.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_benchmark.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_benchmark_run.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_blueprint.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_devbox.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_execution.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_execution_result.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_gateway_config.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_mcp_config.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_network_policy.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_scenario.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_scenario_builder.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_scenario_run.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_scorer.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_secret.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_snapshot.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/async_storage_object.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/axon.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/benchmark.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/benchmark_run.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/blueprint.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/devbox.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/execution.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/execution_result.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/gateway_config.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/mcp_config.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/network_policy.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/scenario.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/scenario_builder.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/scenario_run.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/scorer.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/secret.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/snapshot.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/sdk/storage_object.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/agent_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/agent_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/agent_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/agent_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axon_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axon_event_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axon_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axon_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axon_publish_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axon_subscribe_sse_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axon_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/axon_event_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/event_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/sql_batch_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/sql_batch_result_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/sql_column_meta_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/sql_query_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/sql_query_result_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/sql_result_meta_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/sql_statement_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/sql_step_error_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/axons/sql_step_result_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_job_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_job_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_job_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_job_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_run_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_update_scenarios_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/benchmark_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_create_from_inspection_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/blueprint_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_enable_tunnel_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_resource_usage_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_shutdown_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_update_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/gateway_config_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/gateway_config_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/gateway_config_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/gateway_config_update_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/gateway_config_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/input_context.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/input_context_param.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/input_context_update_param.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/inspection_source_param.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/mcp_config_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/mcp_config_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/mcp_config_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/mcp_config_update_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/mcp_config_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/network_policy_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/network_policy_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/network_policy_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/network_policy_update_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/network_policy_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/object_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/object_download_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/object_download_url_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/object_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/object_list_public_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/object_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/object_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/publish_result_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_environment.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_run_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_update_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenario_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scoring_contract.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scoring_function.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scoring_function_param.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/secret_create_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/secret_list_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/secret_list_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/secret_update_params.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/secret_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared/after_idle.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared/agent_mount.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared/agent_source.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared/mount.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared/object_mount.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared/run_profile.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared_params/agent_mount.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared_params/agent_source.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared_params/mount.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared_params/object_mount.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/types/tunnel_view.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/axons/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/axons/test_events.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/axons/test_sql.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/devboxes/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/devboxes/test_executions.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/devboxes/test_logs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/scenarios/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/scenarios/test_runs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/scenarios/test_scorers.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_axons.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_benchmark_jobs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_benchmark_runs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_gateway_configs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_mcp_configs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_network_policies.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_objects.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/api_resources/test_secrets.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/conftest.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sample_file.txt +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/async_devbox/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/async_devbox/conftest.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/async_devbox/test_core.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/async_devbox/test_edge_cases.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/async_devbox/test_interfaces.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/async_devbox/test_streaming.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/conftest.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/devbox/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/devbox/conftest.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/devbox/test_core.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/devbox/test_edge_cases.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/devbox/test_interfaces.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/devbox/test_streaming.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_agent.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_agent.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_axon.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_benchmark.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_benchmark_run.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_blueprint.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_execution.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_execution_result.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_gateway_config.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_network_policy.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_ops.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_scenario.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_scenario_builder.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_scenario_run.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_scorer.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_snapshot.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_async_storage_object.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_axon.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_benchmark.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_benchmark_run.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_blueprint.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_execution.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_execution_result.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_gateway_config.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_helpers.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_network_policy.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_ops.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_scenario.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_scenario_builder.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_scenario_run.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_scorer.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_snapshot.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/sdk/test_storage_object.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/README.md +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/conftest.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/examples/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/examples/test_examples.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/README.md +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/__init__.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/conftest.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_agent.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_agent.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_axon.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_benchmark.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_blueprint.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_devbox.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_gateway_config.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_network_policy.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_scenario.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_scorer.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_sdk.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_secret.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_snapshot.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_async_storage_object.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_axon.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_benchmark.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_blueprint.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_devbox.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_gateway_config.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_mcp_config.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_network_policy.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_scenario.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_scorer.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_sdk.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_secret.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_snapshot.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/sdk/test_storage_object.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/test_blueprints.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/test_devboxes.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/test_executions.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/test_snapshots.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/smoketests/utils.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_client.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_command_id.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_models.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_polling.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_qs.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_required_args.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_response.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_streaming.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_transform.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_utils/test_context_loader.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_utils/test_json.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_utils/test_path.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_utils/test_proxy.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/test_utils/test_typing.py +0 -0
- {runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/tests/utils.py +0 -0
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.20.0 (2026-04-21)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v1.19.0...v1.20.0](https://github.com/runloopai/api-client-python/compare/v1.19.0...v1.20.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* add OO SDK support for new Agent API calls ([#786](https://github.com/runloopai/api-client-python/issues/786)) ([6197567](https://github.com/runloopai/api-client-python/commit/6197567bee84193beca7699b8616b46479607510))
|
|
10
|
+
* **axon:** add working directory / directory to launch agent ([#8689](https://github.com/runloopai/api-client-python/issues/8689)) ([2097995](https://github.com/runloopai/api-client-python/commit/2097995f63b3e4334c6e6edb7d1c915f5447a9c9))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Performance Improvements
|
|
14
|
+
|
|
15
|
+
* **client:** optimize file structure copying in multipart requests ([64f27ad](https://github.com/runloopai/api-client-python/commit/64f27adfc44ef5242b19637377c50073c8240538))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Chores
|
|
19
|
+
|
|
20
|
+
* **tests:** bump steady to v0.22.1 ([c72f34d](https://github.com/runloopai/api-client-python/commit/c72f34dca3653010eb76a762a68519c996e74860))
|
|
21
|
+
|
|
22
|
+
## 1.19.0 (2026-04-13)
|
|
23
|
+
|
|
24
|
+
Full Changelog: [v1.18.1...v1.19.0](https://github.com/runloopai/api-client-python/compare/v1.18.1...v1.19.0)
|
|
25
|
+
|
|
26
|
+
### Features
|
|
27
|
+
|
|
28
|
+
* Add wake on axon event as an API primitive ([#8681](https://github.com/runloopai/api-client-python/issues/8681)) ([255099a](https://github.com/runloopai/api-client-python/commit/255099a940a7892f3c66e6534517e3545d7daccb))
|
|
29
|
+
* Allow API keys to create API and restricted keys ([#8663](https://github.com/runloopai/api-client-python/issues/8663)) ([2e03b55](https://github.com/runloopai/api-client-python/commit/2e03b55638a83a8354481f47a30910e94ff57fc3))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Bug Fixes
|
|
33
|
+
|
|
34
|
+
* add missing agent API paths to stainless config ([#8699](https://github.com/runloopai/api-client-python/issues/8699)) ([4f6fe60](https://github.com/runloopai/api-client-python/commit/4f6fe60a63fd31c049e54febb81801031dce2325))
|
|
35
|
+
* ensure file data are only sent as 1 parameter ([f7ca2cc](https://github.com/runloopai/api-client-python/commit/f7ca2cc280f1e7a4ab73f331be8fe3e33ae1c611))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### Documentation
|
|
39
|
+
|
|
40
|
+
* add snapshot, suspend & resume example ([#764](https://github.com/runloopai/api-client-python/issues/764)) ([f4b942b](https://github.com/runloopai/api-client-python/commit/f4b942b3329e98a4ea5182c04d6db90fd0b70308))
|
|
41
|
+
* added Async vs Sync tabs, removed top-level class descriptions ([#783](https://github.com/runloopai/api-client-python/issues/783)) ([6a99c56](https://github.com/runloopai/api-client-python/commit/6a99c569914d93e07087ed5003ee7c77f2ab88ff))
|
|
42
|
+
* restructure sphinx docs with async-first API reference and full type coverage ([#782](https://github.com/runloopai/api-client-python/issues/782)) ([514cf93](https://github.com/runloopai/api-client-python/commit/514cf93e8ff8b97bfde171a83cf9abf211193e7f))
|
|
43
|
+
* show full field descriptions for SDK parameter types ([#784](https://github.com/runloopai/api-client-python/issues/784)) ([f04a506](https://github.com/runloopai/api-client-python/commit/f04a5069c33fceb7a4d3db634bfd77ab789314dc))
|
|
44
|
+
|
|
3
45
|
## 1.18.1 (2026-04-10)
|
|
4
46
|
|
|
5
47
|
Full Changelog: [v1.17.0...v1.18.1](https://github.com/runloopai/api-client-python/compare/v1.17.0...v1.18.1)
|
|
@@ -10,6 +10,7 @@ Runnable examples live in [`examples/`](./examples).
|
|
|
10
10
|
- [Blueprint with Build Context](#blueprint-with-build-context)
|
|
11
11
|
- [Devbox From Blueprint (Run Command, Shutdown)](#devbox-from-blueprint-lifecycle)
|
|
12
12
|
- [Devbox Snapshot and Resume](#devbox-snapshot-resume)
|
|
13
|
+
- [Devbox Snapshots (Suspend, Resume, Restore, Delete)](#devbox-snapshots)
|
|
13
14
|
- [Devbox Tunnel (HTTP Server Access)](#devbox-tunnel)
|
|
14
15
|
- [MCP Hub + Claude Code + GitHub](#mcp-github-tools)
|
|
15
16
|
- [Secrets with Devbox and Agent Gateway](#secrets-with-devbox)
|
|
@@ -106,6 +107,37 @@ uv run pytest -m smoketest tests/smoketests/examples/
|
|
|
106
107
|
|
|
107
108
|
**Source:** [`examples/devbox_snapshot_resume.py`](./examples/devbox_snapshot_resume.py)
|
|
108
109
|
|
|
110
|
+
<a id="devbox-snapshots"></a>
|
|
111
|
+
## Devbox Snapshots (Suspend, Resume, Restore, Delete)
|
|
112
|
+
|
|
113
|
+
**Use case:** Upload a file to a devbox, preserve it across suspend and resume, create a disk snapshot, restore multiple devboxes from that snapshot, mutate each copy independently, and delete the snapshot when finished.
|
|
114
|
+
|
|
115
|
+
**Tags:** `devbox`, `snapshot`, `suspend`, `resume`, `files`, `cleanup`
|
|
116
|
+
|
|
117
|
+
### Workflow
|
|
118
|
+
- Create a source devbox
|
|
119
|
+
- Upload a file and mutate it into a shared baseline
|
|
120
|
+
- Suspend and resume the source devbox
|
|
121
|
+
- Create a disk snapshot from the resumed devbox
|
|
122
|
+
- Restore two additional devboxes from the same snapshot baseline
|
|
123
|
+
- Mutate the same file differently in each devbox to prove isolation
|
|
124
|
+
- Shutdown the devboxes and delete the snapshot
|
|
125
|
+
|
|
126
|
+
### Prerequisites
|
|
127
|
+
- `RUNLOOP_API_KEY`
|
|
128
|
+
|
|
129
|
+
### Run
|
|
130
|
+
```sh
|
|
131
|
+
uv run python -m examples.devbox_snapshots
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Test
|
|
135
|
+
```sh
|
|
136
|
+
uv run pytest -m smoketest tests/smoketests/examples/
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Source:** [`examples/devbox_snapshots.py`](./examples/devbox_snapshots.py)
|
|
140
|
+
|
|
109
141
|
<a id="devbox-tunnel"></a>
|
|
110
142
|
## Devbox Tunnel (HTTP Server Access)
|
|
111
143
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: runloop_api_client
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.20.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
|
|
@@ -325,7 +325,7 @@ Error codes are as follows:
|
|
|
325
325
|
|
|
326
326
|
Certain errors are automatically retried 5 times by default, with a short exponential backoff.
|
|
327
327
|
Connection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,
|
|
328
|
-
429 Rate Limit, and >=500 Internal errors are all retried by default for GET requests. For POST requests, only
|
|
328
|
+
429 Rate Limit, and >=500 Internal errors are all retried by default for GET requests. For POST requests, only
|
|
329
329
|
429 errors will be retried.
|
|
330
330
|
|
|
331
331
|
You can use the `max_retries` option to configure or disable retry settings:
|
|
@@ -288,7 +288,7 @@ Error codes are as follows:
|
|
|
288
288
|
|
|
289
289
|
Certain errors are automatically retried 5 times by default, with a short exponential backoff.
|
|
290
290
|
Connection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,
|
|
291
|
-
429 Rate Limit, and >=500 Internal errors are all retried by default for GET requests. For POST requests, only
|
|
291
|
+
429 Rate Limit, and >=500 Internal errors are all retried by default for GET requests. For POST requests, only
|
|
292
292
|
429 errors will be retried.
|
|
293
293
|
|
|
294
294
|
You can use the `max_retries` option to configure or disable retry settings:
|
|
@@ -79,7 +79,12 @@ Methods:
|
|
|
79
79
|
Types:
|
|
80
80
|
|
|
81
81
|
```python
|
|
82
|
-
from runloop_api_client.types import
|
|
82
|
+
from runloop_api_client.types import (
|
|
83
|
+
AgentCreateParameters,
|
|
84
|
+
AgentDevboxCountsView,
|
|
85
|
+
AgentListView,
|
|
86
|
+
AgentView,
|
|
87
|
+
)
|
|
83
88
|
```
|
|
84
89
|
|
|
85
90
|
Methods:
|
|
@@ -87,6 +92,9 @@ Methods:
|
|
|
87
92
|
- <code title="post /v1/agents">client.agents.<a href="./src/runloop_api_client/resources/agents.py">create</a>(\*\*<a href="src/runloop_api_client/types/agent_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/agent_view.py">AgentView</a></code>
|
|
88
93
|
- <code title="get /v1/agents/{id}">client.agents.<a href="./src/runloop_api_client/resources/agents.py">retrieve</a>(id) -> <a href="./src/runloop_api_client/types/agent_view.py">AgentView</a></code>
|
|
89
94
|
- <code title="get /v1/agents">client.agents.<a href="./src/runloop_api_client/resources/agents.py">list</a>(\*\*<a href="src/runloop_api_client/types/agent_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/agent_view.py">SyncAgentsCursorIDPage[AgentView]</a></code>
|
|
95
|
+
- <code title="post /v1/agents/{id}/delete">client.agents.<a href="./src/runloop_api_client/resources/agents.py">delete</a>(id) -> object</code>
|
|
96
|
+
- <code title="get /v1/agents/devbox_counts">client.agents.<a href="./src/runloop_api_client/resources/agents.py">devbox_counts</a>() -> <a href="./src/runloop_api_client/types/agent_devbox_counts_view.py">AgentDevboxCountsView</a></code>
|
|
97
|
+
- <code title="get /v1/agents/list_public">client.agents.<a href="./src/runloop_api_client/resources/agents.py">list_public</a>(\*\*<a href="src/runloop_api_client/types/agent_list_public_params.py">params</a>) -> <a href="./src/runloop_api_client/types/agent_view.py">SyncAgentsCursorIDPage[AgentView]</a></code>
|
|
90
98
|
|
|
91
99
|
# Axons
|
|
92
100
|
|
|
@@ -439,3 +447,31 @@ Methods:
|
|
|
439
447
|
- <code title="post /v1/mcp-configs/{id}">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">update</a>(id, \*\*<a href="src/runloop_api_client/types/mcp_config_update_params.py">params</a>) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">McpConfigView</a></code>
|
|
440
448
|
- <code title="get /v1/mcp-configs">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">list</a>(\*\*<a href="src/runloop_api_client/types/mcp_config_list_params.py">params</a>) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">SyncMcpConfigsCursorIDPage[McpConfigView]</a></code>
|
|
441
449
|
- <code title="post /v1/mcp-configs/{id}/delete">client.mcp_configs.<a href="./src/runloop_api_client/resources/mcp_configs.py">delete</a>(id) -> <a href="./src/runloop_api_client/types/mcp_config_view.py">McpConfigView</a></code>
|
|
450
|
+
|
|
451
|
+
# Apikeys
|
|
452
|
+
|
|
453
|
+
Types:
|
|
454
|
+
|
|
455
|
+
```python
|
|
456
|
+
from runloop_api_client.types import APIKeyCreatedView, APIKeyCreateParameters
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
Methods:
|
|
460
|
+
|
|
461
|
+
- <code title="post /v1/apikeys">client.apikeys.<a href="./src/runloop_api_client/resources/apikeys.py">create</a>(\*\*<a href="src/runloop_api_client/types/apikey_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/api_key_created_view.py">APIKeyCreatedView</a></code>
|
|
462
|
+
|
|
463
|
+
# RestrictedKeys
|
|
464
|
+
|
|
465
|
+
Types:
|
|
466
|
+
|
|
467
|
+
```python
|
|
468
|
+
from runloop_api_client.types import (
|
|
469
|
+
RestrictedKeyCreatedView,
|
|
470
|
+
RestrictedKeyCreateParameters,
|
|
471
|
+
ScopeEntryView,
|
|
472
|
+
)
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
Methods:
|
|
476
|
+
|
|
477
|
+
- <code title="post /v1/restricted_keys">client.restricted_keys.<a href="./src/runloop_api_client/resources/restricted_keys.py">create</a>(\*\*<a href="src/runloop_api_client/types/restricted_key_create_params.py">params</a>) -> <a href="./src/runloop_api_client/types/restricted_key_created_view.py">RestrictedKeyCreatedView</a></code>
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
#!/usr/bin/env -S uv run python
|
|
2
|
+
"""
|
|
3
|
+
---
|
|
4
|
+
title: Devbox Snapshots (Suspend, Resume, Restore, Delete)
|
|
5
|
+
slug: devbox-snapshots
|
|
6
|
+
use_case: Upload a file to a devbox, preserve it across suspend and resume, create a disk snapshot, restore multiple devboxes from that snapshot, mutate each copy independently, and delete the snapshot when finished.
|
|
7
|
+
workflow:
|
|
8
|
+
- Create a source devbox
|
|
9
|
+
- Upload a file and mutate it into a shared baseline
|
|
10
|
+
- Suspend and resume the source devbox
|
|
11
|
+
- Create a disk snapshot from the resumed devbox
|
|
12
|
+
- Restore two additional devboxes from the same snapshot baseline
|
|
13
|
+
- Mutate the same file differently in each devbox to prove isolation
|
|
14
|
+
- Shutdown the devboxes and delete the snapshot
|
|
15
|
+
tags:
|
|
16
|
+
- devbox
|
|
17
|
+
- snapshot
|
|
18
|
+
- suspend
|
|
19
|
+
- resume
|
|
20
|
+
- files
|
|
21
|
+
- cleanup
|
|
22
|
+
prerequisites:
|
|
23
|
+
- RUNLOOP_API_KEY
|
|
24
|
+
run: uv run python -m examples.devbox_snapshots
|
|
25
|
+
test: uv run pytest -m smoketest tests/smoketests/examples/
|
|
26
|
+
---
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import tempfile
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
|
|
34
|
+
from runloop_api_client import AsyncRunloopSDK
|
|
35
|
+
from runloop_api_client.lib.polling import PollingConfig
|
|
36
|
+
|
|
37
|
+
from ._harness import run_as_cli, unique_name, wrap_recipe
|
|
38
|
+
from .example_types import ExampleCheck, RecipeOutput, RecipeContext
|
|
39
|
+
|
|
40
|
+
FILE_PATH = "/tmp/snapshot-demo.txt"
|
|
41
|
+
POLLING_CONFIG = PollingConfig(timeout_seconds=120.0, interval_seconds=5.0)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
async def recipe(ctx: RecipeContext) -> RecipeOutput:
|
|
45
|
+
"""Demonstrate suspend/resume and shared snapshot restoration with isolated mutations."""
|
|
46
|
+
cleanup = ctx.cleanup
|
|
47
|
+
sdk = AsyncRunloopSDK()
|
|
48
|
+
|
|
49
|
+
resources_created: list[str] = []
|
|
50
|
+
|
|
51
|
+
uploaded_contents = "uploaded-from-local-file"
|
|
52
|
+
baseline_contents = "baseline-after-upload-and-mutation"
|
|
53
|
+
source_contents = "source-devbox-after-isolated-mutation"
|
|
54
|
+
clone_a_contents = "clone-a-after-isolated-mutation"
|
|
55
|
+
clone_b_contents = "clone-b-after-isolated-mutation"
|
|
56
|
+
|
|
57
|
+
with tempfile.NamedTemporaryFile(mode="w", delete=False, suffix=".txt") as tmp_file:
|
|
58
|
+
tmp_file.write(uploaded_contents)
|
|
59
|
+
local_file_path = Path(tmp_file.name)
|
|
60
|
+
cleanup.add("local-file:snapshot-demo", lambda: local_file_path.unlink(missing_ok=True))
|
|
61
|
+
|
|
62
|
+
source_devbox = await sdk.devbox.create(
|
|
63
|
+
name=unique_name("snapshot-source"),
|
|
64
|
+
launch_parameters={
|
|
65
|
+
"resource_size_request": "X_SMALL",
|
|
66
|
+
"keep_alive_time_seconds": 60 * 5,
|
|
67
|
+
},
|
|
68
|
+
)
|
|
69
|
+
cleanup.add(f"devbox:{source_devbox.id}", source_devbox.shutdown)
|
|
70
|
+
resources_created.append(f"devbox:{source_devbox.id}")
|
|
71
|
+
|
|
72
|
+
await source_devbox.file.upload(path=FILE_PATH, file=local_file_path)
|
|
73
|
+
uploaded_readback = await source_devbox.file.read(file_path=FILE_PATH)
|
|
74
|
+
|
|
75
|
+
await source_devbox.file.write(file_path=FILE_PATH, contents=baseline_contents)
|
|
76
|
+
|
|
77
|
+
await source_devbox.suspend()
|
|
78
|
+
suspended_info = await source_devbox.await_suspended(polling_config=POLLING_CONFIG)
|
|
79
|
+
|
|
80
|
+
resumed_info = await source_devbox.resume(polling_config=POLLING_CONFIG)
|
|
81
|
+
resumed_readback = await source_devbox.file.read(file_path=FILE_PATH)
|
|
82
|
+
|
|
83
|
+
snapshot = await source_devbox.snapshot_disk(
|
|
84
|
+
name=unique_name("snapshot-baseline"),
|
|
85
|
+
commit_message="Capture the shared baseline after suspend and resume.",
|
|
86
|
+
polling_config=POLLING_CONFIG,
|
|
87
|
+
)
|
|
88
|
+
cleanup.add(f"snapshot:{snapshot.id}", snapshot.delete)
|
|
89
|
+
resources_created.append(f"snapshot:{snapshot.id}")
|
|
90
|
+
|
|
91
|
+
clone_a = await snapshot.create_devbox(
|
|
92
|
+
name=unique_name("snapshot-clone-a"),
|
|
93
|
+
launch_parameters={
|
|
94
|
+
"resource_size_request": "X_SMALL",
|
|
95
|
+
"keep_alive_time_seconds": 60 * 5,
|
|
96
|
+
},
|
|
97
|
+
)
|
|
98
|
+
cleanup.add(f"devbox:{clone_a.id}", clone_a.shutdown)
|
|
99
|
+
resources_created.append(f"devbox:{clone_a.id}")
|
|
100
|
+
|
|
101
|
+
# clone_a used snapshot.create_devbox(); clone_b uses sdk.devbox.create_from_snapshot()
|
|
102
|
+
# to demonstrate both entry points for restoring a devbox from a snapshot.
|
|
103
|
+
clone_b = await sdk.devbox.create_from_snapshot(
|
|
104
|
+
snapshot.id,
|
|
105
|
+
name=unique_name("snapshot-clone-b"),
|
|
106
|
+
launch_parameters={
|
|
107
|
+
"resource_size_request": "X_SMALL",
|
|
108
|
+
"keep_alive_time_seconds": 60 * 5,
|
|
109
|
+
},
|
|
110
|
+
)
|
|
111
|
+
cleanup.add(f"devbox:{clone_b.id}", clone_b.shutdown)
|
|
112
|
+
resources_created.append(f"devbox:{clone_b.id}")
|
|
113
|
+
|
|
114
|
+
clone_a_baseline_readback = await clone_a.file.read(file_path=FILE_PATH)
|
|
115
|
+
clone_b_baseline_readback = await clone_b.file.read(file_path=FILE_PATH)
|
|
116
|
+
|
|
117
|
+
await source_devbox.file.write(file_path=FILE_PATH, contents=source_contents)
|
|
118
|
+
await clone_a.file.write(file_path=FILE_PATH, contents=clone_a_contents)
|
|
119
|
+
await clone_b.file.write(file_path=FILE_PATH, contents=clone_b_contents)
|
|
120
|
+
|
|
121
|
+
source_isolated_readback = await source_devbox.file.read(file_path=FILE_PATH)
|
|
122
|
+
clone_a_isolated_readback = await clone_a.file.read(file_path=FILE_PATH)
|
|
123
|
+
clone_b_isolated_readback = await clone_b.file.read(file_path=FILE_PATH)
|
|
124
|
+
|
|
125
|
+
return RecipeOutput(
|
|
126
|
+
resources_created=resources_created,
|
|
127
|
+
checks=[
|
|
128
|
+
ExampleCheck(
|
|
129
|
+
name="uploaded file is readable on the source devbox",
|
|
130
|
+
passed=uploaded_readback == uploaded_contents,
|
|
131
|
+
details=uploaded_readback,
|
|
132
|
+
),
|
|
133
|
+
ExampleCheck(
|
|
134
|
+
name="suspend reaches the suspended state",
|
|
135
|
+
passed=suspended_info.status == "suspended",
|
|
136
|
+
details=f"status={suspended_info.status}",
|
|
137
|
+
),
|
|
138
|
+
ExampleCheck(
|
|
139
|
+
name="resume preserves the baseline file contents",
|
|
140
|
+
passed=resumed_info.status == "running" and resumed_readback == baseline_contents,
|
|
141
|
+
details=f"status={resumed_info.status}, contents={resumed_readback}",
|
|
142
|
+
),
|
|
143
|
+
ExampleCheck(
|
|
144
|
+
name="multiple devboxes can use the same snapshot baseline",
|
|
145
|
+
passed=(
|
|
146
|
+
clone_a_baseline_readback == baseline_contents and clone_b_baseline_readback == baseline_contents
|
|
147
|
+
),
|
|
148
|
+
details=(f"clone_a={clone_a_baseline_readback}, clone_b={clone_b_baseline_readback}"),
|
|
149
|
+
),
|
|
150
|
+
ExampleCheck(
|
|
151
|
+
name="devboxes diverge after isolated mutations",
|
|
152
|
+
passed=(
|
|
153
|
+
source_isolated_readback == source_contents
|
|
154
|
+
and clone_a_isolated_readback == clone_a_contents
|
|
155
|
+
and clone_b_isolated_readback == clone_b_contents
|
|
156
|
+
),
|
|
157
|
+
details=(
|
|
158
|
+
"source="
|
|
159
|
+
f"{source_isolated_readback}, "
|
|
160
|
+
f"clone_a={clone_a_isolated_readback}, "
|
|
161
|
+
f"clone_b={clone_b_isolated_readback}"
|
|
162
|
+
),
|
|
163
|
+
),
|
|
164
|
+
],
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
run_devbox_snapshots_example = wrap_recipe(recipe)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
if __name__ == "__main__":
|
|
172
|
+
run_as_cli(run_devbox_snapshots_example)
|
|
@@ -9,6 +9,7 @@ from typing import Any, Callable, cast
|
|
|
9
9
|
|
|
10
10
|
from .devbox_tunnel import run_devbox_tunnel_example
|
|
11
11
|
from .example_types import ExampleResult
|
|
12
|
+
from .devbox_snapshots import run_devbox_snapshots_example
|
|
12
13
|
from .mcp_github_tools import run_mcp_github_tools_example
|
|
13
14
|
from .secrets_with_devbox import run_secrets_with_devbox_example
|
|
14
15
|
from .devbox_snapshot_resume import run_devbox_snapshot_resume_example
|
|
@@ -39,6 +40,13 @@ example_registry: list[ExampleRegistryEntry] = [
|
|
|
39
40
|
"required_env": ["RUNLOOP_API_KEY"],
|
|
40
41
|
"run": run_devbox_snapshot_resume_example,
|
|
41
42
|
},
|
|
43
|
+
{
|
|
44
|
+
"slug": "devbox-snapshots",
|
|
45
|
+
"title": "Devbox Snapshots (Suspend, Resume, Restore, Delete)",
|
|
46
|
+
"file_name": "devbox_snapshots.py",
|
|
47
|
+
"required_env": ["RUNLOOP_API_KEY"],
|
|
48
|
+
"run": run_devbox_snapshots_example,
|
|
49
|
+
},
|
|
42
50
|
{
|
|
43
51
|
"slug": "devbox-tunnel",
|
|
44
52
|
"title": "Devbox Tunnel (HTTP Server Access)",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "runloop_api_client"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.20.0"
|
|
4
4
|
description = "The official Python library for the runloop API"
|
|
5
5
|
dynamic = ["readme"]
|
|
6
6
|
license = "MIT"
|
|
@@ -72,6 +72,7 @@ docs = [
|
|
|
72
72
|
"furo>=2025.9.25",
|
|
73
73
|
"sphinx>=7.4.7",
|
|
74
74
|
"sphinx-autodoc-typehints>=2.3.0",
|
|
75
|
+
"sphinx-tabs>=3.4.0",
|
|
75
76
|
"sphinx-toolbox>=4.0.0",
|
|
76
77
|
]
|
|
77
78
|
|
|
@@ -34,6 +34,7 @@ if TYPE_CHECKING:
|
|
|
34
34
|
from .resources import (
|
|
35
35
|
axons,
|
|
36
36
|
agents,
|
|
37
|
+
apikeys,
|
|
37
38
|
objects,
|
|
38
39
|
secrets,
|
|
39
40
|
devboxes,
|
|
@@ -44,9 +45,11 @@ if TYPE_CHECKING:
|
|
|
44
45
|
benchmark_jobs,
|
|
45
46
|
benchmark_runs,
|
|
46
47
|
gateway_configs,
|
|
48
|
+
restricted_keys,
|
|
47
49
|
network_policies,
|
|
48
50
|
)
|
|
49
51
|
from .resources.agents import AgentsResource, AsyncAgentsResource
|
|
52
|
+
from .resources.apikeys import ApikeysResource, AsyncApikeysResource
|
|
50
53
|
from .resources.objects import ObjectsResource, AsyncObjectsResource
|
|
51
54
|
from .resources.secrets import SecretsResource, AsyncSecretsResource
|
|
52
55
|
from .resources.benchmarks import BenchmarksResource, AsyncBenchmarksResource
|
|
@@ -56,6 +59,7 @@ if TYPE_CHECKING:
|
|
|
56
59
|
from .resources.benchmark_jobs import BenchmarkJobsResource, AsyncBenchmarkJobsResource
|
|
57
60
|
from .resources.benchmark_runs import BenchmarkRunsResource, AsyncBenchmarkRunsResource
|
|
58
61
|
from .resources.gateway_configs import GatewayConfigsResource, AsyncGatewayConfigsResource
|
|
62
|
+
from .resources.restricted_keys import RestrictedKeysResource, AsyncRestrictedKeysResource
|
|
59
63
|
from .resources.network_policies import NetworkPoliciesResource, AsyncNetworkPoliciesResource
|
|
60
64
|
from .resources.devboxes.devboxes import DevboxesResource, AsyncDevboxesResource
|
|
61
65
|
from .resources.scenarios.scenarios import ScenariosResource, AsyncScenariosResource
|
|
@@ -198,6 +202,18 @@ class Runloop(SyncAPIClient):
|
|
|
198
202
|
|
|
199
203
|
return McpConfigsResource(self)
|
|
200
204
|
|
|
205
|
+
@cached_property
|
|
206
|
+
def apikeys(self) -> ApikeysResource:
|
|
207
|
+
from .resources.apikeys import ApikeysResource
|
|
208
|
+
|
|
209
|
+
return ApikeysResource(self)
|
|
210
|
+
|
|
211
|
+
@cached_property
|
|
212
|
+
def restricted_keys(self) -> RestrictedKeysResource:
|
|
213
|
+
from .resources.restricted_keys import RestrictedKeysResource
|
|
214
|
+
|
|
215
|
+
return RestrictedKeysResource(self)
|
|
216
|
+
|
|
201
217
|
@cached_property
|
|
202
218
|
def with_raw_response(self) -> RunloopWithRawResponse:
|
|
203
219
|
return RunloopWithRawResponse(self)
|
|
@@ -446,6 +462,18 @@ class AsyncRunloop(AsyncAPIClient):
|
|
|
446
462
|
|
|
447
463
|
return AsyncMcpConfigsResource(self)
|
|
448
464
|
|
|
465
|
+
@cached_property
|
|
466
|
+
def apikeys(self) -> AsyncApikeysResource:
|
|
467
|
+
from .resources.apikeys import AsyncApikeysResource
|
|
468
|
+
|
|
469
|
+
return AsyncApikeysResource(self)
|
|
470
|
+
|
|
471
|
+
@cached_property
|
|
472
|
+
def restricted_keys(self) -> AsyncRestrictedKeysResource:
|
|
473
|
+
from .resources.restricted_keys import AsyncRestrictedKeysResource
|
|
474
|
+
|
|
475
|
+
return AsyncRestrictedKeysResource(self)
|
|
476
|
+
|
|
449
477
|
@cached_property
|
|
450
478
|
def with_raw_response(self) -> AsyncRunloopWithRawResponse:
|
|
451
479
|
return AsyncRunloopWithRawResponse(self)
|
|
@@ -643,6 +671,18 @@ class RunloopWithRawResponse:
|
|
|
643
671
|
|
|
644
672
|
return McpConfigsResourceWithRawResponse(self._client.mcp_configs)
|
|
645
673
|
|
|
674
|
+
@cached_property
|
|
675
|
+
def apikeys(self) -> apikeys.ApikeysResourceWithRawResponse:
|
|
676
|
+
from .resources.apikeys import ApikeysResourceWithRawResponse
|
|
677
|
+
|
|
678
|
+
return ApikeysResourceWithRawResponse(self._client.apikeys)
|
|
679
|
+
|
|
680
|
+
@cached_property
|
|
681
|
+
def restricted_keys(self) -> restricted_keys.RestrictedKeysResourceWithRawResponse:
|
|
682
|
+
from .resources.restricted_keys import RestrictedKeysResourceWithRawResponse
|
|
683
|
+
|
|
684
|
+
return RestrictedKeysResourceWithRawResponse(self._client.restricted_keys)
|
|
685
|
+
|
|
646
686
|
|
|
647
687
|
class AsyncRunloopWithRawResponse:
|
|
648
688
|
_client: AsyncRunloop
|
|
@@ -728,6 +768,18 @@ class AsyncRunloopWithRawResponse:
|
|
|
728
768
|
|
|
729
769
|
return AsyncMcpConfigsResourceWithRawResponse(self._client.mcp_configs)
|
|
730
770
|
|
|
771
|
+
@cached_property
|
|
772
|
+
def apikeys(self) -> apikeys.AsyncApikeysResourceWithRawResponse:
|
|
773
|
+
from .resources.apikeys import AsyncApikeysResourceWithRawResponse
|
|
774
|
+
|
|
775
|
+
return AsyncApikeysResourceWithRawResponse(self._client.apikeys)
|
|
776
|
+
|
|
777
|
+
@cached_property
|
|
778
|
+
def restricted_keys(self) -> restricted_keys.AsyncRestrictedKeysResourceWithRawResponse:
|
|
779
|
+
from .resources.restricted_keys import AsyncRestrictedKeysResourceWithRawResponse
|
|
780
|
+
|
|
781
|
+
return AsyncRestrictedKeysResourceWithRawResponse(self._client.restricted_keys)
|
|
782
|
+
|
|
731
783
|
|
|
732
784
|
class RunloopWithStreamedResponse:
|
|
733
785
|
_client: Runloop
|
|
@@ -813,6 +865,18 @@ class RunloopWithStreamedResponse:
|
|
|
813
865
|
|
|
814
866
|
return McpConfigsResourceWithStreamingResponse(self._client.mcp_configs)
|
|
815
867
|
|
|
868
|
+
@cached_property
|
|
869
|
+
def apikeys(self) -> apikeys.ApikeysResourceWithStreamingResponse:
|
|
870
|
+
from .resources.apikeys import ApikeysResourceWithStreamingResponse
|
|
871
|
+
|
|
872
|
+
return ApikeysResourceWithStreamingResponse(self._client.apikeys)
|
|
873
|
+
|
|
874
|
+
@cached_property
|
|
875
|
+
def restricted_keys(self) -> restricted_keys.RestrictedKeysResourceWithStreamingResponse:
|
|
876
|
+
from .resources.restricted_keys import RestrictedKeysResourceWithStreamingResponse
|
|
877
|
+
|
|
878
|
+
return RestrictedKeysResourceWithStreamingResponse(self._client.restricted_keys)
|
|
879
|
+
|
|
816
880
|
|
|
817
881
|
class AsyncRunloopWithStreamedResponse:
|
|
818
882
|
_client: AsyncRunloop
|
|
@@ -898,6 +962,18 @@ class AsyncRunloopWithStreamedResponse:
|
|
|
898
962
|
|
|
899
963
|
return AsyncMcpConfigsResourceWithStreamingResponse(self._client.mcp_configs)
|
|
900
964
|
|
|
965
|
+
@cached_property
|
|
966
|
+
def apikeys(self) -> apikeys.AsyncApikeysResourceWithStreamingResponse:
|
|
967
|
+
from .resources.apikeys import AsyncApikeysResourceWithStreamingResponse
|
|
968
|
+
|
|
969
|
+
return AsyncApikeysResourceWithStreamingResponse(self._client.apikeys)
|
|
970
|
+
|
|
971
|
+
@cached_property
|
|
972
|
+
def restricted_keys(self) -> restricted_keys.AsyncRestrictedKeysResourceWithStreamingResponse:
|
|
973
|
+
from .resources.restricted_keys import AsyncRestrictedKeysResourceWithStreamingResponse
|
|
974
|
+
|
|
975
|
+
return AsyncRestrictedKeysResourceWithStreamingResponse(self._client.restricted_keys)
|
|
976
|
+
|
|
901
977
|
|
|
902
978
|
Client = Runloop
|
|
903
979
|
|
|
@@ -3,8 +3,8 @@ from __future__ import annotations
|
|
|
3
3
|
import io
|
|
4
4
|
import os
|
|
5
5
|
import pathlib
|
|
6
|
-
from typing import overload
|
|
7
|
-
from typing_extensions import TypeGuard
|
|
6
|
+
from typing import Sequence, cast, overload
|
|
7
|
+
from typing_extensions import TypeVar, TypeGuard
|
|
8
8
|
|
|
9
9
|
import anyio
|
|
10
10
|
|
|
@@ -17,7 +17,9 @@ from ._types import (
|
|
|
17
17
|
HttpxFileContent,
|
|
18
18
|
HttpxRequestFiles,
|
|
19
19
|
)
|
|
20
|
-
from ._utils import is_tuple_t, is_mapping_t, is_sequence_t
|
|
20
|
+
from ._utils import is_list, is_mapping, is_tuple_t, is_mapping_t, is_sequence_t
|
|
21
|
+
|
|
22
|
+
_T = TypeVar("_T")
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
def is_base64_file_input(obj: object) -> TypeGuard[Base64FileInput]:
|
|
@@ -121,3 +123,51 @@ async def async_read_file_content(file: FileContent) -> HttpxFileContent:
|
|
|
121
123
|
return await anyio.Path(file).read_bytes()
|
|
122
124
|
|
|
123
125
|
return file
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def deepcopy_with_paths(item: _T, paths: Sequence[Sequence[str]]) -> _T:
|
|
129
|
+
"""Copy only the containers along the given paths.
|
|
130
|
+
|
|
131
|
+
Used to guard against mutation by extract_files without copying the entire structure.
|
|
132
|
+
Only dicts and lists that lie on a path are copied; everything else
|
|
133
|
+
is returned by reference.
|
|
134
|
+
|
|
135
|
+
For example, given paths=[["foo", "files", "file"]] and the structure:
|
|
136
|
+
{
|
|
137
|
+
"foo": {
|
|
138
|
+
"bar": {"baz": {}},
|
|
139
|
+
"files": {"file": <content>}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
The root dict, "foo", and "files" are copied (they lie on the path).
|
|
143
|
+
"bar" and "baz" are returned by reference (off the path).
|
|
144
|
+
"""
|
|
145
|
+
return _deepcopy_with_paths(item, paths, 0)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _deepcopy_with_paths(item: _T, paths: Sequence[Sequence[str]], index: int) -> _T:
|
|
149
|
+
if not paths:
|
|
150
|
+
return item
|
|
151
|
+
if is_mapping(item):
|
|
152
|
+
key_to_paths: dict[str, list[Sequence[str]]] = {}
|
|
153
|
+
for path in paths:
|
|
154
|
+
if index < len(path):
|
|
155
|
+
key_to_paths.setdefault(path[index], []).append(path)
|
|
156
|
+
|
|
157
|
+
# if no path continues through this mapping, it won't be mutated and copying it is redundant
|
|
158
|
+
if not key_to_paths:
|
|
159
|
+
return item
|
|
160
|
+
|
|
161
|
+
result = dict(item)
|
|
162
|
+
for key, subpaths in key_to_paths.items():
|
|
163
|
+
if key in result:
|
|
164
|
+
result[key] = _deepcopy_with_paths(result[key], subpaths, index + 1)
|
|
165
|
+
return cast(_T, result)
|
|
166
|
+
if is_list(item):
|
|
167
|
+
array_paths = [path for path in paths if index < len(path) and path[index] == "<array>"]
|
|
168
|
+
|
|
169
|
+
# if no path expects a list here, nothing will be mutated inside it - return by reference
|
|
170
|
+
if not array_paths:
|
|
171
|
+
return cast(_T, item)
|
|
172
|
+
return cast(_T, [_deepcopy_with_paths(entry, array_paths, index + 1) for entry in item])
|
|
173
|
+
return item
|
{runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/__init__.py
RENAMED
|
@@ -25,7 +25,6 @@ from ._utils import (
|
|
|
25
25
|
coerce_integer as coerce_integer,
|
|
26
26
|
file_from_path as file_from_path,
|
|
27
27
|
strip_not_given as strip_not_given,
|
|
28
|
-
deepcopy_minimal as deepcopy_minimal,
|
|
29
28
|
get_async_library as get_async_library,
|
|
30
29
|
maybe_coerce_float as maybe_coerce_float,
|
|
31
30
|
get_required_header as get_required_header,
|
{runloop_api_client-1.18.1 → runloop_api_client-1.20.0}/src/runloop_api_client/_utils/_utils.py
RENAMED
|
@@ -86,8 +86,9 @@ def _extract_items(
|
|
|
86
86
|
index += 1
|
|
87
87
|
if is_dict(obj):
|
|
88
88
|
try:
|
|
89
|
-
#
|
|
90
|
-
|
|
89
|
+
# Remove the field if there are no more dict keys in the path,
|
|
90
|
+
# only "<array>" traversal markers or end.
|
|
91
|
+
if all(p == "<array>" for p in path[index:]):
|
|
91
92
|
item = obj.pop(key)
|
|
92
93
|
else:
|
|
93
94
|
item = obj[key]
|
|
@@ -176,21 +177,6 @@ def is_iterable(obj: object) -> TypeGuard[Iterable[object]]:
|
|
|
176
177
|
return isinstance(obj, Iterable)
|
|
177
178
|
|
|
178
179
|
|
|
179
|
-
def deepcopy_minimal(item: _T) -> _T:
|
|
180
|
-
"""Minimal reimplementation of copy.deepcopy() that will only copy certain object types:
|
|
181
|
-
|
|
182
|
-
- mappings, e.g. `dict`
|
|
183
|
-
- list
|
|
184
|
-
|
|
185
|
-
This is done for performance reasons.
|
|
186
|
-
"""
|
|
187
|
-
if is_mapping(item):
|
|
188
|
-
return cast(_T, {k: deepcopy_minimal(v) for k, v in item.items()})
|
|
189
|
-
if is_list(item):
|
|
190
|
-
return cast(_T, [deepcopy_minimal(entry) for entry in item])
|
|
191
|
-
return item
|
|
192
|
-
|
|
193
|
-
|
|
194
180
|
# copied from https://github.com/Rapptz/RoboDanny
|
|
195
181
|
def human_join(seq: Sequence[str], *, delim: str = ", ", final: str = "or") -> str:
|
|
196
182
|
size = len(seq)
|