runloop-api-client 1.13.1__tar.gz → 1.13.3__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.13.3/.release-please-manifest.json +3 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/CHANGELOG.md +22 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/PKG-INFO +1 -1
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/README-SDK.md +111 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/pyproject.toml +1 -1
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_version.py +1 -1
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/__init__.py +4 -2
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/_types.py +10 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_axon.py +37 -2
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_devbox.py +3 -1
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/axon.py +37 -2
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/devbox.py +3 -1
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_job_view.py +6 -3
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/async_devbox/test_core.py +24 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/conftest.py +41 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/devbox/test_core.py +23 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_axon.py +37 -1
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_axon.py +35 -1
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_axon.py +48 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_axon.py +48 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/uv.lock +1 -1
- runloop_api_client-1.13.1/.release-please-manifest.json +0 -3
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/.gitignore +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/CONTRIBUTING.md +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/EXAMPLES.md +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/LICENSE +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/README.md +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/SECURITY.md +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/api.md +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/bin/check-release-environment +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/bin/publish-pypi +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/examples/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/examples/_harness.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/examples/blueprint_with_build_context.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/examples/devbox_from_blueprint_lifecycle.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/examples/devbox_snapshot_resume.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/examples/devbox_tunnel.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/examples/example_types.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/examples/mcp_github_tools.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/examples/registry.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/examples/secrets_with_devbox.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/release-please-config.json +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/requirements-dev.lock +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop/lib/.keep +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_base_client.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_client.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_compat.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_constants.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_exceptions.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_files.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_models.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_qs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_resource.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_streaming.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_types.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_compat.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_json.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_logs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_path.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_proxy.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_reflection.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_streams.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_sync.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_transform.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_typing.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_utils.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/_utils/_validation.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/lib/.keep +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/lib/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/lib/_ignore.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/lib/context_loader.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/lib/polling.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/lib/polling_async.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/pagination.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/py.typed +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/agents.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/axons/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/axons/axons.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/axons/sql.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/benchmark_jobs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/benchmark_runs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/benchmarks.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/blueprints.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/devboxes/browsers.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/devboxes/computers.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/devboxes/devboxes.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/devboxes/executions.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/gateway_configs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/mcp_configs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/network_policies.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/objects.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/repositories.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/resources/secrets.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/_helpers.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/agent.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_agent.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_benchmark.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_benchmark_run.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_blueprint.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_execution.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_execution_result.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_gateway_config.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_mcp_config.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_network_policy.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_scenario.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_scenario_builder.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_scenario_run.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_scorer.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_secret.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_snapshot.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_storage_object.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/benchmark.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/benchmark_run.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/blueprint.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/execution.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/execution_result.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/gateway_config.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/mcp_config.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/network_policy.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/scenario.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/scenario_builder.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/scenario_run.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/scorer.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/secret.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/snapshot.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/storage_object.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/sync.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/agent_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/agent_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/agent_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/agent_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axon_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axon_event_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axon_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axon_publish_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axon_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axons/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axons/sql_batch_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axons/sql_batch_result_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axons/sql_column_meta_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axons/sql_query_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axons/sql_query_result_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axons/sql_result_meta_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axons/sql_statement_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axons/sql_step_error_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/axons/sql_step_result_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_job_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_job_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_job_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_run_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_update_scenarios_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/benchmark_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_create_from_inspection_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/blueprint_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_enable_tunnel_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_resource_usage_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_shutdown_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_update_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/browser_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/browser_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/computer_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/computer_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/gateway_config_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/gateway_config_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/gateway_config_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/gateway_config_update_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/gateway_config_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/input_context.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/input_context_param.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/input_context_update_param.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/inspection_source_param.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/mcp_config_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/mcp_config_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/mcp_config_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/mcp_config_update_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/mcp_config_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/network_policy_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/network_policy_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/network_policy_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/network_policy_update_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/network_policy_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/object_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/object_download_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/object_download_url_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/object_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/object_list_public_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/object_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/object_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/publish_result_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/repository_connection_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/repository_connection_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/repository_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/repository_inspect_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/repository_inspection_details.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/repository_inspection_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/repository_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/repository_manifest_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/repository_refresh_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_environment.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_run_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_update_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenario_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scoring_contract.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scoring_function.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scoring_function_param.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/secret_create_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/secret_list_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/secret_list_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/secret_update_params.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/secret_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared/after_idle.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared/agent_mount.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared/agent_source.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared/broker_mount.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared/launch_parameters.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared/mount.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared/object_mount.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared/run_profile.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared_params/agent_mount.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared_params/agent_source.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared_params/broker_mount.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared_params/launch_parameters.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared_params/mount.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared_params/object_mount.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/types/tunnel_view.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/axons/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/axons/test_sql.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/devboxes/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/devboxes/test_browsers.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/devboxes/test_computers.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/devboxes/test_executions.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/devboxes/test_logs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/scenarios/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/scenarios/test_runs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/scenarios/test_scorers.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_agents.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_axons.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_benchmark_jobs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_benchmark_runs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_benchmarks.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_blueprints.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_devboxes.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_gateway_configs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_mcp_configs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_network_policies.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_objects.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_repositories.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_scenarios.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/api_resources/test_secrets.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/conftest.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sample_file.txt +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/async_devbox/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/async_devbox/conftest.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/async_devbox/test_edge_cases.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/async_devbox/test_interfaces.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/async_devbox/test_streaming.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/devbox/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/devbox/conftest.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/devbox/test_edge_cases.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/devbox/test_interfaces.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/devbox/test_streaming.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_agent.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_agent.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_benchmark.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_benchmark_run.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_blueprint.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_execution.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_execution_result.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_gateway_config.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_network_policy.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_ops.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_scenario.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_scenario_builder.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_scenario_run.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_scorer.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_snapshot.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_async_storage_object.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_benchmark.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_benchmark_run.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_blueprint.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_execution.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_execution_result.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_gateway_config.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_helpers.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_network_policy.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_ops.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_scenario.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_scenario_builder.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_scenario_run.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_scorer.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_snapshot.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/sdk/test_storage_object.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/README.md +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/conftest.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/examples/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/examples/test_examples.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/README.md +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/__init__.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/conftest.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_agent.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_agent.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_benchmark.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_blueprint.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_devbox.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_gateway_config.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_network_policy.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_scenario.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_scorer.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_sdk.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_secret.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_snapshot.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_async_storage_object.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_benchmark.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_blueprint.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_devbox.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_gateway_config.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_mcp_config.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_network_policy.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_scenario.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_scorer.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_sdk.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_secret.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_snapshot.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/sdk/test_storage_object.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/test_blueprints.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/test_devboxes.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/test_executions.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/test_snapshots.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/smoketests/utils.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_client.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_command_id.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_deepcopy.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_extract_files.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_files.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_models.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_polling.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_qs.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_required_args.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_response.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_streaming.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_transform.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_utils/test_context_loader.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_utils/test_datetime_parse.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_utils/test_json.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_utils/test_path.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_utils/test_proxy.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/test_utils/test_typing.py +0 -0
- {runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/tests/utils.py +0 -0
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.13.3 (2026-03-26)
|
|
4
|
+
|
|
5
|
+
Full Changelog: [v1.13.2...v1.13.3](https://github.com/runloopai/api-client-python/compare/v1.13.2...v1.13.3)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
* **api:** surface scenario setup failures instead of silently dropping them ([#8300](https://github.com/runloopai/api-client-python/issues/8300)) ([dd910d0](https://github.com/runloopai/api-client-python/commit/dd910d0e867e9964d24cb792b27dd9b56d670a98))
|
|
10
|
+
* **devbox:** `get_tunnel_url` now derives tunnel domain from base url ([#771](https://github.com/runloopai/api-client-python/issues/771)) ([2634c64](https://github.com/runloopai/api-client-python/commit/2634c64f91e187633d0252dcda6449d72631bc09))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Chores
|
|
14
|
+
|
|
15
|
+
* **axon:** add axon to sdk readme ([#769](https://github.com/runloopai/api-client-python/issues/769)) ([68afe5a](https://github.com/runloopai/api-client-python/commit/68afe5aa20120ed5c0aed061d540e287df945f6c))
|
|
16
|
+
|
|
17
|
+
## 1.13.2 (2026-03-25)
|
|
18
|
+
|
|
19
|
+
Full Changelog: [v1.13.1...v1.13.2](https://github.com/runloopai/api-client-python/compare/v1.13.1...v1.13.2)
|
|
20
|
+
|
|
21
|
+
### Bug Fixes
|
|
22
|
+
|
|
23
|
+
* adding axon SQL to sdk ([#767](https://github.com/runloopai/api-client-python/issues/767)) ([d683fd1](https://github.com/runloopai/api-client-python/commit/d683fd189b45120c0d2abe2963236ccb394a5eef))
|
|
24
|
+
|
|
3
25
|
## 1.13.1 (2026-03-25)
|
|
4
26
|
|
|
5
27
|
Full Changelog: [v1.13.0...v1.13.1](https://github.com/runloopai/api-client-python/compare/v1.13.0...v1.13.1)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: runloop_api_client
|
|
3
|
-
Version: 1.13.
|
|
3
|
+
Version: 1.13.3
|
|
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
|
|
@@ -25,6 +25,10 @@ The `RunloopSDK` builds on top of the underlying REST client and provides a Pyth
|
|
|
25
25
|
- [StorageObject](#storageobject)
|
|
26
26
|
- [Storage Object Upload Helpers](#storage-object-upload-helpers)
|
|
27
27
|
- [Mounting Storage Objects to Devboxes](#mounting-storage-objects-to-devboxes)
|
|
28
|
+
- [Axon](#axon)
|
|
29
|
+
- [Publishing Events](#publishing-events)
|
|
30
|
+
- [Subscribing to Events (SSE)](#subscribing-to-events-sse)
|
|
31
|
+
- [SQL Operations](#sql-operations)
|
|
28
32
|
- [Accessing the Underlying REST Client](#accessing-the-underlying-rest-client)
|
|
29
33
|
- [Error Handling](#error-handling)
|
|
30
34
|
- [Advanced Configuration](#advanced-configuration)
|
|
@@ -116,6 +120,7 @@ The SDK provides object-oriented interfaces for all major Runloop resources:
|
|
|
116
120
|
- **`runloop.blueprint`** - Blueprint management (create, list, build blueprints)
|
|
117
121
|
- **`runloop.snapshot`** - Snapshot management (list disk snapshots)
|
|
118
122
|
- **`runloop.storage_object`** - Storage object management (upload, download, list objects)
|
|
123
|
+
- **`runloop.axon`** - [Beta] Axon management (create, publish events, subscribe to SSE streams, SQL queries)
|
|
119
124
|
- **`runloop.secret`** - Secret management (create, update, list, delete encrypted key-value pairs)
|
|
120
125
|
- **`runloop.api`** - Direct access to the underlying REST API client
|
|
121
126
|
|
|
@@ -679,6 +684,112 @@ result = devbox_with_archive.cmd.exec("ls -la /home/user/project/")
|
|
|
679
684
|
print(result.stdout())
|
|
680
685
|
```
|
|
681
686
|
|
|
687
|
+
### Axon
|
|
688
|
+
|
|
689
|
+
> **Beta:** Axon APIs are in beta and may change.
|
|
690
|
+
|
|
691
|
+
Object-oriented interface for working with axons — event communication channels that support
|
|
692
|
+
publishing events, subscribing to event streams via SSE, and executing SQL queries against an
|
|
693
|
+
embedded SQLite database. Created via `runloop.axon.create()` or `runloop.axon.from_id()`:
|
|
694
|
+
|
|
695
|
+
```python
|
|
696
|
+
# Create a new axon
|
|
697
|
+
axon = runloop.axon.create(name="my-axon")
|
|
698
|
+
|
|
699
|
+
# Or get an existing one
|
|
700
|
+
axon = runloop.axon.from_id(axon_id="axn_123")
|
|
701
|
+
|
|
702
|
+
# List all axons
|
|
703
|
+
axons = runloop.axon.list()
|
|
704
|
+
|
|
705
|
+
# Get axon details
|
|
706
|
+
info = axon.get_info()
|
|
707
|
+
print(f"Axon {info.name} created at {info.created_at_ms}")
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
#### Publishing Events
|
|
711
|
+
|
|
712
|
+
Publish structured events to an axon:
|
|
713
|
+
|
|
714
|
+
```python
|
|
715
|
+
result = axon.publish(
|
|
716
|
+
event_type="task_completed",
|
|
717
|
+
origin="AGENT_EVENT", # EXTERNAL_EVENT | AGENT_EVENT | USER_EVENT
|
|
718
|
+
payload='{"task_id": 42, "status": "done"}',
|
|
719
|
+
source="my-agent",
|
|
720
|
+
)
|
|
721
|
+
print(f"Sequence: {result.sequence}, Timestamp: {result.timestamp_ms}")
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
#### Subscribing to Events (SSE)
|
|
725
|
+
|
|
726
|
+
Subscribe to real-time events via server-sent events:
|
|
727
|
+
|
|
728
|
+
```python
|
|
729
|
+
with axon.subscribe_sse() as stream:
|
|
730
|
+
for event in stream:
|
|
731
|
+
print(f"[{event.source}] {event.event_type}: {event.payload}")
|
|
732
|
+
# event.axon_id, event.origin, event.sequence, event.timestamp_ms also available
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
Async:
|
|
736
|
+
|
|
737
|
+
```python
|
|
738
|
+
async with await axon.subscribe_sse() as stream:
|
|
739
|
+
async for event in stream:
|
|
740
|
+
print(f"[{event.source}] {event.event_type}: {event.payload}")
|
|
741
|
+
```
|
|
742
|
+
|
|
743
|
+
#### SQL Operations
|
|
744
|
+
|
|
745
|
+
Each axon has an embedded SQLite database accessible via `axon.sql`:
|
|
746
|
+
|
|
747
|
+
```python
|
|
748
|
+
# Create a table
|
|
749
|
+
axon.sql.query(sql="CREATE TABLE tasks (id INTEGER PRIMARY KEY, name TEXT, done INTEGER)")
|
|
750
|
+
|
|
751
|
+
# Insert with parameterized queries (? placeholders)
|
|
752
|
+
axon.sql.query(
|
|
753
|
+
sql="INSERT INTO tasks (id, name, done) VALUES (?, ?, ?)",
|
|
754
|
+
params=[1, "Write docs", 0],
|
|
755
|
+
)
|
|
756
|
+
|
|
757
|
+
# Query
|
|
758
|
+
result = axon.sql.query(sql="SELECT * FROM tasks WHERE done = ?", params=[0])
|
|
759
|
+
for row in result.rows:
|
|
760
|
+
print(row) # e.g. [1, "Write docs", 0]
|
|
761
|
+
print(result.columns) # [SqlColumnMetaView(name="id", type="INTEGER"), ...]
|
|
762
|
+
print(result.meta) # SqlResultMetaView(changes=0, duration_ms=0.5, rows_read_limit_reached=False)
|
|
763
|
+
```
|
|
764
|
+
|
|
765
|
+
Execute multiple statements atomically with `batch`:
|
|
766
|
+
|
|
767
|
+
```python
|
|
768
|
+
result = axon.sql.batch(
|
|
769
|
+
statements=[
|
|
770
|
+
{"sql": "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)"},
|
|
771
|
+
{"sql": "INSERT INTO users (id, name) VALUES (?, ?)", "params": [1, "Alice"]},
|
|
772
|
+
{"sql": "INSERT INTO users (id, name) VALUES (?, ?)", "params": [2, "Bob"]},
|
|
773
|
+
{"sql": "SELECT * FROM users ORDER BY id"},
|
|
774
|
+
],
|
|
775
|
+
)
|
|
776
|
+
|
|
777
|
+
# Each statement gets a result
|
|
778
|
+
for step in result.results:
|
|
779
|
+
if step.success:
|
|
780
|
+
print(f"Rows: {step.success.rows}, Changes: {step.success.meta.changes}")
|
|
781
|
+
elif step.error:
|
|
782
|
+
print(f"Error: {step.error}")
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
**Key methods:**
|
|
786
|
+
|
|
787
|
+
- `axon.get_info()` – Get axon details (name, created_at_ms)
|
|
788
|
+
- `axon.publish()` – Publish an event (event_type, origin, payload, source)
|
|
789
|
+
- `axon.subscribe_sse()` – Subscribe to event stream (returns `Stream[AxonEventView]`)
|
|
790
|
+
- `axon.sql.query()` – Execute a single SQL statement with optional params
|
|
791
|
+
- `axon.sql.batch()` – Execute multiple SQL statements atomically
|
|
792
|
+
|
|
682
793
|
## Accessing the Underlying REST Client
|
|
683
794
|
|
|
684
795
|
The SDK always exposes the underlying client through the `.api` attribute:
|
{runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/__init__.py
RENAMED
|
@@ -5,7 +5,7 @@ Provides both sync (`RunloopSDK`) and async (`AsyncRunloopSDK`) interfaces.
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
-
from .axon import Axon
|
|
8
|
+
from .axon import Axon, AxonSqlOps
|
|
9
9
|
from .sync import (
|
|
10
10
|
AxonOps,
|
|
11
11
|
AgentOps,
|
|
@@ -48,7 +48,7 @@ from .snapshot import Snapshot
|
|
|
48
48
|
from .benchmark import Benchmark
|
|
49
49
|
from .blueprint import Blueprint
|
|
50
50
|
from .execution import Execution
|
|
51
|
-
from .async_axon import AsyncAxon
|
|
51
|
+
from .async_axon import AsyncAxon, AsyncAxonSqlOps
|
|
52
52
|
from .mcp_config import McpConfig
|
|
53
53
|
from .async_agent import AsyncAgent
|
|
54
54
|
from .async_devbox import AsyncDevbox, AsyncNamedShell
|
|
@@ -111,6 +111,8 @@ __all__ = [
|
|
|
111
111
|
"AsyncAgent",
|
|
112
112
|
"Axon",
|
|
113
113
|
"AsyncAxon",
|
|
114
|
+
"AxonSqlOps",
|
|
115
|
+
"AsyncAxonSqlOps",
|
|
114
116
|
"AsyncSecret",
|
|
115
117
|
"Benchmark",
|
|
116
118
|
"AsyncBenchmark",
|
{runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/_types.py
RENAMED
|
@@ -42,6 +42,8 @@ from ..lib.polling import PollingConfig
|
|
|
42
42
|
from ..types.devboxes import DiskSnapshotListParams, DiskSnapshotUpdateParams
|
|
43
43
|
from ..types.scenarios import ScorerListParams, ScorerCreateParams, ScorerUpdateParams
|
|
44
44
|
from ..types.devbox_create_params import DevboxBaseCreateParams
|
|
45
|
+
from ..types.axons.sql_batch_params import SqlBatchParams
|
|
46
|
+
from ..types.axons.sql_query_params import SqlQueryParams
|
|
45
47
|
from ..types.scenario_start_run_params import ScenarioStartRunBaseParams
|
|
46
48
|
from ..types.benchmark_start_run_params import BenchmarkSelfStartRunParams
|
|
47
49
|
from ..types.devbox_execute_async_params import DevboxNiceExecuteAsyncParams
|
|
@@ -196,6 +198,14 @@ class SDKAxonPublishParams(AxonPublishParams, LongRequestOptions):
|
|
|
196
198
|
pass
|
|
197
199
|
|
|
198
200
|
|
|
201
|
+
class SDKAxonSqlQueryParams(SqlQueryParams, LongRequestOptions):
|
|
202
|
+
pass
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
class SDKAxonSqlBatchParams(SqlBatchParams, LongRequestOptions):
|
|
206
|
+
pass
|
|
207
|
+
|
|
208
|
+
|
|
199
209
|
class SDKScenarioListParams(ScenarioListParams, BaseRequestOptions):
|
|
200
210
|
pass
|
|
201
211
|
|
{runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_axon.py
RENAMED
|
@@ -7,19 +7,48 @@ from typing_extensions import Unpack, override
|
|
|
7
7
|
from ._types import (
|
|
8
8
|
BaseRequestOptions,
|
|
9
9
|
SDKAxonPublishParams,
|
|
10
|
+
SDKAxonSqlBatchParams,
|
|
11
|
+
SDKAxonSqlQueryParams,
|
|
10
12
|
)
|
|
11
13
|
from .._client import AsyncRunloop
|
|
12
14
|
from .._streaming import AsyncStream
|
|
13
15
|
from ..types.axon_view import AxonView
|
|
14
16
|
from ..types.axon_event_view import AxonEventView
|
|
15
17
|
from ..types.publish_result_view import PublishResultView
|
|
18
|
+
from ..types.axons.sql_batch_result_view import SqlBatchResultView
|
|
19
|
+
from ..types.axons.sql_query_result_view import SqlQueryResultView
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class AsyncAxonSqlOps:
|
|
23
|
+
"""[Beta] Async SQL operations for an axon's SQLite database.
|
|
24
|
+
|
|
25
|
+
Access via ``axon.sql``.
|
|
26
|
+
|
|
27
|
+
Example:
|
|
28
|
+
>>> axon = await runloop.axon.create()
|
|
29
|
+
>>> await axon.sql.query(sql="CREATE TABLE tasks (id INTEGER PRIMARY KEY, name TEXT)")
|
|
30
|
+
>>> result = await axon.sql.query(sql="SELECT * FROM tasks WHERE id = ?", params=[1])
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, client: AsyncRunloop, axon_id: str) -> None:
|
|
34
|
+
self._client = client
|
|
35
|
+
self._axon_id = axon_id
|
|
36
|
+
|
|
37
|
+
async def query(self, **params: Unpack[SDKAxonSqlQueryParams]) -> SqlQueryResultView:
|
|
38
|
+
"""[Beta] Execute a single parameterized SQL statement against this axon's SQLite database."""
|
|
39
|
+
return await self._client.axons.sql.query(self._axon_id, **params)
|
|
40
|
+
|
|
41
|
+
async def batch(self, **params: Unpack[SDKAxonSqlBatchParams]) -> SqlBatchResultView:
|
|
42
|
+
"""[Beta] Execute multiple SQL statements atomically within a single transaction."""
|
|
43
|
+
return await self._client.axons.sql.batch(self._axon_id, **params)
|
|
16
44
|
|
|
17
45
|
|
|
18
46
|
class AsyncAxon:
|
|
19
47
|
"""[Beta] Wrapper around asynchronous axon operations.
|
|
20
48
|
|
|
21
|
-
Axons are event communication channels that support publishing events
|
|
22
|
-
|
|
49
|
+
Axons are event communication channels that support publishing events,
|
|
50
|
+
subscribing to event streams via server-sent events (SSE), and executing
|
|
51
|
+
SQL queries against an embedded SQLite database.
|
|
23
52
|
Obtain instances via ``runloop.axon.create()`` or ``runloop.axon.from_id()``.
|
|
24
53
|
|
|
25
54
|
Example:
|
|
@@ -29,11 +58,17 @@ class AsyncAxon:
|
|
|
29
58
|
>>> async with await axon.subscribe_sse() as stream:
|
|
30
59
|
... async for event in stream:
|
|
31
60
|
... print(event.event_type, event.payload)
|
|
61
|
+
>>> await axon.sql.query(sql="CREATE TABLE tasks (id INTEGER PRIMARY KEY, name TEXT)")
|
|
32
62
|
"""
|
|
33
63
|
|
|
34
64
|
def __init__(self, client: AsyncRunloop, axon_id: str) -> None:
|
|
35
65
|
self._client = client
|
|
36
66
|
self._id = axon_id
|
|
67
|
+
self._sql = AsyncAxonSqlOps(client, axon_id)
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def sql(self) -> AsyncAxonSqlOps:
|
|
71
|
+
return self._sql
|
|
37
72
|
|
|
38
73
|
@override
|
|
39
74
|
def __repr__(self) -> str:
|
{runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/async_devbox.py
RENAMED
|
@@ -161,7 +161,9 @@ class AsyncDevbox:
|
|
|
161
161
|
tunnel_view = await self.get_tunnel(**options)
|
|
162
162
|
if tunnel_view is None:
|
|
163
163
|
return None
|
|
164
|
-
|
|
164
|
+
api_host = self._client.base_url.host
|
|
165
|
+
base_domain = api_host[4:] if api_host.startswith("api.") else api_host
|
|
166
|
+
return f"https://{port}-{tunnel_view.tunnel_key}.tunnel.{base_domain}"
|
|
165
167
|
|
|
166
168
|
async def logs(
|
|
167
169
|
self,
|
|
@@ -7,19 +7,48 @@ from typing_extensions import Unpack, override
|
|
|
7
7
|
from ._types import (
|
|
8
8
|
BaseRequestOptions,
|
|
9
9
|
SDKAxonPublishParams,
|
|
10
|
+
SDKAxonSqlBatchParams,
|
|
11
|
+
SDKAxonSqlQueryParams,
|
|
10
12
|
)
|
|
11
13
|
from .._client import Runloop
|
|
12
14
|
from .._streaming import Stream
|
|
13
15
|
from ..types.axon_view import AxonView
|
|
14
16
|
from ..types.axon_event_view import AxonEventView
|
|
15
17
|
from ..types.publish_result_view import PublishResultView
|
|
18
|
+
from ..types.axons.sql_batch_result_view import SqlBatchResultView
|
|
19
|
+
from ..types.axons.sql_query_result_view import SqlQueryResultView
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class AxonSqlOps:
|
|
23
|
+
"""[Beta] SQL operations for an axon's SQLite database.
|
|
24
|
+
|
|
25
|
+
Access via ``axon.sql``.
|
|
26
|
+
|
|
27
|
+
Example:
|
|
28
|
+
>>> axon = runloop.axon.create()
|
|
29
|
+
>>> axon.sql.query(sql="CREATE TABLE tasks (id INTEGER PRIMARY KEY, name TEXT)")
|
|
30
|
+
>>> result = axon.sql.query(sql="SELECT * FROM tasks WHERE id = ?", params=[1])
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, client: Runloop, axon_id: str) -> None:
|
|
34
|
+
self._client = client
|
|
35
|
+
self._axon_id = axon_id
|
|
36
|
+
|
|
37
|
+
def query(self, **params: Unpack[SDKAxonSqlQueryParams]) -> SqlQueryResultView:
|
|
38
|
+
"""[Beta] Execute a single parameterized SQL statement against this axon's SQLite database."""
|
|
39
|
+
return self._client.axons.sql.query(self._axon_id, **params)
|
|
40
|
+
|
|
41
|
+
def batch(self, **params: Unpack[SDKAxonSqlBatchParams]) -> SqlBatchResultView:
|
|
42
|
+
"""[Beta] Execute multiple SQL statements atomically within a single transaction."""
|
|
43
|
+
return self._client.axons.sql.batch(self._axon_id, **params)
|
|
16
44
|
|
|
17
45
|
|
|
18
46
|
class Axon:
|
|
19
47
|
"""[Beta] Wrapper around synchronous axon operations.
|
|
20
48
|
|
|
21
|
-
Axons are event communication channels that support publishing events
|
|
22
|
-
|
|
49
|
+
Axons are event communication channels that support publishing events,
|
|
50
|
+
subscribing to event streams via server-sent events (SSE), and executing
|
|
51
|
+
SQL queries against an embedded SQLite database.
|
|
23
52
|
Obtain instances via ``runloop.axon.create()`` or ``runloop.axon.from_id()``.
|
|
24
53
|
|
|
25
54
|
Example:
|
|
@@ -29,11 +58,17 @@ class Axon:
|
|
|
29
58
|
>>> with axon.subscribe_sse() as stream:
|
|
30
59
|
... for event in stream:
|
|
31
60
|
... print(event.event_type, event.payload)
|
|
61
|
+
>>> axon.sql.query(sql="CREATE TABLE tasks (id INTEGER PRIMARY KEY, name TEXT)")
|
|
32
62
|
"""
|
|
33
63
|
|
|
34
64
|
def __init__(self, client: Runloop, axon_id: str) -> None:
|
|
35
65
|
self._client = client
|
|
36
66
|
self._id = axon_id
|
|
67
|
+
self._sql = AxonSqlOps(client, axon_id)
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def sql(self) -> AxonSqlOps:
|
|
71
|
+
return self._sql
|
|
37
72
|
|
|
38
73
|
@override
|
|
39
74
|
def __repr__(self) -> str:
|
{runloop_api_client-1.13.1 → runloop_api_client-1.13.3}/src/runloop_api_client/sdk/devbox.py
RENAMED
|
@@ -160,7 +160,9 @@ class Devbox:
|
|
|
160
160
|
tunnel_view = self.get_tunnel(**options)
|
|
161
161
|
if tunnel_view is None:
|
|
162
162
|
return None
|
|
163
|
-
|
|
163
|
+
api_host = self._client.base_url.host
|
|
164
|
+
base_domain = api_host[4:] if api_host.startswith("api.") else api_host
|
|
165
|
+
return f"https://{port}-{tunnel_view.tunnel_key}.tunnel.{base_domain}"
|
|
164
166
|
|
|
165
167
|
def logs(
|
|
166
168
|
self,
|
|
@@ -53,9 +53,6 @@ class BenchmarkOutcomeScenarioOutcome(BaseModel):
|
|
|
53
53
|
scenario_name: str
|
|
54
54
|
"""The name of the scenario."""
|
|
55
55
|
|
|
56
|
-
scenario_run_id: str
|
|
57
|
-
"""The ID of the scenario run."""
|
|
58
|
-
|
|
59
56
|
state: Literal["COMPLETED", "FAILED", "TIMEOUT", "CANCELED"]
|
|
60
57
|
"""The final state of the scenario execution."""
|
|
61
58
|
|
|
@@ -68,6 +65,12 @@ class BenchmarkOutcomeScenarioOutcome(BaseModel):
|
|
|
68
65
|
Contains exception type and message.
|
|
69
66
|
"""
|
|
70
67
|
|
|
68
|
+
scenario_run_id: Optional[str] = None
|
|
69
|
+
"""The ID of the scenario run.
|
|
70
|
+
|
|
71
|
+
May be absent if the scenario failed during setup before a run was created.
|
|
72
|
+
"""
|
|
73
|
+
|
|
71
74
|
score: Optional[float] = None
|
|
72
75
|
"""The score achieved for this scenario (0.0 to 1.0).
|
|
73
76
|
|
|
@@ -9,6 +9,7 @@ from __future__ import annotations
|
|
|
9
9
|
from types import SimpleNamespace
|
|
10
10
|
from unittest.mock import AsyncMock
|
|
11
11
|
|
|
12
|
+
import httpx
|
|
12
13
|
import pytest
|
|
13
14
|
|
|
14
15
|
from tests.sdk.conftest import MockDevboxView
|
|
@@ -377,6 +378,7 @@ class TestAsyncDevbox:
|
|
|
377
378
|
tunnel=tunnel_view,
|
|
378
379
|
)
|
|
379
380
|
mock_async_client.devboxes.retrieve = AsyncMock(return_value=devbox_view_with_tunnel)
|
|
381
|
+
mock_async_client.base_url = httpx.URL("https://api.runloop.ai")
|
|
380
382
|
|
|
381
383
|
devbox = AsyncDevbox(mock_async_client, "dbx_123")
|
|
382
384
|
result = await devbox.get_tunnel_url(8080)
|
|
@@ -384,6 +386,28 @@ class TestAsyncDevbox:
|
|
|
384
386
|
assert result == "https://8080-abc123xyz.tunnel.runloop.ai"
|
|
385
387
|
mock_async_client.devboxes.retrieve.assert_called_once_with("dbx_123")
|
|
386
388
|
|
|
389
|
+
@pytest.mark.asyncio
|
|
390
|
+
async def test_get_tunnel_url_derives_domain_from_base_url(self, mock_async_client: AsyncMock) -> None:
|
|
391
|
+
"""Test get_tunnel_url derives tunnel domain from client base_url."""
|
|
392
|
+
tunnel_view = SimpleNamespace(
|
|
393
|
+
tunnel_key="abc123xyz",
|
|
394
|
+
auth_mode="open",
|
|
395
|
+
create_time_ms=1234567890000,
|
|
396
|
+
)
|
|
397
|
+
devbox_view_with_tunnel = SimpleNamespace(
|
|
398
|
+
id="dbx_123",
|
|
399
|
+
status="running",
|
|
400
|
+
tunnel=tunnel_view,
|
|
401
|
+
)
|
|
402
|
+
mock_async_client.devboxes.retrieve = AsyncMock(return_value=devbox_view_with_tunnel)
|
|
403
|
+
devbox = AsyncDevbox(mock_async_client, "dbx_123")
|
|
404
|
+
|
|
405
|
+
mock_async_client.base_url = httpx.URL("https://api.runloop.pro")
|
|
406
|
+
assert await devbox.get_tunnel_url(8080) == "https://8080-abc123xyz.tunnel.runloop.pro"
|
|
407
|
+
|
|
408
|
+
mock_async_client.base_url = httpx.URL("http://127.0.0.1:8080")
|
|
409
|
+
assert await devbox.get_tunnel_url(8080) == "https://8080-abc123xyz.tunnel.127.0.0.1"
|
|
410
|
+
|
|
387
411
|
@pytest.mark.asyncio
|
|
388
412
|
async def test_get_tunnel_url_returns_none_when_no_tunnel(self, mock_async_client: AsyncMock) -> None:
|
|
389
413
|
"""Test get_tunnel_url returns None when no tunnel is enabled."""
|
|
@@ -133,6 +133,47 @@ class MockPublishResultView:
|
|
|
133
133
|
timestamp_ms: int = 1234567890000
|
|
134
134
|
|
|
135
135
|
|
|
136
|
+
@dataclass
|
|
137
|
+
class MockSqlColumnMetaView:
|
|
138
|
+
"""Mock SqlColumnMetaView for testing."""
|
|
139
|
+
|
|
140
|
+
name: str = "id"
|
|
141
|
+
type: str = "INTEGER"
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
@dataclass
|
|
145
|
+
class MockSqlResultMetaView:
|
|
146
|
+
"""Mock SqlResultMetaView for testing."""
|
|
147
|
+
|
|
148
|
+
changes: int = 0
|
|
149
|
+
duration_ms: float = 1.5
|
|
150
|
+
rows_read_limit_reached: bool = False
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@dataclass
|
|
154
|
+
class MockSqlQueryResultView:
|
|
155
|
+
"""Mock SqlQueryResultView for testing."""
|
|
156
|
+
|
|
157
|
+
columns: list[Any] = field(default_factory=lambda: [MockSqlColumnMetaView()])
|
|
158
|
+
meta: Any = field(default_factory=MockSqlResultMetaView)
|
|
159
|
+
rows: list[Any] = field(default_factory=lambda: [[1, "hello"]])
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
@dataclass
|
|
163
|
+
class MockSqlStepResultView:
|
|
164
|
+
"""Mock SqlStepResultView for testing."""
|
|
165
|
+
|
|
166
|
+
success: Any = field(default_factory=lambda: MockSqlQueryResultView())
|
|
167
|
+
error: Any = None
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
@dataclass
|
|
171
|
+
class MockSqlBatchResultView:
|
|
172
|
+
"""Mock SqlBatchResultView for testing."""
|
|
173
|
+
|
|
174
|
+
results: list[Any] = field(default_factory=lambda: [MockSqlStepResultView()])
|
|
175
|
+
|
|
176
|
+
|
|
136
177
|
@dataclass
|
|
137
178
|
class MockScenarioView:
|
|
138
179
|
"""Mock ScenarioView for testing."""
|
|
@@ -9,6 +9,7 @@ from __future__ import annotations
|
|
|
9
9
|
from types import SimpleNamespace
|
|
10
10
|
from unittest.mock import Mock
|
|
11
11
|
|
|
12
|
+
import httpx
|
|
12
13
|
import pytest
|
|
13
14
|
|
|
14
15
|
from tests.sdk.conftest import (
|
|
@@ -373,6 +374,7 @@ class TestDevbox:
|
|
|
373
374
|
tunnel=tunnel_view,
|
|
374
375
|
)
|
|
375
376
|
mock_client.devboxes.retrieve.return_value = devbox_view_with_tunnel
|
|
377
|
+
mock_client.base_url = httpx.URL("https://api.runloop.ai")
|
|
376
378
|
|
|
377
379
|
devbox = Devbox(mock_client, "dbx_123")
|
|
378
380
|
result = devbox.get_tunnel_url(8080)
|
|
@@ -380,6 +382,27 @@ class TestDevbox:
|
|
|
380
382
|
assert result == "https://8080-abc123xyz.tunnel.runloop.ai"
|
|
381
383
|
mock_client.devboxes.retrieve.assert_called_once_with("dbx_123")
|
|
382
384
|
|
|
385
|
+
def test_get_tunnel_url_derives_domain_from_base_url(self, mock_client: Mock) -> None:
|
|
386
|
+
"""Test get_tunnel_url derives tunnel domain from client base_url."""
|
|
387
|
+
tunnel_view = SimpleNamespace(
|
|
388
|
+
tunnel_key="abc123xyz",
|
|
389
|
+
auth_mode="open",
|
|
390
|
+
create_time_ms=1234567890000,
|
|
391
|
+
)
|
|
392
|
+
devbox_view_with_tunnel = SimpleNamespace(
|
|
393
|
+
id="dbx_123",
|
|
394
|
+
status="running",
|
|
395
|
+
tunnel=tunnel_view,
|
|
396
|
+
)
|
|
397
|
+
mock_client.devboxes.retrieve.return_value = devbox_view_with_tunnel
|
|
398
|
+
devbox = Devbox(mock_client, "dbx_123")
|
|
399
|
+
|
|
400
|
+
mock_client.base_url = httpx.URL("https://api.runloop.pro")
|
|
401
|
+
assert devbox.get_tunnel_url(8080) == "https://8080-abc123xyz.tunnel.runloop.pro"
|
|
402
|
+
|
|
403
|
+
mock_client.base_url = httpx.URL("http://127.0.0.1:8080")
|
|
404
|
+
assert devbox.get_tunnel_url(8080) == "https://8080-abc123xyz.tunnel.127.0.0.1"
|
|
405
|
+
|
|
383
406
|
def test_get_tunnel_url_returns_none_when_no_tunnel(self, mock_client: Mock) -> None:
|
|
384
407
|
"""Test get_tunnel_url returns None when no tunnel is enabled."""
|
|
385
408
|
devbox_view_no_tunnel = SimpleNamespace(
|
|
@@ -6,8 +6,9 @@ from unittest.mock import AsyncMock
|
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
8
|
|
|
9
|
-
from tests.sdk.conftest import MockAxonView, MockPublishResultView
|
|
9
|
+
from tests.sdk.conftest import MockAxonView, MockPublishResultView, MockSqlBatchResultView, MockSqlQueryResultView
|
|
10
10
|
from runloop_api_client.sdk import AsyncAxon
|
|
11
|
+
from runloop_api_client.types.axons.sql_statement_params import SqlStatementParams
|
|
11
12
|
|
|
12
13
|
|
|
13
14
|
class TestAsyncAxon:
|
|
@@ -75,3 +76,38 @@ class TestAsyncAxon:
|
|
|
75
76
|
|
|
76
77
|
assert result == mock_stream
|
|
77
78
|
mock_async_client.axons.subscribe_sse.assert_awaited_once_with("axn_123")
|
|
79
|
+
|
|
80
|
+
@pytest.mark.asyncio
|
|
81
|
+
async def test_sql_query(self, mock_async_client: AsyncMock) -> None:
|
|
82
|
+
"""Test sql.query method delegates to client.axons.sql.query."""
|
|
83
|
+
mock_result = MockSqlQueryResultView()
|
|
84
|
+
mock_async_client.axons.sql.query = AsyncMock(return_value=mock_result)
|
|
85
|
+
|
|
86
|
+
axon = AsyncAxon(mock_async_client, "axn_123")
|
|
87
|
+
result = await axon.sql.query(sql="SELECT * FROM test WHERE id = ?", params=[1])
|
|
88
|
+
|
|
89
|
+
assert result == mock_result
|
|
90
|
+
mock_async_client.axons.sql.query.assert_awaited_once_with(
|
|
91
|
+
"axn_123",
|
|
92
|
+
sql="SELECT * FROM test WHERE id = ?",
|
|
93
|
+
params=[1],
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
@pytest.mark.asyncio
|
|
97
|
+
async def test_sql_batch(self, mock_async_client: AsyncMock) -> None:
|
|
98
|
+
"""Test sql.batch method delegates to client.axons.sql.batch."""
|
|
99
|
+
mock_result = MockSqlBatchResultView()
|
|
100
|
+
mock_async_client.axons.sql.batch = AsyncMock(return_value=mock_result)
|
|
101
|
+
|
|
102
|
+
statements: list[SqlStatementParams] = [
|
|
103
|
+
{"sql": "CREATE TABLE t (id INTEGER PRIMARY KEY)"},
|
|
104
|
+
{"sql": "INSERT INTO t (id) VALUES (?)", "params": [1]},
|
|
105
|
+
]
|
|
106
|
+
axon = AsyncAxon(mock_async_client, "axn_123")
|
|
107
|
+
result = await axon.sql.batch(statements=statements)
|
|
108
|
+
|
|
109
|
+
assert result == mock_result
|
|
110
|
+
mock_async_client.axons.sql.batch.assert_awaited_once_with(
|
|
111
|
+
"axn_123",
|
|
112
|
+
statements=statements,
|
|
113
|
+
)
|
|
@@ -4,8 +4,9 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from unittest.mock import Mock
|
|
6
6
|
|
|
7
|
-
from tests.sdk.conftest import MockAxonView, MockPublishResultView
|
|
7
|
+
from tests.sdk.conftest import MockAxonView, MockPublishResultView, MockSqlBatchResultView, MockSqlQueryResultView
|
|
8
8
|
from runloop_api_client.sdk import Axon
|
|
9
|
+
from runloop_api_client.types.axons.sql_statement_params import SqlStatementParams
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class TestAxon:
|
|
@@ -70,3 +71,36 @@ class TestAxon:
|
|
|
70
71
|
|
|
71
72
|
assert result == mock_stream
|
|
72
73
|
mock_client.axons.subscribe_sse.assert_called_once_with("axn_123")
|
|
74
|
+
|
|
75
|
+
def test_sql_query(self, mock_client: Mock) -> None:
|
|
76
|
+
"""Test sql.query method delegates to client.axons.sql.query."""
|
|
77
|
+
mock_result = MockSqlQueryResultView()
|
|
78
|
+
mock_client.axons.sql.query.return_value = mock_result
|
|
79
|
+
|
|
80
|
+
axon = Axon(mock_client, "axn_123")
|
|
81
|
+
result = axon.sql.query(sql="SELECT * FROM test WHERE id = ?", params=[1])
|
|
82
|
+
|
|
83
|
+
assert result == mock_result
|
|
84
|
+
mock_client.axons.sql.query.assert_called_once_with(
|
|
85
|
+
"axn_123",
|
|
86
|
+
sql="SELECT * FROM test WHERE id = ?",
|
|
87
|
+
params=[1],
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
def test_sql_batch(self, mock_client: Mock) -> None:
|
|
91
|
+
"""Test sql.batch method delegates to client.axons.sql.batch."""
|
|
92
|
+
mock_result = MockSqlBatchResultView()
|
|
93
|
+
mock_client.axons.sql.batch.return_value = mock_result
|
|
94
|
+
|
|
95
|
+
statements: list[SqlStatementParams] = [
|
|
96
|
+
{"sql": "CREATE TABLE t (id INTEGER PRIMARY KEY)"},
|
|
97
|
+
{"sql": "INSERT INTO t (id) VALUES (?)", "params": [1]},
|
|
98
|
+
]
|
|
99
|
+
axon = Axon(mock_client, "axn_123")
|
|
100
|
+
result = axon.sql.batch(statements=statements)
|
|
101
|
+
|
|
102
|
+
assert result == mock_result
|
|
103
|
+
mock_client.axons.sql.batch.assert_called_once_with(
|
|
104
|
+
"axn_123",
|
|
105
|
+
statements=statements,
|
|
106
|
+
)
|