scalebox-sdk 1.0.1__tar.gz → 1.0.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.
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/CHANGELOG.md +24 -0
- {scalebox_sdk-1.0.1/scalebox_sdk.egg-info → scalebox_sdk-1.0.3}/PKG-INFO +1 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/pyproject.toml +2 -2
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/__init__.py +1 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/get_sandboxes.py +1 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/error.py +1 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/listed_sandbox.py +6 -3
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/sandbox.py +2 -2
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/code_interpreter/code_interpreter_async.py +3 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/code_interpreter/code_interpreter_sync.py +3 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/connection_config.py +2 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/generated/api_pb2_connect.py +3 -3
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/main.py +1 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_async/main.py +1 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_sync/main.py +1 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/bedrock_openai_adapter.py +8 -2
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/run_stress_code_interpreter_sync.py +18 -6
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/simple_upload_example.py +39 -31
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/stabitiy_test.py +82 -69
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_browser_use.py +4 -2
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_browser_use_scalebox.py +5 -4
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_code_interpreter_execcode.py +289 -211
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_code_interpreter_sync_comprehensive.py +2 -5
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_connect_pause_async.py +34 -11
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_connect_pause_sync.py +49 -16
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_csx_desktop_examples.py +3 -3
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_desktop_sandbox_sf.py +18 -23
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_download_url.py +6 -14
- scalebox_sdk-1.0.3/scalebox/test/test_existing_sandbox.py +1037 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_sandbox_async_comprehensive.py +4 -2
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_sandbox_object_storage_example.py +14 -9
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_sandbox_object_storage_example_async.py +6 -3
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_sandbox_sync_comprehensive.py +1 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_sf.py +12 -8
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_watch_dir_async.py +6 -4
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/testagetinfo.py +1 -3
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/testsandbox_api.py +5 -3
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/testsandbox_async.py +17 -47
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/testsandbox_sync.py +18 -14
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/upload_100mb_example.py +77 -55
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/version.py +2 -2
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3/scalebox_sdk.egg-info}/PKG-INFO +1 -1
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox_sdk.egg-info/SOURCES.txt +1 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/LICENSE +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/MANIFEST.in +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/README.md +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/delete_sandboxes_sandbox_id.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/get_sandboxes_metrics.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/get_sandboxes_sandbox_id.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/get_sandboxes_sandbox_id_logs.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/get_sandboxes_sandbox_id_metrics.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/get_v2_sandboxes.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/post_sandboxes.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/post_sandboxes_sandbox_id_connect.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/post_sandboxes_sandbox_id_pause.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/post_sandboxes_sandbox_id_refreshes.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/post_sandboxes_sandbox_id_resume.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/post_sandboxes_sandbox_id_timeout.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/client.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/errors.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/build_log_entry.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/connect_sandbox.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/created_access_token.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/created_team_api_key.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/identifier_masking_details.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/log_level.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/new_access_token.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/new_sandbox.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/new_team_api_key.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/node.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/node_detail.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/node_status.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/node_status_change.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/post_sandboxes_sandbox_id_refreshes_body.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/post_sandboxes_sandbox_id_timeout_body.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/resumed_sandbox.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/sandbox_detail.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/sandbox_log.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/sandbox_logs.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/sandbox_metric.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/sandbox_state.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/sandboxes_with_metrics.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/team.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/team_api_key.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/team_user.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/template.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/template_build.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/template_build_file_upload.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/template_build_request.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/template_build_request_v2.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/template_build_start_v2.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/template_build_status.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/template_step.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/template_update_request.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/models/update_team_api_key.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/py.typed +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/types.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/metadata.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/cli.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/client/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/client/aclient.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/client/api.proto +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/client/buf.gen.yaml +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/client/client.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/client/requirements.txt +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/code_interpreter/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/code_interpreter/charts.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/code_interpreter/constants.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/code_interpreter/exceptions.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/code_interpreter/models.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/csx_connect/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/csx_connect/client.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/csx_desktop/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/csx_desktop/main.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/exceptions.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/generated/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/generated/api.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/generated/api_pb2.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/generated/api_pb2.pyi +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/generated/rpc.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/generated/versions.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/requirements.txt +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/commands/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/commands/command_handle.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/commands/main.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/filesystem/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/filesystem/filesystem.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/filesystem/watch_handle.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/sandbox_api.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/signature.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox/utils.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_async/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_async/commands/command.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_async/commands/command_handle.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_async/commands/pty.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_async/filesystem/filesystem.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_async/filesystem/watch_handle.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_async/sandbox_api.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_async/utils.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_sync/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_sync/commands/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_sync/commands/command.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_sync/commands/command_handle.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_sync/commands/pty.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_sync/filesystem/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_sync/filesystem/filesystem.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_sync/filesystem/watch_handle.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/sandbox_sync/sandbox_api.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/CODE_INTERPRETER_TESTS_READY.md +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/README.md +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/aclient.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/code_interpreter_centext.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/code_interpreter_centext_sync.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/code_interpreter_test.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/code_interpreter_test_sync.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/run_all_validation_tests.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/run_code_interpreter_tests.sh +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/run_tests.sh +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_basic.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_code_interpreter_async_comprehensive.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_sandbox_stress_and_edge_cases.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/test_sandbox_usage_examples.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/testacreate.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/testcodeinterpreter_async.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/testcodeinterpreter_sync.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/testcomputeuse.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/test/testnovnc.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/utils/__init__.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/utils/httpcoreclient.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/utils/httpxclient.py +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox_sdk.egg-info/dependency_links.txt +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox_sdk.egg-info/entry_points.txt +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox_sdk.egg-info/requires.txt +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox_sdk.egg-info/top_level.txt +0 -0
- {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/setup.cfg +0 -0
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
# Changelog
|
|
2
|
+
## [1.0.3] - 2026-02-03
|
|
3
|
+
|
|
4
|
+
### Added
|
|
5
|
+
- Version 1.0.3 release
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- Automated version bump (patch)
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- Minor improvements and bug fixes
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [1.0.2] - 2026-02-03
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- Version 1.0.2 release
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
- Automated version bump (patch)
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- Minor improvements and bug fixes
|
|
24
|
+
|
|
25
|
+
|
|
2
26
|
## [1.0.1] - 2026-02-03
|
|
3
27
|
|
|
4
28
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scalebox-sdk
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.3
|
|
4
4
|
Summary: ScaleBox Python SDK - A multi-language code execution sandbox with Python, R, Node.js, Deno/TypeScript, Java, and Bash support
|
|
5
5
|
Author-email: ScaleBox Team <dev@scalebox.dev>
|
|
6
6
|
Maintainer-email: ScaleBox Team <dev@scalebox.dev>
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "scalebox-sdk"
|
|
7
|
-
version = "1.0.
|
|
7
|
+
version = "1.0.3"
|
|
8
8
|
description = "ScaleBox Python SDK - A multi-language code execution sandbox with Python, R, Node.js, Deno/TypeScript, Java, and Bash support"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -114,7 +114,7 @@ line_length = 88
|
|
|
114
114
|
known_first_party = ["scalebox"]
|
|
115
115
|
|
|
116
116
|
[tool.mypy]
|
|
117
|
-
python_version = "1.0.
|
|
117
|
+
python_version = "1.0.3"
|
|
118
118
|
ignore_missing_imports = true
|
|
119
119
|
ignore_errors = true
|
|
120
120
|
|
{scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/api/client/api/sandboxes/get_sandboxes.py
RENAMED
|
@@ -36,7 +36,7 @@ def _parse_response(
|
|
|
36
36
|
if response.status_code == 200:
|
|
37
37
|
response_200 = []
|
|
38
38
|
_response_200 = response.json()
|
|
39
|
-
data=_response_200["data"]
|
|
39
|
+
data = _response_200["data"]
|
|
40
40
|
if data["sandboxes"] is None:
|
|
41
41
|
return None
|
|
42
42
|
for response_200_item_data in data["sandboxes"]:
|
|
@@ -97,13 +97,12 @@ class ListedSandbox:
|
|
|
97
97
|
@classmethod
|
|
98
98
|
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
99
99
|
d = dict(src_dict)
|
|
100
|
-
client_id = d.pop("clientID","")
|
|
100
|
+
client_id = d.pop("clientID", "")
|
|
101
101
|
|
|
102
102
|
cpu_count = d.pop("cpu_count")
|
|
103
103
|
|
|
104
104
|
# end_at = isoparse(d.pop("end_at",""))
|
|
105
105
|
|
|
106
|
-
|
|
107
106
|
memory_mb = d.pop("memory_mb")
|
|
108
107
|
|
|
109
108
|
sandbox_id = d.pop("sandbox_id")
|
|
@@ -120,7 +119,11 @@ class ListedSandbox:
|
|
|
120
119
|
metadata = d.pop("metadata", UNSET)
|
|
121
120
|
uptime = d.pop("uptime", UNSET)
|
|
122
121
|
timeout = d.pop("timeout", UNSET)
|
|
123
|
-
end_at = (
|
|
122
|
+
end_at = (
|
|
123
|
+
(started_at + datetime.timedelta(seconds=float(timeout1)))
|
|
124
|
+
if (timeout1 := d.pop("timeout", "0")) is not UNSET and timeout1 is not None
|
|
125
|
+
else None
|
|
126
|
+
)
|
|
124
127
|
|
|
125
128
|
listed_sandbox = cls(
|
|
126
129
|
client_id=client_id,
|
|
@@ -90,8 +90,8 @@ class Sandbox:
|
|
|
90
90
|
|
|
91
91
|
template_id = data.pop("template_id")
|
|
92
92
|
|
|
93
|
-
object_storage = data.pop("object_storage",{})
|
|
94
|
-
network_proxy = data.pop("network_proxy",{})
|
|
93
|
+
object_storage = data.pop("object_storage", {})
|
|
94
|
+
network_proxy = data.pop("network_proxy", {})
|
|
95
95
|
|
|
96
96
|
alias = data.pop("alias", UNSET)
|
|
97
97
|
|
{scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/code_interpreter/code_interpreter_async.py
RENAMED
|
@@ -365,6 +365,8 @@ class AsyncSandbox(BaseAsyncSandbox):
|
|
|
365
365
|
# headers = {
|
|
366
366
|
# "Authorization": "Bearer root",
|
|
367
367
|
# }
|
|
368
|
-
await client.destroy_context(
|
|
368
|
+
await client.destroy_context(
|
|
369
|
+
destroy_context_request, extra_headers=self.connection_config.headers
|
|
370
|
+
)
|
|
369
371
|
except Exception as e:
|
|
370
372
|
logger.warning(f"Failed to destroy context {context.id}: {e}")
|
{scalebox_sdk-1.0.1 → scalebox_sdk-1.0.3}/scalebox/code_interpreter/code_interpreter_sync.py
RENAMED
|
@@ -312,7 +312,9 @@ class Sandbox(BaseSandbox):
|
|
|
312
312
|
# headers = {
|
|
313
313
|
# "Authorization": "Bearer root",
|
|
314
314
|
# }
|
|
315
|
-
client.destroy_context(
|
|
315
|
+
client.destroy_context(
|
|
316
|
+
destroy_context_request, extra_headers=self.connection_config.headers
|
|
317
|
+
)
|
|
316
318
|
|
|
317
319
|
except Exception as e:
|
|
318
320
|
logger.warning(f"Failed to destroy context {context.id}: {e}")
|
|
@@ -10,6 +10,7 @@ REQUEST_TIMEOUT: float = 30.0 # 30 seconds
|
|
|
10
10
|
KEEPALIVE_PING_INTERVAL_SEC = 50 # 50 seconds
|
|
11
11
|
KEEPALIVE_PING_HEADER = "Keepalive-Ping-Interval"
|
|
12
12
|
|
|
13
|
+
|
|
13
14
|
class ApiParams(TypedDict, total=False):
|
|
14
15
|
"""
|
|
15
16
|
Parameters for a request.
|
|
@@ -38,6 +39,7 @@ class ApiParams(TypedDict, total=False):
|
|
|
38
39
|
proxy: Optional[ProxyTypes]
|
|
39
40
|
"""Proxy to use for the request. In case of a sandbox it applies to all **requests made to the returned sandbox**."""
|
|
40
41
|
|
|
42
|
+
|
|
41
43
|
class ConnectionConfig:
|
|
42
44
|
"""
|
|
43
45
|
Configuration for the connection to the API.
|
|
@@ -690,7 +690,7 @@ class ProcessClient:
|
|
|
690
690
|
extra_headers: HeaderInput | None = None,
|
|
691
691
|
timeout_seconds: float | None = None,
|
|
692
692
|
) -> Iterator[api_pb2.ConnectResponse]:
|
|
693
|
-
stream_output = self.call_connect(req, extra_headers,timeout_seconds)
|
|
693
|
+
stream_output = self.call_connect(req, extra_headers, timeout_seconds)
|
|
694
694
|
err = stream_output.error()
|
|
695
695
|
if err is not None:
|
|
696
696
|
raise err
|
|
@@ -725,7 +725,7 @@ class ProcessClient:
|
|
|
725
725
|
extra_headers: HeaderInput | None = None,
|
|
726
726
|
timeout_seconds: float | None = None,
|
|
727
727
|
) -> Iterator[api_pb2.StartResponse]:
|
|
728
|
-
stream_output = self.call_start(req, extra_headers,timeout_seconds)
|
|
728
|
+
stream_output = self.call_start(req, extra_headers, timeout_seconds)
|
|
729
729
|
err = stream_output.error()
|
|
730
730
|
if err is not None:
|
|
731
731
|
raise err
|
|
@@ -943,7 +943,7 @@ class AsyncProcessClient:
|
|
|
943
943
|
extra_headers: HeaderInput | None = None,
|
|
944
944
|
timeout_seconds: float | None = None,
|
|
945
945
|
) -> AsyncIterator[api_pb2.StartResponse]:
|
|
946
|
-
stream_output = await self.call_start(req, extra_headers,timeout_seconds)
|
|
946
|
+
stream_output = await self.call_start(req, extra_headers, timeout_seconds)
|
|
947
947
|
err = stream_output.error()
|
|
948
948
|
if err is not None:
|
|
949
949
|
raise err
|
|
@@ -141,6 +141,6 @@ class SandboxSetup(ABC):
|
|
|
141
141
|
"""
|
|
142
142
|
if self.connection_config.debug:
|
|
143
143
|
debug_host = self.connection_config.debug_host
|
|
144
|
-
return
|
|
144
|
+
return debug_host
|
|
145
145
|
return f"{self.sandbox_domain}"
|
|
146
146
|
# return f"{port}-{self.sandbox_id}.{self.sandbox_domain}"
|
|
@@ -145,7 +145,7 @@ class AsyncSandbox(SandboxSetup, SandboxApi):
|
|
|
145
145
|
self._sandbox_domain = opts["sandbox_domain"] or self.connection_config.domain
|
|
146
146
|
debug=self._connection_config.debug
|
|
147
147
|
if debug:
|
|
148
|
-
self._envd_api_url =
|
|
148
|
+
self._envd_api_url = self.get_host(8888)
|
|
149
149
|
else:
|
|
150
150
|
self._envd_api_url = f"https://{self.get_host(self.envd_port)}"
|
|
151
151
|
self._envd_version = opts["envd_version"]
|
|
@@ -174,7 +174,7 @@ class Sandbox(SandboxSetup, SandboxApi):
|
|
|
174
174
|
|
|
175
175
|
self._sandbox_domain = self._sandbox_domain or self._connection_config.domain
|
|
176
176
|
if debug:
|
|
177
|
-
self._envd_api_url =
|
|
177
|
+
self._envd_api_url = self.get_host(8888)
|
|
178
178
|
else:
|
|
179
179
|
self._envd_api_url = f"https://{self.get_host(self.envd_port)}"
|
|
180
180
|
self._transport = TransportWithLogger(limits=self._limits, proxy=self._connection_config.proxy)
|
|
@@ -6,22 +6,25 @@ POST /v1/chat/completions -> Bedrock invoke-model
|
|
|
6
6
|
import json, boto3, os
|
|
7
7
|
from fastapi import FastAPI, Response, status
|
|
8
8
|
from pydantic import BaseModel
|
|
9
|
-
from typing import List, Dict
|
|
9
|
+
from typing import List, Dict # <- 修正语法
|
|
10
10
|
|
|
11
11
|
app = FastAPI()
|
|
12
12
|
BEDROCK = boto3.client("bedrock-runtime", region_name="us-east-1")
|
|
13
13
|
MODEL_ID = "us.anthropic.claude-3-7-sonnet-20250219-v1:0"
|
|
14
14
|
|
|
15
|
+
|
|
15
16
|
class Message(BaseModel):
|
|
16
17
|
role: str
|
|
17
18
|
content: str
|
|
18
19
|
|
|
20
|
+
|
|
19
21
|
class ChatRequest(BaseModel):
|
|
20
22
|
model: str
|
|
21
23
|
messages: List[Message]
|
|
22
24
|
max_tokens: int = 4096
|
|
23
25
|
temperature: float = 0.1
|
|
24
26
|
|
|
27
|
+
|
|
25
28
|
@app.post("/v1/chat/completions")
|
|
26
29
|
def chat_completions(req: ChatRequest):
|
|
27
30
|
# 1. OpenAI -> Claude 格式
|
|
@@ -57,11 +60,14 @@ def chat_completions(req: ChatRequest):
|
|
|
57
60
|
}
|
|
58
61
|
return Response(content=json.dumps(openai_reply), media_type="application/json")
|
|
59
62
|
|
|
63
|
+
|
|
60
64
|
# 健康检查
|
|
61
65
|
@app.get("/v1/models")
|
|
62
66
|
def models():
|
|
63
67
|
return {"data": [{"id": "gpt-4", "object": "model"}]}
|
|
64
68
|
|
|
69
|
+
|
|
65
70
|
if __name__ == "__main__":
|
|
66
71
|
import uvicorn
|
|
67
|
-
|
|
72
|
+
|
|
73
|
+
uvicorn.run(app, host="0.0.0.0", port=8000)
|
|
@@ -8,7 +8,9 @@ import re
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
REPO_ROOT = "/root/scalebox"
|
|
11
|
-
TEST_FILE = os.path.join(
|
|
11
|
+
TEST_FILE = os.path.join(
|
|
12
|
+
REPO_ROOT, "test", "test_code_interpreter_sync_comprehensive.py"
|
|
13
|
+
)
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
def _extract_final_report(stdout_text: str) -> str:
|
|
@@ -16,12 +18,22 @@ def _extract_final_report(stdout_text: str) -> str:
|
|
|
16
18
|
if not lines:
|
|
17
19
|
return ""
|
|
18
20
|
# Prefer capturing from the last report title to include full details
|
|
19
|
-
title_indices = [
|
|
21
|
+
title_indices = [
|
|
22
|
+
i
|
|
23
|
+
for i, line in enumerate(lines)
|
|
24
|
+
if "CodeInterpreter" in line and "测试报告" in line
|
|
25
|
+
]
|
|
20
26
|
if title_indices:
|
|
21
27
|
start_idx = title_indices[-1]
|
|
22
28
|
return "\n".join(lines[start_idx:]).strip()
|
|
23
29
|
# Fallback: last long '====' separator block
|
|
24
|
-
sep_indices = [
|
|
30
|
+
sep_indices = [
|
|
31
|
+
i
|
|
32
|
+
for i, line in enumerate(lines)
|
|
33
|
+
if line.strip().startswith("=")
|
|
34
|
+
and set(line.strip()) == {"="}
|
|
35
|
+
and len(line.strip()) >= 20
|
|
36
|
+
]
|
|
25
37
|
if sep_indices:
|
|
26
38
|
start_idx = sep_indices[-1]
|
|
27
39
|
return "\n".join(lines[start_idx:]).strip()
|
|
@@ -138,7 +150,9 @@ async def run_concurrent(concurrency: int) -> None:
|
|
|
138
150
|
|
|
139
151
|
total_time = time.perf_counter() - started_at
|
|
140
152
|
print("-" * 64)
|
|
141
|
-
print(
|
|
153
|
+
print(
|
|
154
|
+
f"Completed: {completed}, Passed: {passed}, Failed: {failed}, Total time: {total_time:.2f}s"
|
|
155
|
+
)
|
|
142
156
|
|
|
143
157
|
|
|
144
158
|
def main() -> None:
|
|
@@ -162,5 +176,3 @@ def main() -> None:
|
|
|
162
176
|
|
|
163
177
|
if __name__ == "__main__":
|
|
164
178
|
main()
|
|
165
|
-
|
|
166
|
-
|
|
@@ -11,99 +11,106 @@ from scalebox.sandbox_sync.main import Sandbox
|
|
|
11
11
|
from scalebox.connection_config import ConnectionConfig
|
|
12
12
|
|
|
13
13
|
# 配置日志
|
|
14
|
-
logging.basicConfig(
|
|
14
|
+
logging.basicConfig(
|
|
15
|
+
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
|
|
16
|
+
)
|
|
15
17
|
logger = logging.getLogger(__name__)
|
|
16
18
|
|
|
19
|
+
|
|
17
20
|
def create_test_file(file_path: str, size_mb: int = 100):
|
|
18
21
|
"""创建指定大小的测试文件"""
|
|
19
22
|
logger.info(f"创建 {size_mb}MB 测试文件: {file_path}")
|
|
20
|
-
|
|
23
|
+
|
|
21
24
|
file_size = size_mb * 1024 * 1024 # 转换为字节
|
|
22
25
|
chunk_size = 1024 * 1024 # 1MB 块
|
|
23
|
-
|
|
24
|
-
with open(file_path,
|
|
26
|
+
|
|
27
|
+
with open(file_path, "wb") as f:
|
|
25
28
|
written = 0
|
|
26
29
|
while written < file_size:
|
|
27
30
|
# 生成测试数据
|
|
28
|
-
chunk_data = bytes(
|
|
31
|
+
chunk_data = bytes(
|
|
32
|
+
[i % 256 for i in range(min(chunk_size, file_size - written))]
|
|
33
|
+
)
|
|
29
34
|
f.write(chunk_data)
|
|
30
35
|
written += len(chunk_data)
|
|
31
|
-
|
|
36
|
+
|
|
32
37
|
if written % (10 * 1024 * 1024) == 0: # 每10MB显示进度
|
|
33
38
|
logger.info(f"进度: {written // (1024*1024)}MB")
|
|
34
|
-
|
|
39
|
+
|
|
35
40
|
logger.info(f"文件创建完成: {os.path.getsize(file_path) / (1024*1024):.2f}MB")
|
|
36
41
|
|
|
42
|
+
|
|
37
43
|
def main():
|
|
38
44
|
"""主函数 - 演示文件上传"""
|
|
39
|
-
|
|
45
|
+
|
|
40
46
|
# 1. 创建 100MB 测试文件
|
|
41
47
|
test_file = "/tmp/test_100mb.bin"
|
|
42
48
|
create_test_file(test_file, 100)
|
|
43
|
-
|
|
49
|
+
|
|
44
50
|
# 2. 创建沙箱连接配置
|
|
45
51
|
connection_config = ConnectionConfig(
|
|
46
|
-
debug=True, # 调试模式
|
|
47
|
-
request_timeout=300.0 # 5分钟超时
|
|
52
|
+
debug=True, request_timeout=300.0 # 调试模式 # 5分钟超时
|
|
48
53
|
)
|
|
49
|
-
|
|
54
|
+
|
|
50
55
|
# 3. 创建沙箱实例
|
|
51
56
|
logger.info("连接沙箱...")
|
|
52
57
|
sandbox = Sandbox(
|
|
53
58
|
sandbox_id="upload_test_sandbox",
|
|
54
59
|
sandbox_domain=None,
|
|
55
|
-
envd_version="v1.0",
|
|
60
|
+
envd_version="v1.0",
|
|
56
61
|
envd_access_token=None,
|
|
57
|
-
connection_config=connection_config
|
|
62
|
+
connection_config=connection_config,
|
|
58
63
|
)
|
|
59
|
-
|
|
64
|
+
|
|
60
65
|
try:
|
|
61
66
|
# 4. 检查沙箱状态
|
|
62
67
|
if not sandbox.is_running():
|
|
63
68
|
logger.error("沙箱未运行")
|
|
64
69
|
return
|
|
65
|
-
|
|
70
|
+
|
|
66
71
|
logger.info(f"沙箱连接成功: {sandbox.sandbox_id}")
|
|
67
|
-
|
|
72
|
+
|
|
68
73
|
# 5. 读取本地文件
|
|
69
74
|
logger.info("读取本地文件...")
|
|
70
75
|
start_time = time.time()
|
|
71
|
-
|
|
72
|
-
with open(test_file,
|
|
76
|
+
|
|
77
|
+
with open(test_file, "rb") as f:
|
|
73
78
|
file_data = f.read()
|
|
74
|
-
|
|
79
|
+
|
|
75
80
|
read_time = time.time() - start_time
|
|
76
|
-
logger.info(
|
|
77
|
-
|
|
81
|
+
logger.info(
|
|
82
|
+
f"文件读取完成: {len(file_data) / (1024*1024):.2f}MB, 耗时: {read_time:.2f}秒"
|
|
83
|
+
)
|
|
84
|
+
|
|
78
85
|
# 6. 上传文件到沙箱
|
|
79
86
|
logger.info("开始上传文件到沙箱...")
|
|
80
87
|
upload_start = time.time()
|
|
81
|
-
|
|
88
|
+
|
|
82
89
|
# 使用 filesystem.write 方法上传
|
|
83
90
|
result = sandbox.files.write("/tmp/uploaded_100mb.bin", file_data)
|
|
84
|
-
|
|
91
|
+
|
|
85
92
|
upload_time = time.time() - upload_start
|
|
86
93
|
logger.info(f"上传完成: {result.path}")
|
|
87
94
|
logger.info(f"上传耗时: {upload_time:.2f}秒")
|
|
88
95
|
logger.info(f"上传速度: {len(file_data) / (1024*1024) / upload_time:.2f} MB/s")
|
|
89
|
-
|
|
96
|
+
|
|
90
97
|
# 7. 验证上传结果
|
|
91
98
|
logger.info("验证上传结果...")
|
|
92
|
-
|
|
99
|
+
|
|
93
100
|
# 检查文件是否存在
|
|
94
101
|
if sandbox.files.exists("/tmp/uploaded_100mb.bin"):
|
|
95
102
|
logger.info("✅ 文件上传成功")
|
|
96
|
-
|
|
103
|
+
|
|
97
104
|
# 获取文件信息
|
|
98
105
|
file_info = sandbox.files.get_info("/tmp/uploaded_100mb.bin")
|
|
99
106
|
logger.info(f"文件信息: 路径={file_info.path}, 大小={file_info.size}字节")
|
|
100
|
-
|
|
107
|
+
|
|
101
108
|
else:
|
|
102
109
|
logger.error("❌ 文件上传失败")
|
|
103
|
-
|
|
110
|
+
|
|
104
111
|
except Exception as e:
|
|
105
112
|
logger.error(f"上传过程中发生错误: {e}")
|
|
106
|
-
|
|
113
|
+
|
|
107
114
|
finally:
|
|
108
115
|
# 8. 清理资源
|
|
109
116
|
try:
|
|
@@ -111,7 +118,7 @@ def main():
|
|
|
111
118
|
logger.info("沙箱已清理")
|
|
112
119
|
except Exception as e:
|
|
113
120
|
logger.warning(f"清理沙箱时发生错误: {e}")
|
|
114
|
-
|
|
121
|
+
|
|
115
122
|
# 删除本地测试文件
|
|
116
123
|
try:
|
|
117
124
|
os.remove(test_file)
|
|
@@ -119,5 +126,6 @@ def main():
|
|
|
119
126
|
except Exception as e:
|
|
120
127
|
logger.warning(f"删除本地文件时发生错误: {e}")
|
|
121
128
|
|
|
129
|
+
|
|
122
130
|
if __name__ == "__main__":
|
|
123
131
|
main()
|