intellif-aihub 0.1.6__tar.gz → 0.1.8__tar.gz

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 (61) hide show
  1. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/PKG-INFO +2 -2
  2. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/README.md +1 -1
  3. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/pyproject.toml +1 -1
  4. intellif_aihub-0.1.8/src/aihub/__init__.py +1 -0
  5. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/model_training_platform.py +4 -5
  6. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/quota_schedule_management.py +0 -5
  7. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/task_center.py +13 -11
  8. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/model_training_platform.py +39 -36
  9. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/intellif_aihub.egg-info/PKG-INFO +2 -2
  10. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_model_training_platform.py +3 -0
  11. intellif_aihub-0.1.6/src/aihub/__init__.py +0 -1
  12. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/LICENSE +0 -0
  13. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/setup.cfg +0 -0
  14. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/client.py +0 -0
  15. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/exceptions.py +0 -0
  16. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/__init__.py +0 -0
  17. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/artifact.py +0 -0
  18. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/common.py +0 -0
  19. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/data_warehouse.py +0 -0
  20. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/dataset_management.py +0 -0
  21. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/document_center.py +0 -0
  22. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/eval.py +0 -0
  23. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/labelfree.py +0 -0
  24. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/model_center.py +0 -0
  25. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/tag_resource_management.py +0 -0
  26. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/user_system.py +0 -0
  27. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/models/workflow_center.py +0 -0
  28. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/__init__.py +0 -0
  29. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/artifact.py +0 -0
  30. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/data_warehouse.py +0 -0
  31. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/dataset_management.py +0 -0
  32. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/document_center.py +0 -0
  33. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/eval.py +0 -0
  34. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/labelfree.py +0 -0
  35. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/model_center.py +0 -0
  36. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/quota_schedule_management.py +0 -0
  37. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/reporter.py +0 -0
  38. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/tag_resource_management.py +0 -0
  39. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/task_center.py +0 -0
  40. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/user_system.py +0 -0
  41. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/services/workflow_center.py +0 -0
  42. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/utils/__init__.py +0 -0
  43. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/utils/download.py +0 -0
  44. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/utils/http.py +0 -0
  45. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/aihub/utils/s3.py +0 -0
  46. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/intellif_aihub.egg-info/SOURCES.txt +0 -0
  47. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/intellif_aihub.egg-info/dependency_links.txt +0 -0
  48. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/intellif_aihub.egg-info/requires.txt +0 -0
  49. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/src/intellif_aihub.egg-info/top_level.txt +0 -0
  50. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_artifact.py +0 -0
  51. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_data_warehouse.py +0 -0
  52. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_dataset_management.py +0 -0
  53. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_document_center.py +0 -0
  54. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_labelfree.py +0 -0
  55. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_model_center.py +0 -0
  56. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_quota_schedule_management.py +0 -0
  57. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_s3.py +0 -0
  58. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_tag_resource_management.py +0 -0
  59. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_task_center.py +0 -0
  60. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_user_system.py +0 -0
  61. {intellif_aihub-0.1.6 → intellif_aihub-0.1.8}/tests/test_workflow_center.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: intellif-aihub
3
- Version: 0.1.6
3
+ Version: 0.1.8
4
4
  Summary: Intellif AI-hub SDK.
5
5
  Author-email: Platform Team <aihub@example.com>
6
6
  License-Expression: Apache-2.0
@@ -44,7 +44,7 @@ aihub_sdk/
44
44
  ```bash
45
45
  # PyPI 安装
46
46
  pip install intellif-aihub
47
- # 运行环境:Python ≥ 3.8
47
+ # 运行环境:Python ≥ 3.9
48
48
  ```
49
49
 
50
50
  ---
@@ -23,7 +23,7 @@ aihub_sdk/
23
23
  ```bash
24
24
  # PyPI 安装
25
25
  pip install intellif-aihub
26
- # 运行环境:Python ≥ 3.8
26
+ # 运行环境:Python ≥ 3.9
27
27
  ```
28
28
 
29
29
  ---
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "intellif-aihub"
3
- version = "0.1.6"
3
+ version = "0.1.8"
4
4
  description = "Intellif AI-hub SDK."
5
5
  readme = {file = "README.md", content-type = "text/markdown"}
6
6
  requires-python = ">=3.9"
@@ -0,0 +1 @@
1
+ __version__ = "0.1.8"
@@ -93,9 +93,6 @@ class CreateTrainingRequest(BaseModel):
93
93
  category_id: int = Field(alias="category_id", description="分类ID")
94
94
  project_id: int = Field(alias="project_id", description="项目ID")
95
95
  estimate_run_time: Optional[int] = Field(None, alias="estimate_run_time", description="预计运行时长(s)")
96
- is_vip: Optional[bool] = Field(False, alias="is_vip", description="是否vip任务")
97
- preempt_policy: Optional[PreemptPolicy] = Field(None, alias="preempt_policy", description="抢占策略")
98
- vip_node_names: Optional[List[str]] = Field(default_factory=list, alias="vip_node_names", description="VIP节点名字")
99
96
  is_quota_schedule: Optional[bool] = Field(False, alias="is_quota_schedule", description="是否配额调度")
100
97
 
101
98
  model_config = {"use_enum_values": True}
@@ -150,10 +147,8 @@ class Training(BaseModel):
150
147
  finished_at: int = Field(alias="finished_at", description="结束时间")
151
148
  started_at: int = Field(alias="started_at", description="开始时间")
152
149
  estimate_run_time: int = Field(alias="estimate_run_time", description="预计运行时长")
153
- is_vip: bool = Field(alias="is_vip", description="是否VIP")
154
150
  cluster_partition: str = Field(alias="cluster_partition", description="集群分区")
155
151
  preempt_policy: PreemptPolicy = Field(alias="preempt_policy", description="抢占策略")
156
- vip_node_names: List[str] = Field(alias="vip_node_names", description="VIP节点")
157
152
  stop_op_user: Optional[User] = Field(None, alias="stop_op_user", description="停止操作人")
158
153
  use_new_log: bool = Field(alias="use_new_log", description="是否使用新版日志")
159
154
  is_quota_schedule: bool = Field(alias="is_quota_schedule", description="配额调度")
@@ -266,3 +261,7 @@ class ListTrainingContainersResponse(BaseModel):
266
261
  page_size: int = Field(alias="page_size", description="每页数量")
267
262
  page_num: int = Field(alias="page_num", description="当前页码")
268
263
  data: Optional[List[TrainingContainer]] = Field(default_factory=list, description="训练容器列表")
264
+
265
+
266
+ class ListStoragesResponse(BaseModel):
267
+ data: List[Storage] = Field(default_factory=list, description="存储列表")
@@ -101,9 +101,6 @@ class CreateTaskRequest(BaseModel):
101
101
  category_id: int = Field(alias="category_id", description="分类ID")
102
102
  project_id: int = Field(alias="project_id", description="项目ID")
103
103
  estimate_run_time: Optional[int] = Field(None, alias="estimate_run_time", description="预计运行时长(s)")
104
- is_vip: Optional[bool] = Field(False, alias="is_vip", description="是否VIP")
105
- preempt_policy: Optional[PreemptPolicy] = Field(None, alias="preempt_policy", description="抢占策略")
106
- vip_node_names: Optional[List[str]] = Field(default_factory=list, alias="vip_node_names", description="VIP节点名字")
107
104
  enable_reschedule: Optional[bool] = Field(False, alias="enable_reschedule", description="启用失败重调度")
108
105
 
109
106
  model_config = {"use_enum_values": True}
@@ -145,10 +142,8 @@ class Task(BaseModel):
145
142
  finished_at: int = Field(alias="finished_at", description="结束时间")
146
143
  started_at: int = Field(alias="started_at", description="开始时间")
147
144
  estimate_run_time: int = Field(alias="estimate_run_time", description="预计运行时长")
148
- is_vip: bool = Field(alias="is_vip", description="是否vip")
149
145
  cluster_partition: str = Field(alias="cluster_partition", description="集群分区")
150
146
  preempt_policy: PreemptPolicy = Field(alias="preempt_policy", description="抢占策略")
151
- vip_node_names: Optional[List[str]] = Field(None, alias="vip_node_names", description="VIP节点")
152
147
  stop_op_user: Optional[User] = Field(None, alias="stop_op_user", description="停止操作人")
153
148
  use_new_log: bool = Field(alias="use_new_log", description="新版日志")
154
149
  is_quota_schedule: bool = Field(alias="is_quota_schedule", description="是否配额调度")
@@ -50,8 +50,8 @@ class ProjectInfo(BaseModel):
50
50
  class TaskDetailOtherInfo(BaseModel):
51
51
  """任务详情附加信息"""
52
52
  label_project_type: LabelProjectTypeEnum = Field(LabelProjectTypeEnum.IMAGE_CLASSIFICATION, description="标注枚举")
53
- dataset_id: int = Field(alias="dataset_id", description="数据集ID")
54
- dataset_version_id: int = Field(alias="dataset_version_id", description="数据集版本ID")
53
+ dataset_id: Optional[int] = Field(default=None, alias="dataset_id", description="数据集ID")
54
+ dataset_version_id: Optional[int] = Field(default=None, alias="dataset_version_id", description="数据集版本ID")
55
55
  doc_id: int = Field(alias="doc_id", description="文档中心文档ID")
56
56
  doc_type: str = Field(alias="doc_type", default="doc_center", description="文档类型")
57
57
  label_projects: Optional[List[ProjectInfo]] = Field(alias="label_projects", default=None,
@@ -83,23 +83,25 @@ class CreateTaskResp(BaseModel):
83
83
  class LabelTaskDetail(BaseModel):
84
84
  """任务详情"""
85
85
  name: str = Field(description="任务名称")
86
- description: Optional[str] = Field(alias="description", description="任务描述")
87
- task_priority: Optional[str] = Field(alias="task_priority", description="优先级")
88
- type: Optional[str] = Field(alias="type", description="任务类型")
89
- receiver_id: Optional[int] = Field(alias="receiver_id", description="接收人ID")
90
- project_id: Optional[int] = Field(None, description="项目ID")
91
- other_info: TaskDetailOtherInfo = Field(alias="other_info", description="附加信息")
92
- estimated_delivery_at: Optional[int] = Field(None, description="预计交付时间")
86
+ description: Optional[str] = Field(default=None, alias="description", description="任务描述")
87
+ task_priority: Optional[str] = Field(default=None, alias="task_priority", description="优先级")
88
+ type: Optional[str] = Field(default=None, alias="type", description="任务类型")
89
+ receiver_id: Optional[int] = Field(default=None, alias="receiver_id", description="接收人ID")
90
+ project_id: Optional[int] = Field(default=None, description="项目ID")
91
+ other_info: Optional[TaskDetailOtherInfo] = Field(default=None, alias="other_info", description="附加信息")
92
+ estimated_delivery_at: Optional[int] = Field(default=None, description="预计交付时间")
93
93
 
94
94
  @field_serializer("other_info")
95
- def serialize_other_info(self, value: TaskDetailOtherInfo) -> str:
95
+ def serialize_other_info(self, value: Optional[TaskDetailOtherInfo]) -> Optional[str]:
96
96
  """将 other_info 序列化为 JSON 字符串"""
97
- return value.model_dump_json()
97
+ return value.model_dump_json() if value else None
98
98
 
99
99
  @field_validator("other_info", mode="before")
100
100
  @classmethod
101
101
  def parse_other_info(cls, value):
102
102
  """将字符串解析为 TaskDetailOtherInfo 对象"""
103
+ if value is None:
104
+ return None
103
105
  if isinstance(value, str):
104
106
  try:
105
107
  # 解析 JSON 字符串为字典
@@ -33,6 +33,7 @@ from ..models.model_training_platform import (
33
33
  ListTrainingUsersResponse,
34
34
  ListTrainingContainersResponse,
35
35
  Pod,
36
+ ListStoragesResponse,
36
37
  )
37
38
 
38
39
  _BASE = "/model-training-platform/api/v1"
@@ -43,6 +44,7 @@ class ModelTrainingPlatformService:
43
44
 
44
45
  def __init__(self, http: httpx.Client):
45
46
  self._training = _Training(http)
47
+ self._storage = _Storage(http)
46
48
 
47
49
  def create_training(self, payload: CreateTrainingRequest) -> int:
48
50
  """创建训练任务
@@ -167,10 +169,22 @@ class ModelTrainingPlatformService:
167
169
  """
168
170
  return self._training.list_training_containers(payload)
169
171
 
172
+ def list_storages(self) -> ListStoragesResponse:
173
+ """获取存储列表
174
+
175
+ Returns:
176
+ ListStoragesResponse: 存储列表
177
+ """
178
+ return self._storage.list_storages()
179
+
170
180
  @property
171
181
  def training(self) -> _Training:
172
182
  return self._training
173
183
 
184
+ @property
185
+ def storage(self) -> _Storage:
186
+ return self._storage
187
+
174
188
 
175
189
  class _Training:
176
190
 
@@ -178,20 +192,14 @@ class _Training:
178
192
  self._http = http
179
193
 
180
194
  def create(self, payload: CreateTrainingRequest) -> int:
181
- resp = self._http.post(
182
- f"{_BASE}/trainings",
183
- json=payload.model_dump(by_alias=True, exclude_none=True),
184
- )
195
+ resp = self._http.post(f"{_BASE}/trainings", json=payload.model_dump(by_alias=True, exclude_none=True))
185
196
  wrapper = APIWrapper[CreateTrainingResponse].model_validate(resp.json())
186
197
  if wrapper.code != 0:
187
198
  raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
188
199
  return wrapper.data.id
189
200
 
190
201
  def list(self, payload: ListTrainingsRequest) -> ListTrainingsResponse:
191
- resp = self._http.get(
192
- f"{_BASE}/trainings",
193
- params=payload.model_dump(by_alias=True, exclude_none=True),
194
- )
202
+ resp = self._http.get(f"{_BASE}/trainings", params=payload.model_dump(by_alias=True, exclude_none=True))
195
203
  wrapper = APIWrapper[ListTrainingsResponse].model_validate(resp.json())
196
204
  if wrapper.code != 0:
197
205
  raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
@@ -210,13 +218,9 @@ class _Training:
210
218
  if wrapper.code != 0:
211
219
  raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
212
220
 
213
- def list_training_pods(
214
- self, training_id: int, payload: ListTrainingPodsRequest
215
- ) -> ListTrainingPodsResponse:
216
- resp = self._http.get(
217
- f"{_BASE}/trainings/{training_id}/pods",
218
- params=payload.model_dump(by_alias=True, exclude_none=True),
219
- )
221
+ def list_training_pods(self, training_id: int, payload: ListTrainingPodsRequest) -> ListTrainingPodsResponse:
222
+ resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods",
223
+ params=payload.model_dump(by_alias=True, exclude_none=True))
220
224
  wrapper = APIWrapper[ListTrainingPodsResponse].model_validate(resp.json())
221
225
  if wrapper.code != 0:
222
226
  raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
@@ -229,51 +233,50 @@ class _Training:
229
233
  raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
230
234
  return wrapper.data
231
235
 
232
- def get_training_logs_new(
233
- self, training_id: int, pod_id: int
234
- ) -> GetTrainingPodLogsNewResponse:
236
+ def get_training_logs_new(self, training_id: int, pod_id: int) -> GetTrainingPodLogsNewResponse:
235
237
  resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}/logs/new")
236
238
  wrapper = APIWrapper[GetTrainingPodLogsNewResponse].model_validate(resp.json())
237
239
  if wrapper.code != 0:
238
240
  raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
239
241
  return wrapper.data
240
242
 
241
- def get_training_spec(
242
- self, training_id: int, pod_id: int
243
- ) -> GetTrainingPodSpecResponse:
243
+ def get_training_spec(self, training_id: int, pod_id: int) -> GetTrainingPodSpecResponse:
244
244
  resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}/spec")
245
245
  wrapper = APIWrapper[GetTrainingPodSpecResponse].model_validate(resp.json())
246
246
  if wrapper.code != 0:
247
247
  raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
248
248
  return wrapper.data
249
249
 
250
- def get_training_events(
251
- self, training_id: int, pod_id: int
252
- ) -> GetTrainingPodEventsResponse:
250
+ def get_training_events(self, training_id: int, pod_id: int) -> GetTrainingPodEventsResponse:
253
251
  resp = self._http.get(f"{_BASE}/trainings/{training_id}/pods/{pod_id}/events")
254
252
  wrapper = APIWrapper[GetTrainingPodEventsResponse].model_validate(resp.json())
255
253
  if wrapper.code != 0:
256
254
  raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
257
255
  return wrapper.data
258
256
 
259
- def list_training_users(
260
- self, payload: ListTrainingUsersRequest
261
- ) -> ListTrainingUsersResponse:
262
- resp = self._http.get(
263
- f"{_BASE}/training-users", params=payload.model_dump(by_alias=True)
264
- )
257
+ def list_training_users(self, payload: ListTrainingUsersRequest) -> ListTrainingUsersResponse:
258
+ resp = self._http.get(f"{_BASE}/training-users", params=payload.model_dump(by_alias=True))
265
259
  wrapper = APIWrapper[ListTrainingUsersResponse].model_validate(resp.json())
266
260
  if wrapper.code != 0:
267
261
  raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
268
262
  return wrapper.data
269
263
 
270
- def list_training_containers(
271
- self, payload: ListTrainingContainersRequest
272
- ) -> ListTrainingContainersResponse:
273
- resp = self._http.get(
274
- f"{_BASE}/training-containers", params=payload.model_dump(by_alias=True)
275
- )
264
+ def list_training_containers(self, payload: ListTrainingContainersRequest) -> ListTrainingContainersResponse:
265
+ resp = self._http.get(f"{_BASE}/training-containers", params=payload.model_dump(by_alias=True))
276
266
  wrapper = APIWrapper[ListTrainingContainersResponse].model_validate(resp.json())
277
267
  if wrapper.code != 0:
278
268
  raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
279
269
  return wrapper.data
270
+
271
+
272
+ class _Storage:
273
+
274
+ def __init__(self, http: httpx.Client):
275
+ self._http = http
276
+
277
+ def list_storages(self) -> ListStoragesResponse:
278
+ resp = self._http.get(f"{_BASE}/storages")
279
+ wrapper = APIWrapper[ListStoragesResponse].model_validate(resp.json())
280
+ if wrapper.code != 0:
281
+ raise APIError(f"backend code {wrapper.code}: {wrapper.msg}")
282
+ return wrapper.data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: intellif-aihub
3
- Version: 0.1.6
3
+ Version: 0.1.8
4
4
  Summary: Intellif AI-hub SDK.
5
5
  Author-email: Platform Team <aihub@example.com>
6
6
  License-Expression: Apache-2.0
@@ -44,7 +44,7 @@ aihub_sdk/
44
44
  ```bash
45
45
  # PyPI 安装
46
46
  pip install intellif-aihub
47
- # 运行环境:Python ≥ 3.8
47
+ # 运行环境:Python ≥ 3.9
48
48
  ```
49
49
 
50
50
  ---
@@ -74,3 +74,6 @@ class TestModelTrainingPlatform(unittest.TestCase):
74
74
  containers = client.model_training_platform.list_training_containers(ListTrainingContainersRequest())
75
75
  data = containers.data or []
76
76
  self.assertIsInstance(data, list)
77
+
78
+ storages = client.model_training_platform.list_storages()
79
+ self.assertIsInstance(storages.data, list)
@@ -1 +0,0 @@
1
- __version__ = "0.1.6"
File without changes
File without changes