intellif-aihub 0.1.3__py3-none-any.whl → 0.1.5__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.
- aihub/__init__.py +1 -1
- aihub/client.py +95 -91
- aihub/exceptions.py +18 -18
- aihub/models/artifact.py +137 -137
- aihub/models/common.py +13 -13
- aihub/models/dataset_management.py +99 -99
- aihub/models/document_center.py +28 -28
- aihub/models/eval.py +17 -0
- aihub/models/labelfree.py +53 -31
- aihub/models/model_training_platform.py +234 -230
- aihub/models/quota_schedule_management.py +239 -0
- aihub/models/tag_resource_management.py +50 -50
- aihub/models/task_center.py +117 -117
- aihub/models/user_system.py +262 -262
- aihub/services/artifact.py +353 -353
- aihub/services/dataset_management.py +240 -240
- aihub/services/document_center.py +43 -43
- aihub/services/eval.py +68 -0
- aihub/services/labelfree.py +44 -44
- aihub/services/model_training_platform.py +209 -135
- aihub/services/quota_schedule_management.py +182 -18
- aihub/services/reporter.py +20 -20
- aihub/services/tag_resource_management.py +55 -55
- aihub/services/task_center.py +190 -190
- aihub/services/user_system.py +339 -339
- aihub/utils/download.py +69 -69
- aihub/utils/http.py +13 -13
- aihub/utils/s3.py +77 -77
- {intellif_aihub-0.1.3.dist-info → intellif_aihub-0.1.5.dist-info}/METADATA +1 -1
- intellif_aihub-0.1.5.dist-info/RECORD +36 -0
- {intellif_aihub-0.1.3.dist-info → intellif_aihub-0.1.5.dist-info}/licenses/LICENSE +200 -200
- intellif_aihub-0.1.3.dist-info/RECORD +0 -34
- {intellif_aihub-0.1.3.dist-info → intellif_aihub-0.1.5.dist-info}/WHEEL +0 -0
- {intellif_aihub-0.1.3.dist-info → intellif_aihub-0.1.5.dist-info}/top_level.txt +0 -0
aihub/services/labelfree.py
CHANGED
|
@@ -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 GetGlobalStatsResponse
|
|
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,135 +1,209 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import httpx
|
|
4
|
-
|
|
5
|
-
from ..exceptions import APIError
|
|
6
|
-
from ..models.common import APIWrapper
|
|
7
|
-
from ..models.model_training_platform import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return self._training.
|
|
43
|
-
|
|
44
|
-
def
|
|
45
|
-
return self._training.
|
|
46
|
-
|
|
47
|
-
def
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return
|
|
73
|
-
|
|
74
|
-
def
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
return
|
|
94
|
-
|
|
95
|
-
def
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
wrapper
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
wrapper = APIWrapper[
|
|
126
|
-
if wrapper.code != 0:
|
|
127
|
-
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
128
|
-
return wrapper.data
|
|
129
|
-
|
|
130
|
-
def
|
|
131
|
-
resp = self._http.get(f"{_BASE}/
|
|
132
|
-
wrapper = APIWrapper[
|
|
133
|
-
if wrapper.code != 0:
|
|
134
|
-
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
135
|
-
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.model_training_platform import (
|
|
8
|
+
CreateTrainingRequest,
|
|
9
|
+
ListTrainingsRequest,
|
|
10
|
+
ListTrainingsResponse,
|
|
11
|
+
ListTrainingPodsRequest,
|
|
12
|
+
GetTrainingPodLogsNewResponse,
|
|
13
|
+
GetTrainingPodEventsResponse,
|
|
14
|
+
Training,
|
|
15
|
+
CreateTrainingResponse,
|
|
16
|
+
ListTrainingUsersRequest,
|
|
17
|
+
ListTrainingPodsResponse,
|
|
18
|
+
GetTrainingPodSpecResponse,
|
|
19
|
+
ListTrainingContainersRequest,
|
|
20
|
+
ListTrainingUsersResponse,
|
|
21
|
+
ListTrainingContainersResponse,
|
|
22
|
+
Pod,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
_BASE = "/model-training-platform/api/v1"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ModelTrainingPlatformService:
|
|
29
|
+
|
|
30
|
+
def __init__(self, http: httpx.Client):
|
|
31
|
+
self._training = _Training(http)
|
|
32
|
+
|
|
33
|
+
def create_training(self, payload: CreateTrainingRequest) -> int:
|
|
34
|
+
"""创建训练任务
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
payload (CreateTrainingRequest): 创建训练任务参数
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
int: 训练任务ID
|
|
41
|
+
"""
|
|
42
|
+
return self._training.create(payload)
|
|
43
|
+
|
|
44
|
+
def list_trainings(self, payload: ListTrainingsRequest) -> ListTrainingsResponse:
|
|
45
|
+
return self._training.list(payload)
|
|
46
|
+
|
|
47
|
+
def get_training(self, training_id: int) -> Training:
|
|
48
|
+
"""获取训练任务详情
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
training_id (int): 训练任务ID
|
|
52
|
+
Returns:
|
|
53
|
+
Training
|
|
54
|
+
|
|
55
|
+
"""
|
|
56
|
+
return self._training.get(training_id)
|
|
57
|
+
|
|
58
|
+
def stop_training(self, training_id: int) -> None:
|
|
59
|
+
"""停止训练瑞文
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
training_id (int): 训练任务ID
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
|
|
66
|
+
"""
|
|
67
|
+
self._training.stop(training_id)
|
|
68
|
+
|
|
69
|
+
def list_training_pods(
|
|
70
|
+
self, training_id: int, payload: ListTrainingPodsRequest
|
|
71
|
+
) -> ListTrainingPodsResponse:
|
|
72
|
+
return self._training.list_training_pods(training_id, payload)
|
|
73
|
+
|
|
74
|
+
def get_training_pod(self, training_id: int, pod_id: int) -> Pod:
|
|
75
|
+
return self._training.get_training_pod(training_id, pod_id)
|
|
76
|
+
|
|
77
|
+
def get_pod_logs_new(
|
|
78
|
+
self, training_id: int, pod_id: int
|
|
79
|
+
) -> GetTrainingPodLogsNewResponse:
|
|
80
|
+
return self._training.get_training_logs_new(training_id, pod_id)
|
|
81
|
+
|
|
82
|
+
def get_pod_spec(self, training_id: int, pod_id: int) -> GetTrainingPodSpecResponse:
|
|
83
|
+
return self._training.get_training_spec(training_id, pod_id)
|
|
84
|
+
|
|
85
|
+
def get_pod_events(
|
|
86
|
+
self, training_id: int, pod_id: int
|
|
87
|
+
) -> GetTrainingPodEventsResponse:
|
|
88
|
+
return self._training.get_training_events(training_id, pod_id)
|
|
89
|
+
|
|
90
|
+
def list_training_users(
|
|
91
|
+
self, payload: ListTrainingUsersRequest
|
|
92
|
+
) -> ListTrainingUsersResponse:
|
|
93
|
+
return self._training.list_training_users(payload)
|
|
94
|
+
|
|
95
|
+
def list_training_containers(
|
|
96
|
+
self, payload: ListTrainingContainersRequest
|
|
97
|
+
) -> ListTrainingContainersResponse:
|
|
98
|
+
return self._training.list_training_containers(payload)
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def training(self) -> _Training:
|
|
102
|
+
return self._training
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class _Training:
|
|
106
|
+
|
|
107
|
+
def __init__(self, http: httpx.Client):
|
|
108
|
+
self._http = http
|
|
109
|
+
|
|
110
|
+
def create(self, payload: CreateTrainingRequest) -> int:
|
|
111
|
+
resp = self._http.post(
|
|
112
|
+
f"{_BASE}/trainings",
|
|
113
|
+
json=payload.model_dump(by_alias=True, exclude_none=True),
|
|
114
|
+
)
|
|
115
|
+
wrapper = APIWrapper[CreateTrainingResponse].model_validate(resp.json())
|
|
116
|
+
if wrapper.code != 0:
|
|
117
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
118
|
+
return wrapper.data.id
|
|
119
|
+
|
|
120
|
+
def list(self, payload: ListTrainingsRequest) -> ListTrainingsResponse:
|
|
121
|
+
resp = self._http.get(
|
|
122
|
+
f"{_BASE}/trainings",
|
|
123
|
+
params=payload.model_dump(by_alias=True, exclude_none=True),
|
|
124
|
+
)
|
|
125
|
+
wrapper = APIWrapper[ListTrainingsResponse].model_validate(resp.json())
|
|
126
|
+
if wrapper.code != 0:
|
|
127
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
128
|
+
return wrapper.data
|
|
129
|
+
|
|
130
|
+
def get(self, training_id: int) -> Training:
|
|
131
|
+
resp = self._http.get(f"{_BASE}/trainings/{training_id}")
|
|
132
|
+
wrapper = APIWrapper[Training].model_validate(resp.json())
|
|
133
|
+
if wrapper.code != 0:
|
|
134
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
135
|
+
return wrapper.data
|
|
136
|
+
|
|
137
|
+
def stop(self, training_id: int) -> None:
|
|
138
|
+
resp = self._http.post(f"{_BASE}/trainings/{training_id}/stop")
|
|
139
|
+
wrapper = APIWrapper[dict].model_validate(resp.json())
|
|
140
|
+
if wrapper.code != 0:
|
|
141
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
142
|
+
|
|
143
|
+
def list_training_pods(
|
|
144
|
+
self, training_id: int, payload: ListTrainingPodsRequest
|
|
145
|
+
) -> ListTrainingPodsResponse:
|
|
146
|
+
resp = self._http.get(
|
|
147
|
+
f"{_BASE}/trainings/{training_id}/pods",
|
|
148
|
+
params=payload.model_dump(by_alias=True, exclude_none=True),
|
|
149
|
+
)
|
|
150
|
+
wrapper = APIWrapper[ListTrainingPodsResponse].model_validate(resp.json())
|
|
151
|
+
if wrapper.code != 0:
|
|
152
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
153
|
+
return wrapper.data
|
|
154
|
+
|
|
155
|
+
def get_training_pod(self, training_id: int, pod_id: int) -> Pod:
|
|
156
|
+
resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}")
|
|
157
|
+
wrapper = APIWrapper[Pod].model_validate(resp.json())
|
|
158
|
+
if wrapper.code != 0:
|
|
159
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
160
|
+
return wrapper.data
|
|
161
|
+
|
|
162
|
+
def get_training_logs_new(
|
|
163
|
+
self, training_id: int, pod_id: int
|
|
164
|
+
) -> GetTrainingPodLogsNewResponse:
|
|
165
|
+
resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}/logs/new")
|
|
166
|
+
wrapper = APIWrapper[GetTrainingPodLogsNewResponse].model_validate(resp.json())
|
|
167
|
+
if wrapper.code != 0:
|
|
168
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
169
|
+
return wrapper.data
|
|
170
|
+
|
|
171
|
+
def get_training_spec(
|
|
172
|
+
self, training_id: int, pod_id: int
|
|
173
|
+
) -> GetTrainingPodSpecResponse:
|
|
174
|
+
resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}/spec")
|
|
175
|
+
wrapper = APIWrapper[GetTrainingPodSpecResponse].model_validate(resp.json())
|
|
176
|
+
if wrapper.code != 0:
|
|
177
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
178
|
+
return wrapper.data
|
|
179
|
+
|
|
180
|
+
def get_training_events(
|
|
181
|
+
self, training_id: int, pod_id: int
|
|
182
|
+
) -> GetTrainingPodEventsResponse:
|
|
183
|
+
resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}/events")
|
|
184
|
+
wrapper = APIWrapper[GetTrainingPodEventsResponse].model_validate(resp.json())
|
|
185
|
+
if wrapper.code != 0:
|
|
186
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
187
|
+
return wrapper.data
|
|
188
|
+
|
|
189
|
+
def list_training_users(
|
|
190
|
+
self, payload: ListTrainingUsersRequest
|
|
191
|
+
) -> ListTrainingUsersResponse:
|
|
192
|
+
resp = self._http.get(
|
|
193
|
+
f"{_BASE}/training-users", params=payload.model_dump(by_alias=True)
|
|
194
|
+
)
|
|
195
|
+
wrapper = APIWrapper[ListTrainingUsersResponse].model_validate(resp.json())
|
|
196
|
+
if wrapper.code != 0:
|
|
197
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
198
|
+
return wrapper.data
|
|
199
|
+
|
|
200
|
+
def list_training_containers(
|
|
201
|
+
self, payload: ListTrainingContainersRequest
|
|
202
|
+
) -> ListTrainingContainersResponse:
|
|
203
|
+
resp = self._http.get(
|
|
204
|
+
f"{_BASE}/training-containers", params=payload.model_dump(by_alias=True)
|
|
205
|
+
)
|
|
206
|
+
wrapper = APIWrapper[ListTrainingContainersResponse].model_validate(resp.json())
|
|
207
|
+
if wrapper.code != 0:
|
|
208
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
209
|
+
return wrapper.data
|
|
@@ -1,18 +1,182 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import os
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import httpx
|
|
7
|
+
|
|
8
|
+
from ..exceptions import APIError
|
|
9
|
+
from ..models.common import APIWrapper
|
|
10
|
+
from ..models.quota_schedule_management import *
|
|
11
|
+
|
|
12
|
+
_ENV_KEY = "PRE_STOP_SENTINEL_FILE"
|
|
13
|
+
_DEFAULT_SENTINEL = "/tmp/pre_stop_sentinel_file"
|
|
14
|
+
_SENTINEL_PATH = Path(os.getenv(_ENV_KEY, _DEFAULT_SENTINEL))
|
|
15
|
+
_BASE = "/quota-schedule-management/api/v1"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def is_pre_stopped() -> bool:
|
|
19
|
+
return _SENTINEL_PATH.exists()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PreStopService:
|
|
23
|
+
@staticmethod
|
|
24
|
+
def is_pre_stopped() -> bool:
|
|
25
|
+
return is_pre_stopped()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class QuotaScheduleManagementService:
|
|
29
|
+
|
|
30
|
+
def __init__(self, http: httpx.Client):
|
|
31
|
+
self._task = _Task(http)
|
|
32
|
+
|
|
33
|
+
def create_task(self, payload: CreateTaskRequest) -> int:
|
|
34
|
+
"""创建调度任务
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
payload: 创建任务的各项参数
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
int: 后端生成的任务 ID
|
|
41
|
+
"""
|
|
42
|
+
return self._task.create(payload)
|
|
43
|
+
|
|
44
|
+
def list_tasks(self, payload: ListTasksRequest) -> ListTasksResponse:
|
|
45
|
+
"""分页查询任务列表
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
payload: 查询条件(分页 / 过滤)
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
ListTasksResponse: 列表及分页信息
|
|
52
|
+
"""
|
|
53
|
+
return self._task.list(payload)
|
|
54
|
+
|
|
55
|
+
def get_task(self, task_id: int) -> Task:
|
|
56
|
+
"""获取任务详情
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
task_id: 任务 ID
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
Task: 任务完整信息
|
|
63
|
+
"""
|
|
64
|
+
return self._task.get(task_id)
|
|
65
|
+
|
|
66
|
+
def stop_task(self, task_id: int) -> None:
|
|
67
|
+
"""停止任务
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
task_id: 任务 ID
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
None
|
|
74
|
+
"""
|
|
75
|
+
self._task.stop(task_id)
|
|
76
|
+
|
|
77
|
+
def list_task_pods(self, task_id: int, payload: ListTaskPodsRequest) -> ListTaskPodsResponse:
|
|
78
|
+
return self._task.list_pods(task_id, payload)
|
|
79
|
+
|
|
80
|
+
def get_task_pod(self, task_id: int, pod_id: int) -> Pod:
|
|
81
|
+
return self._task.get_pod(task_id, pod_id)
|
|
82
|
+
|
|
83
|
+
def get_pod_logs_new(self, task_id: int, pod_id: int) -> List[PodLogInfo]:
|
|
84
|
+
return self._task.get_logs_new(task_id, pod_id).logs
|
|
85
|
+
|
|
86
|
+
def get_pod_spec(self, task_id: int, pod_id: int) -> str:
|
|
87
|
+
return self._task.get_spec(task_id, pod_id).spec
|
|
88
|
+
|
|
89
|
+
def get_pod_events(self, task_id: int, pod_id: int) -> str:
|
|
90
|
+
return self._task.get_events(task_id, pod_id).events
|
|
91
|
+
|
|
92
|
+
def list_task_users(self, payload: ListTaskUsersRequest) -> ListTaskUsersResponse:
|
|
93
|
+
return self._task.list_users(payload)
|
|
94
|
+
|
|
95
|
+
def get_metrics_overview(self, payload: GetMetricsOverviewRequest) -> GetMetricsOverviewResponse:
|
|
96
|
+
return self._task.get_metrics_overview(payload)
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def task(self) -> _Task:
|
|
100
|
+
return self._task
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class _Task:
|
|
104
|
+
|
|
105
|
+
def __init__(self, http: httpx.Client):
|
|
106
|
+
self._http = http
|
|
107
|
+
|
|
108
|
+
def create(self, payload: CreateTaskRequest) -> int:
|
|
109
|
+
resp = self._http.post(f"{_BASE}/tasks", json=payload.model_dump(by_alias=True, exclude_none=True))
|
|
110
|
+
wrapper = APIWrapper[CreateTaskResponse].model_validate(resp.json())
|
|
111
|
+
if wrapper.code != 0:
|
|
112
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
113
|
+
return wrapper.data.id
|
|
114
|
+
|
|
115
|
+
def list(self, payload: ListTasksRequest) -> ListTasksResponse:
|
|
116
|
+
resp = self._http.get(f"{_BASE}/tasks", params=payload.model_dump(by_alias=True, exclude_none=True))
|
|
117
|
+
wrapper = APIWrapper[ListTasksResponse].model_validate(resp.json())
|
|
118
|
+
if wrapper.code != 0:
|
|
119
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
120
|
+
return wrapper.data
|
|
121
|
+
|
|
122
|
+
def get(self, task_id: int) -> Task:
|
|
123
|
+
resp = self._http.get(f"{_BASE}/tasks/{task_id}")
|
|
124
|
+
wrapper = APIWrapper[Task].model_validate(resp.json())
|
|
125
|
+
if wrapper.code != 0:
|
|
126
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
127
|
+
return wrapper.data
|
|
128
|
+
|
|
129
|
+
def stop(self, task_id: int) -> None:
|
|
130
|
+
resp = self._http.post(f"{_BASE}/tasks/{task_id}/stop")
|
|
131
|
+
wrapper = APIWrapper[dict].model_validate(resp.json())
|
|
132
|
+
if wrapper.code != 0:
|
|
133
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
134
|
+
|
|
135
|
+
def list_pods(self, task_id: int, payload: ListTaskPodsRequest) -> ListTaskPodsResponse:
|
|
136
|
+
resp = self._http.get(f"{_BASE}/tasks/{task_id}/pods", params=payload.model_dump(by_alias=True))
|
|
137
|
+
wrapper = APIWrapper[ListTaskPodsResponse].model_validate(resp.json())
|
|
138
|
+
if wrapper.code != 0:
|
|
139
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
140
|
+
return wrapper.data
|
|
141
|
+
|
|
142
|
+
def get_pod(self, task_id: int, pod_id: int) -> Pod:
|
|
143
|
+
resp = self._http.get(f"{_BASE}/tasks/{task_id}/pods/{pod_id}")
|
|
144
|
+
wrapper = APIWrapper[Pod].model_validate(resp.json())
|
|
145
|
+
if wrapper.code != 0:
|
|
146
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
147
|
+
return wrapper.data
|
|
148
|
+
|
|
149
|
+
def get_logs_new(self, task_id: int, pod_id: int) -> GetTaskPodLogsNewResponse:
|
|
150
|
+
resp = self._http.get(f"{_BASE}/tasks/{task_id}/pods/{pod_id}/logs/new")
|
|
151
|
+
wrapper = APIWrapper[GetTaskPodLogsNewResponse].model_validate(resp.json())
|
|
152
|
+
if wrapper.code != 0:
|
|
153
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
154
|
+
return wrapper.data
|
|
155
|
+
|
|
156
|
+
def get_spec(self, task_id: int, pod_id: int) -> GetTaskPodSpecResponse:
|
|
157
|
+
resp = self._http.get(f"{_BASE}/tasks/{task_id}/pods/{pod_id}/spec")
|
|
158
|
+
wrapper = APIWrapper[GetTaskPodSpecResponse].model_validate(resp.json())
|
|
159
|
+
if wrapper.code != 0:
|
|
160
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
161
|
+
return wrapper.data
|
|
162
|
+
|
|
163
|
+
def get_events(self, task_id: int, pod_id: int) -> GetTaskPodEventsResponse:
|
|
164
|
+
resp = self._http.get(f"{_BASE}/tasks/{task_id}/pods/{pod_id}/events")
|
|
165
|
+
wrapper = APIWrapper[GetTaskPodEventsResponse].model_validate(resp.json())
|
|
166
|
+
if wrapper.code != 0:
|
|
167
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
168
|
+
return wrapper.data
|
|
169
|
+
|
|
170
|
+
def list_users(self, payload: ListTaskUsersRequest) -> ListTaskUsersResponse:
|
|
171
|
+
resp = self._http.get(f"{_BASE}/task-users", params=payload.model_dump(by_alias=True))
|
|
172
|
+
wrapper = APIWrapper[ListTaskUsersResponse].model_validate(resp.json())
|
|
173
|
+
if wrapper.code != 0:
|
|
174
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
175
|
+
return wrapper.data
|
|
176
|
+
|
|
177
|
+
def get_metrics_overview(self, payload: GetMetricsOverviewRequest) -> GetMetricsOverviewResponse:
|
|
178
|
+
resp = self._http.get(f"{_BASE}/metrics/overview", params=payload.model_dump(by_alias=True))
|
|
179
|
+
wrapper = APIWrapper[GetMetricsOverviewResponse].model_validate(resp.json())
|
|
180
|
+
if wrapper.code != 0:
|
|
181
|
+
raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
|
|
182
|
+
return wrapper.data
|