runloop_api_client 0.66.0__tar.gz → 0.67.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-0.67.0/.release-please-manifest.json +3 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/CHANGELOG.md +25 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/PKG-INFO +6 -4
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/README.md +5 -3
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/pyproject.toml +1 -1
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/requirements-dev.lock +11 -40
- runloop_api_client-0.67.0/src/runloop_api_client/_constants.py +23 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_streaming.py +4 -6
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/__init__.py +1 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_sync.py +3 -31
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_utils.py +1 -1
- runloop_api_client-0.67.0/src/runloop_api_client/_utils/_validation.py +31 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_version.py +1 -1
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/blueprints.py +92 -14
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/devboxes.py +57 -39
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/executions.py +8 -4
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_view.py +1 -1
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +6 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +4 -1
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +4 -1
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/launch_parameters.py +1 -1
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/launch_parameters.py +1 -1
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_blueprints.py +44 -0
- runloop_api_client-0.67.0/tests/smoketests/test_blueprints.py +107 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/test_devboxes.py +2 -2
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/test_snapshots.py +11 -7
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_client.py +210 -174
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/uv.lock +92 -117
- runloop_api_client-0.66.0/.release-please-manifest.json +0 -3
- runloop_api_client-0.66.0/src/runloop_api_client/_constants.py +0 -14
- runloop_api_client-0.66.0/tests/smoketests/test_blueprints.py +0 -65
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/.gitignore +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/CONTRIBUTING.md +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/LICENSE +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/SECURITY.md +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/api.md +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/bin/check-release-environment +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/bin/publish-pypi +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/examples/.keep +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/release-please-config.json +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop/lib/.keep +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_base_client.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_client.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_compat.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_exceptions.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_files.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_models.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_qs.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_resource.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_types.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_compat.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_logs.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_proxy.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_reflection.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_streams.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_transform.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_typing.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/lib/.keep +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/lib/polling.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/lib/polling_async.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/pagination.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/py.typed +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/benchmarks/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/benchmarks/benchmarks.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/benchmarks/runs.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/browsers.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/computers.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/objects.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/repositories.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/resources/secrets.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmark_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmarks/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmarks/run_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/benchmarks/run_list_scenario_runs_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_create_from_inspection_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_create_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_create_tunnel_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_remove_tunnel_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_tunnel_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_update_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/browser_create_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/browser_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_create_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/computer_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/input_context.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/input_context_param.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/input_context_update_param.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/inspection_source_param.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_create_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_download_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_download_url_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_list_public_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/object_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_connection_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_connection_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_create_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_inspect_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_inspection_details.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_inspection_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_manifest_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/repository_refresh_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_create_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_environment.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_run_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_update_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenario_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_validate_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scenarios/scorer_validate_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_contract.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_function.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_function_param.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/secret_create_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/secret_list_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/secret_list_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/secret_update_params.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/secret_view.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/after_idle.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/agent_mount_parameters.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/mount.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/object_mount_parameters.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared/run_profile.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/agent_mount_parameters.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/mount.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/object_mount_parameters.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/benchmarks/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/benchmarks/test_runs.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/test_browsers.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/test_computers.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/test_executions.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/devboxes/test_logs.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/scenarios/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/scenarios/test_runs.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/scenarios/test_scorers.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_benchmarks.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_devboxes.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_objects.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_repositories.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_scenarios.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/api_resources/test_secrets.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/conftest.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/sample_file.txt +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/README.md +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/__init__.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/conftest.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/test_executions.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/smoketests/utils.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_deepcopy.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_extract_files.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_files.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_models.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_polling.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_qs.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_required_args.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_response.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_streaming.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_transform.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_utils/test_datetime_parse.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_utils/test_proxy.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/test_utils/test_typing.py +0 -0
- {runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/tests/utils.py +0 -0
|
@@ -1,5 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.67.0 (2025-11-14)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v0.66.1...v0.67.0](https://github.com/runloopai/api-client-python/compare/v0.66.1...v0.67.0)
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
* **api:** api update ([516c20b](https://github.com/runloopai/api-client-python/commit/516c20b3095d7e75b0e15647621bf92e0d79f5f4))
|
|
10
|
+
* **blueprint:** adds queued state ([5893559](https://github.com/runloopai/api-client-python/commit/5893559e8839260876947d31f1090dd343f1cf43))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **client:** close streams without requiring full consumption ([30f9ee5](https://github.com/runloopai/api-client-python/commit/30f9ee5b6cc5f42ce642b918c4e0194a4ab8bc7a))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Chores
|
|
19
|
+
|
|
20
|
+
* **internal/tests:** avoid race condition with implicit client cleanup ([7152280](https://github.com/runloopai/api-client-python/commit/71522809d211f5bbad89be807559ca2de591729f))
|
|
21
|
+
* **internal:** grammar fix (it's -> its) ([fd6963f](https://github.com/runloopai/api-client-python/commit/fd6963f1777dedc2db5b86dc222a5e70521134ba))
|
|
22
|
+
* **package:** drop Python 3.8 support ([5026669](https://github.com/runloopai/api-client-python/commit/50266693caae9b3c6e6506cb58f096f1d439dcd0))
|
|
23
|
+
|
|
24
|
+
## 0.66.1 (2025-10-23)
|
|
25
|
+
|
|
26
|
+
Full Changelog: [v0.66.0...v0.66.1](https://github.com/runloopai/api-client-python/compare/v0.66.0...v0.66.1)
|
|
27
|
+
|
|
3
28
|
## 0.66.0 (2025-10-23)
|
|
4
29
|
|
|
5
30
|
Full Changelog: [v0.65.0...v0.66.0](https://github.com/runloopai/api-client-python/compare/v0.65.0...v0.66.0)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: runloop_api_client
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.67.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
|
|
@@ -38,7 +38,7 @@ Description-Content-Type: text/markdown
|
|
|
38
38
|
<!-- prettier-ignore -->
|
|
39
39
|
[)](https://pypi.org/project/runloop_api_client/)
|
|
40
40
|
|
|
41
|
-
The Runloop Python library provides convenient access to the Runloop REST API from any Python 3.
|
|
41
|
+
The Runloop Python library provides convenient access to the Runloop REST API from any Python 3.9+
|
|
42
42
|
application. The library includes type definitions for all request params and response fields,
|
|
43
43
|
and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
|
|
44
44
|
|
|
@@ -46,7 +46,9 @@ It is generated with [Stainless](https://www.stainless.com/).
|
|
|
46
46
|
|
|
47
47
|
## Documentation
|
|
48
48
|
|
|
49
|
-
The REST API documentation can be found on
|
|
49
|
+
The REST API documentation can be found on
|
|
50
|
+
[runloop.ai](https://runloop.ai). The full API of this library can be found in
|
|
51
|
+
[api.md](https://github.com/runloopai/api-client-python/blob/main/api.md).
|
|
50
52
|
|
|
51
53
|
## Installation
|
|
52
54
|
|
|
@@ -489,7 +491,7 @@ print(runloop_api_client.__version__)
|
|
|
489
491
|
|
|
490
492
|
## Requirements
|
|
491
493
|
|
|
492
|
-
Python 3.
|
|
494
|
+
Python 3.9 or higher.
|
|
493
495
|
|
|
494
496
|
## Contributing
|
|
495
497
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<!-- prettier-ignore -->
|
|
4
4
|
[)](https://pypi.org/project/runloop_api_client/)
|
|
5
5
|
|
|
6
|
-
The Runloop Python library provides convenient access to the Runloop REST API from any Python 3.
|
|
6
|
+
The Runloop Python library provides convenient access to the Runloop REST API from any Python 3.9+
|
|
7
7
|
application. The library includes type definitions for all request params and response fields,
|
|
8
8
|
and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).
|
|
9
9
|
|
|
@@ -11,7 +11,9 @@ It is generated with [Stainless](https://www.stainless.com/).
|
|
|
11
11
|
|
|
12
12
|
## Documentation
|
|
13
13
|
|
|
14
|
-
The REST API documentation can be found on
|
|
14
|
+
The REST API documentation can be found on
|
|
15
|
+
[runloop.ai](https://runloop.ai). The full API of this library can be found in
|
|
16
|
+
[api.md](https://github.com/runloopai/api-client-python/blob/main/api.md).
|
|
15
17
|
|
|
16
18
|
## Installation
|
|
17
19
|
|
|
@@ -454,7 +456,7 @@ print(runloop_api_client.__version__)
|
|
|
454
456
|
|
|
455
457
|
## Requirements
|
|
456
458
|
|
|
457
|
-
Python 3.
|
|
459
|
+
Python 3.9 or higher.
|
|
458
460
|
|
|
459
461
|
## Contributing
|
|
460
462
|
|
|
@@ -3,11 +3,7 @@
|
|
|
3
3
|
-e .
|
|
4
4
|
annotated-types==0.7.0
|
|
5
5
|
# via pydantic
|
|
6
|
-
anyio==4.
|
|
7
|
-
# via
|
|
8
|
-
# httpx
|
|
9
|
-
# runloop-api-client
|
|
10
|
-
anyio==4.8.0 ; python_full_version >= '3.9'
|
|
6
|
+
anyio==4.8.0
|
|
11
7
|
# via
|
|
12
8
|
# httpx
|
|
13
9
|
# runloop-api-client
|
|
@@ -38,8 +34,7 @@ idna==3.10
|
|
|
38
34
|
# via
|
|
39
35
|
# anyio
|
|
40
36
|
# httpx
|
|
41
|
-
importlib-metadata==8.
|
|
42
|
-
importlib-metadata==8.6.1 ; python_full_version >= '3.9'
|
|
37
|
+
importlib-metadata==8.6.1
|
|
43
38
|
iniconfig==2.0.0
|
|
44
39
|
# via pytest
|
|
45
40
|
markdown-it-py==3.0.0
|
|
@@ -55,30 +50,23 @@ packaging==24.2
|
|
|
55
50
|
# via pytest
|
|
56
51
|
pluggy==1.5.0
|
|
57
52
|
# via pytest
|
|
58
|
-
pydantic==2.10.
|
|
53
|
+
pydantic==2.10.3
|
|
59
54
|
# via runloop-api-client
|
|
60
|
-
pydantic==2.
|
|
61
|
-
# via runloop-api-client
|
|
62
|
-
pydantic-core==2.27.2 ; python_full_version < '3.9'
|
|
63
|
-
# via pydantic
|
|
64
|
-
pydantic-core==2.33.2 ; python_full_version >= '3.9'
|
|
55
|
+
pydantic-core==2.27.1
|
|
65
56
|
# via pydantic
|
|
66
57
|
pygments==2.19.1
|
|
67
58
|
# via
|
|
68
59
|
# pytest
|
|
69
60
|
# rich
|
|
70
61
|
pyright==1.1.399
|
|
71
|
-
pytest==8.
|
|
72
|
-
# via
|
|
73
|
-
#
|
|
74
|
-
#
|
|
62
|
+
pytest==8.4.1
|
|
63
|
+
# via
|
|
64
|
+
# pytest-asyncio
|
|
65
|
+
# pytest-xdist
|
|
75
66
|
pytest-asyncio==0.24.0
|
|
76
|
-
pytest-timeout==2.3.1
|
|
77
67
|
pytest-xdist==3.7.0
|
|
78
|
-
python-dateutil==2.
|
|
68
|
+
python-dateutil==2.9.0.post0
|
|
79
69
|
# via time-machine
|
|
80
|
-
pytz==2024.2 ; python_full_version < '3.9'
|
|
81
|
-
# via dirty-equals
|
|
82
70
|
respx==0.22.0
|
|
83
71
|
rich==13.9.4
|
|
84
72
|
ruff==0.9.4
|
|
@@ -88,15 +76,13 @@ sniffio==1.3.1
|
|
|
88
76
|
# via
|
|
89
77
|
# anyio
|
|
90
78
|
# runloop-api-client
|
|
91
|
-
time-machine==2.
|
|
92
|
-
time-machine==2.16.0 ; python_full_version >= '3.9'
|
|
79
|
+
time-machine==2.16.0
|
|
93
80
|
tomli==2.2.1 ; python_full_version < '3.11'
|
|
94
81
|
# via
|
|
95
82
|
# mypy
|
|
96
83
|
# pytest
|
|
97
84
|
typing-extensions==4.12.2
|
|
98
85
|
# via
|
|
99
|
-
# annotated-types
|
|
100
86
|
# anyio
|
|
101
87
|
# mypy
|
|
102
88
|
# pydantic
|
|
@@ -104,20 +90,5 @@ typing-extensions==4.12.2
|
|
|
104
90
|
# pyright
|
|
105
91
|
# rich
|
|
106
92
|
# runloop-api-client
|
|
107
|
-
|
|
108
|
-
typing-inspection==0.4.1 ; python_full_version >= '3.9'
|
|
109
|
-
# via pydantic
|
|
110
|
-
# via pydantic-core
|
|
111
|
-
# via pyright
|
|
112
|
-
# via runloop-api-client
|
|
113
|
-
# via typing-inspection
|
|
114
|
-
typing-inspection==0.4.1
|
|
115
|
-
# via pydantic
|
|
116
|
-
uuid-utils==0.11.0
|
|
117
|
-
# via runloop-api-client
|
|
118
|
-
virtualenv==20.24.5
|
|
119
|
-
# via nox
|
|
120
|
-
yarl==1.20.0
|
|
121
|
-
# via aiohttp
|
|
122
|
-
zipp==3.17.0
|
|
93
|
+
zipp==3.21.0
|
|
123
94
|
# via importlib-metadata
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
|
+
|
|
3
|
+
import httpx
|
|
4
|
+
|
|
5
|
+
RAW_RESPONSE_HEADER = "X-Stainless-Raw-Response"
|
|
6
|
+
OVERRIDE_CAST_TO_HEADER = "____stainless_override_cast_to"
|
|
7
|
+
|
|
8
|
+
# default timeout is 30 seconds
|
|
9
|
+
DEFAULT_TIMEOUT = httpx.Timeout(timeout=30, connect=5.0)
|
|
10
|
+
DEFAULT_MAX_RETRIES = 5
|
|
11
|
+
DEFAULT_CONNECTION_LIMITS = httpx.Limits(max_connections=100, max_keepalive_connections=20)
|
|
12
|
+
|
|
13
|
+
INITIAL_RETRY_DELAY = 1.0
|
|
14
|
+
MAX_RETRY_DELAY = 60.0
|
|
15
|
+
|
|
16
|
+
# Maximum allowed size (in bytes) for individual entries in `file_mounts` when creating Blueprints
|
|
17
|
+
# NOTE: Empirically, ~131,000 is the maximum command length after
|
|
18
|
+
# base64 encoding; 98,250 is the pre-encoded limit that stays within that bound.
|
|
19
|
+
# We measure size in bytes using UTF-8 encoding; base64 output is ASCII.
|
|
20
|
+
FILE_MOUNT_MAX_SIZE_BYTES = 98_250
|
|
21
|
+
|
|
22
|
+
# Maximum allowed total size (in bytes) across all `file_mounts` when creating Blueprints
|
|
23
|
+
FILE_MOUNT_TOTAL_MAX_SIZE_BYTES = 786_000 * 10 # ~10 mb
|
{runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_streaming.py
RENAMED
|
@@ -87,9 +87,8 @@ class Stream(Generic[_T]):
|
|
|
87
87
|
|
|
88
88
|
yield process_data(data=sse.json(), cast_to=cast_to, response=response)
|
|
89
89
|
|
|
90
|
-
#
|
|
91
|
-
|
|
92
|
-
...
|
|
90
|
+
# As we might not fully consume the response stream, we need to close it explicitly
|
|
91
|
+
response.close()
|
|
93
92
|
|
|
94
93
|
def __enter__(self) -> Self:
|
|
95
94
|
return self
|
|
@@ -162,9 +161,8 @@ class AsyncStream(Generic[_T]):
|
|
|
162
161
|
|
|
163
162
|
yield process_data(data=sse.json(), cast_to=cast_to, response=response)
|
|
164
163
|
|
|
165
|
-
#
|
|
166
|
-
|
|
167
|
-
...
|
|
164
|
+
# As we might not fully consume the response stream, we need to close it explicitly
|
|
165
|
+
await response.aclose()
|
|
168
166
|
|
|
169
167
|
async def __aenter__(self) -> Self:
|
|
170
168
|
return self
|
{runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_sync.py
RENAMED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
import sys
|
|
4
3
|
import asyncio
|
|
5
4
|
import functools
|
|
6
|
-
import
|
|
7
|
-
from typing import Any, TypeVar, Callable, Awaitable
|
|
5
|
+
from typing import TypeVar, Callable, Awaitable
|
|
8
6
|
from typing_extensions import ParamSpec
|
|
9
7
|
|
|
10
8
|
import anyio
|
|
@@ -15,34 +13,11 @@ T_Retval = TypeVar("T_Retval")
|
|
|
15
13
|
T_ParamSpec = ParamSpec("T_ParamSpec")
|
|
16
14
|
|
|
17
15
|
|
|
18
|
-
if sys.version_info >= (3, 9):
|
|
19
|
-
_asyncio_to_thread = asyncio.to_thread
|
|
20
|
-
else:
|
|
21
|
-
# backport of https://docs.python.org/3/library/asyncio-task.html#asyncio.to_thread
|
|
22
|
-
# for Python 3.8 support
|
|
23
|
-
async def _asyncio_to_thread(
|
|
24
|
-
func: Callable[T_ParamSpec, T_Retval], /, *args: T_ParamSpec.args, **kwargs: T_ParamSpec.kwargs
|
|
25
|
-
) -> Any:
|
|
26
|
-
"""Asynchronously run function *func* in a separate thread.
|
|
27
|
-
|
|
28
|
-
Any *args and **kwargs supplied for this function are directly passed
|
|
29
|
-
to *func*. Also, the current :class:`contextvars.Context` is propagated,
|
|
30
|
-
allowing context variables from the main thread to be accessed in the
|
|
31
|
-
separate thread.
|
|
32
|
-
|
|
33
|
-
Returns a coroutine that can be awaited to get the eventual result of *func*.
|
|
34
|
-
"""
|
|
35
|
-
loop = asyncio.events.get_running_loop()
|
|
36
|
-
ctx = contextvars.copy_context()
|
|
37
|
-
func_call = functools.partial(ctx.run, func, *args, **kwargs)
|
|
38
|
-
return await loop.run_in_executor(None, func_call)
|
|
39
|
-
|
|
40
|
-
|
|
41
16
|
async def to_thread(
|
|
42
17
|
func: Callable[T_ParamSpec, T_Retval], /, *args: T_ParamSpec.args, **kwargs: T_ParamSpec.kwargs
|
|
43
18
|
) -> T_Retval:
|
|
44
19
|
if sniffio.current_async_library() == "asyncio":
|
|
45
|
-
return await
|
|
20
|
+
return await asyncio.to_thread(func, *args, **kwargs)
|
|
46
21
|
|
|
47
22
|
return await anyio.to_thread.run_sync(
|
|
48
23
|
functools.partial(func, *args, **kwargs),
|
|
@@ -53,10 +28,7 @@ async def to_thread(
|
|
|
53
28
|
def asyncify(function: Callable[T_ParamSpec, T_Retval]) -> Callable[T_ParamSpec, Awaitable[T_Retval]]:
|
|
54
29
|
"""
|
|
55
30
|
Take a blocking function and create an async one that receives the same
|
|
56
|
-
positional and keyword arguments.
|
|
57
|
-
asyncio.to_thread to run the function in a separate thread. For python version
|
|
58
|
-
3.8, it uses locally defined copy of the asyncio.to_thread function which was
|
|
59
|
-
introduced in python 3.9.
|
|
31
|
+
positional and keyword arguments.
|
|
60
32
|
|
|
61
33
|
Usage:
|
|
62
34
|
|
{runloop_api_client-0.66.0 → runloop_api_client-0.67.0}/src/runloop_api_client/_utils/_utils.py
RENAMED
|
@@ -133,7 +133,7 @@ def is_given(obj: _T | NotGiven | Omit) -> TypeGuard[_T]:
|
|
|
133
133
|
# Type safe methods for narrowing types with TypeVars.
|
|
134
134
|
# The default narrowing for isinstance(obj, dict) is dict[unknown, unknown],
|
|
135
135
|
# however this cause Pyright to rightfully report errors. As we know we don't
|
|
136
|
-
# care about the contained types we can safely use `object` in
|
|
136
|
+
# care about the contained types we can safely use `object` in its place.
|
|
137
137
|
#
|
|
138
138
|
# There are two separate functions defined, `is_*` and `is_*_t` for different use cases.
|
|
139
139
|
# `is_*` is for when you're dealing with an unknown input
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ValidationNotification:
|
|
7
|
+
"""Collects validation errors without raising exceptions.
|
|
8
|
+
|
|
9
|
+
This follows the notification pattern: validations append errors, and callers
|
|
10
|
+
decide how to react (e.g., surface all messages at once or abort).
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def __init__(self) -> None:
|
|
14
|
+
self._errors: List[str] = []
|
|
15
|
+
self._causes: List[Optional[Exception]] = []
|
|
16
|
+
|
|
17
|
+
def add_error(self, message: str, cause: Optional[Exception] = None) -> None:
|
|
18
|
+
self._errors.append(message)
|
|
19
|
+
self._causes.append(cause)
|
|
20
|
+
|
|
21
|
+
def has_errors(self) -> bool:
|
|
22
|
+
return len(self._errors) > 0
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def errors(self) -> List[str]:
|
|
26
|
+
# Return a copy to avoid external mutation
|
|
27
|
+
return list(self._errors)
|
|
28
|
+
|
|
29
|
+
def error_message(self) -> str:
|
|
30
|
+
# Join with semicolons to present multiple issues succinctly
|
|
31
|
+
return "; ".join(self._errors)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
|
+
# isort: skip_file
|
|
2
3
|
|
|
3
4
|
from __future__ import annotations
|
|
4
5
|
|
|
@@ -15,6 +16,7 @@ from ..types import (
|
|
|
15
16
|
)
|
|
16
17
|
from .._types import NOT_GIVEN, Body, Omit, Query, Headers, NotGiven, SequenceNotStr, omit, not_given
|
|
17
18
|
from .._utils import maybe_transform, async_maybe_transform
|
|
19
|
+
from .._utils._validation import ValidationNotification
|
|
18
20
|
from .._compat import cached_property
|
|
19
21
|
from .._resource import SyncAPIResource, AsyncAPIResource
|
|
20
22
|
from .._response import (
|
|
@@ -23,6 +25,7 @@ from .._response import (
|
|
|
23
25
|
async_to_raw_response_wrapper,
|
|
24
26
|
async_to_streamed_response_wrapper,
|
|
25
27
|
)
|
|
28
|
+
from .._constants import FILE_MOUNT_MAX_SIZE_BYTES, FILE_MOUNT_TOTAL_MAX_SIZE_BYTES
|
|
26
29
|
from ..pagination import SyncBlueprintsCursorIDPage, AsyncBlueprintsCursorIDPage
|
|
27
30
|
from .._exceptions import RunloopError
|
|
28
31
|
from ..lib.polling import PollingConfig, poll_until
|
|
@@ -50,6 +53,57 @@ class BlueprintRequestArgs(TypedDict, total=False):
|
|
|
50
53
|
__all__ = ["BlueprintsResource", "AsyncBlueprintsResource", "BlueprintRequestArgs"]
|
|
51
54
|
|
|
52
55
|
|
|
56
|
+
def _format_bytes(num_bytes: int) -> str:
|
|
57
|
+
"""Format a byte count in a human-friendly way (KB/MB/GB).
|
|
58
|
+
|
|
59
|
+
Uses binary units (1024). Avoids decimals when exact.
|
|
60
|
+
"""
|
|
61
|
+
if num_bytes < 1024:
|
|
62
|
+
return f"{num_bytes} bytes"
|
|
63
|
+
for factor, unit in ((1 << 30, "GB"), (1 << 20, "MB"), (1 << 10, "KB")):
|
|
64
|
+
if num_bytes >= factor:
|
|
65
|
+
value = num_bytes / factor
|
|
66
|
+
if float(value).is_integer():
|
|
67
|
+
return f"{int(value)} {unit}"
|
|
68
|
+
return f"{value:.1f} {unit}"
|
|
69
|
+
return f"{num_bytes} bytes"
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _validate_file_mounts(file_mounts: Optional[Dict[str, str]] | Omit) -> ValidationNotification:
|
|
73
|
+
"""Validate file_mounts are within size constraints: returns validation failures.
|
|
74
|
+
|
|
75
|
+
Currently enforces a maximum per-file size to avoid server-side issues with
|
|
76
|
+
large inline file contents. Also enforces a maximum total size across all
|
|
77
|
+
file_mounts.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
note = ValidationNotification()
|
|
81
|
+
|
|
82
|
+
if file_mounts is omit or file_mounts is None:
|
|
83
|
+
return note
|
|
84
|
+
|
|
85
|
+
total_size_bytes = 0
|
|
86
|
+
for mount_path, content in file_mounts.items():
|
|
87
|
+
# Measure size in bytes using UTF-8 encoding since payloads are JSON strings
|
|
88
|
+
size_bytes = len(content.encode("utf-8"))
|
|
89
|
+
if size_bytes > FILE_MOUNT_MAX_SIZE_BYTES:
|
|
90
|
+
over = size_bytes - FILE_MOUNT_MAX_SIZE_BYTES
|
|
91
|
+
note.add_error(
|
|
92
|
+
f"file_mount '{mount_path}' is {_format_bytes(over)} over the limit "
|
|
93
|
+
f"({_format_bytes(size_bytes)} / {_format_bytes(FILE_MOUNT_MAX_SIZE_BYTES)}). Use object_mounts instead."
|
|
94
|
+
)
|
|
95
|
+
total_size_bytes += size_bytes
|
|
96
|
+
|
|
97
|
+
if total_size_bytes > FILE_MOUNT_TOTAL_MAX_SIZE_BYTES:
|
|
98
|
+
total_over = total_size_bytes - FILE_MOUNT_TOTAL_MAX_SIZE_BYTES
|
|
99
|
+
note.add_error(
|
|
100
|
+
f"total file_mounts size is {_format_bytes(total_over)} over the limit "
|
|
101
|
+
f"({_format_bytes(total_size_bytes)} / {_format_bytes(FILE_MOUNT_TOTAL_MAX_SIZE_BYTES)}). Use object_mounts instead."
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
return note
|
|
105
|
+
|
|
106
|
+
|
|
53
107
|
class BlueprintsResource(SyncAPIResource):
|
|
54
108
|
@cached_property
|
|
55
109
|
def with_raw_response(self) -> BlueprintsResourceWithRawResponse:
|
|
@@ -144,6 +198,10 @@ class BlueprintsResource(SyncAPIResource):
|
|
|
144
198
|
|
|
145
199
|
idempotency_key: Specify a custom idempotency key for this request
|
|
146
200
|
"""
|
|
201
|
+
note = _validate_file_mounts(file_mounts)
|
|
202
|
+
if note.has_errors():
|
|
203
|
+
raise ValueError(note.error_message())
|
|
204
|
+
|
|
147
205
|
return self._post(
|
|
148
206
|
"/v1/blueprints",
|
|
149
207
|
body=maybe_transform(
|
|
@@ -255,14 +313,18 @@ class BlueprintsResource(SyncAPIResource):
|
|
|
255
313
|
self,
|
|
256
314
|
*,
|
|
257
315
|
name: str,
|
|
258
|
-
base_blueprint_id: Optional[str] |
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
316
|
+
base_blueprint_id: Optional[str] | Omit = omit,
|
|
317
|
+
base_blueprint_name: Optional[str] | Omit = omit,
|
|
318
|
+
build_args: Optional[Dict[str, str]] | Omit = omit,
|
|
319
|
+
code_mounts: Optional[Iterable[CodeMountParameters]] | Omit = omit,
|
|
320
|
+
dockerfile: Optional[str] | Omit = omit,
|
|
321
|
+
file_mounts: Optional[Dict[str, str]] | Omit = omit,
|
|
322
|
+
launch_parameters: Optional[LaunchParameters] | Omit = omit,
|
|
323
|
+
metadata: Optional[Dict[str, str]] | Omit = omit,
|
|
324
|
+
secrets: Optional[Dict[str, str]] | Omit = omit,
|
|
325
|
+
services: Optional[Iterable[blueprint_create_params.Service]] | Omit = omit,
|
|
326
|
+
system_setup_commands: Optional[SequenceNotStr[str]] | Omit = omit,
|
|
263
327
|
polling_config: PollingConfig | None = None,
|
|
264
|
-
services: Optional[Iterable[blueprint_create_params.Service]] | NotGiven = NOT_GIVEN,
|
|
265
|
-
system_setup_commands: Optional[SequenceNotStr[str]] | NotGiven = NOT_GIVEN,
|
|
266
328
|
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
267
329
|
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
268
330
|
extra_headers: Headers | None = None,
|
|
@@ -290,10 +352,14 @@ class BlueprintsResource(SyncAPIResource):
|
|
|
290
352
|
blueprint = self.create(
|
|
291
353
|
name=name,
|
|
292
354
|
base_blueprint_id=base_blueprint_id,
|
|
355
|
+
base_blueprint_name=base_blueprint_name,
|
|
356
|
+
build_args=build_args,
|
|
293
357
|
code_mounts=code_mounts,
|
|
294
358
|
dockerfile=dockerfile,
|
|
295
359
|
file_mounts=file_mounts,
|
|
296
360
|
launch_parameters=launch_parameters,
|
|
361
|
+
metadata=metadata,
|
|
362
|
+
secrets=secrets,
|
|
297
363
|
services=services,
|
|
298
364
|
system_setup_commands=system_setup_commands,
|
|
299
365
|
extra_headers=extra_headers,
|
|
@@ -758,6 +824,10 @@ class AsyncBlueprintsResource(AsyncAPIResource):
|
|
|
758
824
|
|
|
759
825
|
idempotency_key: Specify a custom idempotency key for this request
|
|
760
826
|
"""
|
|
827
|
+
note = _validate_file_mounts(file_mounts)
|
|
828
|
+
if note.has_errors():
|
|
829
|
+
raise ValueError(note.error_message())
|
|
830
|
+
|
|
761
831
|
return await self._post(
|
|
762
832
|
"/v1/blueprints",
|
|
763
833
|
body=await async_maybe_transform(
|
|
@@ -869,14 +939,18 @@ class AsyncBlueprintsResource(AsyncAPIResource):
|
|
|
869
939
|
self,
|
|
870
940
|
*,
|
|
871
941
|
name: str,
|
|
872
|
-
base_blueprint_id: Optional[str] |
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
942
|
+
base_blueprint_id: Optional[str] | Omit = omit,
|
|
943
|
+
base_blueprint_name: Optional[str] | Omit = omit,
|
|
944
|
+
build_args: Optional[Dict[str, str]] | Omit = omit,
|
|
945
|
+
code_mounts: Optional[Iterable[CodeMountParameters]] | Omit = omit,
|
|
946
|
+
dockerfile: Optional[str] | Omit = omit,
|
|
947
|
+
file_mounts: Optional[Dict[str, str]] | Omit = omit,
|
|
948
|
+
launch_parameters: Optional[LaunchParameters] | Omit = omit,
|
|
949
|
+
metadata: Optional[Dict[str, str]] | Omit = omit,
|
|
950
|
+
secrets: Optional[Dict[str, str]] | Omit = omit,
|
|
951
|
+
services: Optional[Iterable[blueprint_create_params.Service]] | Omit = omit,
|
|
952
|
+
system_setup_commands: Optional[SequenceNotStr[str]] | Omit = omit,
|
|
877
953
|
polling_config: PollingConfig | None = None,
|
|
878
|
-
services: Optional[Iterable[blueprint_create_params.Service]] | NotGiven = NOT_GIVEN,
|
|
879
|
-
system_setup_commands: Optional[SequenceNotStr[str]] | NotGiven = NOT_GIVEN,
|
|
880
954
|
# Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
|
|
881
955
|
# The extra values given here take precedence over values defined on the client or passed to this method.
|
|
882
956
|
extra_headers: Headers | None = None,
|
|
@@ -904,10 +978,14 @@ class AsyncBlueprintsResource(AsyncAPIResource):
|
|
|
904
978
|
blueprint = await self.create(
|
|
905
979
|
name=name,
|
|
906
980
|
base_blueprint_id=base_blueprint_id,
|
|
981
|
+
base_blueprint_name=base_blueprint_name,
|
|
982
|
+
build_args=build_args,
|
|
907
983
|
code_mounts=code_mounts,
|
|
908
984
|
dockerfile=dockerfile,
|
|
909
985
|
file_mounts=file_mounts,
|
|
910
986
|
launch_parameters=launch_parameters,
|
|
987
|
+
metadata=metadata,
|
|
988
|
+
secrets=secrets,
|
|
911
989
|
services=services,
|
|
912
990
|
system_setup_commands=system_setup_commands,
|
|
913
991
|
extra_headers=extra_headers,
|