bizyengine 0.4.2__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 (76) hide show
  1. bizyengine/__init__.py +35 -0
  2. bizyengine/bizy_server/__init__.py +7 -0
  3. bizyengine/bizy_server/api_client.py +763 -0
  4. bizyengine/bizy_server/errno.py +122 -0
  5. bizyengine/bizy_server/error_handler.py +3 -0
  6. bizyengine/bizy_server/execution.py +55 -0
  7. bizyengine/bizy_server/resp.py +24 -0
  8. bizyengine/bizy_server/server.py +898 -0
  9. bizyengine/bizy_server/utils.py +93 -0
  10. bizyengine/bizyair_extras/__init__.py +24 -0
  11. bizyengine/bizyair_extras/nodes_advanced_refluxcontrol.py +62 -0
  12. bizyengine/bizyair_extras/nodes_cogview4.py +31 -0
  13. bizyengine/bizyair_extras/nodes_comfyui_detail_daemon.py +180 -0
  14. bizyengine/bizyair_extras/nodes_comfyui_instantid.py +164 -0
  15. bizyengine/bizyair_extras/nodes_comfyui_layerstyle_advance.py +141 -0
  16. bizyengine/bizyair_extras/nodes_comfyui_pulid_flux.py +88 -0
  17. bizyengine/bizyair_extras/nodes_controlnet.py +50 -0
  18. bizyengine/bizyair_extras/nodes_custom_sampler.py +130 -0
  19. bizyengine/bizyair_extras/nodes_dataset.py +99 -0
  20. bizyengine/bizyair_extras/nodes_differential_diffusion.py +16 -0
  21. bizyengine/bizyair_extras/nodes_flux.py +69 -0
  22. bizyengine/bizyair_extras/nodes_image_utils.py +93 -0
  23. bizyengine/bizyair_extras/nodes_ip2p.py +20 -0
  24. bizyengine/bizyair_extras/nodes_ipadapter_plus/__init__.py +1 -0
  25. bizyengine/bizyair_extras/nodes_ipadapter_plus/nodes_ipadapter_plus.py +1598 -0
  26. bizyengine/bizyair_extras/nodes_janus_pro.py +81 -0
  27. bizyengine/bizyair_extras/nodes_kolors_mz/__init__.py +86 -0
  28. bizyengine/bizyair_extras/nodes_model_advanced.py +62 -0
  29. bizyengine/bizyair_extras/nodes_sd3.py +52 -0
  30. bizyengine/bizyair_extras/nodes_segment_anything.py +256 -0
  31. bizyengine/bizyair_extras/nodes_segment_anything_utils.py +134 -0
  32. bizyengine/bizyair_extras/nodes_testing_utils.py +139 -0
  33. bizyengine/bizyair_extras/nodes_trellis.py +199 -0
  34. bizyengine/bizyair_extras/nodes_ultimatesdupscale.py +137 -0
  35. bizyengine/bizyair_extras/nodes_upscale_model.py +32 -0
  36. bizyengine/bizyair_extras/nodes_wan_video.py +49 -0
  37. bizyengine/bizyair_extras/oauth_callback/main.py +118 -0
  38. bizyengine/core/__init__.py +8 -0
  39. bizyengine/core/commands/__init__.py +1 -0
  40. bizyengine/core/commands/base.py +27 -0
  41. bizyengine/core/commands/invoker.py +4 -0
  42. bizyengine/core/commands/processors/model_hosting_processor.py +0 -0
  43. bizyengine/core/commands/processors/prompt_processor.py +123 -0
  44. bizyengine/core/commands/servers/model_server.py +0 -0
  45. bizyengine/core/commands/servers/prompt_server.py +234 -0
  46. bizyengine/core/common/__init__.py +8 -0
  47. bizyengine/core/common/caching.py +198 -0
  48. bizyengine/core/common/client.py +262 -0
  49. bizyengine/core/common/env_var.py +101 -0
  50. bizyengine/core/common/utils.py +93 -0
  51. bizyengine/core/configs/conf.py +112 -0
  52. bizyengine/core/configs/models.json +101 -0
  53. bizyengine/core/configs/models.yaml +329 -0
  54. bizyengine/core/data_types.py +20 -0
  55. bizyengine/core/image_utils.py +288 -0
  56. bizyengine/core/nodes_base.py +159 -0
  57. bizyengine/core/nodes_io.py +97 -0
  58. bizyengine/core/path_utils/__init__.py +9 -0
  59. bizyengine/core/path_utils/path_manager.py +276 -0
  60. bizyengine/core/path_utils/utils.py +34 -0
  61. bizyengine/misc/__init__.py +0 -0
  62. bizyengine/misc/auth.py +83 -0
  63. bizyengine/misc/llm.py +431 -0
  64. bizyengine/misc/mzkolors.py +93 -0
  65. bizyengine/misc/nodes.py +1208 -0
  66. bizyengine/misc/nodes_controlnet_aux.py +491 -0
  67. bizyengine/misc/nodes_controlnet_union_sdxl.py +171 -0
  68. bizyengine/misc/route_sam.py +60 -0
  69. bizyengine/misc/segment_anything.py +276 -0
  70. bizyengine/misc/supernode.py +182 -0
  71. bizyengine/misc/utils.py +218 -0
  72. bizyengine/version.txt +1 -0
  73. bizyengine-0.4.2.dist-info/METADATA +12 -0
  74. bizyengine-0.4.2.dist-info/RECORD +76 -0
  75. bizyengine-0.4.2.dist-info/WHEEL +5 -0
  76. bizyengine-0.4.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,763 @@
1
+ import os
2
+ import urllib
3
+
4
+ import aiohttp
5
+ import bizyengine.core as core
6
+ from bizyengine.core.common import get_api_key
7
+ from bizyengine.core.common.env_var import BIZYAIR_PRODUCTION_TEST, BIZYAIR_SERVER_ADDRESS
8
+
9
+ from .errno import ErrorNo, errnos
10
+ from .error_handler import ErrorHandler
11
+ from .utils import is_string_valid
12
+
13
+ with open(os.path.join(os.path.dirname(__file__), "..", "version.txt"), "r") as file:
14
+ CLIENT_VERSION = file.read()
15
+
16
+
17
+ class APIClient:
18
+ def __init__(self):
19
+ self.error_handler = ErrorHandler()
20
+
21
+ async def get_session(self):
22
+ timeout = aiohttp.ClientTimeout(total=30)
23
+ return aiohttp.ClientSession(timeout=timeout)
24
+
25
+ def auth_header(self):
26
+ try:
27
+ api_key = get_api_key()
28
+ auth = f"Bearer {api_key}"
29
+ headers = {
30
+ "accept": "application/json",
31
+ "content-type": "application/json",
32
+ "authorization": auth,
33
+ "x-bizyair-client-version": CLIENT_VERSION,
34
+ }
35
+ if BIZYAIR_PRODUCTION_TEST != None:
36
+ headers["x-bizyair-production-test"] = BIZYAIR_PRODUCTION_TEST
37
+ return headers, None
38
+ except ValueError as e:
39
+ error_message = e.args[0] if e.args else "Invalid API key"
40
+ errnos.INVALID_API_KEY.message = error_message
41
+ return None, errnos.INVALID_API_KEY
42
+
43
+ async def do_get(self, url, params=None, headers=None):
44
+ if params:
45
+ query_string = urllib.parse.urlencode(params, doseq=True)
46
+ url = f"{url}?{query_string}"
47
+ async with await self.get_session() as session:
48
+ async with session.get(url, headers=headers) as response:
49
+ resp_json = await response.json()
50
+ if response.status != 200:
51
+ return None, ErrorNo(
52
+ response.status,
53
+ resp_json.get("code", response.status),
54
+ None,
55
+ resp_json.get("message", await response.text()),
56
+ )
57
+ return resp_json, None
58
+
59
+ async def do_post(self, url, data=None, headers=None):
60
+ async with await self.get_session() as session:
61
+ async with session.post(url, json=data, headers=headers) as response:
62
+ resp_json = await response.json()
63
+ if response.status != 200:
64
+ return None, ErrorNo(
65
+ response.status,
66
+ resp_json.get("code", response.status),
67
+ None,
68
+ resp_json.get("message", await response.text()),
69
+ )
70
+ return resp_json, None
71
+
72
+ async def do_put(self, url, data=None, headers=None):
73
+ async with await self.get_session() as session:
74
+ async with session.put(url, json=data, headers=headers) as response:
75
+ resp_json = await response.json()
76
+ if response.status != 200:
77
+ return None, ErrorNo(
78
+ response.status,
79
+ resp_json.get("code", response.status),
80
+ None,
81
+ resp_json.get("message", await response.text()),
82
+ )
83
+ return resp_json, None
84
+
85
+ async def do_delete(self, url, data=None, headers=None):
86
+ async with await self.get_session() as session:
87
+ async with session.delete(url, json=data, headers=headers) as response:
88
+ resp_json = await response.json()
89
+ if response.status != 200:
90
+ return None, ErrorNo(
91
+ response.status,
92
+ resp_json.get("code", response.status),
93
+ None,
94
+ resp_json.get("message", await response.text()),
95
+ )
96
+ return resp_json, None
97
+
98
+ async def user_info(self) -> tuple[dict | None, ErrorNo | None]:
99
+ headers, err = self.auth_header()
100
+ if err is not None:
101
+ return None, err
102
+
103
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/user/info"
104
+ try:
105
+ ret, err = await self.do_get(server_url, headers=headers)
106
+ if err is not None:
107
+ return None, err
108
+
109
+ return ret["data"], None
110
+ except Exception as e:
111
+ print(f"\033[31m[BizyAir]\033[0m Fail to get user info: {str(e)}")
112
+ return None, errnos.GET_USER_INFO
113
+
114
+ async def sign(
115
+ self, signature: str, type: str
116
+ ) -> tuple[dict | None, ErrorNo | None]:
117
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/files/{signature}"
118
+ params = None
119
+ if is_string_valid(type):
120
+ params = {"type": type}
121
+
122
+ headers, err = self.auth_header()
123
+ if err is not None:
124
+ return None, err
125
+
126
+ try:
127
+ ret, err = await self.do_get(server_url, params=params, headers=headers)
128
+ if err is not None:
129
+ return None, err
130
+
131
+ return ret["data"], None
132
+
133
+ except Exception as e:
134
+ print(f"\033[31m[BizyAir]\033[0m Fail to sign model: {str(e)}")
135
+ return None, errnos.SIGN_FILE
136
+
137
+ async def commit_file(
138
+ self, signature: str, object_key: str, md5_hash: str, type: str
139
+ ) -> tuple[dict | None, ErrorNo | None]:
140
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/files"
141
+
142
+ payload = {
143
+ "sign": signature,
144
+ "object_key": object_key,
145
+ "md5_hash": md5_hash,
146
+ "type": type,
147
+ }
148
+ headers, err = self.auth_header()
149
+ if err is not None:
150
+ return None, err
151
+
152
+ try:
153
+ ret, err = await self.do_post(server_url, data=payload, headers=headers)
154
+ if err is not None:
155
+ return None, err
156
+
157
+ return ret["data"], None
158
+ except Exception as e:
159
+ print(f"\033[31m[BizyAir]\033[0m Fail to commit file: {str(e)}")
160
+ return None, errnos.COMMIT_FILE
161
+
162
+ async def commit_bizy_model(self, payload) -> tuple[dict | None, ErrorNo | None]:
163
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/bizy_models"
164
+
165
+ headers, err = self.auth_header()
166
+ if err is not None:
167
+ return None, err
168
+
169
+ try:
170
+ ret, err = await self.do_post(server_url, data=payload, headers=headers)
171
+ if err is not None:
172
+ return None, err
173
+
174
+ return ret["data"], None
175
+ except Exception as e:
176
+ print(f"\033[31m[BizyAir]\033[0m Fail to commit model: {str(e)}")
177
+ return None, errnos.COMMIT_BIZY_MODEL
178
+
179
+ async def delete_bizy_model(
180
+ self, model_id: int
181
+ ) -> tuple[dict | None, ErrorNo | None]:
182
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/bizy_models/{model_id}"
183
+
184
+ headers, err = self.auth_header()
185
+ if err is not None:
186
+ return None, err
187
+
188
+ try:
189
+ ret, err = await self.do_delete(server_url, headers=headers)
190
+ if err is not None:
191
+ return None, err
192
+
193
+ return ret["data"], None
194
+ except Exception as e:
195
+ print(f"\033[31m[BizyAir]\033[0m Fail to delete model: {str(e)}")
196
+ return None, errnos.DELETE_BIZY_MODEL
197
+
198
+ async def query_community_models(
199
+ self,
200
+ current: int,
201
+ page_size: int,
202
+ keyword: str = None,
203
+ model_types: list[str] = None,
204
+ base_models: list[str] = None,
205
+ sort: str = None,
206
+ ) -> tuple[dict | None, ErrorNo | None]:
207
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/bizy_models/community"
208
+ params = {"current": current, "page_size": page_size}
209
+ if keyword:
210
+ params["keyword"] = keyword
211
+ if model_types:
212
+ params["model_types"] = model_types
213
+ if base_models:
214
+ params["base_models"] = base_models
215
+ if sort:
216
+ params["sort"] = sort
217
+
218
+ headers, err = self.auth_header()
219
+ if err is not None:
220
+ return None, err
221
+
222
+ try:
223
+ ret, err = await self.do_get(server_url, params=params, headers=headers)
224
+ if err is not None:
225
+ return None, err
226
+
227
+ return ret["data"], None
228
+ except Exception as e:
229
+ print(f"\033[31m[BizyAir]\033[0m Fail to query community models: {str(e)}")
230
+ return None, errnos.QUERY_COMMUNITY_MODELS
231
+
232
+ async def query_official_models(
233
+ self,
234
+ current: int,
235
+ page_size: int,
236
+ keyword: str = None,
237
+ model_types: list[str] = None,
238
+ base_models: list[str] = None,
239
+ sort: str = None,
240
+ ) -> tuple[dict | None, ErrorNo | None]:
241
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/bizy_models/official"
242
+ params = {"current": current, "page_size": page_size}
243
+ if keyword:
244
+ params["keyword"] = keyword
245
+ if model_types:
246
+ params["model_types"] = model_types
247
+ if base_models:
248
+ params["base_models"] = base_models
249
+ if sort:
250
+ params["sort"] = sort
251
+
252
+ headers, err = self.auth_header()
253
+ if err is not None:
254
+ return None, err
255
+
256
+ try:
257
+ ret, err = await self.do_get(server_url, params=params, headers=headers)
258
+ if err is not None:
259
+ return None, err
260
+
261
+ return ret["data"], None
262
+ except Exception as e:
263
+ print(f"\033[31m[BizyAir]\033[0m Fail to query official models: {str(e)}")
264
+ return None, errnos.QUERY_OFFICIAL_MODELS
265
+
266
+ async def query_models(
267
+ self,
268
+ mode: str,
269
+ current: int,
270
+ page_size: int,
271
+ keyword: str = None,
272
+ model_types: list[str] = None,
273
+ base_models: list[str] = None,
274
+ sort: str = None,
275
+ ) -> tuple[dict | None, ErrorNo | None]:
276
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/bizy_models/{mode}"
277
+ params = {"current": current, "page_size": page_size}
278
+ if keyword:
279
+ params["keyword"] = keyword
280
+ if model_types:
281
+ params["model_types"] = model_types
282
+ if base_models:
283
+ params["base_models"] = base_models
284
+ if sort:
285
+ params["sort"] = sort
286
+
287
+ headers, err = self.auth_header()
288
+ if err is not None:
289
+ return None, err
290
+
291
+ try:
292
+ ret, err = await self.do_get(server_url, params=params, headers=headers)
293
+ if err is not None:
294
+ return None, err
295
+
296
+ return ret["data"], None
297
+ except Exception as e:
298
+ print(f"\033[31m[BizyAir]\033[0m Fail to query models: {str(e)}")
299
+ return None, errnos.QUERY_MODELS
300
+
301
+ async def get_model_detail(
302
+ self, model_id: int, source: str
303
+ ) -> tuple[dict | None, ErrorNo | None]:
304
+ server_url = (
305
+ f"{BIZYAIR_SERVER_ADDRESS}/bizy_models/{model_id}/detail?source={source}"
306
+ )
307
+
308
+ headers, err = self.auth_header()
309
+ if err is not None:
310
+ return None, err
311
+
312
+ try:
313
+ ret, err = await self.do_get(server_url, headers=headers)
314
+ if err is not None:
315
+ return None, err
316
+
317
+ return ret["data"], None
318
+ except Exception as e:
319
+ print(f"\033[31m[BizyAir]\033[0m Fail to get model detail: {str(e)}")
320
+ return None, errnos.GET_MODEL_DETAIL
321
+
322
+ async def get_model_version_detail(
323
+ self, version_id: int
324
+ ) -> tuple[dict | None, ErrorNo | None]:
325
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/bizy_models/versions/{version_id}"
326
+
327
+ headers, err = self.auth_header()
328
+ if err is not None:
329
+ return None, err
330
+
331
+ try:
332
+ ret, err = await self.do_get(server_url, headers=headers)
333
+ if err is not None:
334
+ return None, err
335
+
336
+ return ret["data"], None
337
+ except Exception as e:
338
+ print(
339
+ f"\033[31m[BizyAir]\033[0m Fail to get model version detail: {str(e)}"
340
+ )
341
+ return None, errnos.GET_MODEL_VERSION_DETAIL
342
+
343
+ async def fork_model_version(self, version_id: int) -> tuple[None, ErrorNo | None]:
344
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/bizy_models/versions/{version_id}/fork"
345
+
346
+ headers, err = self.auth_header()
347
+ if err is not None:
348
+ return None, err
349
+
350
+ try:
351
+ ret, err = await self.do_post(server_url, headers=headers)
352
+ if err is not None:
353
+ return None, err
354
+
355
+ return None, None
356
+ except Exception as e:
357
+ print(f"\033[31m[BizyAir]\033[0m Fail to fork model version: {str(e)}")
358
+ return None, errnos.FORK_MODEL_VERSION
359
+
360
+ async def unfork_model_version(
361
+ self, version_id: int
362
+ ) -> tuple[None, ErrorNo | None]:
363
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/bizy_models/versions/{version_id}/fork"
364
+
365
+ headers, err = self.auth_header()
366
+ if err is not None:
367
+ return None, err
368
+
369
+ try:
370
+ ret, err = await self.do_delete(server_url, headers=headers)
371
+ if err is not None:
372
+ return None, err
373
+
374
+ return None, None
375
+ except Exception as e:
376
+ print(f"\033[31m[BizyAir]\033[0m Fail to unfork model version: {str(e)}")
377
+ return None, errnos.UNFORK_MODEL_VERSION
378
+
379
+ async def update_model(
380
+ self, model_id: int, name: str, type_: str, versions: list[dict]
381
+ ) -> tuple[dict | None, ErrorNo | None]:
382
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/bizy_models/{model_id}"
383
+
384
+ headers, err = self.auth_header()
385
+ if err is not None:
386
+ return None, err
387
+
388
+ data = {"name": name, "type": type_, "versions": versions}
389
+
390
+ try:
391
+ ret, err = await self.do_put(server_url, data=data, headers=headers)
392
+ if err is not None:
393
+ return None, err
394
+
395
+ return ret["data"], None
396
+ except Exception as e:
397
+ print(f"\033[31m[BizyAir]\033[0m Fail to update model: {str(e)}")
398
+ return None, errnos.UPDATE_MODEL
399
+
400
+ async def get_upload_token(
401
+ self, filename: str
402
+ ) -> tuple[dict | None, ErrorNo | None]:
403
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/upload/token?file_name={filename}"
404
+
405
+ headers, err = self.auth_header()
406
+ if err is not None:
407
+ return None, err
408
+
409
+ try:
410
+ ret, err = await self.do_get(server_url, headers=headers)
411
+ if err is not None:
412
+ return None, err
413
+
414
+ return ret["data"], None
415
+ except Exception as e:
416
+ print(f"\033[31m[BizyAir]\033[0m Fail to get upload token: {str(e)}")
417
+ return None, errnos.GET_UPLOAD_TOKEN
418
+
419
+ async def toggle_user_like(
420
+ self, like_type: str, object_id: str
421
+ ) -> tuple[dict | None, ErrorNo | None]:
422
+ if like_type == "model_version":
423
+ server_url = (
424
+ f"{BIZYAIR_SERVER_ADDRESS}/bizy_models/versions/{object_id}/like"
425
+ )
426
+ else:
427
+ return None, errnos.UNSUPPORT_LIKE_TYPE
428
+
429
+ headers, err = self.auth_header()
430
+ if err is not None:
431
+ return None, err
432
+
433
+ try:
434
+ ret, err = await self.do_post(server_url, headers=headers)
435
+ if err is not None:
436
+ return None, err
437
+
438
+ return ret["data"], None
439
+ except Exception as e:
440
+ print(f"\033[31m[BizyAir]\033[0m Fail to toggle user like: {str(e)}")
441
+ return None, errnos.TOGGLE_USER_LIKE
442
+
443
+ async def get_download_url(
444
+ self, sign: str, model_version_id: int
445
+ ) -> tuple[str | None, ErrorNo | None]:
446
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/files/temp-download/{sign}?version_id={model_version_id}"
447
+
448
+ headers, err = self.auth_header()
449
+ if err is not None:
450
+ return None, err
451
+
452
+ try:
453
+ ret, err = await self.do_get(server_url, headers=headers)
454
+ if err is not None:
455
+ return None, err
456
+
457
+ return ret["data"]["url"], None
458
+ except Exception as e:
459
+ print(f"\033[31m[BizyAir]\033[0m Fail to get download url: {str(e)}")
460
+ return None, errnos.GET_DOWNLOAD_URL
461
+
462
+ async def get_share_model_files(self, shareId, payload) -> (dict, ErrorNo):
463
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/{shareId}/models/files"
464
+ try:
465
+
466
+ def callback(ret: dict):
467
+ if ret["code"] != errnos.OK.code:
468
+ return [], ErrorNo(500, ret["code"], None, f"{ret}")
469
+ if not ret or "data" not in ret or ret["data"] is None:
470
+ return [], None
471
+
472
+ outputs = [
473
+ x["label_path"] for x in ret["data"]["files"] if x["label_path"]
474
+ ]
475
+ outputs = core.path_utils.filter_files_extensions(
476
+ outputs,
477
+ extensions=core.path_utils.path_manager.supported_pt_extensions,
478
+ )
479
+ return outputs, None
480
+
481
+ ret = await core.common.client.async_send_request(
482
+ method="GET", url=server_url, params=payload, callback=callback
483
+ )
484
+ return ret[0], ret[1]
485
+ except Exception as e:
486
+ print(
487
+ f"\033[31m[BizyAir]\033[0m Fail to list share model files: response {ret} error {str(e)}"
488
+ )
489
+ return [], errnos.LIST_SHARE_MODEL_FILE_ERR
490
+
491
+ async def commit_dataset(self, payload) -> tuple[dict | None, ErrorNo | None]:
492
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/datasets"
493
+
494
+ headers, err = self.auth_header()
495
+ if err is not None:
496
+ return None, err
497
+
498
+ try:
499
+ ret, err = await self.do_post(server_url, data=payload, headers=headers)
500
+ if err is not None:
501
+ return None, err
502
+
503
+ return ret["data"], None
504
+ except Exception as e:
505
+ print(f"\033[31m[BizyAir]\033[0m Fail to commit dataset: {str(e)}")
506
+ return None, errnos.COMMIT_DATASET
507
+
508
+ async def update_dataset(
509
+ self, dataset_id: int, name: str, versions: list[dict]
510
+ ) -> tuple[dict | None, ErrorNo | None]:
511
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/datasets/{dataset_id}"
512
+
513
+ headers, err = self.auth_header()
514
+ if err is not None:
515
+ return None, err
516
+
517
+ data = {"name": name, "versions": versions}
518
+
519
+ try:
520
+ ret, err = await self.do_put(server_url, data=data, headers=headers)
521
+ if err is not None:
522
+ return None, err
523
+
524
+ return ret["data"], None
525
+ except Exception as e:
526
+ print(f"\033[31m[BizyAir]\033[0m Fail to update dataset: {str(e)}")
527
+ return None, errnos.UPDATE_DATASET
528
+
529
+ async def get_dataset_version_detail(
530
+ self, version_id: int
531
+ ) -> tuple[dict | None, ErrorNo | None]:
532
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/datasets/versions/{version_id}"
533
+
534
+ headers, err = self.auth_header()
535
+ if err is not None:
536
+ return None, err
537
+
538
+ try:
539
+ ret, err = await self.do_get(server_url, headers=headers)
540
+ if err is not None:
541
+ return None, err
542
+
543
+ return ret["data"], None
544
+ except Exception as e:
545
+ print(
546
+ f"\033[31m[BizyAir]\033[0m Fail to get dataset version detail: {str(e)}"
547
+ )
548
+ return None, errnos.GET_MODEL_VERSION_DETAIL
549
+
550
+ async def delete_dataset(
551
+ self, dataset_id: int
552
+ ) -> tuple[dict | None, ErrorNo | None]:
553
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/datasets/{dataset_id}"
554
+
555
+ headers, err = self.auth_header()
556
+ if err is not None:
557
+ return None, err
558
+
559
+ try:
560
+ ret, err = await self.do_delete(server_url, headers=headers)
561
+ if err is not None:
562
+ return None, err
563
+
564
+ return ret["data"], None
565
+ except Exception as e:
566
+ print(f"\033[31m[BizyAir]\033[0m Fail to delete dataset: {str(e)}")
567
+ return None, errnos.DELETE_DATASET
568
+
569
+ async def query_datasets(
570
+ self,
571
+ current: int,
572
+ page_size: int,
573
+ keyword: str = None,
574
+ annotated: str = None,
575
+ ) -> tuple[dict | None, ErrorNo | None]:
576
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/datasets"
577
+ params = {"current": current, "page_size": page_size}
578
+ if keyword:
579
+ params["keyword"] = keyword
580
+ if annotated:
581
+ params["annotated"] = annotated
582
+
583
+ headers, err = self.auth_header()
584
+ if err is not None:
585
+ return None, err
586
+
587
+ try:
588
+ ret, err = await self.do_get(server_url, params=params, headers=headers)
589
+ if err is not None:
590
+ return None, err
591
+
592
+ return ret["data"], None
593
+ except Exception as e:
594
+ print(f"\033[31m[BizyAir]\033[0m Fail to query datasets: {str(e)}")
595
+ return None, errnos.QUERY_DATASETS
596
+
597
+ async def get_dataset_detail(
598
+ self, dataset_id: int
599
+ ) -> tuple[dict | None, ErrorNo | None]:
600
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/datasets/{dataset_id}/detail"
601
+
602
+ headers, err = self.auth_header()
603
+ if err is not None:
604
+ return None, err
605
+
606
+ try:
607
+ ret, err = await self.do_get(server_url, headers=headers)
608
+ if err is not None:
609
+ return None, err
610
+
611
+ return ret["data"], None
612
+ except Exception as e:
613
+ print(f"\033[31m[BizyAir]\033[0m Fail to get dataset detail: {str(e)}")
614
+ return None, errnos.GET_DATASET_DETAIL
615
+
616
+ async def create_share(self, payload) -> tuple[dict | None, ErrorNo | None]:
617
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/share"
618
+
619
+ headers, err = self.auth_header()
620
+ if err is not None:
621
+ return None, err
622
+
623
+ try:
624
+ ret, err = await self.do_post(server_url, data=payload, headers=headers)
625
+ if err is not None:
626
+ return None, err
627
+ return ret["data"], None
628
+ except Exception as e:
629
+ print(f"\033[31m[BizyAir]\033[0m Fail to create share: {str(e)}")
630
+ return None, errnos.CREATE_SHARE
631
+
632
+ async def get_share_detail(self, code: str) -> tuple[dict | None, ErrorNo | None]:
633
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/share/{code}"
634
+
635
+ headers, err = self.auth_header()
636
+ if err is not None:
637
+ return None, err
638
+
639
+ try:
640
+ ret, err = await self.do_get(server_url, headers=headers)
641
+ if err is not None:
642
+ return None, err
643
+
644
+ return ret["data"], None
645
+ except Exception as e:
646
+ print(f"\033[31m[BizyAir]\033[0m Fail to get share detail: {str(e)}")
647
+ return None, errnos.GET_SHARE_DETAIL
648
+
649
+ async def get_data_dict(self) -> tuple[dict | None, ErrorNo | None]:
650
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/dict"
651
+ headers, err = self.auth_header()
652
+ if err is not None:
653
+ return None, err
654
+
655
+ try:
656
+ ret, err = await self.do_get(server_url, headers=headers)
657
+ if err is not None:
658
+ return None, err
659
+
660
+ return ret["data"], None
661
+ except Exception as e:
662
+ print(f"\033[31m[BizyAir]\033[0m Fail to get data dict: {str(e)}")
663
+ return None, errnos.GET_DATA_DICT
664
+
665
+ async def get_notification_unread_count(self) -> tuple[dict | None, ErrorNo | None]:
666
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/notifications/unread_count"
667
+ headers, err = self.auth_header()
668
+ if err is not None:
669
+ return None, err
670
+
671
+ try:
672
+ ret, err = await self.do_get(server_url, headers=headers)
673
+ if err is not None:
674
+ return None, err
675
+
676
+ return ret["data"], None
677
+ except Exception as e:
678
+ print(
679
+ f"\033[31m[BizyAir]\033[0m Fail to get notification unread counts: {str(e)}"
680
+ )
681
+ return None, errnos.GET_NOTIF_UNREAD_COUNT
682
+
683
+ async def fetch_notifications(
684
+ self,
685
+ page_size: int,
686
+ last_pm_id: int,
687
+ last_broadcast_id: int,
688
+ types: list | None,
689
+ read_status: bool | None,
690
+ ) -> tuple[dict | None, ErrorNo | None]:
691
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/notifications"
692
+ headers, err = self.auth_header()
693
+ if err is not None:
694
+ return None, err
695
+
696
+ params = {"page_size": page_size}
697
+ if last_pm_id > 0:
698
+ params["last_pm_id"] = last_pm_id
699
+ if last_broadcast_id > 0:
700
+ params["last_broadcast_id"] = last_broadcast_id
701
+ if types and len(types) > 0:
702
+ params["types"] = types
703
+ if read_status:
704
+ params["read_status"] = read_status
705
+
706
+ try:
707
+ ret, err = await self.do_get(server_url, headers=headers, params=params)
708
+ if err is not None:
709
+ return None, err
710
+
711
+ return ret["data"], None
712
+ except Exception as e:
713
+ print(f"\033[31m[BizyAir]\033[0m Fail to query notifications: {str(e)}")
714
+ return None, errnos.QUERY_NOTIF
715
+
716
+ async def read_notifications(
717
+ self, notif_ids: list[int]
718
+ ) -> tuple[dict | None, ErrorNo | None]:
719
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/notifications/read"
720
+ headers, err = self.auth_header()
721
+ if err is not None:
722
+ return None, err
723
+
724
+ if notif_ids is None or len(notif_ids) < 1:
725
+ return None, errnos.INVALID_NOTIF_ID
726
+
727
+ payload = {"ids": notif_ids}
728
+
729
+ try:
730
+ ret, err = await self.do_post(server_url, headers=headers, data=payload)
731
+ if err is not None:
732
+ return None, err
733
+
734
+ return ret["data"], None
735
+ except Exception as e:
736
+ print(
737
+ f"\033[31m[BizyAir]\033[0m Fail to mark notifications as read: {str(e)}"
738
+ )
739
+ return None, errnos.READ_NOTIF
740
+
741
+ async def read_all_notifications(
742
+ self, type: int
743
+ ) -> tuple[dict | None, ErrorNo | None]:
744
+ server_url = f"{BIZYAIR_SERVER_ADDRESS}/notifications/read_all"
745
+ headers, err = self.auth_header()
746
+ if err is not None:
747
+ return None, err
748
+
749
+ payload = {}
750
+ if type > 0:
751
+ payload["type"] = type
752
+
753
+ try:
754
+ ret, err = await self.do_post(server_url, headers=headers, data=payload)
755
+ if err is not None:
756
+ return None, err
757
+
758
+ return ret["data"], None
759
+ except Exception as e:
760
+ print(
761
+ f"\033[31m[BizyAir]\033[0m Fail to mark all notifications as read: {str(e)}"
762
+ )
763
+ return None, errnos.READ_ALL_NOTIF