intellif-aihub 0.1.2__py3-none-any.whl → 0.1.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.

Potentially problematic release.


This version of intellif-aihub might be problematic. Click here for more details.

Files changed (35) hide show
  1. aihub/__init__.py +1 -1
  2. aihub/client.py +91 -87
  3. aihub/exceptions.py +18 -18
  4. aihub/models/artifact.py +137 -137
  5. aihub/models/common.py +13 -13
  6. aihub/models/dataset_management.py +99 -99
  7. aihub/models/document_center.py +28 -28
  8. aihub/models/labelfree.py +31 -31
  9. aihub/models/model_training_platform.py +230 -0
  10. aihub/models/tag_resource_management.py +50 -0
  11. aihub/models/task_center.py +117 -117
  12. aihub/models/user_system.py +262 -0
  13. aihub/services/artifact.py +353 -332
  14. aihub/services/dataset_management.py +240 -240
  15. aihub/services/document_center.py +43 -43
  16. aihub/services/labelfree.py +44 -44
  17. aihub/services/model_training_platform.py +135 -0
  18. aihub/services/quota_schedule_management.py +18 -18
  19. aihub/services/reporter.py +20 -20
  20. aihub/services/tag_resource_management.py +55 -0
  21. aihub/services/task_center.py +190 -190
  22. aihub/services/user_system.py +339 -0
  23. aihub/utils/download.py +69 -69
  24. aihub/utils/http.py +13 -13
  25. aihub/utils/s3.py +77 -77
  26. {intellif_aihub-0.1.2.dist-info → intellif_aihub-0.1.3.dist-info}/METADATA +2 -2
  27. intellif_aihub-0.1.3.dist-info/RECORD +34 -0
  28. {intellif_aihub-0.1.2.dist-info → intellif_aihub-0.1.3.dist-info}/licenses/LICENSE +200 -200
  29. aihub/models/tag_management.py +0 -21
  30. aihub/models/user.py +0 -46
  31. aihub/services/tag_management.py +0 -35
  32. aihub/services/user.py +0 -47
  33. intellif_aihub-0.1.2.dist-info/RECORD +0 -32
  34. {intellif_aihub-0.1.2.dist-info → intellif_aihub-0.1.3.dist-info}/WHEEL +0 -0
  35. {intellif_aihub-0.1.2.dist-info → intellif_aihub-0.1.3.dist-info}/top_level.txt +0 -0
@@ -1,240 +1,240 @@
1
- from __future__ import annotations
2
-
3
- import mimetypes
4
- import os
5
- import pathlib
6
-
7
- import httpx
8
-
9
- from ..exceptions import APIError
10
- from ..models.common import APIWrapper
11
- from ..models.dataset_management import *
12
- from ..utils.download import dataset_download
13
-
14
- _BASE = "/dataset-mng/api/v2"
15
-
16
-
17
- class DatasetManagementService:
18
- """数据集管理服务,用于数据集的上传、下载
19
-
20
- Methods:
21
- create_dataset_and_version: 创建数据集版本
22
- run_download: 下载
23
-
24
-
25
- """
26
-
27
- def __init__(self, http: httpx.Client):
28
- self._dataset = _Dataset(http)
29
- self._dataset_version = _DatasetVersion(http)
30
- self._upload = _Upload(http)
31
-
32
- # 直接把常用方法抛到一级,调用体验简单
33
- def create_dataset(self, payload: CreateDatasetRequest) -> int:
34
- return self._dataset.create(payload)
35
-
36
- def get_dataset(self, dataset_id: int) -> DatasetDetail:
37
- return self._dataset.get(dataset_id)
38
-
39
- def create_dataset_version(self, payload: CreateDatasetVersionRequest) -> int:
40
- return self._dataset_version.create(payload)
41
-
42
- def upload_dataset_version(self, payload: UploadDatasetVersionRequest) -> int:
43
- return self._dataset_version.upload(payload)
44
-
45
- def get_dataset_version(self, version_id: int) -> DatasetVersionDetail:
46
- return self._dataset_version.get(version_id)
47
-
48
- def get_dataset_version_by_name(self, version_name: str) -> DatasetVersionDetail:
49
- return self._dataset_version.get_by_name(version_name)
50
-
51
- def upload_file(self, file_path: str) -> FileUploadData:
52
- return self._upload.upload_file(file_path)
53
-
54
- # 如果想要访问子对象,也保留属性
55
- @property
56
- def dataset(self) -> _Dataset:
57
- return self._dataset
58
-
59
- @property
60
- def dataset_version(self) -> _DatasetVersion:
61
- return self._dataset_version
62
-
63
- def create_dataset_and_version(
64
- self,
65
- *,
66
- dataset_name: str,
67
- dataset_description: str = "",
68
- is_local_upload: bool,
69
- local_file_path: str | None = None,
70
- server_file_path: str | None = None,
71
- version_description: str = "",
72
- ) -> tuple[int, int, str]:
73
- """创建数据集及其版本。
74
-
75
- 根据参数创建数据集,并根据上传类型(本地或服务器路径)创建对应的数据集版本。
76
-
77
- Args:
78
- dataset_name: 数据集名称。
79
- dataset_description: 数据集描述,默认为空。
80
- is_local_upload: 是否为本地上传。若为 True,需提供 local_file_path;
81
- 否则需提供 server_file_path。
82
- local_file_path: 本地文件路径,当 is_local_upload=True 时必须提供。
83
- server_file_path: 服务器已有文件路径,当 is_local_upload=False 时必须提供。
84
- version_description: 版本描述,默认为空。
85
-
86
- Returns:
87
- tuple[int, int, str]: 一个三元组,包含:[数据集 ID,数据集版本 ID, 数据集版本标签(格式为 <dataset_name>/V<version_number>)]
88
- """
89
- if is_local_upload:
90
- if not local_file_path:
91
- raise ValueError("is_local_upload=True 时必须提供 local_file_path")
92
- upload_type = 1
93
- else:
94
- if not server_file_path:
95
- raise ValueError("is_local_upload=False 时必须提供 server_file_path")
96
- upload_type = 3
97
-
98
- dataset_id = self._dataset.create(
99
- CreateDatasetRequest(
100
- name=dataset_name,
101
- description=dataset_description,
102
- tags=[],
103
- )
104
- )
105
-
106
- if is_local_upload:
107
- upload_data = self._upload.upload_file(local_file_path)
108
- upload_path = upload_data.path
109
- else:
110
- upload_path = server_file_path
111
-
112
- version_id = self._dataset_version.upload(
113
- UploadDatasetVersionRequest(
114
- upload_path=upload_path,
115
- upload_type=upload_type,
116
- dataset_id=dataset_id,
117
- description=version_description,
118
- )
119
- )
120
-
121
- detail = self._dataset.get(dataset_id)
122
- ver_num = next(
123
- (v.version for v in detail.versions if v.id == version_id),
124
- None,
125
- )
126
- if ver_num is None:
127
- ver_num = 1
128
-
129
- version_tag = f"{detail.name}/V{ver_num}"
130
-
131
- return dataset_id, version_id, version_tag
132
-
133
- def run_download(
134
- self, *, dataset_version_name: str, local_dir: str, worker: int = 4
135
- ) -> None:
136
- """根据数据集版本名称下载对应的数据集文件。
137
-
138
- Args:
139
- dataset_version_name (str): 数据集版本名称。
140
- local_dir (str): 下载文件保存的本地目录路径。
141
- worker (int): 并发下载使用的线程数,默认为 4。
142
-
143
- Raises:
144
- APIError: 如果获取到的版本信息中没有 parquet_index_path,即无法进行下载时抛出异常。
145
-
146
- Returns:
147
- None
148
- """
149
- detail = self._dataset_version.get_by_name(dataset_version_name)
150
- if not detail.parquet_index_path:
151
- raise APIError("parquet_index_path 为空")
152
- dataset_download(detail.parquet_index_path, local_dir, worker)
153
-
154
-
155
- class _Dataset:
156
- def __init__(self, http: httpx.Client):
157
- self._http = http
158
-
159
- def create(self, payload: CreateDatasetRequest) -> int:
160
- resp = self._http.post(
161
- f"{_BASE}/datasets",
162
- json=payload.model_dump(by_alias=True, exclude_none=True),
163
- )
164
- wrapper = APIWrapper[CreateDatasetResponse].model_validate(resp.json())
165
- if wrapper.code != 0:
166
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
167
- return wrapper.data.id
168
-
169
- def get(self, dataset_id: int) -> DatasetDetail:
170
- resp = self._http.get(f"{_BASE}/datasets/{dataset_id}")
171
- wrapper = APIWrapper[DatasetDetail].model_validate(resp.json())
172
- if wrapper.code != 0:
173
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
174
- return wrapper.data
175
-
176
-
177
- class _DatasetVersion:
178
- def __init__(self, http: httpx.Client):
179
- self._http = http
180
-
181
- def create(self, payload: CreateDatasetVersionRequest) -> int:
182
- resp = self._http.post(
183
- f"{_BASE}/dataset-versions",
184
- json=payload.model_dump(by_alias=True, exclude_none=True),
185
- )
186
- wrapper = APIWrapper[CreateDatasetVersionResponse].model_validate(resp.json())
187
- if wrapper.code != 0:
188
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
189
- return wrapper.data.id
190
-
191
- def upload(self, payload: UploadDatasetVersionRequest) -> int:
192
- resp = self._http.post(
193
- f"{_BASE}/dataset-versions-upload",
194
- json=payload.model_dump(by_alias=True, exclude_none=True),
195
- )
196
- wrapper = APIWrapper[UploadDatasetVersionResponse].model_validate(resp.json())
197
- if wrapper.code != 0:
198
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
199
- return wrapper.data.id
200
-
201
- def get(self, version_id: int) -> DatasetVersionDetail:
202
- resp = self._http.get(f"{_BASE}/dataset-versions/{version_id}")
203
- wrapper = APIWrapper[DatasetVersionDetail].model_validate(resp.json())
204
- if wrapper.code != 0:
205
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
206
- return wrapper.data
207
-
208
- def get_by_name(self, version_name: str) -> DatasetVersionDetail:
209
- resp = self._http.get(
210
- f"{_BASE}/dataset-versions-detail", params={"name": version_name}
211
- )
212
- wrapper = APIWrapper[DatasetVersionDetail].model_validate(resp.json())
213
- if wrapper.code != 0:
214
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
215
- return wrapper.data
216
-
217
-
218
- class _Upload:
219
- def __init__(self, http: httpx.Client):
220
- self._http = http
221
-
222
- def upload_file(self, file_path: str) -> FileUploadData:
223
- if not os.path.isfile(file_path):
224
- raise FileNotFoundError(file_path)
225
-
226
- file_name = pathlib.Path(file_path).name
227
- mime_type = mimetypes.guess_type(file_name)[0] or "application/octet-stream"
228
-
229
- with open(file_path, "rb") as fp:
230
- resp = self._http.post(
231
- f"/dataset-mng/api/v1/uploads",
232
- files={"file": (file_name, fp, mime_type)},
233
- timeout=None,
234
- )
235
-
236
- wrapper = APIWrapper[FileUploadData].model_validate(resp.json())
237
- if wrapper.code != 0:
238
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
239
-
240
- return wrapper.data
1
+ from __future__ import annotations
2
+
3
+ import mimetypes
4
+ import os
5
+ import pathlib
6
+
7
+ import httpx
8
+
9
+ from ..exceptions import APIError
10
+ from ..models.common import APIWrapper
11
+ from ..models.dataset_management import *
12
+ from ..utils.download import dataset_download
13
+
14
+ _BASE = "/dataset-mng/api/v2"
15
+
16
+
17
+ class DatasetManagementService:
18
+ """数据集管理服务,用于数据集的上传、下载
19
+
20
+ Methods:
21
+ create_dataset_and_version: 创建数据集版本
22
+ run_download: 下载
23
+
24
+
25
+ """
26
+
27
+ def __init__(self, http: httpx.Client):
28
+ self._dataset = _Dataset(http)
29
+ self._dataset_version = _DatasetVersion(http)
30
+ self._upload = _Upload(http)
31
+
32
+ # 直接把常用方法抛到一级,调用体验简单
33
+ def create_dataset(self, payload: CreateDatasetRequest) -> int:
34
+ return self._dataset.create(payload)
35
+
36
+ def get_dataset(self, dataset_id: int) -> DatasetDetail:
37
+ return self._dataset.get(dataset_id)
38
+
39
+ def create_dataset_version(self, payload: CreateDatasetVersionRequest) -> int:
40
+ return self._dataset_version.create(payload)
41
+
42
+ def upload_dataset_version(self, payload: UploadDatasetVersionRequest) -> int:
43
+ return self._dataset_version.upload(payload)
44
+
45
+ def get_dataset_version(self, version_id: int) -> DatasetVersionDetail:
46
+ return self._dataset_version.get(version_id)
47
+
48
+ def get_dataset_version_by_name(self, version_name: str) -> DatasetVersionDetail:
49
+ return self._dataset_version.get_by_name(version_name)
50
+
51
+ def upload_file(self, file_path: str) -> FileUploadData:
52
+ return self._upload.upload_file(file_path)
53
+
54
+ # 如果想要访问子对象,也保留属性
55
+ @property
56
+ def dataset(self) -> _Dataset:
57
+ return self._dataset
58
+
59
+ @property
60
+ def dataset_version(self) -> _DatasetVersion:
61
+ return self._dataset_version
62
+
63
+ def create_dataset_and_version(
64
+ self,
65
+ *,
66
+ dataset_name: str,
67
+ dataset_description: str = "",
68
+ is_local_upload: bool,
69
+ local_file_path: str | None = None,
70
+ server_file_path: str | None = None,
71
+ version_description: str = "",
72
+ ) -> tuple[int, int, str]:
73
+ """创建数据集及其版本。
74
+
75
+ 根据参数创建数据集,并根据上传类型(本地或服务器路径)创建对应的数据集版本。
76
+
77
+ Args:
78
+ dataset_name: 数据集名称。
79
+ dataset_description: 数据集描述,默认为空。
80
+ is_local_upload: 是否为本地上传。若为 True,需提供 local_file_path;
81
+ 否则需提供 server_file_path。
82
+ local_file_path: 本地文件路径,当 is_local_upload=True 时必须提供。
83
+ server_file_path: 服务器已有文件路径,当 is_local_upload=False 时必须提供。
84
+ version_description: 版本描述,默认为空。
85
+
86
+ Returns:
87
+ tuple[int, int, str]: 一个三元组,包含:[数据集 ID,数据集版本 ID, 数据集版本标签(格式为 <dataset_name>/V<version_number>)]
88
+ """
89
+ if is_local_upload:
90
+ if not local_file_path:
91
+ raise ValueError("is_local_upload=True 时必须提供 local_file_path")
92
+ upload_type = 1
93
+ else:
94
+ if not server_file_path:
95
+ raise ValueError("is_local_upload=False 时必须提供 server_file_path")
96
+ upload_type = 3
97
+
98
+ dataset_id = self._dataset.create(
99
+ CreateDatasetRequest(
100
+ name=dataset_name,
101
+ description=dataset_description,
102
+ tags=[],
103
+ )
104
+ )
105
+
106
+ if is_local_upload:
107
+ upload_data = self._upload.upload_file(local_file_path)
108
+ upload_path = upload_data.path
109
+ else:
110
+ upload_path = server_file_path
111
+
112
+ version_id = self._dataset_version.upload(
113
+ UploadDatasetVersionRequest(
114
+ upload_path=upload_path,
115
+ upload_type=upload_type,
116
+ dataset_id=dataset_id,
117
+ description=version_description,
118
+ )
119
+ )
120
+
121
+ detail = self._dataset.get(dataset_id)
122
+ ver_num = next(
123
+ (v.version for v in detail.versions if v.id == version_id),
124
+ None,
125
+ )
126
+ if ver_num is None:
127
+ ver_num = 1
128
+
129
+ version_tag = f"{detail.name}/V{ver_num}"
130
+
131
+ return dataset_id, version_id, version_tag
132
+
133
+ def run_download(
134
+ self, dataset_version_name: str, local_dir: str, worker: int = 4
135
+ ) -> None:
136
+ """根据数据集版本名称下载对应的数据集文件。
137
+
138
+ Args:
139
+ dataset_version_name (str): 数据集版本名称。
140
+ local_dir (str): 下载文件保存的本地目录路径。
141
+ worker (int): 并发下载使用的线程数,默认为 4。
142
+
143
+ Raises:
144
+ APIError: 如果获取到的版本信息中没有 parquet_index_path,即无法进行下载时抛出异常。
145
+
146
+ Returns:
147
+ None
148
+ """
149
+ detail = self._dataset_version.get_by_name(dataset_version_name)
150
+ if not detail.parquet_index_path:
151
+ raise APIError("parquet_index_path 为空")
152
+ dataset_download(detail.parquet_index_path, local_dir, worker)
153
+
154
+
155
+ class _Dataset:
156
+ def __init__(self, http: httpx.Client):
157
+ self._http = http
158
+
159
+ def create(self, payload: CreateDatasetRequest) -> int:
160
+ resp = self._http.post(
161
+ f"{_BASE}/datasets",
162
+ json=payload.model_dump(by_alias=True, exclude_none=True),
163
+ )
164
+ wrapper = APIWrapper[CreateDatasetResponse].model_validate(resp.json())
165
+ if wrapper.code != 0:
166
+ raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
167
+ return wrapper.data.id
168
+
169
+ def get(self, dataset_id: int) -> DatasetDetail:
170
+ resp = self._http.get(f"{_BASE}/datasets/{dataset_id}")
171
+ wrapper = APIWrapper[DatasetDetail].model_validate(resp.json())
172
+ if wrapper.code != 0:
173
+ raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
174
+ return wrapper.data
175
+
176
+
177
+ class _DatasetVersion:
178
+ def __init__(self, http: httpx.Client):
179
+ self._http = http
180
+
181
+ def create(self, payload: CreateDatasetVersionRequest) -> int:
182
+ resp = self._http.post(
183
+ f"{_BASE}/dataset-versions",
184
+ json=payload.model_dump(by_alias=True, exclude_none=True),
185
+ )
186
+ wrapper = APIWrapper[CreateDatasetVersionResponse].model_validate(resp.json())
187
+ if wrapper.code != 0:
188
+ raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
189
+ return wrapper.data.id
190
+
191
+ def upload(self, payload: UploadDatasetVersionRequest) -> int:
192
+ resp = self._http.post(
193
+ f"{_BASE}/dataset-versions-upload",
194
+ json=payload.model_dump(by_alias=True, exclude_none=True),
195
+ )
196
+ wrapper = APIWrapper[UploadDatasetVersionResponse].model_validate(resp.json())
197
+ if wrapper.code != 0:
198
+ raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
199
+ return wrapper.data.id
200
+
201
+ def get(self, version_id: int) -> DatasetVersionDetail:
202
+ resp = self._http.get(f"{_BASE}/dataset-versions/{version_id}")
203
+ wrapper = APIWrapper[DatasetVersionDetail].model_validate(resp.json())
204
+ if wrapper.code != 0:
205
+ raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
206
+ return wrapper.data
207
+
208
+ def get_by_name(self, version_name: str) -> DatasetVersionDetail:
209
+ resp = self._http.get(
210
+ f"{_BASE}/dataset-versions-detail", params={"name": version_name}
211
+ )
212
+ wrapper = APIWrapper[DatasetVersionDetail].model_validate(resp.json())
213
+ if wrapper.code != 0:
214
+ raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
215
+ return wrapper.data
216
+
217
+
218
+ class _Upload:
219
+ def __init__(self, http: httpx.Client):
220
+ self._http = http
221
+
222
+ def upload_file(self, file_path: str) -> FileUploadData:
223
+ if not os.path.isfile(file_path):
224
+ raise FileNotFoundError(file_path)
225
+
226
+ file_name = pathlib.Path(file_path).name
227
+ mime_type = mimetypes.guess_type(file_name)[0] or "application/octet-stream"
228
+
229
+ with open(file_path, "rb") as fp:
230
+ resp = self._http.post(
231
+ f"/dataset-mng/api/v1/uploads",
232
+ files={"file": (file_name, fp, mime_type)},
233
+ timeout=None,
234
+ )
235
+
236
+ wrapper = APIWrapper[FileUploadData].model_validate(resp.json())
237
+ if wrapper.code != 0:
238
+ raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
239
+
240
+ return wrapper.data
@@ -1,43 +1,43 @@
1
- # !/usr/bin/env python
2
- # -*-coding:utf-8 -*-
3
- from __future__ import annotations
4
-
5
- import httpx
6
-
7
- from ..exceptions import APIError
8
- from ..models.common import APIWrapper
9
- from ..models.document_center import *
10
-
11
- _BASE = "/document-center/api/v1"
12
-
13
-
14
- class DocumentCenterService:
15
- def __init__(self, http: httpx.Client):
16
- self._document = _Document(http)
17
-
18
- def get_documents(
19
- self, page_size: int = 9999, page_num: int = 1, name: str = ""
20
- ) -> List[Document]:
21
- return self._document.get_documents(page_size, page_num, name)
22
-
23
- @property
24
- def document(self) -> _Document:
25
- return self._document
26
-
27
-
28
- class _Document:
29
- def __init__(self, http: httpx.Client):
30
- self._http = http
31
-
32
- def get_documents(
33
- self, page_size: int = 9999, page_num: int = 1, name: str = ""
34
- ) -> List[Document]:
35
- params = {"page_size": page_size, "page_num": page_num, "name": name}
36
- resp = self._http.get(f"{_BASE}/documents", params=params)
37
- if resp.status_code != 200:
38
- raise APIError(f"backend code {resp.status_code}: {resp.text}")
39
- res = resp.json()
40
- wrapper = APIWrapper[GetDocumentsResponse].model_validate(res)
41
- if wrapper.code != 0:
42
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
43
- return wrapper.data.data
1
+ # !/usr/bin/env python
2
+ # -*-coding:utf-8 -*-
3
+ from __future__ import annotations
4
+
5
+ import httpx
6
+
7
+ from ..exceptions import APIError
8
+ from ..models.common import APIWrapper
9
+ from ..models.document_center import *
10
+
11
+ _BASE = "/document-center/api/v1"
12
+
13
+
14
+ class DocumentCenterService:
15
+ def __init__(self, http: httpx.Client):
16
+ self._document = _Document(http)
17
+
18
+ def get_documents(
19
+ self, page_size: int = 9999, page_num: int = 1, name: str = ""
20
+ ) -> List[Document]:
21
+ return self._document.get_documents(page_size, page_num, name)
22
+
23
+ @property
24
+ def document(self) -> _Document:
25
+ return self._document
26
+
27
+
28
+ class _Document:
29
+ def __init__(self, http: httpx.Client):
30
+ self._http = http
31
+
32
+ def get_documents(
33
+ self, page_size: int = 9999, page_num: int = 1, name: str = ""
34
+ ) -> List[Document]:
35
+ params = {"page_size": page_size, "page_num": page_num, "name": name}
36
+ resp = self._http.get(f"{_BASE}/documents", params=params)
37
+ if resp.status_code != 200:
38
+ raise APIError(f"backend code {resp.status_code}: {resp.text}")
39
+ res = resp.json()
40
+ wrapper = APIWrapper[GetDocumentsResponse].model_validate(res)
41
+ if wrapper.code != 0:
42
+ raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
43
+ return wrapper.data.data
@@ -1,44 +1,44 @@
1
- from __future__ import annotations
2
-
3
- import httpx
4
-
5
- from ..exceptions import APIError
6
- from ..models.common import APIWrapper
7
- from ..models.labelfree import *
8
-
9
- _BASE = "/labelfree/api/v2"
10
-
11
-
12
- class LabelfreeService:
13
- def __init__(self, http: httpx.Client):
14
- self._project = _Project(http)
15
-
16
- def get_project_global_stats(self, project_name: str) -> GetGlobalStatsResponse:
17
- """获取标注项目的进展信息
18
-
19
- Args:
20
- project_name: 标注项目名称
21
-
22
- Returns:
23
- GetGlobalStatsResponse
24
-
25
- """
26
- return self._project.get_global_stats(project_name)
27
-
28
- @property
29
- def project(self) -> _Project:
30
- return self._project
31
-
32
-
33
- class _Project:
34
- def __init__(self, http: httpx.Client):
35
- self._http = http
36
-
37
- def get_global_stats(self, project_name: str) -> GetGlobalStatsResponse:
38
- resp = self._http.get(
39
- f"{_BASE}/projects/global_stats", params={"project_name": project_name}
40
- )
41
- wrapper = APIWrapper[GetGlobalStatsResponse].model_validate(resp.json())
42
- if wrapper.code != 0:
43
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
44
- return wrapper.data
1
+ from __future__ import annotations
2
+
3
+ import httpx
4
+
5
+ from ..exceptions import APIError
6
+ from ..models.common import APIWrapper
7
+ from ..models.labelfree import *
8
+
9
+ _BASE = "/labelfree/api/v2"
10
+
11
+
12
+ class LabelfreeService:
13
+ def __init__(self, http: httpx.Client):
14
+ self._project = _Project(http)
15
+
16
+ def get_project_global_stats(self, project_name: str) -> GetGlobalStatsResponse:
17
+ """获取标注项目的进展信息
18
+
19
+ Args:
20
+ project_name: 标注项目名称
21
+
22
+ Returns:
23
+ GetGlobalStatsResponse
24
+
25
+ """
26
+ return self._project.get_global_stats(project_name)
27
+
28
+ @property
29
+ def project(self) -> _Project:
30
+ return self._project
31
+
32
+
33
+ class _Project:
34
+ def __init__(self, http: httpx.Client):
35
+ self._http = http
36
+
37
+ def get_global_stats(self, project_name: str) -> GetGlobalStatsResponse:
38
+ resp = self._http.get(
39
+ f"{_BASE}/projects/global_stats", params={"project_name": project_name}
40
+ )
41
+ wrapper = APIWrapper[GetGlobalStatsResponse].model_validate(resp.json())
42
+ if wrapper.code != 0:
43
+ raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
44
+ return wrapper.data