runloop-api-client 1.10.3__tar.gz → 1.12.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.12.0/.release-please-manifest.json +3 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/CHANGELOG.md +42 -0
- runloop_api_client-1.12.0/EXAMPLES.md +169 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/PKG-INFO +39 -2
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/README-SDK.md +22 -2
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/README.md +37 -0
- runloop_api_client-1.12.0/examples/__init__.py +1 -0
- runloop_api_client-1.12.0/examples/_harness.py +172 -0
- runloop_api_client-1.12.0/examples/blueprint_with_build_context.py +130 -0
- runloop_api_client-1.12.0/examples/devbox_from_blueprint_lifecycle.py +101 -0
- runloop_api_client-1.12.0/examples/devbox_snapshot_resume.py +134 -0
- runloop_api_client-1.12.0/examples/example_types.py +64 -0
- runloop_api_client-1.12.0/examples/mcp_github_tools.py +184 -0
- runloop_api_client-1.12.0/examples/registry.py +63 -0
- runloop_api_client-1.12.0/examples/secrets_with_devbox.py +112 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/pyproject.toml +3 -2
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_compat.py +9 -2
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_version.py +1 -1
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/devboxes/devboxes.py +16 -8
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/secrets.py +78 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/__init__.py +9 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_.py +128 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_devbox.py +34 -0
- runloop_api_client-1.12.0/src/runloop_api_client/sdk/async_secret.py +130 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/devbox.py +34 -0
- runloop_api_client-1.12.0/src/runloop_api_client/sdk/secret.py +130 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/sync.py +128 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_devboxes.py +2 -2
- runloop_api_client-1.12.0/tests/smoketests/examples/__init__.py +1 -0
- runloop_api_client-1.12.0/tests/smoketests/examples/test_examples.py +107 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_devbox.py +52 -23
- runloop_api_client-1.12.0/tests/smoketests/sdk/test_async_secret.py +128 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_devbox.py +52 -23
- runloop_api_client-1.12.0/tests/smoketests/sdk/test_secret.py +145 -0
- runloop_api_client-1.12.0/tests/test_command_id.py +94 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/uv.lock +291 -151
- runloop_api_client-1.10.3/.release-please-manifest.json +0 -3
- runloop_api_client-1.10.3/examples/.keep +0 -4
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/.gitignore +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/CONTRIBUTING.md +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/LICENSE +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/SECURITY.md +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/api.md +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/bin/check-release-environment +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/bin/publish-pypi +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/release-please-config.json +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/requirements-dev.lock +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop/lib/.keep +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_base_client.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_client.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_constants.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_exceptions.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_files.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_models.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_qs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_resource.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_streaming.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_types.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_compat.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_json.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_logs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_proxy.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_reflection.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_streams.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_sync.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_transform.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_typing.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_utils.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/_utils/_validation.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/lib/.keep +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/lib/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/lib/_ignore.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/lib/context_loader.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/lib/polling.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/lib/polling_async.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/pagination.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/py.typed +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/agents.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/benchmark_jobs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/benchmark_runs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/benchmarks.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/blueprints.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/devboxes/browsers.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/devboxes/computers.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/devboxes/executions.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/gateway_configs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/mcp_configs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/network_policies.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/objects.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/repositories.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/_helpers.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/_types.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/agent.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_agent.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_benchmark.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_benchmark_run.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_blueprint.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_execution.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_execution_result.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_gateway_config.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_mcp_config.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_network_policy.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_scenario.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_scenario_builder.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_scenario_run.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_scorer.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_snapshot.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/async_storage_object.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/benchmark.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/benchmark_run.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/blueprint.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/execution.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/execution_result.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/gateway_config.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/mcp_config.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/network_policy.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/scenario.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/scenario_builder.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/scenario_run.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/scorer.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/snapshot.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/sdk/storage_object.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/agent_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/agent_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/agent_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/agent_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_job_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_job_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_job_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_job_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_run_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_update_scenarios_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/benchmark_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_create_from_inspection_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/blueprint_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_create_tunnel_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_enable_tunnel_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_remove_tunnel_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_resource_usage_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_shutdown_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_tunnel_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_update_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/browser_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/browser_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/computer_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/computer_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/gateway_config_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/gateway_config_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/gateway_config_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/gateway_config_update_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/gateway_config_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/input_context.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/input_context_param.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/input_context_update_param.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/inspection_source_param.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/mcp_config_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/mcp_config_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/mcp_config_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/mcp_config_update_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/mcp_config_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/network_policy_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/network_policy_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/network_policy_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/network_policy_update_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/network_policy_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/object_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/object_download_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/object_download_url_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/object_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/object_list_public_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/object_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/object_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/repository_connection_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/repository_connection_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/repository_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/repository_inspect_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/repository_inspection_details.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/repository_inspection_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/repository_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/repository_manifest_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/repository_refresh_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_environment.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_run_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_update_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenario_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scoring_contract.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scoring_function.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scoring_function_param.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/secret_create_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/secret_list_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/secret_list_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/secret_update_params.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/secret_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared/after_idle.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared/agent_mount.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared/agent_source.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared/launch_parameters.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared/mount.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared/object_mount.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared/run_profile.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared_params/agent_mount.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared_params/agent_source.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared_params/launch_parameters.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared_params/mount.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared_params/object_mount.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/src/runloop_api_client/types/tunnel_view.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/devboxes/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/devboxes/test_browsers.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/devboxes/test_computers.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/devboxes/test_executions.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/devboxes/test_logs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/scenarios/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/scenarios/test_runs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/scenarios/test_scorers.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_agents.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_benchmark_jobs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_benchmark_runs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_benchmarks.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_blueprints.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_gateway_configs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_mcp_configs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_network_policies.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_objects.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_repositories.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_scenarios.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/api_resources/test_secrets.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/conftest.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sample_file.txt +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/async_devbox/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/async_devbox/conftest.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/async_devbox/test_core.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/async_devbox/test_edge_cases.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/async_devbox/test_interfaces.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/async_devbox/test_streaming.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/conftest.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/devbox/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/devbox/conftest.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/devbox/test_core.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/devbox/test_edge_cases.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/devbox/test_interfaces.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/devbox/test_streaming.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_agent.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_agent.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_benchmark.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_benchmark_run.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_blueprint.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_execution.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_execution_result.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_gateway_config.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_network_policy.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_ops.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_scenario.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_scenario_builder.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_scenario_run.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_scorer.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_snapshot.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_async_storage_object.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_benchmark.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_benchmark_run.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_blueprint.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_execution.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_execution_result.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_gateway_config.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_helpers.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_network_policy.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_ops.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_scenario.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_scenario_builder.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_scenario_run.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_scorer.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_snapshot.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/sdk/test_storage_object.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/README.md +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/conftest.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/README.md +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/__init__.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/conftest.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_agent.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_agent.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_benchmark.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_blueprint.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_gateway_config.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_network_policy.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_scenario.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_scorer.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_sdk.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_snapshot.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_async_storage_object.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_benchmark.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_blueprint.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_gateway_config.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_mcp_config.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_network_policy.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_scenario.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_scorer.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_sdk.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_snapshot.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/sdk/test_storage_object.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/test_blueprints.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/test_devboxes.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/test_executions.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/test_snapshots.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/smoketests/utils.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_client.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_deepcopy.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_extract_files.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_files.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_models.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_polling.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_qs.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_required_args.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_response.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_streaming.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_transform.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_utils/test_context_loader.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_utils/test_json.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_utils/test_proxy.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/test_utils/test_typing.py +0 -0
- {runloop_api_client-1.10.3 → runloop_api_client-1.12.0}/tests/utils.py +0 -0
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.12.0 (2026-03-18)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v1.11.0...v1.12.0](https://github.com/runloopai/api-client-python/compare/v1.11.0...v1.12.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* add secrets to oo-sdk ([#756](https://github.com/runloopai/api-client-python/issues/756)) ([09c4997](https://github.com/runloopai/api-client-python/commit/09c4997908ca7ec2ab9a45173d4d0bcf33ad2ca2))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* **deps:** bump minimum typing-extensions version ([a873aad](https://github.com/runloopai/api-client-python/commit/a873aada5cbf8d29600374039f4d65bd321fa6bb))
|
|
15
|
+
* **pydantic:** do not pass `by_alias` unless set ([baf3a9a](https://github.com/runloopai/api-client-python/commit/baf3a9a8fe64e14f92f31387781f95dc6c7753de))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Chores
|
|
19
|
+
|
|
20
|
+
* configure new SDK language ([13d3ada](https://github.com/runloopai/api-client-python/commit/13d3adaa20a78b6d02db41369505f28aed92e1f5))
|
|
21
|
+
* **internal:** tweak CI branches ([b374486](https://github.com/runloopai/api-client-python/commit/b374486156c36b01c55135e4a0c1871b78360176))
|
|
22
|
+
|
|
23
|
+
## 1.11.0 (2026-03-10)
|
|
24
|
+
|
|
25
|
+
Full Changelog: [v1.10.3...v1.11.0](https://github.com/runloopai/api-client-python/compare/v1.10.3...v1.11.0)
|
|
26
|
+
|
|
27
|
+
### Features
|
|
28
|
+
|
|
29
|
+
* add snapshots example ([#753](https://github.com/runloopai/api-client-python/issues/753)) ([f13916a](https://github.com/runloopai/api-client-python/commit/f13916a570fe708aef56c6fbfd5c06b9e0dc158e))
|
|
30
|
+
* **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))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
### Bug Fixes
|
|
34
|
+
|
|
35
|
+
* 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))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### Chores
|
|
39
|
+
|
|
40
|
+
* **ci:** skip uploading artifacts on stainless-internal branches ([6874252](https://github.com/runloopai/api-client-python/commit/6874252fe355ac8a44be6bc57cd6bb15a3f035be))
|
|
41
|
+
* **documentation:** correct exec advice ([#752](https://github.com/runloopai/api-client-python/issues/752)) ([fa16c1d](https://github.com/runloopai/api-client-python/commit/fa16c1d602ec301200e82a48fe23c2218ae82a08))
|
|
42
|
+
* **test:** do not count install time for mock server timeout ([f6fde05](https://github.com/runloopai/api-client-python/commit/f6fde050a5f4b985c01003cd7593c1619ede028f))
|
|
43
|
+
* update placeholder string ([5dfcd93](https://github.com/runloopai/api-client-python/commit/5dfcd93bb05cda783901377ee7fc03a6acffe0ae))
|
|
44
|
+
|
|
3
45
|
## 1.10.3 (2026-02-27)
|
|
4
46
|
|
|
5
47
|
Full Changelog: [v1.10.2...v1.10.3](https://github.com/runloopai/api-client-python/compare/v1.10.2...v1.10.3)
|
|
@@ -0,0 +1,169 @@
|
|
|
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
|
+
- [Secrets with Devbox (Create, Inject, Verify, Delete)](#secrets-with-devbox)
|
|
15
|
+
|
|
16
|
+
<a id="blueprint-with-build-context"></a>
|
|
17
|
+
## Blueprint with Build Context
|
|
18
|
+
|
|
19
|
+
**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.
|
|
20
|
+
|
|
21
|
+
**Tags:** `blueprint`, `object-store`, `build-context`, `devbox`, `cleanup`, `async`
|
|
22
|
+
|
|
23
|
+
### Workflow
|
|
24
|
+
- Create a temporary directory with sample application files
|
|
25
|
+
- Upload the directory to object storage as build context
|
|
26
|
+
- Create a blueprint with a Dockerfile that copies the context files
|
|
27
|
+
- Create a devbox from the blueprint
|
|
28
|
+
- Verify the files were copied into the image
|
|
29
|
+
- Shutdown devbox and delete blueprint and storage object
|
|
30
|
+
|
|
31
|
+
### Prerequisites
|
|
32
|
+
- `RUNLOOP_API_KEY`
|
|
33
|
+
|
|
34
|
+
### Run
|
|
35
|
+
```sh
|
|
36
|
+
uv run python -m examples.blueprint_with_build_context
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Test
|
|
40
|
+
```sh
|
|
41
|
+
uv run pytest -m smoketest tests/smoketests/examples/
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Source:** [`examples/blueprint_with_build_context.py`](./examples/blueprint_with_build_context.py)
|
|
45
|
+
|
|
46
|
+
<a id="devbox-from-blueprint-lifecycle"></a>
|
|
47
|
+
## Devbox From Blueprint (Run Command, Shutdown)
|
|
48
|
+
|
|
49
|
+
**Use case:** Create a devbox from a blueprint, run a command, fetch logs, validate output, and cleanly tear everything down.
|
|
50
|
+
|
|
51
|
+
**Tags:** `devbox`, `blueprint`, `commands`, `logs`, `cleanup`
|
|
52
|
+
|
|
53
|
+
### Workflow
|
|
54
|
+
- Create a blueprint
|
|
55
|
+
- Fetch blueprint build logs
|
|
56
|
+
- Create a devbox from the blueprint
|
|
57
|
+
- Execute a command in the devbox
|
|
58
|
+
- Fetch devbox logs
|
|
59
|
+
- Validate exit code, stdout, and logs
|
|
60
|
+
- Shutdown devbox and delete blueprint
|
|
61
|
+
|
|
62
|
+
### Prerequisites
|
|
63
|
+
- `RUNLOOP_API_KEY`
|
|
64
|
+
|
|
65
|
+
### Run
|
|
66
|
+
```sh
|
|
67
|
+
uv run python -m examples.devbox_from_blueprint_lifecycle
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Test
|
|
71
|
+
```sh
|
|
72
|
+
uv run pytest -m smoketest tests/smoketests/examples/
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Source:** [`examples/devbox_from_blueprint_lifecycle.py`](./examples/devbox_from_blueprint_lifecycle.py)
|
|
76
|
+
|
|
77
|
+
<a id="devbox-snapshot-resume"></a>
|
|
78
|
+
## Devbox Snapshot and Resume
|
|
79
|
+
|
|
80
|
+
**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.
|
|
81
|
+
|
|
82
|
+
**Tags:** `devbox`, `snapshot`, `resume`, `cleanup`, `async`
|
|
83
|
+
|
|
84
|
+
### Workflow
|
|
85
|
+
- Create a devbox
|
|
86
|
+
- Write a file to the devbox
|
|
87
|
+
- Create a disk snapshot
|
|
88
|
+
- Create a new devbox from the snapshot
|
|
89
|
+
- Modify the file on the original devbox
|
|
90
|
+
- Verify the clone has the original content
|
|
91
|
+
- Shutdown both devboxes and delete the snapshot
|
|
92
|
+
|
|
93
|
+
### Prerequisites
|
|
94
|
+
- `RUNLOOP_API_KEY`
|
|
95
|
+
|
|
96
|
+
### Run
|
|
97
|
+
```sh
|
|
98
|
+
uv run python -m examples.devbox_snapshot_resume
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Test
|
|
102
|
+
```sh
|
|
103
|
+
uv run pytest -m smoketest tests/smoketests/examples/
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Source:** [`examples/devbox_snapshot_resume.py`](./examples/devbox_snapshot_resume.py)
|
|
107
|
+
|
|
108
|
+
<a id="mcp-github-tools"></a>
|
|
109
|
+
## MCP Hub + Claude Code + GitHub
|
|
110
|
+
|
|
111
|
+
**Use case:** Connect Claude Code running in a devbox to GitHub tools through MCP Hub without exposing raw GitHub credentials to the devbox.
|
|
112
|
+
|
|
113
|
+
**Tags:** `mcp`, `devbox`, `github`, `commands`, `cleanup`
|
|
114
|
+
|
|
115
|
+
### Workflow
|
|
116
|
+
- Create an MCP config for GitHub
|
|
117
|
+
- Store GitHub token as a Runloop secret
|
|
118
|
+
- Launch a devbox with MCP Hub wiring
|
|
119
|
+
- Install Claude Code and register MCP endpoint
|
|
120
|
+
- Run a Claude prompt through MCP tools
|
|
121
|
+
- Shutdown devbox and clean up cloud resources
|
|
122
|
+
|
|
123
|
+
### Prerequisites
|
|
124
|
+
- `RUNLOOP_API_KEY`
|
|
125
|
+
- `GITHUB_TOKEN (GitHub PAT with repo scope)`
|
|
126
|
+
- `ANTHROPIC_API_KEY`
|
|
127
|
+
|
|
128
|
+
### Run
|
|
129
|
+
```sh
|
|
130
|
+
GITHUB_TOKEN=ghp_xxx ANTHROPIC_API_KEY=sk-ant-xxx uv run python -m examples.mcp_github_tools
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Test
|
|
134
|
+
```sh
|
|
135
|
+
uv run pytest -m smoketest tests/smoketests/examples/
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Source:** [`examples/mcp_github_tools.py`](./examples/mcp_github_tools.py)
|
|
139
|
+
|
|
140
|
+
<a id="secrets-with-devbox"></a>
|
|
141
|
+
## Secrets with Devbox (Create, Inject, Verify, Delete)
|
|
142
|
+
|
|
143
|
+
**Use case:** Create a secret, inject it into a devbox as an environment variable, verify access, and clean up.
|
|
144
|
+
|
|
145
|
+
**Tags:** `secrets`, `devbox`, `environment-variables`, `cleanup`
|
|
146
|
+
|
|
147
|
+
### Workflow
|
|
148
|
+
- Create a secret with a test value
|
|
149
|
+
- Create a devbox with the secret mapped to an env var
|
|
150
|
+
- Execute a command that reads the secret from the environment
|
|
151
|
+
- Verify the value matches
|
|
152
|
+
- Update the secret and verify
|
|
153
|
+
- List secrets and verify the secret appears
|
|
154
|
+
- Shutdown devbox and delete secret
|
|
155
|
+
|
|
156
|
+
### Prerequisites
|
|
157
|
+
- `RUNLOOP_API_KEY`
|
|
158
|
+
|
|
159
|
+
### Run
|
|
160
|
+
```sh
|
|
161
|
+
uv run python -m examples.secrets_with_devbox
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Test
|
|
165
|
+
```sh
|
|
166
|
+
uv run pytest -m smoketest tests/smoketests/examples/
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Source:** [`examples/secrets_with_devbox.py`](./examples/secrets_with_devbox.py)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: runloop_api_client
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.12.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
|
|
@@ -28,7 +28,7 @@ Requires-Dist: distro<2,>=1.7.0
|
|
|
28
28
|
Requires-Dist: httpx<1,>=0.23.0
|
|
29
29
|
Requires-Dist: pydantic<3,>=2.0
|
|
30
30
|
Requires-Dist: sniffio
|
|
31
|
-
Requires-Dist: typing-extensions<5,>=4.
|
|
31
|
+
Requires-Dist: typing-extensions<5,>=4.14
|
|
32
32
|
Requires-Dist: uuid-utils>=0.11.0
|
|
33
33
|
Provides-Extra: aiohttp
|
|
34
34
|
Requires-Dist: aiohttp; extra == 'aiohttp'
|
|
@@ -46,6 +46,15 @@ and offers both synchronous and asynchronous clients powered by [httpx](https://
|
|
|
46
46
|
|
|
47
47
|
It is generated with [Stainless](https://www.stainless.com/).
|
|
48
48
|
|
|
49
|
+
## MCP Server
|
|
50
|
+
|
|
51
|
+
Use the Runloop MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application.
|
|
52
|
+
|
|
53
|
+
[](https://cursor.com/en-US/install-mcp?name=%40runloop%2Fapi-client-mcp&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBydW5sb29wL2FwaS1jbGllbnQtbWNwIl0sImVudiI6eyJSVU5MT09QX0FQSV9LRVkiOiJNeSBCZWFyZXIgVG9rZW4ifX0)
|
|
54
|
+
[](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40runloop%2Fapi-client-mcp%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40runloop%2Fapi-client-mcp%22%5D%2C%22env%22%3A%7B%22RUNLOOP_API_KEY%22%3A%22My%20Bearer%20Token%22%7D%7D)
|
|
55
|
+
|
|
56
|
+
> Note: You may need to set environment variables in your MCP client.
|
|
57
|
+
|
|
49
58
|
## Documentation
|
|
50
59
|
|
|
51
60
|
The REST API documentation can be found on
|
|
@@ -125,6 +134,23 @@ asyncio.run(main())
|
|
|
125
134
|
|
|
126
135
|
Functionality between the synchronous and asynchronous clients is otherwise identical.
|
|
127
136
|
|
|
137
|
+
## Examples
|
|
138
|
+
|
|
139
|
+
Workflow-oriented runnable examples are documented in [`EXAMPLES.md`](./EXAMPLES.md).
|
|
140
|
+
|
|
141
|
+
`EXAMPLES.md` is generated from metadata in `examples/*.py` and should not be edited manually.
|
|
142
|
+
Regenerate it with:
|
|
143
|
+
|
|
144
|
+
```sh
|
|
145
|
+
uv run python scripts/generate_examples_md.py
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Agent Guidance
|
|
149
|
+
|
|
150
|
+
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).
|
|
151
|
+
|
|
152
|
+
After completing any modifications to this project, ensure `llms.txt` and `README.md` are kept in sync.
|
|
153
|
+
|
|
128
154
|
### With aiohttp
|
|
129
155
|
|
|
130
156
|
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 +543,17 @@ print(runloop_api_client.__version__)
|
|
|
517
543
|
|
|
518
544
|
Python 3.9 or higher.
|
|
519
545
|
|
|
546
|
+
## Development
|
|
547
|
+
|
|
548
|
+
After cloning the repository, run the bootstrap script and install git hooks:
|
|
549
|
+
|
|
550
|
+
```sh
|
|
551
|
+
./scripts/bootstrap
|
|
552
|
+
./scripts/install-hooks
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
This installs pre-push hooks that run linting and verify generated files are up to date.
|
|
556
|
+
|
|
520
557
|
## Contributing
|
|
521
558
|
|
|
522
559
|
See [the contributing documentation](./CONTRIBUTING.md).
|
|
@@ -116,6 +116,7 @@ The SDK provides object-oriented interfaces for all major Runloop resources:
|
|
|
116
116
|
- **`runloop.blueprint`** - Blueprint management (create, list, build blueprints)
|
|
117
117
|
- **`runloop.snapshot`** - Snapshot management (list disk snapshots)
|
|
118
118
|
- **`runloop.storage_object`** - Storage object management (upload, download, list objects)
|
|
119
|
+
- **`runloop.secret`** - Secret management (create, update, list, delete encrypted key-value pairs)
|
|
119
120
|
- **`runloop.api`** - Direct access to the underlying REST API client
|
|
120
121
|
|
|
121
122
|
### Devbox
|
|
@@ -160,13 +161,13 @@ print(f"Devbox {info.name} is {info.status}")
|
|
|
160
161
|
Execute commands synchronously or asynchronously:
|
|
161
162
|
|
|
162
163
|
```python
|
|
163
|
-
#
|
|
164
|
+
# exec blocks until completion - use for commands that return immediately
|
|
164
165
|
result = devbox.cmd.exec("ls -la")
|
|
165
166
|
print("Output:", result.stdout())
|
|
166
167
|
print("Exit code:", result.exit_code)
|
|
167
168
|
print("Success:", result.success)
|
|
168
169
|
|
|
169
|
-
#
|
|
170
|
+
# exec_async returns immediately - use for long-running processes
|
|
170
171
|
execution = devbox.cmd.exec_async("npm run dev")
|
|
171
172
|
|
|
172
173
|
# Check execution status
|
|
@@ -393,11 +394,30 @@ async with await runloop.devbox.create(name="temp-devbox") as devbox:
|
|
|
393
394
|
# devbox is automatically shutdown when exiting the context
|
|
394
395
|
```
|
|
395
396
|
|
|
397
|
+
#### Devbox Logs
|
|
398
|
+
|
|
399
|
+
Retrieve logs from a devbox, optionally filtered by execution ID or shell name:
|
|
400
|
+
|
|
401
|
+
```python
|
|
402
|
+
# Get all devbox logs
|
|
403
|
+
logs = devbox.logs()
|
|
404
|
+
for log in logs.logs:
|
|
405
|
+
print(f"[{log.level}] {log.message}")
|
|
406
|
+
|
|
407
|
+
# Filter logs by execution ID
|
|
408
|
+
result = devbox.cmd.exec('echo "hello"')
|
|
409
|
+
exec_logs = devbox.logs(execution_id=result.execution_id)
|
|
410
|
+
|
|
411
|
+
# Filter logs by shell name
|
|
412
|
+
shell_logs = devbox.logs(shell_name="my-shell")
|
|
413
|
+
```
|
|
414
|
+
|
|
396
415
|
**Key methods:**
|
|
397
416
|
|
|
398
417
|
- `devbox.get_info()` - Get devbox details and status
|
|
399
418
|
- `devbox.cmd.exec()` - Execute commands synchronously
|
|
400
419
|
- `devbox.cmd.exec_async()` - Execute commands asynchronously
|
|
420
|
+
- `devbox.logs()` - Retrieve devbox logs (optionally filter by execution_id or shell_name)
|
|
401
421
|
- `devbox.file.read()` - Read file contents
|
|
402
422
|
- `devbox.file.write()` - Write file contents
|
|
403
423
|
- `devbox.file.upload()` - Upload files
|
|
@@ -9,6 +9,15 @@ and offers both synchronous and asynchronous clients powered by [httpx](https://
|
|
|
9
9
|
|
|
10
10
|
It is generated with [Stainless](https://www.stainless.com/).
|
|
11
11
|
|
|
12
|
+
## MCP Server
|
|
13
|
+
|
|
14
|
+
Use the Runloop MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application.
|
|
15
|
+
|
|
16
|
+
[](https://cursor.com/en-US/install-mcp?name=%40runloop%2Fapi-client-mcp&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBydW5sb29wL2FwaS1jbGllbnQtbWNwIl0sImVudiI6eyJSVU5MT09QX0FQSV9LRVkiOiJNeSBCZWFyZXIgVG9rZW4ifX0)
|
|
17
|
+
[](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22%40runloop%2Fapi-client-mcp%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40runloop%2Fapi-client-mcp%22%5D%2C%22env%22%3A%7B%22RUNLOOP_API_KEY%22%3A%22My%20Bearer%20Token%22%7D%7D)
|
|
18
|
+
|
|
19
|
+
> Note: You may need to set environment variables in your MCP client.
|
|
20
|
+
|
|
12
21
|
## Documentation
|
|
13
22
|
|
|
14
23
|
The REST API documentation can be found on
|
|
@@ -88,6 +97,23 @@ asyncio.run(main())
|
|
|
88
97
|
|
|
89
98
|
Functionality between the synchronous and asynchronous clients is otherwise identical.
|
|
90
99
|
|
|
100
|
+
## Examples
|
|
101
|
+
|
|
102
|
+
Workflow-oriented runnable examples are documented in [`EXAMPLES.md`](./EXAMPLES.md).
|
|
103
|
+
|
|
104
|
+
`EXAMPLES.md` is generated from metadata in `examples/*.py` and should not be edited manually.
|
|
105
|
+
Regenerate it with:
|
|
106
|
+
|
|
107
|
+
```sh
|
|
108
|
+
uv run python scripts/generate_examples_md.py
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Agent Guidance
|
|
112
|
+
|
|
113
|
+
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).
|
|
114
|
+
|
|
115
|
+
After completing any modifications to this project, ensure `llms.txt` and `README.md` are kept in sync.
|
|
116
|
+
|
|
91
117
|
### With aiohttp
|
|
92
118
|
|
|
93
119
|
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 +506,17 @@ print(runloop_api_client.__version__)
|
|
|
480
506
|
|
|
481
507
|
Python 3.9 or higher.
|
|
482
508
|
|
|
509
|
+
## Development
|
|
510
|
+
|
|
511
|
+
After cloning the repository, run the bootstrap script and install git hooks:
|
|
512
|
+
|
|
513
|
+
```sh
|
|
514
|
+
./scripts/bootstrap
|
|
515
|
+
./scripts/install-hooks
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
This installs pre-push hooks that run linting and verify generated files are up to date.
|
|
519
|
+
|
|
483
520
|
## Contributing
|
|
484
521
|
|
|
485
522
|
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)
|