runloop_api_client 1.0.0__tar.gz → 1.2.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.2.0/.release-please-manifest.json +3 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/CHANGELOG.md +40 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/CONTRIBUTING.md +38 -2
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/PKG-INFO +4 -2
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/README-SDK.md +65 -15
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/README.md +2 -1
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/api.md +0 -2
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/pyproject.toml +24 -43
- runloop_api_client-1.2.0/requirements-dev.lock +110 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_streaming.py +32 -32
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_version.py +1 -1
- runloop_api_client-1.2.0/src/runloop_api_client/lib/__init__.py +3 -0
- runloop_api_client-1.2.0/src/runloop_api_client/lib/_ignore.py +496 -0
- runloop_api_client-1.2.0/src/runloop_api_client/lib/context_loader.py +78 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/blueprints.py +0 -4
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/__init__.py +19 -1
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/_types.py +29 -0
- runloop_api_client-1.2.0/src/runloop_api_client/sdk/agent.py +72 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_.py +281 -12
- runloop_api_client-1.2.0/src/runloop_api_client/sdk/async_agent.py +76 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_devbox.py +1 -3
- runloop_api_client-1.2.0/src/runloop_api_client/sdk/async_scenario.py +118 -0
- runloop_api_client-1.2.0/src/runloop_api_client/sdk/async_scenario_run.py +242 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_storage_object.py +19 -2
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/devbox.py +1 -3
- runloop_api_client-1.2.0/src/runloop_api_client/sdk/scenario.py +118 -0
- runloop_api_client-1.2.0/src/runloop_api_client/sdk/scenario_run.py +242 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/storage_object.py +19 -2
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/sync.py +306 -11
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/__init__.py +0 -2
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +3 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_start_run_params.py +6 -4
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_function.py +1 -1
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_function_param.py +1 -1
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/__init__.py +0 -2
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -3
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/launch_parameters.py +1 -1
- runloop_api_client-1.2.0/src/runloop_api_client/types/shared/mount.py +78 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/__init__.py +0 -2
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +1 -3
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/launch_parameters.py +1 -1
- runloop_api_client-1.2.0/src/runloop_api_client/types/shared_params/mount.py +77 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_blueprints.py +0 -4
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_devboxes.py +0 -2
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/conftest.py +55 -5
- runloop_api_client-1.2.0/tests/sdk/test_agent.py +43 -0
- runloop_api_client-1.2.0/tests/sdk/test_async_agent.py +46 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_ops.py +473 -1
- runloop_api_client-1.2.0/tests/sdk/test_async_scenario.py +121 -0
- runloop_api_client-1.2.0/tests/sdk/test_async_scenario_run.py +162 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_ops.py +422 -3
- runloop_api_client-1.2.0/tests/sdk/test_scenario.py +121 -0
- runloop_api_client-1.2.0/tests/sdk/test_scenario_run.py +157 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/README.md +25 -7
- runloop_api_client-1.2.0/tests/smoketests/sdk/test_agent.py +197 -0
- runloop_api_client-1.2.0/tests/smoketests/sdk/test_async_agent.py +203 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_devbox.py +0 -28
- runloop_api_client-1.2.0/tests/smoketests/sdk/test_async_scenario.py +126 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_storage_object.py +2 -1
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_devbox.py +0 -28
- runloop_api_client-1.2.0/tests/smoketests/sdk/test_scenario.py +126 -0
- runloop_api_client-1.2.0/tests/test_utils/test_context_loader.py +207 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/uv.lock +740 -406
- runloop_api_client-1.0.0/.release-please-manifest.json +0 -3
- runloop_api_client-1.0.0/requirements-dev.lock +0 -94
- runloop_api_client-1.0.0/src/runloop_api_client/types/shared/agent_mount_parameters.py +0 -31
- runloop_api_client-1.0.0/src/runloop_api_client/types/shared/mount.py +0 -28
- runloop_api_client-1.0.0/src/runloop_api_client/types/shared/object_mount_parameters.py +0 -21
- runloop_api_client-1.0.0/src/runloop_api_client/types/shared_params/agent_mount_parameters.py +0 -31
- runloop_api_client-1.0.0/src/runloop_api_client/types/shared_params/mount.py +0 -25
- runloop_api_client-1.0.0/src/runloop_api_client/types/shared_params/object_mount_parameters.py +0 -21
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/.gitignore +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/LICENSE +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/SECURITY.md +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/bin/check-release-environment +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/bin/publish-pypi +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/examples/.keep +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/release-please-config.json +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop/lib/.keep +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_base_client.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_client.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_compat.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_constants.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_exceptions.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_files.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_models.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_qs.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_resource.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_types.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_compat.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_logs.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_proxy.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_reflection.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_streams.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_sync.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_transform.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_typing.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_utils.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/_utils/_validation.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/lib/.keep +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/lib/polling.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/lib/polling_async.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/pagination.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/py.typed +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/agents.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/benchmarks/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/benchmarks/benchmarks.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/benchmarks/runs.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/browsers.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/computers.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/devboxes.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/executions.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/objects.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/repositories.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/resources/secrets.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/_helpers.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_blueprint.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_execution.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_execution_result.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_scorer.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/async_snapshot.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/blueprint.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/execution.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/execution_result.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/scorer.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/sdk/snapshot.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/agent_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/agent_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/agent_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/agent_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmark_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmarks/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmarks/run_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/benchmarks/run_list_scenario_runs_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_create_from_inspection_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/blueprint_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_create_tunnel_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_remove_tunnel_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_tunnel_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_update_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/browser_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/browser_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/computer_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/input_context.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/input_context_param.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/input_context_update_param.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/inspection_source_param.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_download_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_download_url_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_list_public_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/object_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_connection_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_connection_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_inspect_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_inspection_details.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_inspection_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_manifest_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/repository_refresh_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_environment.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_run_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_update_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenario_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_validate_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scenarios/scorer_validate_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_contract.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/secret_create_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/secret_list_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/secret_list_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/secret_update_params.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/secret_view.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/after_idle.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/agent_source.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared/run_profile.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/agent_source.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/benchmarks/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/benchmarks/test_runs.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/test_browsers.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/test_computers.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/test_executions.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/devboxes/test_logs.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/scenarios/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/scenarios/test_runs.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/scenarios/test_scorers.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_agents.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_benchmarks.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_objects.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_repositories.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_scenarios.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/api_resources/test_secrets.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/conftest.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sample_file.txt +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/conftest.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/test_core.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/test_edge_cases.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/test_interfaces.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/async_devbox/test_streaming.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/conftest.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/test_core.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/test_edge_cases.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/test_interfaces.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/devbox/test_streaming.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_blueprint.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_execution.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_execution_result.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_scorer.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_snapshot.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_async_storage_object.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_blueprint.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_execution.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_execution_result.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_helpers.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_scorer.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_snapshot.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/sdk/test_storage_object.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/README.md +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/conftest.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/__init__.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/conftest.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_blueprint.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_scorer.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_sdk.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_async_snapshot.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_blueprint.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_scorer.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_sdk.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_snapshot.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/sdk/test_storage_object.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/test_blueprints.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/test_devboxes.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/test_executions.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/test_snapshots.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/smoketests/utils.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_client.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_deepcopy.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_extract_files.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_files.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_models.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_polling.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_qs.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_required_args.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_response.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_streaming.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_transform.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_utils/test_proxy.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/test_utils/test_typing.py +0 -0
- {runloop_api_client-1.0.0 → runloop_api_client-1.2.0}/tests/utils.py +0 -0
|
@@ -1,5 +1,45 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.2.0 (2025-12-09)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v1.1.0...v1.2.0](https://github.com/runloopai/api-client-python/compare/v1.1.0...v1.2.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **devbox:** default to x86 arch ([501de0b](https://github.com/runloopai/api-client-python/commit/501de0bb1d76c836ff9f448513a16155641345ae))
|
|
10
|
+
* **devbox:** return user for createSshKey ([f094bf7](https://github.com/runloopai/api-client-python/commit/f094bf7443a0ca5bab6d47a53b7b14bade3cecd0))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* ensure streams are always closed ([d01aae2](https://github.com/runloopai/api-client-python/commit/d01aae204d8c57ac76646df0e0e1078e64ad9891))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Chores
|
|
19
|
+
|
|
20
|
+
* bump required `uv` version ([8ad519f](https://github.com/runloopai/api-client-python/commit/8ad519fd26d389628d157a413a0b0f1f5d435e9e))
|
|
21
|
+
* **deps:** mypy 1.18.1 has a regression, pin to 1.17 ([e56582a](https://github.com/runloopai/api-client-python/commit/e56582a93590445d8e545b6123be0f14db39a8f5))
|
|
22
|
+
* **docs:** use environment variables for authentication in code snippets ([55cf613](https://github.com/runloopai/api-client-python/commit/55cf6131edb8d38144761c5dbbbcf9389093ed7b))
|
|
23
|
+
* **internal:** version bump ([2fa85c6](https://github.com/runloopai/api-client-python/commit/2fa85c6694dc468280eedb28136aadcda4f11801))
|
|
24
|
+
* remove some unnecessary changes to reduce diff from Stainless ([#705](https://github.com/runloopai/api-client-python/issues/705)) ([715c9d0](https://github.com/runloopai/api-client-python/commit/715c9d09f4e874032ee1d4d6c81d80ab6a72ec45))
|
|
25
|
+
* update lockfile ([7e0136d](https://github.com/runloopai/api-client-python/commit/7e0136dfcd62a2843138ae382bd6fedfd881e1b3))
|
|
26
|
+
* update requirements-dev.lock ([#707](https://github.com/runloopai/api-client-python/issues/707)) ([a2d5326](https://github.com/runloopai/api-client-python/commit/a2d5326634cad5afe6c74252d26b01916ed41bcb))
|
|
27
|
+
* update uv.lock ([b9e0729](https://github.com/runloopai/api-client-python/commit/b9e07291745291d16f122dbca5ef513ed134c5dd))
|
|
28
|
+
|
|
29
|
+
## 1.1.0 (2025-12-06)
|
|
30
|
+
|
|
31
|
+
Full Changelog: [v1.0.0...v1.1.0](https://github.com/runloopai/api-client-python/compare/v1.0.0...v1.1.0)
|
|
32
|
+
|
|
33
|
+
### Features
|
|
34
|
+
|
|
35
|
+
* **scenarios:** added scenario class to sdk ([#701](https://github.com/runloopai/api-client-python/issues/701)) ([121f0fc](https://github.com/runloopai/api-client-python/commit/121f0fc6efa779979f664a75e91d60c068358e21))
|
|
36
|
+
* **SDK:** Build context helpers for the python clients and SDKs ([#684](https://github.com/runloopai/api-client-python/issues/684)) ([42849d6](https://github.com/runloopai/api-client-python/commit/42849d6834098d00234e5ab345ed0d91bac00435))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
### Chores
|
|
40
|
+
|
|
41
|
+
* **smoketests:** fixed smoketests and cleaned up typing/formatting ([#699](https://github.com/runloopai/api-client-python/issues/699)) ([f57aae7](https://github.com/runloopai/api-client-python/commit/f57aae71be8eb801214c012b2ec66b9414f0365e))
|
|
42
|
+
|
|
3
43
|
## 1.0.0 (2025-12-02)
|
|
4
44
|
|
|
5
45
|
Full Changelog: [v0.69.0...v1.0.0](https://github.com/runloopai/api-client-python/compare/v0.69.0...v1.0.0)
|
|
@@ -89,13 +89,49 @@ Most tests require you to [set up a mock server](https://github.com/stoplightio/
|
|
|
89
89
|
|
|
90
90
|
```sh
|
|
91
91
|
# you will need npm installed
|
|
92
|
-
|
|
92
|
+
npx prism mock path/to/your/openapi.yml
|
|
93
93
|
```
|
|
94
94
|
|
|
95
95
|
```sh
|
|
96
|
-
|
|
96
|
+
# run all tests
|
|
97
|
+
./scripts/test
|
|
98
|
+
|
|
99
|
+
# pass in pytest args, eg to show info on skipped tests:
|
|
100
|
+
./scripts/test -rs
|
|
101
|
+
|
|
102
|
+
# Run tests for only one python version
|
|
103
|
+
UV_PYTHON=3.13 ./scripts/test
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Running pytets
|
|
107
|
+
|
|
108
|
+
Assuming you have a uv virtual env set up in .venv, the following are helpful for more granular test running:
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
# Run all tests pytests
|
|
112
|
+
.venv/bin/pytest tests/
|
|
113
|
+
|
|
114
|
+
# Run all SDK tests with verbose info
|
|
115
|
+
.venv/bin/pytest tests/sdk/ -v
|
|
116
|
+
|
|
117
|
+
# Run specific test class
|
|
118
|
+
.venv/bin/pytest tests/sdk/test_clients.py::TestAgentClient -v
|
|
119
|
+
|
|
120
|
+
# Run specific test method
|
|
121
|
+
.venv/bin/pytest tests/sdk/test_clients.py::TestAgentClient::test_create_from_npm -v
|
|
122
|
+
|
|
123
|
+
# Run agent smoketests (requires RUNLOOP_API_KEY)
|
|
124
|
+
export RUNLOOP_API_KEY=your_key_here
|
|
125
|
+
.venv/bin/pytest tests/smoketests/sdk/test_agent.py -v
|
|
126
|
+
|
|
127
|
+
# Run tests matching a pattern
|
|
128
|
+
.venv/bin/pytest tests/sdk/ -k "agent" -v
|
|
129
|
+
|
|
130
|
+
# Run with coverage
|
|
131
|
+
.venv/bin/pytest tests/sdk/ --cov=src/runloop_api_client/sdk --cov-report=html
|
|
97
132
|
```
|
|
98
133
|
|
|
134
|
+
|
|
99
135
|
## Linting and formatting
|
|
100
136
|
|
|
101
137
|
This repository uses [ruff](https://github.com/astral-sh/ruff) and
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: runloop_api_client
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.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
|
|
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.11
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.12
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
22
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
22
23
|
Classifier: Typing :: Typed
|
|
23
24
|
Requires-Python: >=3.9
|
|
@@ -137,6 +138,7 @@ pip install runloop_api_client[aiohttp]
|
|
|
137
138
|
Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
|
|
138
139
|
|
|
139
140
|
```python
|
|
141
|
+
import os
|
|
140
142
|
import asyncio
|
|
141
143
|
from runloop_api_client import DefaultAioHttpClient
|
|
142
144
|
from runloop_api_client import AsyncRunloop
|
|
@@ -144,7 +146,7 @@ from runloop_api_client import AsyncRunloop
|
|
|
144
146
|
|
|
145
147
|
async def main() -> None:
|
|
146
148
|
async with AsyncRunloop(
|
|
147
|
-
bearer_token="
|
|
149
|
+
bearer_token=os.environ.get("RUNLOOP_API_KEY"), # This is the default and can be omitted
|
|
148
150
|
http_client=DefaultAioHttpClient(),
|
|
149
151
|
) as client:
|
|
150
152
|
devbox_view = await client.devboxes.create()
|
|
@@ -8,11 +8,23 @@ The `RunloopSDK` builds on top of the underlying REST client and provides a Pyth
|
|
|
8
8
|
- [Quickstart (synchronous)](#quickstart-synchronous)
|
|
9
9
|
- [Quickstart (asynchronous)](#quickstart-asynchronous)
|
|
10
10
|
- [Core Concepts](#core-concepts)
|
|
11
|
-
- [
|
|
12
|
-
- [
|
|
13
|
-
- [
|
|
14
|
-
- [
|
|
15
|
-
- [
|
|
11
|
+
- [RunloopSDK](#runloopsdk)
|
|
12
|
+
- [Available Resources](#available-resources)
|
|
13
|
+
- [Devbox](#devbox)
|
|
14
|
+
- [Command Execution](#command-execution)
|
|
15
|
+
- [Execution Management](#execution-management)
|
|
16
|
+
- [Execution Results](#execution-results)
|
|
17
|
+
- [Streaming Command Output](#streaming-command-output)
|
|
18
|
+
- [File Operations](#file-operations)
|
|
19
|
+
- [Network Operations](#network-operations)
|
|
20
|
+
- [Snapshot Operations](#snapshot-operations)
|
|
21
|
+
- [Devbox Lifecycle Management](#devbox-lifecycle-management)
|
|
22
|
+
- [Context Manager Support](#context-manager-support)
|
|
23
|
+
- [Blueprint](#blueprint)
|
|
24
|
+
- [Snapshot](#snapshot)
|
|
25
|
+
- [StorageObject](#storageobject)
|
|
26
|
+
- [Storage Object Upload Helpers](#storage-object-upload-helpers)
|
|
27
|
+
- [Mounting Storage Objects to Devboxes](#mounting-storage-objects-to-devboxes)
|
|
16
28
|
- [Accessing the Underlying REST Client](#accessing-the-underlying-rest-client)
|
|
17
29
|
- [Error Handling](#error-handling)
|
|
18
30
|
- [Advanced Configuration](#advanced-configuration)
|
|
@@ -65,6 +77,7 @@ print(obj.download_as_text())
|
|
|
65
77
|
import asyncio
|
|
66
78
|
from runloop_api_client import AsyncRunloopSDK
|
|
67
79
|
|
|
80
|
+
|
|
68
81
|
async def main():
|
|
69
82
|
runloop = AsyncRunloopSDK()
|
|
70
83
|
async with await runloop.devbox.create(name="async-devbox") as devbox:
|
|
@@ -76,6 +89,7 @@ async def main():
|
|
|
76
89
|
|
|
77
90
|
await devbox.cmd.exec("ls", stdout=capture)
|
|
78
91
|
|
|
92
|
+
|
|
79
93
|
asyncio.run(main())
|
|
80
94
|
```
|
|
81
95
|
|
|
@@ -182,7 +196,7 @@ print("Devbox ID:", execution.devbox_id)
|
|
|
182
196
|
# Poll for current state
|
|
183
197
|
state = execution.get_state()
|
|
184
198
|
print("Status:", state.status) # "running", "completed", etc.
|
|
185
|
-
print("Exit code:", state.exit_status)
|
|
199
|
+
print("Exit code:", state.exit_status) # only set when execution has completed
|
|
186
200
|
|
|
187
201
|
# Wait for completion and get results
|
|
188
202
|
result = execution.result()
|
|
@@ -217,7 +231,7 @@ result = execution.result()
|
|
|
217
231
|
# Access execution results
|
|
218
232
|
print("Exit code:", result.exit_code)
|
|
219
233
|
print("Success:", result.success) # True if exit code is 0
|
|
220
|
-
print("Failed:", result.failed)
|
|
234
|
+
print("Failed:", result.failed) # True if exit code is non-zero
|
|
221
235
|
|
|
222
236
|
# Get output streams
|
|
223
237
|
stdout = result.stdout()
|
|
@@ -249,6 +263,7 @@ Pass callbacks into `cmd.exec` / `cmd.exec_async` to process logs in real time:
|
|
|
249
263
|
def handle_output(line: str) -> None:
|
|
250
264
|
print("LOG:", line)
|
|
251
265
|
|
|
266
|
+
|
|
252
267
|
result = devbox.cmd.exec(
|
|
253
268
|
"python train.py",
|
|
254
269
|
stdout=handle_output,
|
|
@@ -266,6 +281,7 @@ def capture(line: str) -> None:
|
|
|
266
281
|
# Use thread-safe data structures if needed
|
|
267
282
|
log_queue.put_nowait(line)
|
|
268
283
|
|
|
284
|
+
|
|
269
285
|
await devbox.cmd.exec(
|
|
270
286
|
"tail -f /var/log/app.log",
|
|
271
287
|
stdout=capture,
|
|
@@ -287,6 +303,7 @@ print(content)
|
|
|
287
303
|
|
|
288
304
|
# Upload files
|
|
289
305
|
from pathlib import Path
|
|
306
|
+
|
|
290
307
|
devbox.file.upload(
|
|
291
308
|
path="/home/user/upload.txt",
|
|
292
309
|
file=Path("local_file.txt"),
|
|
@@ -409,6 +426,36 @@ blueprint = runloop.blueprint.create(
|
|
|
409
426
|
system_setup_commands=["pip install numpy pandas"],
|
|
410
427
|
)
|
|
411
428
|
|
|
429
|
+
# Or create a blueprint with a Docker build context from a local directory
|
|
430
|
+
from pathlib import Path
|
|
431
|
+
from runloop_api_client.lib.context_loader import build_docker_context_tar
|
|
432
|
+
|
|
433
|
+
context_root = Path("./my-app")
|
|
434
|
+
tar_bytes = build_docker_context_tar(context_root)
|
|
435
|
+
|
|
436
|
+
build_ctx_obj = runloop.storage_object.upload_from_bytes(
|
|
437
|
+
data=tar_bytes,
|
|
438
|
+
name="my-app-context.tar.gz",
|
|
439
|
+
content_type="tgz",
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
blueprint_with_context = runloop.blueprint.create(
|
|
443
|
+
name="my-blueprint-with-context",
|
|
444
|
+
dockerfile="""\
|
|
445
|
+
FROM node:22
|
|
446
|
+
WORKDIR /usr/src/app
|
|
447
|
+
|
|
448
|
+
# copy using the build context from the object
|
|
449
|
+
COPY package.json package.json
|
|
450
|
+
COPY src src
|
|
451
|
+
|
|
452
|
+
RUN npm install --only=production
|
|
453
|
+
CMD ["node", "src/app.js"]
|
|
454
|
+
""",
|
|
455
|
+
# Build context
|
|
456
|
+
build_context=build_ctx_obj.as_build_context(),
|
|
457
|
+
)
|
|
458
|
+
|
|
412
459
|
# Or get an existing one
|
|
413
460
|
blueprint = runloop.blueprint.from_id(blueprint_id="bpt_123")
|
|
414
461
|
|
|
@@ -493,6 +540,7 @@ storage_object.complete()
|
|
|
493
540
|
|
|
494
541
|
# Upload from file
|
|
495
542
|
from pathlib import Path
|
|
543
|
+
|
|
496
544
|
uploaded = runloop.storage_object.upload_from_file(
|
|
497
545
|
Path("/path/to/file.txt"),
|
|
498
546
|
name="my-file.txt",
|
|
@@ -542,7 +590,7 @@ obj = runloop.storage_object.create(
|
|
|
542
590
|
name="data.bin",
|
|
543
591
|
content_type="binary",
|
|
544
592
|
)
|
|
545
|
-
obj.upload_content(b"\
|
|
593
|
+
obj.upload_content(b"\xde\xad\xbe\xef")
|
|
546
594
|
obj.complete()
|
|
547
595
|
```
|
|
548
596
|
|
|
@@ -689,28 +737,30 @@ The async SDK has the same interface as the synchronous version, but all I/O ope
|
|
|
689
737
|
import asyncio
|
|
690
738
|
from runloop_api_client import AsyncRunloopSDK
|
|
691
739
|
|
|
740
|
+
|
|
692
741
|
async def main():
|
|
693
742
|
runloop = AsyncRunloopSDK()
|
|
694
|
-
|
|
743
|
+
|
|
695
744
|
# All the same operations, but with await
|
|
696
745
|
async with await runloop.devbox.create(name="async-devbox") as devbox:
|
|
697
746
|
result = await devbox.cmd.exec("pwd")
|
|
698
747
|
print(await result.stdout())
|
|
699
|
-
|
|
748
|
+
|
|
700
749
|
# Streaming (note: callbacks must be synchronous)
|
|
701
750
|
def capture(line: str) -> None:
|
|
702
751
|
print(">>", line)
|
|
703
|
-
|
|
752
|
+
|
|
704
753
|
await devbox.cmd.exec("ls", stdout=capture)
|
|
705
|
-
|
|
754
|
+
|
|
706
755
|
# Async file operations
|
|
707
756
|
await devbox.file.write(path="/tmp/test.txt", contents="Hello")
|
|
708
757
|
content = await devbox.file.read(path="/tmp/test.txt")
|
|
709
|
-
|
|
758
|
+
|
|
710
759
|
# Async network operations
|
|
711
760
|
tunnel = await devbox.net.create_tunnel(port=8080)
|
|
712
761
|
print("Tunnel URL:", tunnel.url)
|
|
713
762
|
|
|
763
|
+
|
|
714
764
|
asyncio.run(main())
|
|
715
765
|
```
|
|
716
766
|
|
|
@@ -726,7 +776,7 @@ devbox = runloop.devbox.create(
|
|
|
726
776
|
name="my-devbox",
|
|
727
777
|
polling_config=PollingConfig(
|
|
728
778
|
timeout_seconds=300.0, # Wait up to 5 minutes
|
|
729
|
-
interval_seconds=2.0,
|
|
779
|
+
interval_seconds=2.0, # Poll every 2 seconds
|
|
730
780
|
),
|
|
731
781
|
)
|
|
732
782
|
|
|
@@ -734,7 +784,7 @@ devbox = runloop.devbox.create(
|
|
|
734
784
|
snapshot.await_completed(
|
|
735
785
|
polling_config=PollingConfig(
|
|
736
786
|
timeout_seconds=600.0, # Wait up to 10 minutes
|
|
737
|
-
interval_seconds=5.0,
|
|
787
|
+
interval_seconds=5.0, # Poll every 5 seconds
|
|
738
788
|
),
|
|
739
789
|
)
|
|
740
790
|
```
|
|
@@ -102,6 +102,7 @@ pip install runloop_api_client[aiohttp]
|
|
|
102
102
|
Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
|
|
103
103
|
|
|
104
104
|
```python
|
|
105
|
+
import os
|
|
105
106
|
import asyncio
|
|
106
107
|
from runloop_api_client import DefaultAioHttpClient
|
|
107
108
|
from runloop_api_client import AsyncRunloop
|
|
@@ -109,7 +110,7 @@ from runloop_api_client import AsyncRunloop
|
|
|
109
110
|
|
|
110
111
|
async def main() -> None:
|
|
111
112
|
async with AsyncRunloop(
|
|
112
|
-
bearer_token="
|
|
113
|
+
bearer_token=os.environ.get("RUNLOOP_API_KEY"), # This is the default and can be omitted
|
|
113
114
|
http_client=DefaultAioHttpClient(),
|
|
114
115
|
) as client:
|
|
115
116
|
devbox_view = await client.devboxes.create()
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "runloop_api_client"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.2.0"
|
|
4
4
|
description = "The official Python library for the runloop API"
|
|
5
5
|
dynamic = ["readme"]
|
|
6
6
|
license = "MIT"
|
|
7
7
|
authors = [
|
|
8
8
|
{ name = "Runloop", email = "support@runloop.ai" },
|
|
9
9
|
]
|
|
10
|
+
|
|
10
11
|
dependencies = [
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
"httpx>=0.23.0, <1",
|
|
13
|
+
"pydantic>=1.9.0, <3",
|
|
14
|
+
"typing-extensions>=4.10, <5",
|
|
15
|
+
"anyio>=3.5.0, <5",
|
|
16
|
+
"distro>=1.7.0, <2",
|
|
17
|
+
"sniffio",
|
|
17
18
|
"uuid-utils>=0.11.0",
|
|
18
19
|
]
|
|
19
20
|
|
|
@@ -26,6 +27,7 @@ classifiers = [
|
|
|
26
27
|
"Programming Language :: Python :: 3.11",
|
|
27
28
|
"Programming Language :: Python :: 3.12",
|
|
28
29
|
"Programming Language :: Python :: 3.13",
|
|
30
|
+
"Programming Language :: Python :: 3.14",
|
|
29
31
|
"Operating System :: OS Independent",
|
|
30
32
|
"Operating System :: POSIX",
|
|
31
33
|
"Operating System :: MacOS",
|
|
@@ -44,13 +46,19 @@ aiohttp = ["aiohttp", "httpx_aiohttp>=0.1.9"]
|
|
|
44
46
|
|
|
45
47
|
[tool.uv]
|
|
46
48
|
managed = true
|
|
47
|
-
required-version = ">=0.
|
|
49
|
+
required-version = ">=0.9"
|
|
50
|
+
conflicts = [
|
|
51
|
+
[
|
|
52
|
+
{ group = "pydantic-v1" },
|
|
53
|
+
{ group = "pydantic-v2" },
|
|
54
|
+
],
|
|
55
|
+
]
|
|
48
56
|
|
|
49
57
|
[dependency-groups]
|
|
50
58
|
# version pins are in uv.lock
|
|
51
59
|
dev = [
|
|
52
60
|
"pyright==1.1.399",
|
|
53
|
-
"mypy",
|
|
61
|
+
"mypy==1.17",
|
|
54
62
|
"respx",
|
|
55
63
|
"pytest",
|
|
56
64
|
"pytest-asyncio",
|
|
@@ -64,51 +72,24 @@ dev = [
|
|
|
64
72
|
"uuid-utils>=0.11.0",
|
|
65
73
|
"pytest-cov>=7.0.0",
|
|
66
74
|
]
|
|
75
|
+
pydantic-v1 = [
|
|
76
|
+
"pydantic>=1.9.0,<2",
|
|
77
|
+
]
|
|
78
|
+
pydantic-v2 = [
|
|
79
|
+
"pydantic~=2.0 ; python_full_version < '3.14'",
|
|
80
|
+
"pydantic~=2.12 ; python_full_version >= '3.14'",
|
|
81
|
+
]
|
|
67
82
|
docs = [
|
|
68
83
|
"furo>=2025.9.25",
|
|
69
84
|
"sphinx>=7.4.7",
|
|
70
85
|
"sphinx-autodoc-typehints>=2.3.0",
|
|
71
86
|
"sphinx-toolbox>=4.0.0",
|
|
72
87
|
]
|
|
73
|
-
pydantic-v1 = [
|
|
74
|
-
"pydantic>=1.9.0, <2",
|
|
75
|
-
]
|
|
76
|
-
|
|
77
|
-
[tool.rye.scripts]
|
|
78
|
-
format = { chain = [
|
|
79
|
-
"format:ruff",
|
|
80
|
-
"format:docs",
|
|
81
|
-
"fix:ruff",
|
|
82
|
-
# run formatting again to fix any inconsistencies when imports are stripped
|
|
83
|
-
"format:ruff",
|
|
84
|
-
]}
|
|
85
|
-
"format:docs" = "python scripts/utils/ruffen-docs.py README.md api.md"
|
|
86
|
-
"format:ruff" = "ruff format"
|
|
87
|
-
|
|
88
|
-
"lint" = { chain = [
|
|
89
|
-
"check:ruff",
|
|
90
|
-
"typecheck",
|
|
91
|
-
"check:importable",
|
|
92
|
-
]}
|
|
93
|
-
"check:ruff" = "ruff check ."
|
|
94
|
-
"fix:ruff" = "ruff check --fix ."
|
|
95
|
-
|
|
96
|
-
"check:importable" = "python -c 'import runloop_api_client'"
|
|
97
|
-
|
|
98
|
-
typecheck = { chain = [
|
|
99
|
-
"typecheck:pyright",
|
|
100
|
-
"typecheck:mypy"
|
|
101
|
-
]}
|
|
102
|
-
|
|
103
|
-
"typecheck:pyright" = "pyright"
|
|
104
|
-
"typecheck:verify-types" = "pyright --verifytypes runloop_api_client --ignoreexternal"
|
|
105
|
-
"typecheck:mypy" = "mypy ."
|
|
106
88
|
|
|
107
89
|
[build-system]
|
|
108
90
|
requires = ["hatchling==1.26.3", "hatch-fancy-pypi-readme"]
|
|
109
91
|
build-backend = "hatchling.build"
|
|
110
92
|
|
|
111
|
-
|
|
112
93
|
[tool.hatch.build]
|
|
113
94
|
include = [
|
|
114
95
|
"src/*"
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# This file was autogenerated by uv via the following command:
|
|
2
|
+
# uv export -o requirements-dev.lock --no-hashes
|
|
3
|
+
-e .
|
|
4
|
+
annotated-types==0.7.0
|
|
5
|
+
# via pydantic
|
|
6
|
+
anyio==4.12.0
|
|
7
|
+
# via
|
|
8
|
+
# httpx
|
|
9
|
+
# runloop-api-client
|
|
10
|
+
backports-asyncio-runner==1.2.0 ; python_full_version < '3.11'
|
|
11
|
+
# via pytest-asyncio
|
|
12
|
+
certifi==2025.11.12
|
|
13
|
+
# via
|
|
14
|
+
# httpcore
|
|
15
|
+
# httpx
|
|
16
|
+
colorama==0.4.6 ; sys_platform == 'win32'
|
|
17
|
+
# via pytest
|
|
18
|
+
dirty-equals==0.11
|
|
19
|
+
distro==1.9.0
|
|
20
|
+
# via runloop-api-client
|
|
21
|
+
exceptiongroup==1.3.1 ; python_full_version < '3.11'
|
|
22
|
+
# via
|
|
23
|
+
# anyio
|
|
24
|
+
# pytest
|
|
25
|
+
execnet==2.1.2
|
|
26
|
+
# via pytest-xdist
|
|
27
|
+
h11==0.16.0
|
|
28
|
+
# via httpcore
|
|
29
|
+
httpcore==1.0.9
|
|
30
|
+
# via httpx
|
|
31
|
+
httpx==0.28.1
|
|
32
|
+
# via
|
|
33
|
+
# respx
|
|
34
|
+
# runloop-api-client
|
|
35
|
+
idna==3.11
|
|
36
|
+
# via
|
|
37
|
+
# anyio
|
|
38
|
+
# httpx
|
|
39
|
+
importlib-metadata==8.7.0
|
|
40
|
+
iniconfig==2.1.0 ; python_full_version < '3.10'
|
|
41
|
+
# via pytest
|
|
42
|
+
iniconfig==2.3.0 ; python_full_version >= '3.10'
|
|
43
|
+
# via pytest
|
|
44
|
+
markdown-it-py==3.0.0 ; python_full_version < '3.10'
|
|
45
|
+
# via rich
|
|
46
|
+
markdown-it-py==4.0.0 ; python_full_version >= '3.10'
|
|
47
|
+
# via rich
|
|
48
|
+
mdurl==0.1.2
|
|
49
|
+
# via markdown-it-py
|
|
50
|
+
mypy==1.17.0
|
|
51
|
+
mypy-extensions==1.1.0
|
|
52
|
+
# via mypy
|
|
53
|
+
nodeenv==1.9.1
|
|
54
|
+
# via pyright
|
|
55
|
+
packaging==25.0
|
|
56
|
+
# via pytest
|
|
57
|
+
pathspec==0.12.1
|
|
58
|
+
# via mypy
|
|
59
|
+
pluggy==1.6.0
|
|
60
|
+
# via pytest
|
|
61
|
+
pydantic==2.12.5
|
|
62
|
+
# via runloop-api-client
|
|
63
|
+
pydantic-core==2.41.5
|
|
64
|
+
# via pydantic
|
|
65
|
+
pygments==2.19.2
|
|
66
|
+
# via
|
|
67
|
+
# pytest
|
|
68
|
+
# rich
|
|
69
|
+
pyright==1.1.399
|
|
70
|
+
pytest==8.4.2 ; python_full_version < '3.10'
|
|
71
|
+
# via
|
|
72
|
+
# pytest-asyncio
|
|
73
|
+
# pytest-xdist
|
|
74
|
+
pytest==9.0.1 ; python_full_version >= '3.10'
|
|
75
|
+
# via
|
|
76
|
+
# pytest-asyncio
|
|
77
|
+
# pytest-xdist
|
|
78
|
+
pytest-asyncio==1.2.0 ; python_full_version < '3.10'
|
|
79
|
+
pytest-asyncio==1.3.0 ; python_full_version >= '3.10'
|
|
80
|
+
pytest-xdist==3.8.0
|
|
81
|
+
python-dateutil==2.9.0.post0 ; python_full_version < '3.10'
|
|
82
|
+
# via time-machine
|
|
83
|
+
respx==0.22.0
|
|
84
|
+
rich==14.2.0
|
|
85
|
+
ruff==0.14.7
|
|
86
|
+
six==1.17.0 ; python_full_version < '3.10'
|
|
87
|
+
# via python-dateutil
|
|
88
|
+
sniffio==1.3.1
|
|
89
|
+
# via runloop-api-client
|
|
90
|
+
time-machine==2.19.0 ; python_full_version < '3.10'
|
|
91
|
+
time-machine==3.1.0 ; python_full_version >= '3.10'
|
|
92
|
+
tomli==2.3.0 ; python_full_version < '3.11'
|
|
93
|
+
# via
|
|
94
|
+
# mypy
|
|
95
|
+
# pytest
|
|
96
|
+
typing-extensions==4.15.0
|
|
97
|
+
# via
|
|
98
|
+
# anyio
|
|
99
|
+
# exceptiongroup
|
|
100
|
+
# mypy
|
|
101
|
+
# pydantic
|
|
102
|
+
# pydantic-core
|
|
103
|
+
# pyright
|
|
104
|
+
# pytest-asyncio
|
|
105
|
+
# runloop-api-client
|
|
106
|
+
# typing-inspection
|
|
107
|
+
typing-inspection==0.4.2
|
|
108
|
+
# via pydantic
|
|
109
|
+
zipp==3.23.0
|
|
110
|
+
# via importlib-metadata
|
|
@@ -73,22 +73,22 @@ class Stream(Generic[_T]):
|
|
|
73
73
|
process_data = self._client._process_response_data
|
|
74
74
|
iterator = self._iter_events()
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
76
|
+
try:
|
|
77
|
+
for sse in iterator:
|
|
78
|
+
# Surface server-sent error events as API errors to allow callers to handle/retry
|
|
79
|
+
if sse.event == "error":
|
|
80
|
+
try:
|
|
81
|
+
error_obj = json.loads(sse.data)
|
|
82
|
+
status_code = int(error_obj.get("code", 500))
|
|
83
|
+
fake_resp = httpx.Response(status_code, request=response.request, content=sse.data)
|
|
84
|
+
except Exception:
|
|
85
|
+
fake_resp = httpx.Response(500, request=response.request, content=sse.data)
|
|
86
|
+
raise self._client._make_status_error_from_response(fake_resp)
|
|
87
|
+
|
|
88
|
+
yield process_data(data=sse.json(), cast_to=cast_to, response=response)
|
|
89
|
+
finally:
|
|
90
|
+
# Ensure the response is closed even if the consumer doesn't read all data
|
|
91
|
+
response.close()
|
|
92
92
|
|
|
93
93
|
def __enter__(self) -> Self:
|
|
94
94
|
return self
|
|
@@ -147,22 +147,22 @@ class AsyncStream(Generic[_T]):
|
|
|
147
147
|
process_data = self._client._process_response_data
|
|
148
148
|
iterator = self._iter_events()
|
|
149
149
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
150
|
+
try:
|
|
151
|
+
async for sse in iterator:
|
|
152
|
+
# Surface server-sent error events as API errors to allow callers to handle/retry
|
|
153
|
+
if sse.event == "error":
|
|
154
|
+
try:
|
|
155
|
+
error_obj = json.loads(sse.data)
|
|
156
|
+
status_code = int(error_obj.get("code", 500))
|
|
157
|
+
fake_resp = httpx.Response(status_code, request=response.request, content=sse.data)
|
|
158
|
+
except Exception:
|
|
159
|
+
fake_resp = httpx.Response(500, request=response.request, content=sse.data)
|
|
160
|
+
raise self._client._make_status_error_from_response(fake_resp)
|
|
161
|
+
|
|
162
|
+
yield process_data(data=sse.json(), cast_to=cast_to, response=response)
|
|
163
|
+
finally:
|
|
164
|
+
# Ensure the response is closed even if the consumer doesn't read all data
|
|
165
|
+
await response.aclose()
|
|
166
166
|
|
|
167
167
|
async def __aenter__(self) -> Self:
|
|
168
168
|
return self
|