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.

Files changed (34) hide show
  1. aihub/__init__.py +1 -1
  2. aihub/client.py +95 -91
  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/eval.py +17 -0
  9. aihub/models/labelfree.py +53 -31
  10. aihub/models/model_training_platform.py +234 -230
  11. aihub/models/quota_schedule_management.py +239 -0
  12. aihub/models/tag_resource_management.py +50 -50
  13. aihub/models/task_center.py +117 -117
  14. aihub/models/user_system.py +262 -262
  15. aihub/services/artifact.py +353 -353
  16. aihub/services/dataset_management.py +240 -240
  17. aihub/services/document_center.py +43 -43
  18. aihub/services/eval.py +68 -0
  19. aihub/services/labelfree.py +44 -44
  20. aihub/services/model_training_platform.py +209 -135
  21. aihub/services/quota_schedule_management.py +182 -18
  22. aihub/services/reporter.py +20 -20
  23. aihub/services/tag_resource_management.py +55 -55
  24. aihub/services/task_center.py +190 -190
  25. aihub/services/user_system.py +339 -339
  26. aihub/utils/download.py +69 -69
  27. aihub/utils/http.py +13 -13
  28. aihub/utils/s3.py +77 -77
  29. {intellif_aihub-0.1.3.dist-info → intellif_aihub-0.1.5.dist-info}/METADATA +1 -1
  30. intellif_aihub-0.1.5.dist-info/RECORD +36 -0
  31. {intellif_aihub-0.1.3.dist-info → intellif_aihub-0.1.5.dist-info}/licenses/LICENSE +200 -200
  32. intellif_aihub-0.1.3.dist-info/RECORD +0 -34
  33. {intellif_aihub-0.1.3.dist-info → intellif_aihub-0.1.5.dist-info}/WHEEL +0 -0
  34. {intellif_aihub-0.1.3.dist-info → intellif_aihub-0.1.5.dist-info}/top_level.txt +0 -0
@@ -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
- _BASE = "/model-training-platform/api/v1"
10
-
11
-
12
- class ModelTrainingPlatformService:
13
-
14
- def __init__(self, http: httpx.Client):
15
- self._training = _Training(http)
16
-
17
- def create_training(self, payload: CreateTrainingRequest) -> int:
18
- return self._training.create(payload)
19
-
20
- def list_trainings(self, payload: ListTrainingsRequest) -> ListTrainingsResponse:
21
- return self._training.list(payload)
22
-
23
- def get_training(self, training_id: int) -> Training:
24
- return self._training.get(training_id)
25
-
26
- def stop_training(self, training_id: int) -> None:
27
- self._training.stop(training_id)
28
-
29
- def list_training_pods(self, training_id: int, payload: ListTrainingPodsRequest) -> ListTrainingPodsResponse:
30
- return self._training.list_training_pods(training_id, payload)
31
-
32
- def get_training_pod(self, training_id: int, pod_id: int) -> Pod:
33
- return self._training.get_training_pod(training_id, pod_id)
34
-
35
- def get_pod_logs_new(self, training_id: int, pod_id: int) -> GetTrainingPodLogsNewResponse:
36
- return self._training.get_training_logs_new(training_id, pod_id)
37
-
38
- def get_pod_spec(self, training_id: int, pod_id: int) -> GetTrainingPodSpecResponse:
39
- return self._training.get_training_spec(training_id, pod_id)
40
-
41
- def get_pod_events(self, training_id: int, pod_id: int) -> GetTrainingPodEventsResponse:
42
- return self._training.get_training_events(training_id, pod_id)
43
-
44
- def list_training_users(self, payload: ListTrainingUsersRequest) -> ListTrainingUsersResponse:
45
- return self._training.list_training_users(payload)
46
-
47
- def list_training_containers(self, payload: ListTrainingContainersRequest) -> ListTrainingContainersResponse:
48
- return self._training.list_training_containers(payload)
49
-
50
- @property
51
- def training(self) -> _Training:
52
- return self._training
53
-
54
-
55
- class _Training:
56
-
57
- def __init__(self, http: httpx.Client):
58
- self._http = http
59
-
60
- def create(self, payload: CreateTrainingRequest) -> int:
61
- resp = self._http.post(f"{_BASE}/trainings", json=payload.model_dump(by_alias=True, exclude_none=True))
62
- wrapper = APIWrapper[CreateTrainingResponse].model_validate(resp.json())
63
- if wrapper.code != 0:
64
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
65
- return wrapper.data.id
66
-
67
- def list(self, payload: ListTrainingsRequest) -> ListTrainingsResponse:
68
- resp = self._http.get(f"{_BASE}/trainings", params=payload.model_dump(by_alias=True, exclude_none=True))
69
- wrapper = APIWrapper[ListTrainingsResponse].model_validate(resp.json())
70
- if wrapper.code != 0:
71
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
72
- return wrapper.data
73
-
74
- def get(self, training_id: int) -> Training:
75
- resp = self._http.get(f"{_BASE}/trainings/{training_id}")
76
- wrapper = APIWrapper[Training].model_validate(resp.json())
77
- if wrapper.code != 0:
78
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
79
- return wrapper.data
80
-
81
- def stop(self, training_id: int) -> None:
82
- resp = self._http.post(f"{_BASE}/trainings/{training_id}/stop")
83
- wrapper = APIWrapper[dict].model_validate(resp.json())
84
- if wrapper.code != 0:
85
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
86
-
87
- def list_training_pods(self, training_id: int, payload: ListTrainingPodsRequest) -> ListTrainingPodsResponse:
88
- resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods",
89
- params=payload.model_dump(by_alias=True, exclude_none=True))
90
- wrapper = APIWrapper[ListTrainingPodsResponse].model_validate(resp.json())
91
- if wrapper.code != 0:
92
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
93
- return wrapper.data
94
-
95
- def get_training_pod(self, training_id: int, pod_id: int) -> Pod:
96
- resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}")
97
- wrapper = APIWrapper[Pod].model_validate(resp.json())
98
- if wrapper.code != 0:
99
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
100
- return wrapper.data
101
-
102
- def get_training_logs_new(self, training_id: int, pod_id: int) -> GetTrainingPodLogsNewResponse:
103
- resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}/logs/new")
104
- wrapper = APIWrapper[GetTrainingPodLogsNewResponse].model_validate(resp.json())
105
- if wrapper.code != 0:
106
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
107
- return wrapper.data
108
-
109
- def get_training_spec(self, training_id: int, pod_id: int) -> GetTrainingPodSpecResponse:
110
- resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}/spec")
111
- wrapper = APIWrapper[GetTrainingPodSpecResponse].model_validate(resp.json())
112
- if wrapper.code != 0:
113
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
114
- return wrapper.data
115
-
116
- def get_training_events(self, training_id: int, pod_id: int) -> GetTrainingPodEventsResponse:
117
- resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}/events")
118
- wrapper = APIWrapper[GetTrainingPodEventsResponse].model_validate(resp.json())
119
- if wrapper.code != 0:
120
- raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
121
- return wrapper.data
122
-
123
- def list_training_users(self, payload: ListTrainingUsersRequest) -> ListTrainingUsersResponse:
124
- resp = self._http.get(f"{_BASE}/training-users", params=payload.model_dump(by_alias=True))
125
- wrapper = APIWrapper[ListTrainingUsersResponse].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 list_training_containers(self, payload: ListTrainingContainersRequest) -> ListTrainingContainersResponse:
131
- resp = self._http.get(f"{_BASE}/training-containers", params=payload.model_dump(by_alias=True))
132
- wrapper = APIWrapper[ListTrainingContainersResponse].model_validate(resp.json())
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
- _ENV_KEY = "PRE_STOP_SENTINEL_FILE"
7
- _DEFAULT_SENTINEL = "/tmp/pre_stop_sentinel_file"
8
- _SENTINEL_PATH = Path(os.getenv(_ENV_KEY, _DEFAULT_SENTINEL))
9
-
10
-
11
- def is_pre_stopped() -> bool:
12
- return _SENTINEL_PATH.exists()
13
-
14
-
15
- class PreStopService:
16
- @staticmethod
17
- def is_pre_stopped() -> bool:
18
- return is_pre_stopped()
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