modelscope-api 0.0.1__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.
- modelscope_api/__init__.py +1 -0
- modelscope_api/config.py +23 -0
- modelscope_api/data_models/__init__.py +3 -0
- modelscope_api/data_models/base.py +22 -0
- modelscope_api/data_models/collection/__init__.py +6 -0
- modelscope_api/data_models/collection/collection.py +110 -0
- modelscope_api/data_models/collection/collection_item.py +92 -0
- modelscope_api/data_models/magicube/__init__.py +5 -0
- modelscope_api/data_models/magicube/magicube_blance.py +31 -0
- modelscope_api/data_models/studio/__init__.py +13 -0
- modelscope_api/data_models/studio/base_image.py +26 -0
- modelscope_api/data_models/studio/environment_variable.py +38 -0
- modelscope_api/data_models/studio/hardware.py +87 -0
- modelscope_api/data_models/studio/logs.py +54 -0
- modelscope_api/data_models/studio/sdk.py +41 -0
- modelscope_api/data_models/studio/studio.py +207 -0
- modelscope_api/data_models/user/__init__.py +5 -0
- modelscope_api/data_models/user/user.py +47 -0
- modelscope_api/exceptions.py +59 -0
- modelscope_api/models/__init__.py +9 -0
- modelscope_api/models/_sub_client.py +71 -0
- modelscope_api/models/collection/__init__.py +8 -0
- modelscope_api/models/collection/collection.py +122 -0
- modelscope_api/models/collection/collection_client.py +132 -0
- modelscope_api/models/collection/collection_item.py +92 -0
- modelscope_api/models/collection/collection_item_client.py +247 -0
- modelscope_api/models/magicube/__init__.py +5 -0
- modelscope_api/models/magicube/magicube_client.py +46 -0
- modelscope_api/models/modelscope_client.py +206 -0
- modelscope_api/models/studio/__init__.py +7 -0
- modelscope_api/models/studio/environment_variable_client.py +107 -0
- modelscope_api/models/studio/studio.py +197 -0
- modelscope_api/models/studio/studio_client.py +237 -0
- modelscope_api/models/user/__init__.py +5 -0
- modelscope_api/models/user/user_client.py +46 -0
- modelscope_api/utils/regex.py +12 -0
- modelscope_api/utils/typing.py +12 -0
- modelscope_api-0.0.1.dist-info/METADATA +20 -0
- modelscope_api-0.0.1.dist-info/RECORD +42 -0
- modelscope_api-0.0.1.dist-info/WHEEL +5 -0
- modelscope_api-0.0.1.dist-info/licenses/LICENSE +21 -0
- modelscope_api-0.0.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""
|
|
2
|
+
对单个创空间的环境变量的操作。
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import List, TYPE_CHECKING
|
|
8
|
+
|
|
9
|
+
from ...data_models.studio import EnvironmentVariableInfo, EnvironmentVariableType
|
|
10
|
+
from .._sub_client import SubClient
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from .studio import Studio
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class EnvironmentVariableClient(SubClient):
|
|
17
|
+
"""
|
|
18
|
+
操作单个创空间的环境变量。
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
studio: Studio,
|
|
24
|
+
type: EnvironmentVariableType,
|
|
25
|
+
):
|
|
26
|
+
self.type: EnvironmentVariableType = EnvironmentVariableType(type)
|
|
27
|
+
super().__init__(
|
|
28
|
+
super_client=studio,
|
|
29
|
+
prefix=f"{self.type}s"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
async def get_all(self, **kwargs) -> List[EnvironmentVariableInfo]:
|
|
34
|
+
"""
|
|
35
|
+
获取当前 Studio 的所有环境变量的 key 和 value。
|
|
36
|
+
|
|
37
|
+
密文变量的值不可见。
|
|
38
|
+
"""
|
|
39
|
+
kwargs["method"] = "GET"
|
|
40
|
+
kwargs["subpath"] = None
|
|
41
|
+
data = await self.request_openapi_data(**kwargs)
|
|
42
|
+
environment_variable_infos = list(map(
|
|
43
|
+
EnvironmentVariableInfo.from_json,
|
|
44
|
+
data.get(self.prefix) or []
|
|
45
|
+
))
|
|
46
|
+
return environment_variable_infos
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
async def add(
|
|
50
|
+
self,
|
|
51
|
+
key: str,
|
|
52
|
+
value: str,
|
|
53
|
+
**kwargs
|
|
54
|
+
) -> None:
|
|
55
|
+
"""
|
|
56
|
+
为当前的 Studio 添加一个环境变量.
|
|
57
|
+
|
|
58
|
+
明文变量的 key 和 value 都公开可见,敏感信息请使用密文变量接口。
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
key: 变量名称。
|
|
62
|
+
value: 变量值。
|
|
63
|
+
"""
|
|
64
|
+
kwargs["method"] = "POST"
|
|
65
|
+
kwargs["subpath"] = None
|
|
66
|
+
kwargs.setdefault("json", {}).update({
|
|
67
|
+
"key": key,
|
|
68
|
+
"value": value,
|
|
69
|
+
})
|
|
70
|
+
await self.request_openapi_data(**kwargs)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
async def update(
|
|
74
|
+
self,
|
|
75
|
+
key: str,
|
|
76
|
+
value: str,
|
|
77
|
+
**kwargs
|
|
78
|
+
) -> None:
|
|
79
|
+
"""
|
|
80
|
+
更新当前 Studio 的一个环境变量值。
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
key: 变量名称。
|
|
84
|
+
value: 变量新值。
|
|
85
|
+
"""
|
|
86
|
+
kwargs["method"] = "PUT"
|
|
87
|
+
kwargs["subpath"] = None
|
|
88
|
+
kwargs.setdefault("json", {}).update({
|
|
89
|
+
"key": key,
|
|
90
|
+
"value": value,
|
|
91
|
+
})
|
|
92
|
+
await self.request_openapi_data(**kwargs)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
async def delete(self, key: str, **kwargs) -> None:
|
|
96
|
+
"""
|
|
97
|
+
删除当前 Studio 的一个环境变量。
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
key: 变量名称。
|
|
101
|
+
"""
|
|
102
|
+
kwargs["method"] = "DELETE"
|
|
103
|
+
kwargs["subpath"] = None
|
|
104
|
+
kwargs.setdefault("json", {}).update({
|
|
105
|
+
"key": key,
|
|
106
|
+
})
|
|
107
|
+
await self.request_openapi_data(**kwargs)
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""
|
|
2
|
+
对单个创空间的操作。
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import Optional, TYPE_CHECKING
|
|
8
|
+
|
|
9
|
+
from ...utils.regex import STUDIO_ID_PATTERN
|
|
10
|
+
from ...data_models.studio import (
|
|
11
|
+
StudioInfo, StudioRuntimeInfo, StudioVisibility,
|
|
12
|
+
EnvironmentVariableType,
|
|
13
|
+
SDKType,
|
|
14
|
+
LogsInfo, LogsType
|
|
15
|
+
)
|
|
16
|
+
from .._sub_client import SubClient
|
|
17
|
+
from .environment_variable_client import EnvironmentVariableClient
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from .studio_client import StudioClient
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Studio(SubClient):
|
|
25
|
+
"""
|
|
26
|
+
单个创空间。
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, studio_client: StudioClient, id: str):
|
|
30
|
+
self._id = id
|
|
31
|
+
assert STUDIO_ID_PATTERN.fullmatch(self.id), f"Invalid studio ID: {self.id}"
|
|
32
|
+
super().__init__(
|
|
33
|
+
super_client=studio_client,
|
|
34
|
+
prefix=self.id
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# 明文变量
|
|
38
|
+
self.variables = EnvironmentVariableClient(
|
|
39
|
+
studio=self,
|
|
40
|
+
type=EnvironmentVariableType.VARIABLE
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# 密文变量
|
|
44
|
+
self.secrets = EnvironmentVariableClient(
|
|
45
|
+
studio=self,
|
|
46
|
+
type=EnvironmentVariableType.SECRET
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def __str__(self) -> str:
|
|
51
|
+
return f"{type(self).__name__}<{self.id}>"
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# ==== 只读属性 ====
|
|
55
|
+
|
|
56
|
+
@property
|
|
57
|
+
def id(self) -> str:
|
|
58
|
+
"""
|
|
59
|
+
Studio ID (owner/repo_name)
|
|
60
|
+
"""
|
|
61
|
+
return self._id
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def owner(self) -> str:
|
|
66
|
+
"""
|
|
67
|
+
拥有者(个人用户名或组织名)
|
|
68
|
+
"""
|
|
69
|
+
return self._id.split("/")[0]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@property
|
|
73
|
+
def repo_name(self) -> str:
|
|
74
|
+
"""
|
|
75
|
+
仓库名。
|
|
76
|
+
"""
|
|
77
|
+
return self._id.split("/")[1]
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# ==== 创空间操作 ====
|
|
81
|
+
|
|
82
|
+
async def get_info(self, **kwargs) -> StudioInfo:
|
|
83
|
+
"""
|
|
84
|
+
获取当前 Studio 的详细信息。
|
|
85
|
+
|
|
86
|
+
公开(public)和公开体验(protected)类型的创空间无需认证即可访问;私有(private)创空间需要认证。
|
|
87
|
+
"""
|
|
88
|
+
kwargs["method"] = "GET"
|
|
89
|
+
kwargs["subpath"] = None
|
|
90
|
+
data = await self.request_openapi_data(**kwargs)
|
|
91
|
+
return StudioInfo.from_json(data)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
async def update_settings(
|
|
95
|
+
self,
|
|
96
|
+
*,
|
|
97
|
+
display_name: Optional[str] = None,
|
|
98
|
+
license: Optional[str] = None,
|
|
99
|
+
visibility: Optional[StudioVisibility] = None,
|
|
100
|
+
description: Optional[str] = None,
|
|
101
|
+
cover_image: Optional[str] = None,
|
|
102
|
+
sdk_type: Optional[SDKType] = None,
|
|
103
|
+
sdk_version: Optional[str] = None,
|
|
104
|
+
base_image: Optional[str] = None,
|
|
105
|
+
hardware: Optional[str] = None,
|
|
106
|
+
**kwargs
|
|
107
|
+
) -> StudioInfo:
|
|
108
|
+
"""
|
|
109
|
+
更新当前 Studio 的设置,传入哪个字段修改哪个字段,不传的字段不修改。
|
|
110
|
+
|
|
111
|
+
注意:sdk_type、sdk_version、base_image、hardware 修改后需重新部署才能生效。
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
display_name: 显示名称。
|
|
115
|
+
display_name.length <= 128
|
|
116
|
+
license: 许可证。
|
|
117
|
+
visibility: 创空间可见性。
|
|
118
|
+
description: 描述。
|
|
119
|
+
description.length <= 2000。
|
|
120
|
+
cover_image: 封面图 URL。
|
|
121
|
+
sdk_type: SDK 类型,修改后需重新部署才能生效。
|
|
122
|
+
sdk_version: SDK 版本,仅对 Gradio 类型生效,默认最新版,建议选用最新版本,修改后需重新部署才能生效。
|
|
123
|
+
base_image: 基础镜像,仅 Docker 类型不支持,建议选用最新版本,修改后需重新部署才能生效。
|
|
124
|
+
hardware: 硬件配置,修改后需重新部署才能生效。默认为 "platform/2v-cpu-16g-mem"。
|
|
125
|
+
免费资源常见格式为 platform/...、xgpu/...、amd/...;
|
|
126
|
+
付费资源格式为 paid/<InstanceType>,例如 paid/ecs.gn7i-c8g1.2xlarge。
|
|
127
|
+
"""
|
|
128
|
+
kwargs["method"] = "PATCH"
|
|
129
|
+
kwargs["subpath"] = "settings"
|
|
130
|
+
kwargs.setdefault("json", {}).update({
|
|
131
|
+
"display_name": display_name,
|
|
132
|
+
"license": license,
|
|
133
|
+
"visibility": visibility,
|
|
134
|
+
"description": description,
|
|
135
|
+
"cover_image": cover_image,
|
|
136
|
+
"sdk_type": sdk_type,
|
|
137
|
+
"sdk_version": sdk_version,
|
|
138
|
+
"base_image": base_image,
|
|
139
|
+
"hardware": hardware,
|
|
140
|
+
})
|
|
141
|
+
data = await self.request_openapi_data(**kwargs)
|
|
142
|
+
return StudioInfo.from_json(data)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
async def deploy(self, **kwargs) -> StudioRuntimeInfo:
|
|
146
|
+
"""
|
|
147
|
+
部署当前的 Studio(会重新拉取代码并重建),无论当前状态是停止还是运行中均可调用。
|
|
148
|
+
"""
|
|
149
|
+
kwargs["method"] = "POST"
|
|
150
|
+
kwargs["subpath"] = "deploy"
|
|
151
|
+
data = await self.request_openapi_data(**kwargs)
|
|
152
|
+
return StudioRuntimeInfo.from_json(data)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
async def stop(self, **kwargs) -> StudioRuntimeInfo:
|
|
156
|
+
"""
|
|
157
|
+
停止当前的 Studio。
|
|
158
|
+
"""
|
|
159
|
+
kwargs["method"] = "POST"
|
|
160
|
+
kwargs["subpath"] = "stop"
|
|
161
|
+
data = await self.request_openapi_data(**kwargs)
|
|
162
|
+
return StudioRuntimeInfo.from_json(data)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
async def get_logs(
|
|
166
|
+
self,
|
|
167
|
+
log_type: LogsType,
|
|
168
|
+
*,
|
|
169
|
+
page_num: int = 1,
|
|
170
|
+
page_size: int = 100,
|
|
171
|
+
keyword: Optional[str] = None,
|
|
172
|
+
start_timestamp: Optional[int] = None,
|
|
173
|
+
end_timestamp: Optional[int] = None,
|
|
174
|
+
**kwargs
|
|
175
|
+
) -> LogsInfo:
|
|
176
|
+
"""
|
|
177
|
+
获取当前 Studio 的运行日志。
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
log_type: 日志类型:build(构建日志)或 run(运行日志)。
|
|
181
|
+
page_num: 页码,默认 1。
|
|
182
|
+
page_size: 每页数量,默认 100,最大 500。
|
|
183
|
+
keyword: 关键字过滤,可选。
|
|
184
|
+
start_timestamp: 开始时间戳(秒),可选,自动根据 end_timestamp 计算。
|
|
185
|
+
end_timestamp: 结束时间戳(秒),可选,默认当前时间。
|
|
186
|
+
"""
|
|
187
|
+
kwargs["method"] = "GET"
|
|
188
|
+
kwargs["subpath"] = f"logs/{log_type}"
|
|
189
|
+
kwargs.setdefault("params", {}).update({
|
|
190
|
+
"page_num": page_num,
|
|
191
|
+
"page_size": page_size,
|
|
192
|
+
"keyword": keyword,
|
|
193
|
+
"start_timestamp": start_timestamp,
|
|
194
|
+
"end_timestamp": end_timestamp,
|
|
195
|
+
})
|
|
196
|
+
data = await self.request_openapi_data(**kwargs)
|
|
197
|
+
return LogsInfo.from_json(data)
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"""
|
|
2
|
+
集成封装与创空间(Studios)有关的 API。
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import List, Literal, Optional, TYPE_CHECKING
|
|
8
|
+
|
|
9
|
+
from ...data_models.studio import (
|
|
10
|
+
BaseImageInfo,
|
|
11
|
+
HardwareInfo,
|
|
12
|
+
SDKType, SDKVersionInfo,
|
|
13
|
+
StudioInfo, StudioVisibility,
|
|
14
|
+
)
|
|
15
|
+
from .._sub_client import SubClient
|
|
16
|
+
from .studio import Studio
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from ..modelscope_client import ModelScopeClient
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class StudioClient(SubClient):
|
|
24
|
+
"""
|
|
25
|
+
集成封装与创空间(Studios)有关的 API。
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
modelscope_client: ModelScopeClient,
|
|
31
|
+
*,
|
|
32
|
+
prefix: str = "studios"
|
|
33
|
+
):
|
|
34
|
+
super().__init__(
|
|
35
|
+
super_client=modelscope_client,
|
|
36
|
+
prefix=prefix
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# ==== 查询创空间信息 ====
|
|
41
|
+
|
|
42
|
+
async def search_studio_infos(
|
|
43
|
+
self,
|
|
44
|
+
search: Optional[str] = None,
|
|
45
|
+
owner: Optional[str] = None,
|
|
46
|
+
*,
|
|
47
|
+
sort: Literal["default", "last_modified", "view_num", "likes"] = "default",
|
|
48
|
+
page_number: int = 1,
|
|
49
|
+
page_size: int = 10,
|
|
50
|
+
status: Optional[Literal["running", "all"]] = None,
|
|
51
|
+
mcp_support: Optional[bool] = None,
|
|
52
|
+
hardware_type: Optional[Literal["xgpu", "amd"]] = None,
|
|
53
|
+
**kwargs
|
|
54
|
+
) -> List[StudioInfo]:
|
|
55
|
+
"""
|
|
56
|
+
列出创空间信息。
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
search: 针对创空间名称、展示名称、作者(包括组织、个人)的子字符串关键词进行搜索。
|
|
60
|
+
max length: 100.
|
|
61
|
+
owner: 针对创空间作者(包括组织、个人)进行搜索。
|
|
62
|
+
sort: 排序方式。
|
|
63
|
+
page_number: 页码,限制 page_number * page_size <= 3000, page_number >= 1。
|
|
64
|
+
page_size: 每页大小(1~50),限制 page_number * page_size <= 3000。
|
|
65
|
+
status: 按创空间运行状态筛选。正常搜索仅支持 running;当按 owner 筛选时,默认为 all。
|
|
66
|
+
mcp_support: 是否支持通过MCP使用。
|
|
67
|
+
hardware_type: 根据创空间硬件类型筛选,当前仅支持筛选 xGPU。
|
|
68
|
+
"""
|
|
69
|
+
kwargs["method"] = "GET"
|
|
70
|
+
kwargs["subpath"] = None
|
|
71
|
+
kwargs.setdefault("params", {}).update({
|
|
72
|
+
"search": search,
|
|
73
|
+
"owner": owner,
|
|
74
|
+
"sort": sort,
|
|
75
|
+
"page_number": page_number,
|
|
76
|
+
"page_size": page_size,
|
|
77
|
+
"status": status,
|
|
78
|
+
"mcp_support": mcp_support,
|
|
79
|
+
"hardware_type": hardware_type,
|
|
80
|
+
})
|
|
81
|
+
data = await self.request_openapi_data(**kwargs)
|
|
82
|
+
studio_infos = list(map(
|
|
83
|
+
StudioInfo.from_json,
|
|
84
|
+
data.get("studios") or []
|
|
85
|
+
))
|
|
86
|
+
return studio_infos
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# ==== 查询硬件信息 ====
|
|
90
|
+
|
|
91
|
+
async def search_available_hardwares(
|
|
92
|
+
self,
|
|
93
|
+
*,
|
|
94
|
+
sdk_type: Optional[SDKType] = None,
|
|
95
|
+
studio_id: Optional[str] = None,
|
|
96
|
+
**kwargs
|
|
97
|
+
) -> List[HardwareInfo]:
|
|
98
|
+
"""
|
|
99
|
+
查询创空间可用的硬件配置列表。
|
|
100
|
+
|
|
101
|
+
- 未登录:返回默认免费硬件
|
|
102
|
+
- 已登录:返回用户可用的免费硬件和带价格的付费硬件
|
|
103
|
+
- 已登录且指定创空间:免费硬件以该创空间的可用免费资源为准
|
|
104
|
+
- 付费资源:使用 paid/<InstanceType> 作为创建或更新 Studio 时的 hardware 参数值
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
sdk_type: 按 supported_sdk_types 过滤硬件配置。
|
|
108
|
+
studio_id: 创空间 ID(owner/repo_name),指定后返回该创空间可选的硬件。
|
|
109
|
+
"""
|
|
110
|
+
kwargs["method"] = "GET"
|
|
111
|
+
kwargs["subpath"] = "hardware"
|
|
112
|
+
kwargs.setdefault("params", {}).update({
|
|
113
|
+
"sdk_type": sdk_type,
|
|
114
|
+
"studio": studio_id,
|
|
115
|
+
})
|
|
116
|
+
data = await self.request_openapi_data(**kwargs)
|
|
117
|
+
hardware_infos = list(map(
|
|
118
|
+
HardwareInfo.from_json,
|
|
119
|
+
data.get("hardware") or []
|
|
120
|
+
))
|
|
121
|
+
return hardware_infos
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# ==== 查询 SDK 版本 ====
|
|
125
|
+
|
|
126
|
+
async def query_available_sdk_versions(
|
|
127
|
+
self,
|
|
128
|
+
sdk_type: SDKType,
|
|
129
|
+
**kwargs
|
|
130
|
+
) -> List[SDKVersionInfo]:
|
|
131
|
+
"""
|
|
132
|
+
查询创空间可用的 SDK 版本列表。
|
|
133
|
+
仅当 sdk_type=gradio 时返回 Gradio 版本列表;其他 SDK 类型或未传 sdk_type 时返回空列表。
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
sdk_type: SDK 类型,仅 gradio 返回版本列表。
|
|
137
|
+
"""
|
|
138
|
+
kwargs["method"] = "GET"
|
|
139
|
+
kwargs["subpath"] = "sdk-versions"
|
|
140
|
+
kwargs.setdefault("params", {}).update({
|
|
141
|
+
"sdk_type": sdk_type,
|
|
142
|
+
})
|
|
143
|
+
data = await self.request_openapi_data(**kwargs)
|
|
144
|
+
sdk_version_infos = list(map(
|
|
145
|
+
SDKVersionInfo.from_json,
|
|
146
|
+
data.get("sdk_versions") or []
|
|
147
|
+
))
|
|
148
|
+
return sdk_version_infos
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
# ==== 查询基础镜像 ====
|
|
152
|
+
|
|
153
|
+
async def query_available_base_images(self, **kwargs) -> List[BaseImageInfo]:
|
|
154
|
+
"""
|
|
155
|
+
查询创空间可用的基础镜像列表,登录与否返回结果一致。
|
|
156
|
+
"""
|
|
157
|
+
kwargs["method"] = "GET"
|
|
158
|
+
kwargs["subpath"] = "base-images"
|
|
159
|
+
data = await self.request_openapi_data(**kwargs)
|
|
160
|
+
base_image_infos = list(map(
|
|
161
|
+
BaseImageInfo.from_json,
|
|
162
|
+
data.get("base_images") or []
|
|
163
|
+
))
|
|
164
|
+
return base_image_infos
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
# ==== 创建创空间 ====
|
|
168
|
+
|
|
169
|
+
def get_studio(self, studio_id: str) -> Studio:
|
|
170
|
+
"""
|
|
171
|
+
构造一个 Studio 对象。
|
|
172
|
+
"""
|
|
173
|
+
return Studio(studio_client=self, id=studio_id)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
async def create_studio(
|
|
177
|
+
self,
|
|
178
|
+
repo_name: str,
|
|
179
|
+
owner: Optional[str] = None,
|
|
180
|
+
*,
|
|
181
|
+
display_name: Optional[str] = None,
|
|
182
|
+
license: Optional[str] = None,
|
|
183
|
+
visibility: Optional[StudioVisibility] = None,
|
|
184
|
+
description: Optional[str] = None,
|
|
185
|
+
cover_image: Optional[str] = None,
|
|
186
|
+
sdk_type: Optional[SDKType] = None,
|
|
187
|
+
sdk_version: Optional[str] = None,
|
|
188
|
+
base_image: Optional[str] = None,
|
|
189
|
+
hardware: Optional[str] = None,
|
|
190
|
+
**kwargs
|
|
191
|
+
) -> Studio:
|
|
192
|
+
"""
|
|
193
|
+
创建一个新的 Studio(创空间)。
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
repo_name: 仓库名称。
|
|
197
|
+
repo_name.length <= 64
|
|
198
|
+
owner: 所有者(用户名或组织名)(大小写敏感)。默认使用当前登录的用户。
|
|
199
|
+
display_name: 显示名称。
|
|
200
|
+
display_name.length <= 128
|
|
201
|
+
license: 许可证,默认 apache-2.0。
|
|
202
|
+
visibility: 创空间可见性,默认 public。
|
|
203
|
+
description: 描述。
|
|
204
|
+
description.length <= 2000。
|
|
205
|
+
cover_image: 封面图 URL,为空时使用平台默认图。
|
|
206
|
+
sdk_type: SDK 类型,修改后需重新部署才能生效。默认 gradio。
|
|
207
|
+
sdk_version: SDK 版本,仅对 Gradio 类型生效,默认最新版,建议选用最新版本,修改后需重新部署才能生效。
|
|
208
|
+
可用版本会随平台更新,请通过 self.query_available_sdk_versions("gradio") 查询当前可用的 Gradio 版本列表。
|
|
209
|
+
base_image: 基础镜像,仅 Docker 类型不支持,建议选用最新版本,修改后需重新部署才能生效。
|
|
210
|
+
可用值不固定,请通过 self.query_available_base_images() 查询当前可用的基础镜像列表。
|
|
211
|
+
hardware: 硬件配置,修改后需重新部署才能生效。默认为 "platform/2v-cpu-16g-mem"。
|
|
212
|
+
可用值不固定,请通过 self.search_available_hardwares() 查询当前可用的硬件配置列表。
|
|
213
|
+
免费资源常见格式为 platform/...、xgpu/...、amd/...;
|
|
214
|
+
付费资源格式为 paid/<InstanceType>,例如 paid/ecs.gn7i-c8g1.2xlarge。
|
|
215
|
+
"""
|
|
216
|
+
# 补全 `owner` 参数
|
|
217
|
+
if not owner:
|
|
218
|
+
current_user_info = await self.super_client.user.get_current_user_info()
|
|
219
|
+
owner = current_user_info.username
|
|
220
|
+
|
|
221
|
+
kwargs["method"] = "POST"
|
|
222
|
+
kwargs["subpath"] = None
|
|
223
|
+
kwargs.setdefault("json", {}).update({
|
|
224
|
+
"repo_name": repo_name,
|
|
225
|
+
"owner": owner,
|
|
226
|
+
"display_name": display_name,
|
|
227
|
+
"license": license,
|
|
228
|
+
"visibility": visibility,
|
|
229
|
+
"description": description,
|
|
230
|
+
"cover_image": cover_image,
|
|
231
|
+
"sdk_type": sdk_type,
|
|
232
|
+
"sdk_version": sdk_version,
|
|
233
|
+
"base_image": base_image,
|
|
234
|
+
"hardware": hardware,
|
|
235
|
+
})
|
|
236
|
+
data = await self.request_openapi_data(**kwargs)
|
|
237
|
+
return self.get_studio(data["id"])
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""
|
|
2
|
+
集成封装与用户(User)有关的 API。
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
8
|
+
|
|
9
|
+
from ...data_models.user import UserInfo
|
|
10
|
+
from .._sub_client import SubClient
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from ..modelscope_client import ModelScopeClient
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class UserClient(SubClient):
|
|
18
|
+
"""
|
|
19
|
+
集成封装与用户(User)有关的 API。
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(
|
|
23
|
+
self,
|
|
24
|
+
modelscope_client: ModelScopeClient,
|
|
25
|
+
*,
|
|
26
|
+
prefix: str = "users"
|
|
27
|
+
):
|
|
28
|
+
super().__init__(
|
|
29
|
+
super_client=modelscope_client,
|
|
30
|
+
prefix=prefix
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# ==== 查询用户信息 ====
|
|
35
|
+
|
|
36
|
+
async def get_current_user_info(self, **kwargs) -> UserInfo:
|
|
37
|
+
"""
|
|
38
|
+
获取当前已认证用户的个人信息。
|
|
39
|
+
|
|
40
|
+
Raises:
|
|
41
|
+
ModelScopeException: 如果未登录。
|
|
42
|
+
"""
|
|
43
|
+
kwargs["method"] = "GET"
|
|
44
|
+
kwargs["subpath"] = "me"
|
|
45
|
+
data = await self.request_openapi_data(**kwargs)
|
|
46
|
+
return UserInfo.from_json(data)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: modelscope-api
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: A Python async SDK that wraps the ModelScope API into a clean, type-safe interface.
|
|
5
|
+
Author-email: Jerry <wujr24@m.fudan.edu.cn>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Jerry-Wu-GitHub/modelscope-api
|
|
8
|
+
Project-URL: Repository, https://github.com/Jerry-Wu-GitHub/modelscope-api.git
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Requires-Python: >=3.11
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
License-File: LICENSE
|
|
15
|
+
Requires-Dist: fake-useragent
|
|
16
|
+
Requires-Dist: httpx
|
|
17
|
+
Requires-Dist: python-dotenv
|
|
18
|
+
Requires-Dist: typing-extensions
|
|
19
|
+
Requires-Dist: yarl
|
|
20
|
+
Dynamic: license-file
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
modelscope_api/__init__.py,sha256=JClFlMDTFFp8UaoII9GwG8NRppPKq2wvLvUUN3m44_8,38
|
|
2
|
+
modelscope_api/config.py,sha256=ZRURUHHw4PZ9K5HuI-vUOmi16Q9hMBkEtRbXN2ajKss,481
|
|
3
|
+
modelscope_api/exceptions.py,sha256=mJSqnlz2pteun5_UXJ2aHmKTDLcWZPBEqxGiTE_9KzA,1561
|
|
4
|
+
modelscope_api/data_models/__init__.py,sha256=nMb3jpewbElJNMiciL3nUtiDUIS-8vDp8XcusNBVD2U,27
|
|
5
|
+
modelscope_api/data_models/base.py,sha256=Trg1YpiJCEg2OaMdN4ik-4Kf4948lHAYU6stXQomDjg,439
|
|
6
|
+
modelscope_api/data_models/collection/__init__.py,sha256=g64zrtIbwLO5Wc7hTrPuZWXgWlK2doYDD_yfbKFdEI0,237
|
|
7
|
+
modelscope_api/data_models/collection/collection.py,sha256=AvX2Dq92ZeU8C5OqOpB8ZsMaJXIQCkPuPsXotQ7PrjE,2685
|
|
8
|
+
modelscope_api/data_models/collection/collection_item.py,sha256=nLxj0n_Btz7FDl0OU2ebKq_QsMZOvZSyDv5NdTw_BtU,2479
|
|
9
|
+
modelscope_api/data_models/magicube/__init__.py,sha256=Qjdp1UIeD4CJAzUCdU5rYyg9x3vFAXiC6pmf-E3fiYg,111
|
|
10
|
+
modelscope_api/data_models/magicube/magicube_blance.py,sha256=Cv66ciGBhIVGcBpxCDpNz5FjYg6GwZm0XJynS3HYQp4,664
|
|
11
|
+
modelscope_api/data_models/studio/__init__.py,sha256=ulMTIrQyqCwSQQ5TRmgRubFFn4jkeejQW1GkBF3apz4,420
|
|
12
|
+
modelscope_api/data_models/studio/base_image.py,sha256=T0hKHvBGEFNJw2sB5G45jvyRgg-XX-TO9pWycOnxnZY,529
|
|
13
|
+
modelscope_api/data_models/studio/environment_variable.py,sha256=MJk1_uQsDltPHedAwYZKyVGII_HBfxHjFCtFg3t0czU,706
|
|
14
|
+
modelscope_api/data_models/studio/hardware.py,sha256=OgWYsKxyph9yrx9PQlu5kvbAFcP5R8uJ8zDhbO9y5DA,2334
|
|
15
|
+
modelscope_api/data_models/studio/logs.py,sha256=HUdI7jh_m-wf1HZCb_jOWoD-1f-8O5047qxMZzEBBXU,972
|
|
16
|
+
modelscope_api/data_models/studio/sdk.py,sha256=GOPAvCZ-UwRLp_nMHF1qKxQa4b0AexvIFyAupK8YjAI,734
|
|
17
|
+
modelscope_api/data_models/studio/studio.py,sha256=R9RSGXd8TPuym0uNnztAnJtclBSrVgGaCKD0es4xk_o,5275
|
|
18
|
+
modelscope_api/data_models/user/__init__.py,sha256=BNVnQ5ibbq-gdk6hluoRd_ZifrwWfCQ3CfggDwZ5Fjc,85
|
|
19
|
+
modelscope_api/data_models/user/user.py,sha256=XH-X59GTHui0Xr_ig91VQVUL1UJWdATlPqyxG5BUsRg,1040
|
|
20
|
+
modelscope_api/models/__init__.py,sha256=Nf3_nUc6BKvcCtQVQ1exWK7uWcobvR2U1iI4MrZQ6WQ,318
|
|
21
|
+
modelscope_api/models/_sub_client.py,sha256=g2T4kvOaG8ihLjuJqGnxyQPGsbwdg7LJxEJxXMRYPtI,1889
|
|
22
|
+
modelscope_api/models/modelscope_client.py,sha256=eOAY539kodN8QC_zfvQ6ciNTMrYLxJl2ARqbW4P7pos,6998
|
|
23
|
+
modelscope_api/models/collection/__init__.py,sha256=wTBTsY72m7NJ6pOyXio0M0hUikJC7mIDcbjdQQ0iAe8,250
|
|
24
|
+
modelscope_api/models/collection/collection.py,sha256=kIUSkEfuyJA9JC8CMixXeBbWTUpQMOTHXYN84m9GQA4,3401
|
|
25
|
+
modelscope_api/models/collection/collection_client.py,sha256=It39XmF0JYniqE56STQQ0aCuMe1OuXPXu53G9j5VDCQ,4356
|
|
26
|
+
modelscope_api/models/collection/collection_item.py,sha256=sgG-KqOkT-NM-AqvlEJOjLJTWb-hePFzV3gPmG7LD8A,2236
|
|
27
|
+
modelscope_api/models/collection/collection_item_client.py,sha256=vkoLpiKD31Cvjg9VgRq6VziQ3fs0m1147DYj3cbuHBA,7774
|
|
28
|
+
modelscope_api/models/magicube/__init__.py,sha256=guvFERzOmL6pgJmnYV7XUyWpb6jOw49p9SHUiwX9yww,105
|
|
29
|
+
modelscope_api/models/magicube/magicube_client.py,sha256=t2R0JjOW6MuCid9z-pwtwJz7leVVEby49H4NjunJLRk,1115
|
|
30
|
+
modelscope_api/models/studio/__init__.py,sha256=AeVCPawF9QLzbu3C94PZZUtxlsRn_DRO5UEbp3uRIuc,198
|
|
31
|
+
modelscope_api/models/studio/environment_variable_client.py,sha256=syxpk53aO9SCWvdqdfNezmm5kaBtBkyGF9GFxSvYZiA,2784
|
|
32
|
+
modelscope_api/models/studio/studio.py,sha256=b3evKZ-35bGpx3PiSvUCU72lyh5j4Cvf4qfpgw-gbrw,6525
|
|
33
|
+
modelscope_api/models/studio/studio_client.py,sha256=E1lq4uSOZ4ORmXaaD7_W58keiQ4LIgo0GPbk8DB1BM4,8834
|
|
34
|
+
modelscope_api/models/user/__init__.py,sha256=NIdeQFEn38giQE4PY1lhnlqKsicDHhCK3qeF4Jq66tI,93
|
|
35
|
+
modelscope_api/models/user/user_client.py,sha256=fMxAgxKOEI0jXFQJTmgfr1xLVztr_--XVot-i9s54mk,1067
|
|
36
|
+
modelscope_api/utils/regex.py,sha256=khlg-zj5P7fizGs9ZkzmU8M9L5dz7R_9jDjspS7OP_Y,245
|
|
37
|
+
modelscope_api/utils/typing.py,sha256=Tq9sxXPae8Fdx9ibgbwraMJtIzCSFGyOERGdcIapnmk,207
|
|
38
|
+
modelscope_api-0.0.1.dist-info/licenses/LICENSE,sha256=39yjsOXCxti7EMXdyAAfqityQk1hVHL-QiZHZqxSGI0,1083
|
|
39
|
+
modelscope_api-0.0.1.dist-info/METADATA,sha256=xAk4IOZq9JQCH6X1m2pX4b4e1bUjkprr2gHggDDEI8s,779
|
|
40
|
+
modelscope_api-0.0.1.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
41
|
+
modelscope_api-0.0.1.dist-info/top_level.txt,sha256=oARZ-KorRdgifR8v3fZySSZU9NF7fnJsaI5wcQldSUM,15
|
|
42
|
+
modelscope_api-0.0.1.dist-info/RECORD,,
|