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