scalebox-sdk 1.0.1__py3-none-any.whl → 1.0.3__py3-none-any.whl

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 (44) hide show
  1. scalebox/__init__.py +1 -1
  2. scalebox/api/client/api/sandboxes/get_sandboxes.py +1 -1
  3. scalebox/api/client/models/error.py +1 -1
  4. scalebox/api/client/models/listed_sandbox.py +6 -3
  5. scalebox/api/client/models/sandbox.py +2 -2
  6. scalebox/code_interpreter/code_interpreter_async.py +3 -1
  7. scalebox/code_interpreter/code_interpreter_sync.py +3 -1
  8. scalebox/connection_config.py +2 -0
  9. scalebox/generated/api_pb2_connect.py +3 -3
  10. scalebox/sandbox/main.py +1 -1
  11. scalebox/sandbox_async/main.py +1 -1
  12. scalebox/sandbox_sync/main.py +1 -1
  13. scalebox/test/bedrock_openai_adapter.py +8 -2
  14. scalebox/test/run_stress_code_interpreter_sync.py +18 -6
  15. scalebox/test/simple_upload_example.py +39 -31
  16. scalebox/test/stabitiy_test.py +82 -69
  17. scalebox/test/test_browser_use.py +4 -2
  18. scalebox/test/test_browser_use_scalebox.py +5 -4
  19. scalebox/test/test_code_interpreter_execcode.py +289 -211
  20. scalebox/test/test_code_interpreter_sync_comprehensive.py +2 -5
  21. scalebox/test/test_connect_pause_async.py +34 -11
  22. scalebox/test/test_connect_pause_sync.py +49 -16
  23. scalebox/test/test_csx_desktop_examples.py +3 -3
  24. scalebox/test/test_desktop_sandbox_sf.py +18 -23
  25. scalebox/test/test_download_url.py +6 -14
  26. scalebox/test/test_existing_sandbox.py +1037 -0
  27. scalebox/test/test_sandbox_async_comprehensive.py +4 -2
  28. scalebox/test/test_sandbox_object_storage_example.py +14 -9
  29. scalebox/test/test_sandbox_object_storage_example_async.py +6 -3
  30. scalebox/test/test_sandbox_sync_comprehensive.py +1 -1
  31. scalebox/test/test_sf.py +12 -8
  32. scalebox/test/test_watch_dir_async.py +6 -4
  33. scalebox/test/testagetinfo.py +1 -3
  34. scalebox/test/testsandbox_api.py +5 -3
  35. scalebox/test/testsandbox_async.py +17 -47
  36. scalebox/test/testsandbox_sync.py +18 -14
  37. scalebox/test/upload_100mb_example.py +77 -55
  38. scalebox/version.py +2 -2
  39. {scalebox_sdk-1.0.1.dist-info → scalebox_sdk-1.0.3.dist-info}/METADATA +1 -1
  40. {scalebox_sdk-1.0.1.dist-info → scalebox_sdk-1.0.3.dist-info}/RECORD +44 -43
  41. {scalebox_sdk-1.0.1.dist-info → scalebox_sdk-1.0.3.dist-info}/WHEEL +0 -0
  42. {scalebox_sdk-1.0.1.dist-info → scalebox_sdk-1.0.3.dist-info}/entry_points.txt +0 -0
  43. {scalebox_sdk-1.0.1.dist-info → scalebox_sdk-1.0.3.dist-info}/licenses/LICENSE +0 -0
  44. {scalebox_sdk-1.0.1.dist-info → scalebox_sdk-1.0.3.dist-info}/top_level.txt +0 -0
@@ -17,55 +17,63 @@ from scalebox.sandbox_sync.main import Sandbox
17
17
  from scalebox.connection_config import ConnectionConfig
18
18
 
19
19
  # 配置日志
20
- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
20
+ logging.basicConfig(
21
+ level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
22
+ )
21
23
  logger = logging.getLogger(__name__)
22
24
 
25
+
23
26
  def create_100mb_test_file(file_path: str = "/home/test_100mb.bin") -> str:
24
27
  """
25
28
  创建一个 100MB 的测试文件
26
-
29
+
27
30
  Args:
28
31
  file_path: 本地文件路径
29
-
32
+
30
33
  Returns:
31
34
  创建的文件路径
32
35
  """
33
36
  logger.info(f"开始创建 100MB 测试文件: {file_path}")
34
37
  start_time = time.time()
35
-
38
+
36
39
  # 创建 100MB 的数据 (100 * 1024 * 1024 字节)
37
40
  file_size = 1000 * 1024 * 1024 # 100MB
38
41
  chunk_size = 1024 * 1024 # 1MB 块大小
39
-
40
- with open(file_path, 'wb') as f:
42
+
43
+ with open(file_path, "wb") as f:
41
44
  written = 0
42
45
  while written < file_size:
43
46
  # 生成 1MB 的数据块,包含一些模式以便验证
44
47
  chunk_data = bytes([(i + written) % 256 for i in range(chunk_size)])
45
48
  f.write(chunk_data)
46
49
  written += chunk_size
47
-
50
+
48
51
  # 显示进度
49
52
  if written % (10 * 1024 * 1024) == 0: # 每 10MB 显示一次
50
53
  progress = (written / file_size) * 100
51
54
  logger.info(f"创建进度: {progress:.1f}% ({written // (1024*1024)}MB)")
52
-
55
+
53
56
  creation_time = time.time() - start_time
54
57
  actual_size = os.path.getsize(file_path)
55
- logger.info(f"文件创建完成: {actual_size / (1024*1024):.2f}MB, 耗时: {creation_time:.2f}秒")
56
-
58
+ logger.info(
59
+ f"文件创建完成: {actual_size / (1024*1024):.2f}MB, 耗时: {creation_time:.2f}秒"
60
+ )
61
+
57
62
  return file_path
58
63
 
59
- def upload_file_to_sandbox(local_file_path: str, sandbox_path: str = "/tmp/uploaded_100mb.bin"):
64
+
65
+ def upload_file_to_sandbox(
66
+ local_file_path: str, sandbox_path: str = "/tmp/uploaded_100mb.bin"
67
+ ):
60
68
  """
61
69
  将本地文件上传到沙箱
62
-
70
+
63
71
  Args:
64
72
  local_file_path: 本地文件路径
65
73
  sandbox_path: 沙箱中的目标路径
66
74
  """
67
75
  logger.info("开始连接沙箱...")
68
-
76
+
69
77
  # 创建沙箱连接配置
70
78
  sandbox = Sandbox.create(
71
79
  timeout=3600,
@@ -79,70 +87,74 @@ def upload_file_to_sandbox(local_file_path: str, sandbox_path: str = "/tmp/uploa
79
87
  if not sandbox.is_running():
80
88
  logger.error("沙箱未运行,无法上传文件")
81
89
  return False
82
-
90
+
83
91
  logger.info(f"沙箱连接成功,ID: {sandbox.sandbox_id}")
84
-
92
+
85
93
  # 读取本地文件
86
94
  logger.info(f"读取本地文件: {local_file_path}")
87
95
  start_time = time.time()
88
-
89
- with open(local_file_path, 'rb') as f:
96
+
97
+ with open(local_file_path, "rb") as f:
90
98
  file_data = f.read()
91
-
99
+
92
100
  read_time = time.time() - start_time
93
- logger.info(f"文件读取完成: {len(file_data) / (1024*1024):.2f}MB, 耗时: {read_time:.2f}秒")
94
-
101
+ logger.info(
102
+ f"文件读取完成: {len(file_data) / (1024*1024):.2f}MB, 耗时: {read_time:.2f}秒"
103
+ )
104
+
95
105
  # 上传文件到沙箱
96
106
  logger.info(f"开始上传文件到沙箱: {sandbox_path}")
97
107
  upload_start = time.time()
98
-
108
+
99
109
  # 使用 filesystem.write 方法上传文件
100
- result = sandbox.files.write(sandbox_path, file_data,"root",3600)
101
-
110
+ result = sandbox.files.write(sandbox_path, file_data, "root", 3600)
111
+
102
112
  upload_time = time.time() - upload_start
103
113
  logger.info(f"文件上传完成: {result.path}, 耗时: {upload_time:.2f}秒")
104
114
  logger.info(f"上传速度: {len(file_data) / (1024*1024) / upload_time:.2f} MB/s")
105
-
115
+
106
116
  # 验证上传结果
107
117
  logger.info("验证上传结果...")
108
118
  verify_start = time.time()
109
-
119
+
110
120
  # 检查文件是否存在
111
121
  if sandbox.files.exists(sandbox_path):
112
122
  logger.info("✅ 文件在沙箱中存在")
113
-
123
+
114
124
  # 获取文件信息
115
125
  file_info = sandbox.files.get_info(sandbox_path)
116
126
  logger.info(f"文件信息: {file_info}")
117
-
127
+
118
128
  # 读取文件内容进行验证(只读取前1MB进行快速验证)
119
129
  logger.info("验证文件内容...")
120
- with open(local_file_path, 'rb') as f:
130
+ with open(local_file_path, "rb") as f:
121
131
  local_sample = f.read(1024 * 1024) # 读取前1MB
122
-
123
- sandbox_sample = sandbox.files.read(sandbox_path, format="bytes")[:1024 * 1024]
124
-
132
+
133
+ sandbox_sample = sandbox.files.read(sandbox_path, format="bytes")[
134
+ : 1024 * 1024
135
+ ]
136
+
125
137
  if local_sample == sandbox_sample:
126
138
  logger.info("✅ 文件内容验证成功")
127
139
  else:
128
140
  logger.error("❌ 文件内容验证失败")
129
141
  return False
130
-
142
+
131
143
  else:
132
144
  logger.error("❌ 文件在沙箱中不存在")
133
145
  return False
134
-
146
+
135
147
  verify_time = time.time() - verify_start
136
148
  total_time = time.time() - upload_start
137
149
  logger.info(f"验证完成,耗时: {verify_time:.2f}秒")
138
150
  logger.info(f"总上传时间: {total_time:.2f}秒")
139
-
151
+
140
152
  return True
141
-
153
+
142
154
  except Exception as e:
143
155
  logger.error(f"上传过程中发生错误: {e}")
144
156
  return False
145
-
157
+
146
158
  finally:
147
159
  # 清理沙箱
148
160
  try:
@@ -151,7 +163,10 @@ def upload_file_to_sandbox(local_file_path: str, sandbox_path: str = "/tmp/uploa
151
163
  except Exception as e:
152
164
  logger.warning(f"清理沙箱时发生错误: {e}")
153
165
 
154
- def upload_file_streaming(local_file_path: str, sandbox_path: str = "/tmp/uploaded_100mb_streaming.bin"):
166
+
167
+ def upload_file_streaming(
168
+ local_file_path: str, sandbox_path: str = "/tmp/uploaded_100mb_streaming.bin"
169
+ ):
155
170
  """
156
171
  使用真正的流式方式上传文件(不将整个文件读入内存)。
157
172
 
@@ -184,7 +199,7 @@ def upload_file_streaming(local_file_path: str, sandbox_path: str = "/tmp/upload
184
199
  start_time = time.time()
185
200
 
186
201
  with open(local_file_path, "rb") as f:
187
- sandbox.files.write(sandbox_path, f,"root",3600)
202
+ sandbox.files.write(sandbox_path, f, "root", 3600)
188
203
 
189
204
  upload_time = time.time() - start_time
190
205
  logger.info(f"流式上传完成,总耗时: {upload_time:.2f}秒")
@@ -210,7 +225,10 @@ def upload_file_streaming(local_file_path: str, sandbox_path: str = "/tmp/upload
210
225
  except Exception as e:
211
226
  logger.warning(f"清理沙箱时发生错误: {e}")
212
227
 
213
- def upload_file_chunked_32m(local_file_path: str, sandbox_path: str = "/tmp/uploaded_100mb_chunked_32m.bin"):
228
+
229
+ def upload_file_chunked_32m(
230
+ local_file_path: str, sandbox_path: str = "/tmp/uploaded_100mb_chunked_32m.bin"
231
+ ):
214
232
  """
215
233
  使用客户端 32MB 分片方式上传:
216
234
  - 本地读取 32MB 分片,逐片上传为临时文件 {sandbox_path}.partXXXXXX
@@ -267,9 +285,7 @@ def upload_file_chunked_32m(local_file_path: str, sandbox_path: str = "/tmp/uplo
267
285
 
268
286
  # 在沙箱中合并分片,确保按编号顺序连接
269
287
  logger.info("开始在沙箱内合并分片...")
270
- concat_cmd = (
271
- f"bash -lc 'cat {' '.join(uploaded_parts)} > {sandbox_path}'"
272
- )
288
+ concat_cmd = f"bash -lc 'cat {' '.join(uploaded_parts)} > {sandbox_path}'"
273
289
  proc = sandbox.commands.run(concat_cmd)
274
290
  if proc.exit_code != 0:
275
291
  logger.error(f"合并失败: exit={proc.exit_code}, stderr=\n{proc.stderr}")
@@ -278,9 +294,7 @@ def upload_file_chunked_32m(local_file_path: str, sandbox_path: str = "/tmp/uplo
278
294
  # 校验合并后的文件大小
279
295
  info = sandbox.files.get_info(sandbox_path)
280
296
  if info.size != file_size:
281
- logger.error(
282
- f"合并后大小不一致: 期望={file_size}, 实际={info.size}"
283
- )
297
+ logger.error(f"合并后大小不一致: 期望={file_size}, 实际={info.size}")
284
298
  return False
285
299
 
286
300
  # 删除分片
@@ -288,7 +302,9 @@ def upload_file_chunked_32m(local_file_path: str, sandbox_path: str = "/tmp/uplo
288
302
  rm_cmd = f"bash -lc 'rm -f {sandbox_path}.part*'"
289
303
  rm_proc = sandbox.commands.run(rm_cmd)
290
304
  if rm_proc.exit_code != 0:
291
- logger.warning(f"删除分片警告: exit={rm_proc.exit_code}, stderr=\n{rm_proc.stderr}")
305
+ logger.warning(
306
+ f"删除分片警告: exit={rm_proc.exit_code}, stderr=\n{rm_proc.stderr}"
307
+ )
292
308
 
293
309
  total_time = time.time() - start_time
294
310
  logger.info(
@@ -306,13 +322,14 @@ def upload_file_chunked_32m(local_file_path: str, sandbox_path: str = "/tmp/uplo
306
322
  except Exception as e:
307
323
  logger.warning(f"清理沙箱时发生错误: {e}")
308
324
 
325
+
309
326
  def main():
310
327
  """主函数"""
311
328
  logger.info("=== 100MB 文件上传示例 ===")
312
-
329
+
313
330
  # 1. 创建 100MB 测试文件
314
331
  local_file = create_100mb_test_file()
315
-
332
+
316
333
  try:
317
334
  # 2. 方式一:直接上传整个文件
318
335
  logger.info("\n=== 方式一:直接上传 ===")
@@ -322,25 +339,29 @@ def main():
322
339
  logger.info("✅ 直接上传成功")
323
340
  else:
324
341
  logger.error("❌ 直接上传失败")
325
-
342
+
326
343
  # 3. 方式二:流式分块上传
327
344
  logger.info("\n=== 方式二:流式上传 ===")
328
- success2 = upload_file_streaming(local_file, "/home/uploaded_100mb_streaming.bin")
329
-
345
+ success2 = upload_file_streaming(
346
+ local_file, "/home/uploaded_100mb_streaming.bin"
347
+ )
348
+
330
349
  if success2:
331
350
  logger.info("✅ 流式上传成功")
332
351
  else:
333
352
  logger.error("❌ 流式上传失败")
334
-
353
+
335
354
  # 4. 方式三:32MB 分片上传(客户端分片 + 服务器端合并)
336
355
  logger.info("\n=== 方式三:32MB 分片上传 ===")
337
- success3 = upload_file_chunked_32m(local_file, "/tmp/uploaded_100mb_chunked_32m.bin")
356
+ success3 = upload_file_chunked_32m(
357
+ local_file, "/tmp/uploaded_100mb_chunked_32m.bin"
358
+ )
338
359
 
339
360
  if success3:
340
361
  logger.info("✅ 32MB 分片上传成功")
341
362
  else:
342
363
  logger.error("❌ 32MB 分片上传失败")
343
-
364
+
344
365
  finally:
345
366
  # 4. 清理本地测试文件
346
367
  try:
@@ -348,8 +369,9 @@ def main():
348
369
  logger.info(f"本地测试文件已删除: {local_file}")
349
370
  except Exception as e:
350
371
  logger.warning(f"删除本地文件时发生错误: {e}")
351
-
372
+
352
373
  logger.info("=== 示例完成 ===")
353
374
 
375
+
354
376
  if __name__ == "__main__":
355
377
  main()
scalebox/version.py CHANGED
@@ -2,8 +2,8 @@
2
2
  Version information for ScaleBox Python SDK
3
3
  """
4
4
 
5
- __version__ = "1.0.1"
6
- __version_info__ = (1, 0, 1)
5
+ __version__ = "1.0.3"
6
+ __version_info__ = (1, 0, 3)
7
7
 
8
8
 
9
9
  def get_version() -> str:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scalebox-sdk
3
- Version: 1.0.1
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>
@@ -1,9 +1,9 @@
1
- scalebox/__init__.py,sha256=DlHulyCvIWvmm3b6pz_ZqhhhQj-FHbyeQ6s2vicogSw,1813
1
+ scalebox/__init__.py,sha256=OhML14L8AAZZILh00_1fovSAdVmXHu3Gb4fdaZEh48c,1813
2
2
  scalebox/cli.py,sha256=nLOcdzb1UdeSXVKlCoJg7w66HV59oig22IKbGxcV1kM,4029
3
- scalebox/connection_config.py,sha256=Cj2OZqcIfFvKlJaksDxi1rmpf1rFQWo57ImapdnQWsg,3930
3
+ scalebox/connection_config.py,sha256=vAbtZH4428x8FV4WRqbJRjFeh1k5aXbUxgZZXp9VZao,3934
4
4
  scalebox/exceptions.py,sha256=DIvbcSMpPY3LtcNxPFYwHyqCm6eCewzI63rb_RCoYw4,2136
5
5
  scalebox/requirements.txt,sha256=LEYsk2VzoxKR-V44Y6qJuJ3vKdTYS79f1Gv1Ajleifo,567
6
- scalebox/version.py,sha256=UOmyG5td1ReuEuVNcIR620e7munZonLy_kN0GnQmgL4,321
6
+ scalebox/version.py,sha256=EkrnOReaxEEyYYOALdYj1iQ7_Farp0S3e7e6en-zRys,321
7
7
  scalebox/api/__init__.py,sha256=DhDrZ0oc9Ms1NMOWNy3NmhHrnafwFG-29rPgbJjovu8,4392
8
8
  scalebox/api/metadata.py,sha256=lg5ekfnFZYZoCoJxIPo961HEGVg_rLLRJBbw4ZApM_Y,512
9
9
  scalebox/api/client/__init__.py,sha256=HzKIvZRZ7K4vQZKmBQXWh7CdmavSWi49NPaOAQdjdvs,163
@@ -14,7 +14,7 @@ scalebox/api/client/types.py,sha256=4Noqx0va9oEOqpp6miwyq9Y-nW4lGrd_ClvJbEXi5To,
14
14
  scalebox/api/client/api/__init__.py,sha256=zTSiG_ujSjAqWPyc435YXaX9XTlpMjiJWBbV-f-YtdA,45
15
15
  scalebox/api/client/api/sandboxes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  scalebox/api/client/api/sandboxes/delete_sandboxes_sandbox_id.py,sha256=exBkD4FP0t730uuuKvNPWwm9PMOE68BDeaKmt98gPlg,3945
17
- scalebox/api/client/api/sandboxes/get_sandboxes.py,sha256=mOrhfvS_O9z58wjf8mpMkXR_cWmp7r6c_zAQCZ5beWA,4877
17
+ scalebox/api/client/api/sandboxes/get_sandboxes.py,sha256=0dJMMwsXSxXK14eddofO1ZVVcf2acv54DMcpelbNKT4,4879
18
18
  scalebox/api/client/api/sandboxes/get_sandboxes_metrics.py,sha256=7vchRZZhVqT2TJDq_P1PZ6xcb6A-bvYmfq8swCEuVw4,4581
19
19
  scalebox/api/client/api/sandboxes/get_sandboxes_sandbox_id.py,sha256=M4a8lrM0NgaIF4G6rMw2LcoLs2FK6b4Dfc15JoroSkc,4133
20
20
  scalebox/api/client/api/sandboxes/get_sandboxes_sandbox_id_logs.py,sha256=EQmwi1HGcadWZOCSQ3UrtrT3quNHnJkPnanvd-gW0sM,5217
@@ -31,9 +31,9 @@ scalebox/api/client/models/build_log_entry.py,sha256=eCLxmK8cWMYo0RAfQjWT0zcN2a2
31
31
  scalebox/api/client/models/connect_sandbox.py,sha256=FVB8Jd6PzBZbVn37Nqz5B1icbHDRwtKCOxQNzPEppiM,1620
32
32
  scalebox/api/client/models/created_access_token.py,sha256=VjU_tuW67zrtc3V1po-MVtPo8J1dtRkwy-6uTe2AEf0,2639
33
33
  scalebox/api/client/models/created_team_api_key.py,sha256=QO2jAIR8u1Xxn26jnftkDNYCI1mEqDMt-ZUIQS1y1NU,5040
34
- scalebox/api/client/models/error.py,sha256=2Mz7_7erL01Ipae9v7ri366gszo3YZOybV6VHm6xSrs,1594
34
+ scalebox/api/client/models/error.py,sha256=4QEPd15N5xnfmaOm-Wcrvl-x7ZO_5V5N8sBLBvXC0LM,1595
35
35
  scalebox/api/client/models/identifier_masking_details.py,sha256=97xSg4Nr3D5xbjGDuZ16doEMOlck0EtyjMxtHQR9TKk,2496
36
- scalebox/api/client/models/listed_sandbox.py,sha256=IX5rqM7mvr16UjH71DV4Gget6dJXnGanHLLw-7qRbhc,4756
36
+ scalebox/api/client/models/listed_sandbox.py,sha256=wnJRNquu5VNPr_OTABJ0oIifumV2ZEJWIUqd3TRqSm4,4804
37
37
  scalebox/api/client/models/log_level.py,sha256=uv6u1nkqfzdxTjJAxLZdWuH5goVI_g-ULLhh6TU5dw8,189
38
38
  scalebox/api/client/models/new_access_token.py,sha256=sjlQ7dEj4ByCgwud750SbxwyjggAKB1s-o_N7dRCo7s,1480
39
39
  scalebox/api/client/models/new_sandbox.py,sha256=xjAxkxpOTCv_fLKHrMdcC4tGSjUoX5FIWXB7HsB_bc4,4457
@@ -45,7 +45,7 @@ scalebox/api/client/models/node_status_change.py,sha256=gJJWj3-8AaHkjli_KMcBLu4V
45
45
  scalebox/api/client/models/post_sandboxes_sandbox_id_refreshes_body.py,sha256=VwMoBB9y2vFP7kcLDJ0Q9kVGOBqD2W3VvAEKv_XHd2Y,1763
46
46
  scalebox/api/client/models/post_sandboxes_sandbox_id_timeout_body.py,sha256=iay4pLjwIryb6J8fjx3UjThsNJ5AvqArzAwr5K8LnNs,1668
47
47
  scalebox/api/client/models/resumed_sandbox.py,sha256=2xD811-BnABH7M9vceACDucdASx0pwpxxoBGzTtxMns,1980
48
- scalebox/api/client/models/sandbox.py,sha256=HVhDBodbbx5FwbUvOE8-gNfMdr9QmaPnMJ-4JR5GEdE,4469
48
+ scalebox/api/client/models/sandbox.py,sha256=auaQsKKExpbm-3VFYLyNhjTZ7aCYNR84PuHoDZd2mF0,4471
49
49
  scalebox/api/client/models/sandbox_detail.py,sha256=GXJV0YHZQQdy3JMf7q_l-VhwR0YiM_CjplVvPcggxx8,6196
50
50
  scalebox/api/client/models/sandbox_log.py,sha256=tXw35j3poz7DMJrLeoxr4oYdbcYJV5ep3E0bVdQsS2o,1806
51
51
  scalebox/api/client/models/sandbox_logs.py,sha256=zpQbPAmdrQoUexnwobzljOYcairMmK6sUHVyM1n2Ix0,1894
@@ -73,8 +73,8 @@ scalebox/client/client.py,sha256=oduFu3HgkeHXPzWHhnlLjPjagfPdqX_nU6YP4Dv9Adc,352
73
73
  scalebox/client/requirements.txt,sha256=wKvAVEljSzYT7t1PFWlsWHR9I47sAYjx97xU51NvAPw,94
74
74
  scalebox/code_interpreter/__init__.py,sha256=aRozFXYJiqtzgEDkZBaCktYhEWGiRQFB5-L5oq7E9bY,250
75
75
  scalebox/code_interpreter/charts.py,sha256=vsGRhl_6Yo9rl8eDBRMct-4ExWW08sYqpSFwRooXS64,5741
76
- scalebox/code_interpreter/code_interpreter_async.py,sha256=rtsGJlGkczVngjMP4dTGS2rO6sRQ55k8c60y3A0ZUVA,13429
77
- scalebox/code_interpreter/code_interpreter_sync.py,sha256=HydYJxVbemH8VwcnuE_8o8_u-mKF_WRWcgFsEBAb8Wg,11891
76
+ scalebox/code_interpreter/code_interpreter_async.py,sha256=EDg-C8ogMVKOARXdHUhs0OdDh3iK7uooHxDMYsQv2GE,13462
77
+ scalebox/code_interpreter/code_interpreter_sync.py,sha256=fLLMSNBn_m1PCTOB5VIb5pFrIF4LkHANMj-ms6NCv9A,11924
78
78
  scalebox/code_interpreter/constants.py,sha256=h8yTW0Scglq7kGE30hxWyL2VBAXsWLW4rklCZBARQOg,84
79
79
  scalebox/code_interpreter/exceptions.py,sha256=EeiimLZwST422fFzDxFDUOzAaKTvziQI4bWNcsqLPE8,423
80
80
  scalebox/code_interpreter/models.py,sha256=udA-ZtS2fe_8elzzcctuVs8H-iKr7KhiAzFvh_hO2aY,14504
@@ -86,11 +86,11 @@ scalebox/generated/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
86
86
  scalebox/generated/api.py,sha256=AxdkIC4-tKRlzixXtMFDmo8-gck2NwzD8rflyxcAIlc,1619
87
87
  scalebox/generated/api_pb2.py,sha256=P02Cun4acvUNEZIqwK0c0ofpF3m6d10bgksrrw5_Yo4,26144
88
88
  scalebox/generated/api_pb2.pyi,sha256=uqBUXljcl0WyTn_y2-thacJWOpjsTUOSoBMBWz6S4vg,31114
89
- scalebox/generated/api_pb2_connect.py,sha256=juPcvBY2SkR3G0mfPKEdRHka2f1xVKIj8qgjK_wGO0g,53222
89
+ scalebox/generated/api_pb2_connect.py,sha256=p4EaCB67QooflVRaeivj1CqXFEY3MjV0Th-2aEgGnrA,53225
90
90
  scalebox/generated/rpc.py,sha256=mxO3XOq9kQCpxZqpRZN_sMadabzTNCL1BhjaqjKZ_TM,2048
91
91
  scalebox/generated/versions.py,sha256=rBZ4T4ZxsrP7LVnWU-E9r_yN-x8qJXyR2q-EU-bFEMo,87
92
92
  scalebox/sandbox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
- scalebox/sandbox/main.py,sha256=wZaYpna6IlewIlnkWHMfTUYM_ZBxWSMA3djEnRFtzog,4600
93
+ scalebox/sandbox/main.py,sha256=nL9m4RlWspr18SnppnTIZt-wjyS0UqHEjVRhq2tik4g,4588
94
94
  scalebox/sandbox/sandbox_api.py,sha256=0fTjp5tHZn74hOj4BASn7NQ62GGjq51er4tjNjrmMN0,2525
95
95
  scalebox/sandbox/signature.py,sha256=OABXXFHep_DbH62tu6_TReVLrNlPd9xMdFS29XuAH5Q,1137
96
96
  scalebox/sandbox/utils.py,sha256=ow_L3dP1qF6AQrcTrOhNtx2Wq5989EMI6rVc-9o5c50,1334
@@ -101,7 +101,7 @@ scalebox/sandbox/filesystem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
101
101
  scalebox/sandbox/filesystem/filesystem.py,sha256=d3R6jp1Gn3cEdKpzB3I2P3ECQCkktBa2AfRCZZwzA08,1833
102
102
  scalebox/sandbox/filesystem/watch_handle.py,sha256=vLVy366IIQaNKqlGIWyURou3OCSSJb9m-NpfP8kqXGw,1372
103
103
  scalebox/sandbox_async/__init__.py,sha256=D8A0Asb6TNwtm9vdGx-hHCMxEUUHq_Iosi7iaaO9pmc,30
104
- scalebox/sandbox_async/main.py,sha256=2O-i1ek9djDZH5kCNnE0RybamWemAdsIibujJVO5zZE,29278
104
+ scalebox/sandbox_async/main.py,sha256=HeA0fxsWqGq42Hsl1bBfzZ1nzTBUuQbi9qHdSZN18wU,29266
105
105
  scalebox/sandbox_async/sandbox_api.py,sha256=glXMZ3xmvfGkgP5E4E3RbxTDFr6J7ONDSYtsZpyKW70,17569
106
106
  scalebox/sandbox_async/utils.py,sha256=-KkAt7kwI4i9NJJ-0cSmrABnT3C4H4R7Bx2JH1LlBmc,166
107
107
  scalebox/sandbox_async/commands/command.py,sha256=eA4Q2TM4ZFmoVs6r8Nq9qm2CUUgggnBOKG7nJ_qx-vk,11336
@@ -110,7 +110,7 @@ scalebox/sandbox_async/commands/pty.py,sha256=DnIhzZrLZc-0-0L-rc1dbcVPZdi541Ftnl
110
110
  scalebox/sandbox_async/filesystem/filesystem.py,sha256=EIZLb3d-FJNhEpmovoRkQzxJVYsV3Jy-lL45m6KCFQQ,19629
111
111
  scalebox/sandbox_async/filesystem/watch_handle.py,sha256=PRBUPaQFKQw-iFQM1Hv5GDnnEJvzkjBGGUKA0A7jezg,2013
112
112
  scalebox/sandbox_sync/__init__.py,sha256=kb9Pmj_h-RzsZe9rbU_VBd1tY1tTKdyJUYMbI8qq2Ss,116
113
- scalebox/sandbox_sync/main.py,sha256=25OqgCYJ12oNoZvh3NLtq7g_Dm5XYB2dc99nQquvTzk,30706
113
+ scalebox/sandbox_sync/main.py,sha256=jpeZZheMEGLHxk7yFCu-wqJp3q5BNXcchrFGRGCJ--A,30694
114
114
  scalebox/sandbox_sync/sandbox_api.py,sha256=P5y83Ux32SC5PtO_zEdOeBKYgz6PJRXBinpiVDLKXF4,16952
115
115
  scalebox/sandbox_sync/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
116
  scalebox/sandbox_sync/commands/command.py,sha256=XB_MTIlqECKQStsDDV7sHgT3gB_VMu9rYtGqr8kC8Xc,10477
@@ -123,52 +123,53 @@ scalebox/test/CODE_INTERPRETER_TESTS_READY.md,sha256=qbYoXoNhKeZSQAEB801H7027BEG
123
123
  scalebox/test/README.md,sha256=Tvdkfz_0jYbLDoUX3BR_HdPFeD7CKpzyZ1H2UZ2TFTQ,9458
124
124
  scalebox/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
125
  scalebox/test/aclient.py,sha256=hCZAs2X1AwRHevexdbH0Z2MdahSczjvRglnyb1WFrV4,2335
126
- scalebox/test/bedrock_openai_adapter.py,sha256=I2bYpyWF9qYoA_l3CQpRwIF7RQMzZr6a_Yzzy9tDcKA,2007
126
+ scalebox/test/bedrock_openai_adapter.py,sha256=zhwQ2K6y73cIIz8J7XT1maIoIso87KaYb5y195ly6BA,2020
127
127
  scalebox/test/code_interpreter_centext.py,sha256=f2GC3l8jsNF9n1Sl4boxJMGqWNl1d1Ff29f_5hahH00,468
128
128
  scalebox/test/code_interpreter_centext_sync.py,sha256=cGebrc7c1VQDsv6X0Ez7Xs2plvv_j7EjqQhklLmQ01o,433
129
129
  scalebox/test/code_interpreter_test.py,sha256=SPpBBmP4EQmsVlDwdmmd8ve2Q-9K9PJx8LNeszACicY,738
130
130
  scalebox/test/code_interpreter_test_sync.py,sha256=WC8dL0MNtJxIVHl7uxbnJRvu9e4iujPX5wckGAZ47ac,681
131
131
  scalebox/test/run_all_validation_tests.py,sha256=iWldYseiCW-34Mowkj1AbV_ciFG5mg-DYj_Znl9Agm8,12729
132
132
  scalebox/test/run_code_interpreter_tests.sh,sha256=L5sBr5jsFhZxtqfq98yhOA8FK8-bOvYUSVeft8hb1LI,1973
133
- scalebox/test/run_stress_code_interpreter_sync.py,sha256=jQiquH_iJJLvtj5TfGe33GPH2PgW8zpDxVNegDpQKMo,5790
133
+ scalebox/test/run_stress_code_interpreter_sync.py,sha256=zFD_pQBsJ43gRXo7OiZ8q1lt8szEO9dOmVpwoPoWFkE,5884
134
134
  scalebox/test/run_tests.sh,sha256=1gWoC_RhemlmtqKfBCw2_fRI20saDJ8iCTRtPUiuUE8,6091
135
- scalebox/test/simple_upload_example.py,sha256=hrS1_gXuGQswvA9luHiDQGFCWcgilfQAGmAA_X4y-mE,4099
136
- scalebox/test/stabitiy_test.py,sha256=2FlJ_OEGoFZ9T-CKaYnzREJy6nkNc55CeSvnIfjE6Us,11121
135
+ scalebox/test/simple_upload_example.py,sha256=69tIJTfc4fdpniKXc2KZyV0sK5Waj2665ceZYyH5aPM,3988
136
+ scalebox/test/stabitiy_test.py,sha256=y00kAJdEMAiyzXUS69OC5kQ7b86o8dJODypwhf2ZGow,11350
137
137
  scalebox/test/test_basic.py,sha256=EfK7XzgY63CxLw8x8C1Tnu0yD4vazJxYLHvBV4Zz08U,2375
138
- scalebox/test/test_browser_use.py,sha256=aBL15L1mtOb1y-tY209Zb7cOIvARIqQIyqtdYlt2i6w,649
139
- scalebox/test/test_browser_use_scalebox.py,sha256=iXRuETg637aR5sVSRt0sVu5h-3qyzTXzi5lBmVOU2pI,1989
138
+ scalebox/test/test_browser_use.py,sha256=E4vWI69nJgcqDTPlh2uLbBE3jYp7q0SJtjMvAQy-_R0,648
139
+ scalebox/test/test_browser_use_scalebox.py,sha256=kTsrWJbFhhoW5xCo_czsYNYwE0Kxbxr1A_w0nAIvX3g,1991
140
140
  scalebox/test/test_code_interpreter_async_comprehensive.py,sha256=r63dsWsLIEtQKzyswQDOT1s3yVbXKsNgsgWoSDgTQ2c,84464
141
- scalebox/test/test_code_interpreter_execcode.py,sha256=ODHS4IJGUZ84MvlmFDHupar6AFJikd_MvjFpv8qVgDY,103484
142
- scalebox/test/test_code_interpreter_sync_comprehensive.py,sha256=KWwJHCsLiu2Pgh-Qd9hxcYLuKO4N-m-HL_Hj3KQnwYk,107470
143
- scalebox/test/test_connect_pause_async.py,sha256=7wCHwGnc-vssjU-NAK8DtMG2Reya_NCAeFpLQEVb1AM,11479
144
- scalebox/test/test_connect_pause_sync.py,sha256=xgwD9yUkAmQe3uh8Wf8zvN8vj6AAmdTTfNmsU0Blz34,10845
145
- scalebox/test/test_csx_desktop_examples.py,sha256=hBF-YHnPctN2jeLLl-TAIj8w1T8lG1RB3PVw1ljZ2Aw,4414
146
- scalebox/test/test_desktop_sandbox_sf.py,sha256=h9_yjbOGeTsWwgZIc22uB-fWpgUpACm3dRVUh8qNv_E,4275
147
- scalebox/test/test_download_url.py,sha256=ln38yS2sl_z_Ub2SMnofhuogIHDvq4dYPVkNHbaGjZI,1373
148
- scalebox/test/test_sandbox_async_comprehensive.py,sha256=YQsq_onsAR2RJs6B2s7NUeAgAnNWZO6ZQ485DpTOu7I,27062
149
- scalebox/test/test_sandbox_object_storage_example.py,sha256=o4p8xP2NVr2AIygrPyUseeJtRbxk93InCde21S_6Ulg,4958
150
- scalebox/test/test_sandbox_object_storage_example_async.py,sha256=NcEhL3U5bvYBuc_ximiQdImhYfUIvUxy__IgRSUYgQA,5300
141
+ scalebox/test/test_code_interpreter_execcode.py,sha256=5nOJVOvR-TrczP_PBRRwde4ml6w0ZiIQS6fMuCbDTcU,103056
142
+ scalebox/test/test_code_interpreter_sync_comprehensive.py,sha256=z7FwG4vN6G1uDuJ4NAajzJPcQHH9r4WUofEc8Vaeq3c,107433
143
+ scalebox/test/test_connect_pause_async.py,sha256=w5IU9tT0No6I8B4Ynde-gN3ow6yVXSRBaIwd-4M5jqY,11813
144
+ scalebox/test/test_connect_pause_sync.py,sha256=gUuaV15eIfPT43Uy9BuAmDdfnenjdNhkKuDtRaDEXPU,11329
145
+ scalebox/test/test_csx_desktop_examples.py,sha256=SLfvU73otrgrwp5Vo_xxcNSb4qgBJ308PZ-UfZf3mLE,4426
146
+ scalebox/test/test_desktop_sandbox_sf.py,sha256=TtvqLsjJA-K2W9bgWTYPo4JjCd_GWEWajABU2dJhI8A,4139
147
+ scalebox/test/test_download_url.py,sha256=yPGrRv6pSdpqn3mNh53phxGucK9i3O6fdl8x-PMIdx8,1325
148
+ scalebox/test/test_existing_sandbox.py,sha256=sZKm1IbMEFZgTPVEh5p3q0gaJl_pL1sW3QtA_-MQFC8,39934
149
+ scalebox/test/test_sandbox_async_comprehensive.py,sha256=sXm-E4j78Mf1tL2yDHIAD-_zbEHz2HUTLD1eldA7jE8,27078
150
+ scalebox/test/test_sandbox_object_storage_example.py,sha256=3E56DXw526lSrka-H3goG3Cc4lzwMHBGf_MlyDaBH90,4955
151
+ scalebox/test/test_sandbox_object_storage_example_async.py,sha256=ko3Qr8zeJkwC9PlW8GQDz6Pox6T_gXyC_a5g8vzXzok,5327
151
152
  scalebox/test/test_sandbox_stress_and_edge_cases.py,sha256=-lzub_06u_SmMVqu1OWIcP5VANm5FIz-a2bRTNqgUOk,27602
152
- scalebox/test/test_sandbox_sync_comprehensive.py,sha256=lRsP0Cp_h5Vgmv7rbL90n8aMQIzkBEIQh_NMoiE8Rrg,27747
153
+ scalebox/test/test_sandbox_sync_comprehensive.py,sha256=aYTsc_RMI838NtoTX10-e4WvC349Ueftvy_BBXHFFpI,27739
153
154
  scalebox/test/test_sandbox_usage_examples.py,sha256=B-UdG3nW2dF2ACGKt77zuPaTobMoKMaFf074VERmzuU,34691
154
- scalebox/test/test_sf.py,sha256=L_XsiHX8C-K0_-K_ARJ4vxi8ngXL9e0m_qjHbw4UG_Y,4715
155
- scalebox/test/test_watch_dir_async.py,sha256=LmbIXgdP_9UBggBaz9h-XBS_n829YPUIb87GM1UGuvU,1524
155
+ scalebox/test/test_sf.py,sha256=mZpcVgIAGryHxUmOASB-5yYoVG7DaLRSin5CoF_ZUzc,4731
156
+ scalebox/test/test_watch_dir_async.py,sha256=PXD4Ydd5ZAjKDVj6QnyyqCWIdQ0UUEwhydMiNX7Yv8k,1542
156
157
  scalebox/test/testacreate.py,sha256=dc7gr9M-ym60vJ2t6WZp-BoJCRluUJuEyMbBk3_m_F0,739
157
- scalebox/test/testagetinfo.py,sha256=Fi6gHliHglVtxg6qEMaLVz3zUdwiWa5bQpPMk0DG9Ww,520
158
+ scalebox/test/testagetinfo.py,sha256=_vZmcmPUqp6D5XzdyJuO1L3GeoQe5yudeAl21Jkxy34,504
158
159
  scalebox/test/testcodeinterpreter_async.py,sha256=Cmrgv2iRhgJgzr8yvQz3PL4qM_TY_TVvgtRlNrG-G7Y,14258
159
160
  scalebox/test/testcodeinterpreter_sync.py,sha256=g9ni-hOz11IYVGwqslRA8CZE6bkWaVBVd2aZxauWFHw,5713
160
161
  scalebox/test/testcomputeuse.py,sha256=k519uxPRe9CZDaU2NlmOVLpON8l6zx4EHVpzoWL1l5o,7318
161
162
  scalebox/test/testnovnc.py,sha256=p5UM1ueKbyjlyYBcaToFGljG4ppIqC7JGPqltIGY6Po,310
162
- scalebox/test/testsandbox_api.py,sha256=SP4LbO_TyksHgYs2cbBP8bvETCJdMJJyUp6alAywcmY,361
163
- scalebox/test/testsandbox_async.py,sha256=DzT4yXWCEgBtfvthGq4E_1TTBd-2BfQ_2DSHttos1ms,6140
164
- scalebox/test/testsandbox_sync.py,sha256=p6ar8D6DTLffTpDzYE_WDO9QN1l-cKV7BIU5H1jKUd8,2851
165
- scalebox/test/upload_100mb_example.py,sha256=i4hOXzUcfm1eWqrVoxEl6wg6ZlyPkdbHQtSaS-d6XLg,12423
163
+ scalebox/test/testsandbox_api.py,sha256=EngCtcLXQwLWC1-vTQORoULSkeKmpUSWBflhSmJbKTw,371
164
+ scalebox/test/testsandbox_async.py,sha256=7Y2zDJ_LKryIf82900rClUpJ6rk6h9QBgtGcYxbHiQM,5869
165
+ scalebox/test/testsandbox_sync.py,sha256=KVTG9mXuNLSOIzd5yVsX0lMsVAVE6QkeZ7QxjcBm8Ho,2858
166
+ scalebox/test/upload_100mb_example.py,sha256=o3ibRs85uxh3vTPyyfWBaE0P4pT3M5NBQYpUYso-5H0,12268
166
167
  scalebox/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
168
  scalebox/utils/httpcoreclient.py,sha256=rWt8valiNCdxQMwDPEdVeFePGPHCq70LO1T0lSE6hG0,10165
168
169
  scalebox/utils/httpxclient.py,sha256=Fk337PPI99VEQjvA62b-BdnOvyL6g4H03EpvjpdxBBg,13845
169
- scalebox_sdk-1.0.1.dist-info/licenses/LICENSE,sha256=9zP32kHlBovkfji1R6ptx3H7WjJJvnf4UuwTpfogmsY,1069
170
- scalebox_sdk-1.0.1.dist-info/METADATA,sha256=Ix7_Y9jSJBPKJ0-cKPBohAsUcXUv_F4DWcYB7RWa7vs,12735
171
- scalebox_sdk-1.0.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
172
- scalebox_sdk-1.0.1.dist-info/entry_points.txt,sha256=g7C1Trcg8EyvAGMnHpJ3alqtZzQuMypYUQVFK13kOFM,47
173
- scalebox_sdk-1.0.1.dist-info/top_level.txt,sha256=CDjlibkbOG-MT-s1TRxs4Xe_iN1m11ii48spB6DOMj4,9
174
- scalebox_sdk-1.0.1.dist-info/RECORD,,
170
+ scalebox_sdk-1.0.3.dist-info/licenses/LICENSE,sha256=9zP32kHlBovkfji1R6ptx3H7WjJJvnf4UuwTpfogmsY,1069
171
+ scalebox_sdk-1.0.3.dist-info/METADATA,sha256=rNzLcngozXEKWh-utsVXHHmMOJduT1W8Hxh6BFgXNp0,12735
172
+ scalebox_sdk-1.0.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
173
+ scalebox_sdk-1.0.3.dist-info/entry_points.txt,sha256=g7C1Trcg8EyvAGMnHpJ3alqtZzQuMypYUQVFK13kOFM,47
174
+ scalebox_sdk-1.0.3.dist-info/top_level.txt,sha256=CDjlibkbOG-MT-s1TRxs4Xe_iN1m11ii48spB6DOMj4,9
175
+ scalebox_sdk-1.0.3.dist-info/RECORD,,