scalebox-sdk 1.0.1__tar.gz → 1.0.2__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.
Files changed (182) hide show
  1. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/CHANGELOG.md +12 -0
  2. {scalebox_sdk-1.0.1/scalebox_sdk.egg-info → scalebox_sdk-1.0.2}/PKG-INFO +1 -1
  3. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/pyproject.toml +2 -2
  4. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/__init__.py +1 -1
  5. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/get_sandboxes.py +1 -1
  6. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/error.py +1 -1
  7. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/listed_sandbox.py +6 -3
  8. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/sandbox.py +2 -2
  9. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/code_interpreter/code_interpreter_async.py +3 -1
  10. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/code_interpreter/code_interpreter_sync.py +3 -1
  11. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/connection_config.py +2 -0
  12. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/generated/api_pb2_connect.py +3 -3
  13. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/main.py +4 -4
  14. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/bedrock_openai_adapter.py +8 -2
  15. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/run_stress_code_interpreter_sync.py +18 -6
  16. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/simple_upload_example.py +39 -31
  17. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/stabitiy_test.py +82 -69
  18. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_browser_use.py +4 -2
  19. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_browser_use_scalebox.py +5 -4
  20. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_code_interpreter_execcode.py +289 -211
  21. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_code_interpreter_sync_comprehensive.py +2 -5
  22. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_connect_pause_async.py +34 -11
  23. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_connect_pause_sync.py +49 -16
  24. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_csx_desktop_examples.py +3 -3
  25. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_desktop_sandbox_sf.py +18 -23
  26. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_download_url.py +6 -14
  27. scalebox_sdk-1.0.2/scalebox/test/test_existing_sandbox.py +1037 -0
  28. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_sandbox_async_comprehensive.py +4 -2
  29. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_sandbox_object_storage_example.py +14 -9
  30. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_sandbox_object_storage_example_async.py +6 -3
  31. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_sandbox_sync_comprehensive.py +1 -1
  32. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_sf.py +12 -8
  33. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_watch_dir_async.py +6 -4
  34. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/testagetinfo.py +1 -3
  35. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/testsandbox_api.py +5 -3
  36. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/testsandbox_async.py +17 -47
  37. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/testsandbox_sync.py +18 -14
  38. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/upload_100mb_example.py +77 -55
  39. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/version.py +2 -2
  40. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2/scalebox_sdk.egg-info}/PKG-INFO +1 -1
  41. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox_sdk.egg-info/SOURCES.txt +1 -0
  42. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/LICENSE +0 -0
  43. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/MANIFEST.in +0 -0
  44. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/README.md +0 -0
  45. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/__init__.py +0 -0
  46. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/__init__.py +0 -0
  47. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/__init__.py +0 -0
  48. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/__init__.py +0 -0
  49. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/delete_sandboxes_sandbox_id.py +0 -0
  50. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/get_sandboxes_metrics.py +0 -0
  51. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/get_sandboxes_sandbox_id.py +0 -0
  52. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/get_sandboxes_sandbox_id_logs.py +0 -0
  53. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/get_sandboxes_sandbox_id_metrics.py +0 -0
  54. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/get_v2_sandboxes.py +0 -0
  55. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/post_sandboxes.py +0 -0
  56. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/post_sandboxes_sandbox_id_connect.py +0 -0
  57. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/post_sandboxes_sandbox_id_pause.py +0 -0
  58. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/post_sandboxes_sandbox_id_refreshes.py +0 -0
  59. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/post_sandboxes_sandbox_id_resume.py +0 -0
  60. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/api/sandboxes/post_sandboxes_sandbox_id_timeout.py +0 -0
  61. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/client.py +0 -0
  62. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/errors.py +0 -0
  63. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/__init__.py +0 -0
  64. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/build_log_entry.py +0 -0
  65. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/connect_sandbox.py +0 -0
  66. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/created_access_token.py +0 -0
  67. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/created_team_api_key.py +0 -0
  68. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/identifier_masking_details.py +0 -0
  69. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/log_level.py +0 -0
  70. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/new_access_token.py +0 -0
  71. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/new_sandbox.py +0 -0
  72. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/new_team_api_key.py +0 -0
  73. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/node.py +0 -0
  74. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/node_detail.py +0 -0
  75. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/node_status.py +0 -0
  76. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/node_status_change.py +0 -0
  77. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/post_sandboxes_sandbox_id_refreshes_body.py +0 -0
  78. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/post_sandboxes_sandbox_id_timeout_body.py +0 -0
  79. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/resumed_sandbox.py +0 -0
  80. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/sandbox_detail.py +0 -0
  81. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/sandbox_log.py +0 -0
  82. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/sandbox_logs.py +0 -0
  83. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/sandbox_metric.py +0 -0
  84. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/sandbox_state.py +0 -0
  85. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/sandboxes_with_metrics.py +0 -0
  86. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/team.py +0 -0
  87. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/team_api_key.py +0 -0
  88. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/team_user.py +0 -0
  89. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/template.py +0 -0
  90. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/template_build.py +0 -0
  91. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/template_build_file_upload.py +0 -0
  92. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/template_build_request.py +0 -0
  93. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/template_build_request_v2.py +0 -0
  94. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/template_build_start_v2.py +0 -0
  95. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/template_build_status.py +0 -0
  96. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/template_step.py +0 -0
  97. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/template_update_request.py +0 -0
  98. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/models/update_team_api_key.py +0 -0
  99. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/py.typed +0 -0
  100. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/client/types.py +0 -0
  101. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/api/metadata.py +0 -0
  102. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/cli.py +0 -0
  103. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/client/__init__.py +0 -0
  104. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/client/aclient.py +0 -0
  105. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/client/api.proto +0 -0
  106. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/client/buf.gen.yaml +0 -0
  107. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/client/client.py +0 -0
  108. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/client/requirements.txt +0 -0
  109. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/code_interpreter/__init__.py +0 -0
  110. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/code_interpreter/charts.py +0 -0
  111. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/code_interpreter/constants.py +0 -0
  112. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/code_interpreter/exceptions.py +0 -0
  113. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/code_interpreter/models.py +0 -0
  114. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/csx_connect/__init__.py +0 -0
  115. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/csx_connect/client.py +0 -0
  116. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/csx_desktop/__init__.py +0 -0
  117. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/csx_desktop/main.py +0 -0
  118. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/exceptions.py +0 -0
  119. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/generated/__init__.py +0 -0
  120. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/generated/api.py +0 -0
  121. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/generated/api_pb2.py +0 -0
  122. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/generated/api_pb2.pyi +0 -0
  123. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/generated/rpc.py +0 -0
  124. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/generated/versions.py +0 -0
  125. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/requirements.txt +0 -0
  126. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/__init__.py +0 -0
  127. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/commands/__init__.py +0 -0
  128. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/commands/command_handle.py +0 -0
  129. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/commands/main.py +0 -0
  130. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/filesystem/__init__.py +0 -0
  131. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/filesystem/filesystem.py +0 -0
  132. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/filesystem/watch_handle.py +0 -0
  133. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/sandbox_api.py +0 -0
  134. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/signature.py +0 -0
  135. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox/utils.py +0 -0
  136. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_async/__init__.py +0 -0
  137. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_async/commands/command.py +0 -0
  138. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_async/commands/command_handle.py +0 -0
  139. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_async/commands/pty.py +0 -0
  140. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_async/filesystem/filesystem.py +0 -0
  141. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_async/filesystem/watch_handle.py +0 -0
  142. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_async/main.py +0 -0
  143. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_async/sandbox_api.py +0 -0
  144. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_async/utils.py +0 -0
  145. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_sync/__init__.py +0 -0
  146. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_sync/commands/__init__.py +0 -0
  147. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_sync/commands/command.py +0 -0
  148. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_sync/commands/command_handle.py +0 -0
  149. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_sync/commands/pty.py +0 -0
  150. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_sync/filesystem/__init__.py +0 -0
  151. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_sync/filesystem/filesystem.py +0 -0
  152. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_sync/filesystem/watch_handle.py +0 -0
  153. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_sync/main.py +0 -0
  154. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/sandbox_sync/sandbox_api.py +0 -0
  155. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/CODE_INTERPRETER_TESTS_READY.md +0 -0
  156. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/README.md +0 -0
  157. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/__init__.py +0 -0
  158. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/aclient.py +0 -0
  159. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/code_interpreter_centext.py +0 -0
  160. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/code_interpreter_centext_sync.py +0 -0
  161. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/code_interpreter_test.py +0 -0
  162. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/code_interpreter_test_sync.py +0 -0
  163. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/run_all_validation_tests.py +0 -0
  164. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/run_code_interpreter_tests.sh +0 -0
  165. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/run_tests.sh +0 -0
  166. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_basic.py +0 -0
  167. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_code_interpreter_async_comprehensive.py +0 -0
  168. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_sandbox_stress_and_edge_cases.py +0 -0
  169. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/test_sandbox_usage_examples.py +0 -0
  170. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/testacreate.py +0 -0
  171. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/testcodeinterpreter_async.py +0 -0
  172. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/testcodeinterpreter_sync.py +0 -0
  173. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/testcomputeuse.py +0 -0
  174. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/test/testnovnc.py +0 -0
  175. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/utils/__init__.py +0 -0
  176. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/utils/httpcoreclient.py +0 -0
  177. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox/utils/httpxclient.py +0 -0
  178. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox_sdk.egg-info/dependency_links.txt +0 -0
  179. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox_sdk.egg-info/entry_points.txt +0 -0
  180. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox_sdk.egg-info/requires.txt +0 -0
  181. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/scalebox_sdk.egg-info/top_level.txt +0 -0
  182. {scalebox_sdk-1.0.1 → scalebox_sdk-1.0.2}/setup.cfg +0 -0
@@ -1,4 +1,16 @@
1
1
  # Changelog
2
+ ## [1.0.2] - 2026-02-03
3
+
4
+ ### Added
5
+ - Version 1.0.2 release
6
+
7
+ ### Changed
8
+ - Automated version bump (patch)
9
+
10
+ ### Fixed
11
+ - Minor improvements and bug fixes
12
+
13
+
2
14
  ## [1.0.1] - 2026-02-03
3
15
 
4
16
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scalebox-sdk
3
- Version: 1.0.1
3
+ Version: 1.0.2
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.1"
7
+ version = "1.0.2"
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.1"
117
+ python_version = "1.0.2"
118
118
  ignore_missing_imports = true
119
119
  ignore_errors = true
120
120
 
@@ -9,7 +9,7 @@ A multi-language code execution sandbox with support for:
9
9
  - Real-time callbacks and monitoring
10
10
  """
11
11
 
12
- __version__ = "1.0.1"
12
+ __version__ = "1.0.2"
13
13
  __author__ = "ScaleBox Team"
14
14
  __email__ = "dev@scalebox.dev"
15
15
 
@@ -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"]:
@@ -38,7 +38,7 @@ class Error:
38
38
  @classmethod
39
39
  def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
40
40
  d = dict(src_dict)
41
- code = d.pop("code",0)
41
+ code = d.pop("code", 0)
42
42
 
43
43
  message = d.pop("error")
44
44
 
@@ -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 = (started_at + datetime.timedelta(seconds=float(timeout1))) if (timeout1 := d.pop("timeout", "0")) is not UNSET and timeout1 is not None else None
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
 
@@ -365,6 +365,8 @@ class AsyncSandbox(BaseAsyncSandbox):
365
365
  # headers = {
366
366
  # "Authorization": "Bearer root",
367
367
  # }
368
- await client.destroy_context(destroy_context_request,extra_headers=self.connection_config.headers)
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}")
@@ -312,7 +312,9 @@ class Sandbox(BaseSandbox):
312
312
  # headers = {
313
313
  # "Authorization": "Bearer root",
314
314
  # }
315
- client.destroy_context(destroy_context_request,extra_headers=self.connection_config.headers)
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
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  from httpx import Limits
6
6
 
7
7
  from ..connection_config import ConnectionConfig
8
- from ..generated.api import ENVD_API_DOWNLOAD_FILES_ROUTE,ENVD_API_UPLOAD_FILES_ROUTE
8
+ from ..generated.api import ENVD_API_DOWNLOAD_FILES_ROUTE, ENVD_API_UPLOAD_FILES_ROUTE
9
9
  from .signature import get_signature, Operation
10
10
 
11
11
 
@@ -53,7 +53,7 @@ class SandboxSetup(ABC):
53
53
  url = urllib.parse.urljoin(self.envd_api_url, ENVD_API_DOWNLOAD_FILES_ROUTE)
54
54
  if operation == "write":
55
55
  url = urllib.parse.urljoin(self.envd_api_url, ENVD_API_UPLOAD_FILES_ROUTE)
56
- query = {**query,"path": path}
56
+ query = {**query, "path": path}
57
57
  else:
58
58
  url = f"{url}/{path.lstrip('/')}"
59
59
  query = {**query, "username": user}
@@ -96,7 +96,7 @@ class SandboxSetup(ABC):
96
96
  path, "read", user, self._envd_access_token, use_signature_expiration
97
97
  )
98
98
  return self._file_url(
99
- path,"read", user, signature["signature"], signature["expiration"]
99
+ path, "read", user, signature["signature"], signature["expiration"]
100
100
  )
101
101
  else:
102
102
  return self._file_url(path)
@@ -125,7 +125,7 @@ class SandboxSetup(ABC):
125
125
  path, "write", user, self._envd_access_token, use_signature_expiration
126
126
  )
127
127
  return self._file_url(
128
- path,"write", user, signature["signature"], signature["expiration"]
128
+ path, "write", user, signature["signature"], signature["expiration"]
129
129
  )
130
130
  else:
131
131
  return self._file_url(path)
@@ -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
- uvicorn.run(app, host="0.0.0.0", port=8000)
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(REPO_ROOT, "test", "test_code_interpreter_sync_comprehensive.py")
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 = [i for i, line in enumerate(lines) if "CodeInterpreter" in line and "测试报告" in line]
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 = [i for i, line in enumerate(lines) if line.strip().startswith("=") and set(line.strip()) == {"="} and len(line.strip()) >= 20]
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(f"Completed: {completed}, Passed: {passed}, Failed: {failed}, Total time: {total_time:.2f}s")
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(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
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, 'wb') as f:
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([i % 256 for i in range(min(chunk_size, file_size - written))])
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, 'rb') as f:
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(f"文件读取完成: {len(file_data) / (1024*1024):.2f}MB, 耗时: {read_time:.2f}秒")
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()