1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15+ import json
1516from pathlib import Path
16-
17+ import os
1718import frontmatter
1819
1920from veadk .skills .skill import Skill
2021from veadk .utils .logger import get_logger
22+ from veadk .utils .volcengine_sign import ve_request
2123
2224logger = get_logger (__name__ )
2325
2426
2527def load_skill_from_directory (skill_directory : Path ) -> Skill :
2628 logger .info (f"Load skill from { skill_directory } " )
2729 skill_readme = skill_directory / "SKILL.md"
30+ if not skill_readme .exists ():
31+ logger .error (f"Skill '{ skill_directory } ' has no SKILL.md file." )
32+ raise ValueError (f"Skill '{ skill_directory } ' has no SKILL.md file" )
33+
2834 skill = frontmatter .load (str (skill_readme ))
2935
3036 skill_name = skill .get ("name" , "" )
@@ -39,7 +45,7 @@ def load_skill_from_directory(skill_directory: Path) -> Skill:
3945 )
4046
4147 logger .info (
42- f"Successfully loaded skill from { skill_readme } , name={ skill [ 'name' ] } , description={ skill [ 'description' ] } "
48+ f"Successfully loaded skill { skill_name } locally from { skill_readme } , name={ skill_name } , description={ skill_description } "
4349 )
4450 return Skill (
4551 name = skill_name , # type: ignore
@@ -58,4 +64,76 @@ def load_skills_from_directory(skills_directory: Path) -> list[Skill]:
5864 return skills
5965
6066
61- def load_skills_from_cloud (space_name : str ) -> list [Skill ]: ...
67+ def load_skills_from_cloud (skill_space_ids : str ) -> list [Skill ]:
68+ skill_space_ids_list = [x .strip () for x in skill_space_ids .split ("," )]
69+ logger .info (f"Load skills from skill spaces: { skill_space_ids_list } " )
70+
71+ from veadk .auth .veauth .utils import get_credential_from_vefaas_iam
72+
73+ skills = []
74+
75+ for skill_space_id in skill_space_ids_list :
76+ try :
77+ service = os .getenv ("AGENTKIT_TOOL_SERVICE_CODE" , "agentkit" )
78+ region = os .getenv ("AGENTKIT_TOOL_REGION" , "cn-beijing" )
79+ host = os .getenv ("AGENTKIT_SKILL_HOST" , "open.volcengineapi.com" )
80+
81+ access_key = os .getenv ("VOLCENGINE_ACCESS_KEY" )
82+ secret_key = os .getenv ("VOLCENGINE_SECRET_KEY" )
83+ session_token = ""
84+
85+ if not (access_key and secret_key ):
86+ # Try to get from vefaas iam
87+ cred = get_credential_from_vefaas_iam ()
88+ access_key = cred .access_key_id
89+ secret_key = cred .secret_access_key
90+ session_token = cred .session_token
91+
92+ response = ve_request (
93+ request_body = {
94+ "SkillSpaceId" : skill_space_id ,
95+ "InnerTags" : {"source" : "sandbox" },
96+ },
97+ action = "ListSkillsBySpaceId" ,
98+ ak = access_key ,
99+ sk = secret_key ,
100+ service = service ,
101+ version = "2025-10-30" ,
102+ region = region ,
103+ host = host ,
104+ header = {"X-Security-Token" : session_token },
105+ )
106+
107+ if isinstance (response , str ):
108+ response = json .loads (response )
109+
110+ list_skills_result = response .get ("Result" )
111+ items = list_skills_result .get ("Items" )
112+
113+ for item in items :
114+ if not isinstance (item , dict ):
115+ continue
116+ skill_name = item .get ("Name" )
117+ skill_description = item .get ("Description" )
118+ tos_bucket = item .get ("BucketName" )
119+ tos_path = item .get ("TosPath" )
120+ if not skill_name :
121+ continue
122+
123+ skill = Skill (
124+ name = skill_name , # type: ignore
125+ description = skill_description , # type: ignore
126+ path = tos_path ,
127+ skill_space_id = skill_space_id ,
128+ bucket_name = tos_bucket ,
129+ )
130+
131+ skills .append (skill )
132+
133+ logger .info (
134+ f"Successfully loaded skill { skill_name } from skill space={ skill_space_id } , name={ skill_name } , description={ skill_description } "
135+ )
136+ except Exception as e :
137+ logger .error (f"Failed to load skill from skill space: { e } " )
138+
139+ return skills
0 commit comments