Skip to content

Commit f9a7d95

Browse files
author
dawnguo
committed
feat(skills): 为vestack环境添加 minio 文件上传下载支持
添加对vestack环境的支持,包括: 1. 通过GenTempTosObjectUrl/GenTempTosObjectDownloadUrl API获取临时URL 2. 使用requests库实现文件上传下载 3. 使用环境变量AGENTKIT_TOOL_SCHEME配置请求协议
1 parent 5fa550c commit f9a7d95

4 files changed

Lines changed: 285 additions & 55 deletions

File tree

veadk/skills/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ def load_skills_from_cloud(skill_space_ids: str) -> list[Skill]:
174174
"InnerTags": {"source": "sandbox"},
175175
}
176176
logger.debug(f"ListSkillsBySpaceId request body: {request_body}")
177+
scheme = os.getenv("AGENTKIT_TOOL_SCHEME", "https").lower()
177178

178179
response = ve_request(
179180
request_body=request_body,
@@ -185,6 +186,7 @@ def load_skills_from_cloud(skill_space_ids: str) -> list[Skill]:
185186
region=region,
186187
host=host,
187188
header={"X-Security-Token": session_token},
189+
scheme=scheme,
188190
)
189191

190192
if isinstance(response, str):

veadk/tools/skills_tools/download_skills_tool.py

Lines changed: 84 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ def download_skills_tool(
9292

9393
all_downloaded_skills = []
9494

95+
scheme = os.getenv("AGENTKIT_TOOL_SCHEME", "https").lower()
9596
# Iterate through each skill space
9697
for skill_space_id in skill_space_ids_list:
9798
try:
@@ -101,7 +102,7 @@ def download_skills_tool(
101102
"InnerTags": {"source": "sandbox"},
102103
}
103104
logger.info(f"ListSkillsBySpaceId request body: {request_body}")
104-
105+
105106
response = ve_request(
106107
request_body=request_body,
107108
action="ListSkillsBySpaceId",
@@ -112,6 +113,7 @@ def download_skills_tool(
112113
region=region,
113114
host=host,
114115
header={"X-Security-Token": session_token},
116+
scheme=scheme,
115117
)
116118

117119
if isinstance(response, str):
@@ -161,11 +163,87 @@ def download_skills_tool(
161163

162164
# Download zip file
163165
zip_path = download_dir / f"{skill_name}.zip"
164-
success = tos_client.download(
165-
bucket_name=tos_bucket,
166-
object_key=tos_path,
167-
save_path=str(zip_path),
168-
)
166+
167+
if cloud_provider == "vestack":
168+
import requests
169+
170+
try:
171+
path_parts = tos_path.split("/")
172+
if len(path_parts) >= 3:
173+
skill_id = path_parts[1]
174+
skill_version = path_parts[2]
175+
else:
176+
logger.error(
177+
f"Invalid TosPath format for skill '{skill_name}': {tos_path}"
178+
)
179+
success = False
180+
continue
181+
except Exception as e:
182+
logger.error(
183+
f"Failed to parse TosPath for skill '{skill_name}': {e}"
184+
)
185+
success = False
186+
continue
187+
188+
# Call GenTempTosObjectDownloadUrl API
189+
temp_url_request_body = {
190+
"SkillId": skill_id,
191+
"SkillVersion": skill_version,
192+
}
193+
logger.debug(
194+
f"GenTempTosObjectDownloadUrl request body: {temp_url_request_body}"
195+
)
196+
197+
temp_url_res = ve_request(
198+
request_body=temp_url_request_body,
199+
action="GenTempTosObjectDownloadUrl",
200+
ak=access_key,
201+
sk=secret_key,
202+
service=service,
203+
version="2025-10-30",
204+
region=region,
205+
host=host,
206+
header={"X-Security-Token": session_token},
207+
scheme=scheme,
208+
)
209+
210+
if isinstance(temp_url_res, str):
211+
temp_url_res = json.loads(temp_url_res)
212+
213+
if (
214+
"ResponseMetadata" in temp_url_res
215+
and "Error" in temp_url_res["ResponseMetadata"]
216+
):
217+
error_details = temp_url_res["ResponseMetadata"]["Error"]
218+
logger.error(
219+
f"Failed to get temporary download URL for '{skill_name}': {error_details}"
220+
)
221+
success = False
222+
else:
223+
signed_url = temp_url_res.get("Result", {}).get("SignedUrl")
224+
if not signed_url:
225+
logger.error(
226+
f"Failed to get SignedUrl from GenTempTosObjectDownloadUrl response: {temp_url_res}"
227+
)
228+
success = False
229+
else:
230+
try:
231+
response = requests.get(signed_url)
232+
response.raise_for_status()
233+
with open(zip_path, "wb") as f:
234+
f.write(response.content)
235+
success = True
236+
except Exception as e:
237+
logger.warning(
238+
f"Failed to download skill '{skill_name}' from minio: {e}"
239+
)
240+
success = False
241+
else:
242+
success = tos_client.download(
243+
bucket_name=tos_bucket,
244+
object_key=tos_path,
245+
save_path=str(zip_path),
246+
)
169247

170248
if not success:
171249
logger.warning(f"Failed to download skill '{skill_name}'")

veadk/tools/skills_tools/register_skills_tool.py

Lines changed: 90 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -111,46 +111,100 @@ def register_skills_tool(
111111
secret_key = cred.secret_access_key
112112
session_token = cred.session_token
113113

114-
res = ve_request(
115-
request_body={},
116-
action="GetCallerIdentity",
117-
ak=access_key,
118-
sk=secret_key,
119-
service="sts",
120-
version="2018-01-01",
121-
region=region,
122-
host="sts.volcengineapi.com"
123-
if cloud_provider != "byteplus"
124-
else "open.byteplusapi.com",
125-
header={"X-Security-Token": session_token},
126-
)
127-
try:
128-
account_id = res["Result"]["AccountId"]
129-
except KeyError as e:
130-
logger.error(
131-
f"Error occurred while getting account id: {e}, response is {res}"
114+
account_id = ""
115+
if cloud_provider != "vestack":
116+
res = ve_request(
117+
request_body={},
118+
action="GetCallerIdentity",
119+
ak=access_key,
120+
sk=secret_key,
121+
service="sts",
122+
version="2018-01-01",
123+
region=region,
124+
host="sts.volcengineapi.com"
125+
if cloud_provider != "byteplus"
126+
else "open.byteplusapi.com",
127+
header={"X-Security-Token": session_token},
132128
)
133-
return f"Error: Failed to get account id when registering skill '{skill_name}'."
129+
try:
130+
account_id = res["Result"]["AccountId"]
131+
except KeyError as e:
132+
logger.error(
133+
f"Error occurred while getting account id: {e}, response is {res}"
134+
)
135+
return f"Error: Failed to get account id when registering skill '{skill_name}'."
134136

135137
tos_bucket = f"agentkit-platform-{region}-{account_id}-skill"
138+
scheme = os.getenv("AGENTKIT_TOOL_SCHEME", "https").lower()
139+
if cloud_provider == "vestack":
140+
import requests
141+
142+
# Call GenTempTosObjectUrl API
143+
temp_url_request_body = {
144+
"SkillName": skill_name,
145+
}
146+
logger.debug(f"GenTempTosObjectUrl request body: {temp_url_request_body}")
147+
148+
temp_url_res = ve_request(
149+
request_body=temp_url_request_body,
150+
action="GenTempTosObjectUrl",
151+
ak=access_key,
152+
sk=secret_key,
153+
service=agentkit_tool_service,
154+
version="2025-10-30",
155+
region=region,
156+
host=agentkit_skill_host,
157+
header={"X-Security-Token": session_token},
158+
scheme=scheme,
159+
)
136160

137-
tos_client = VeTOS(
138-
ak=access_key,
139-
sk=secret_key,
140-
session_token=session_token,
141-
bucket_name=tos_bucket,
142-
region=region,
143-
)
161+
if isinstance(temp_url_res, str):
162+
temp_url_res = json.loads(temp_url_res)
163+
164+
if (
165+
"ResponseMetadata" in temp_url_res
166+
and "Error" in temp_url_res["ResponseMetadata"]
167+
):
168+
error_details = temp_url_res["ResponseMetadata"]["Error"]
169+
logger.error(
170+
f"Failed to get temporary upload URL for '{skill_name}': {error_details}"
171+
)
172+
return f"Failed to get temporary upload URL for '{skill_name}': {error_details}"
173+
174+
signed_url = temp_url_res.get("Result", {}).get("SignedUrl")
175+
tos_url = temp_url_res.get("Result", {}).get("TosUrl")
176+
177+
if not signed_url or not tos_url:
178+
logger.error(
179+
f"Failed to get SignedUrl or TosUrl from GenTempTosObjectUrl response: {temp_url_res}"
180+
)
181+
return f"Failed to get temporary upload URL for '{skill_name}'."
182+
183+
try:
184+
with open(zip_file_path, "rb") as f:
185+
response = requests.put(signed_url, data=f)
186+
response.raise_for_status()
187+
except Exception as e:
188+
logger.error(f"Failed to upload skill '{skill_name}' to minio: {e}")
189+
return f"Failed to upload skill '{skill_name}' to minio: {e}"
190+
else:
191+
tos_client = VeTOS(
192+
ak=access_key,
193+
sk=secret_key,
194+
session_token=session_token,
195+
bucket_name=tos_bucket,
196+
region=region,
197+
)
144198

145-
object_key = (
146-
f"uploads/{datetime.now().strftime('%Y%m%d_%H%M%S')}/{skill_name}.zip"
147-
)
148-
tos_client.upload_file(
149-
file_path=zip_file_path, bucket_name=tos_bucket, object_key=object_key
150-
)
151-
tos_url = tos_client.build_tos_url(
152-
bucket_name=tos_bucket, object_key=object_key
153-
)
199+
object_key = (
200+
f"uploads/{datetime.now().strftime('%Y%m%d_%H%M%S')}/{skill_name}.zip"
201+
)
202+
tos_client.upload_file(
203+
file_path=zip_file_path, bucket_name=tos_bucket, object_key=object_key
204+
)
205+
tos_url = tos_client.build_tos_url(
206+
bucket_name=tos_bucket, object_key=object_key
207+
)
154208

155209
skill_space_ids = os.getenv("SKILL_SPACE_ID", "")
156210
skill_space_ids_list = [
@@ -173,6 +227,7 @@ def register_skills_tool(
173227
region=region,
174228
host=agentkit_skill_host,
175229
header={"X-Security-Token": session_token},
230+
scheme=scheme,
176231
)
177232

178233
if isinstance(response, str):

0 commit comments

Comments
 (0)