skillagent/skillagent/skillkit_wrapper.py
2026-01-22 11:55:42 +08:00

94 lines
2.3 KiB
Python

import os
from skillkit import SkillManager
import yaml
from pathlib import Path
from typing import Dict, Any
from appPublic.dictObject import DictObject
from appPublic.log import debug, exception
def find_missing_params(
input_schema: Dict[str, Any],
provided_params: Dict[str, Any],
) -> list[str]:
"""
根据 YAML schema 判断缺失的必填参数
"""
missing = []
for name, spec in input_schema.items():
if spec.get("required", False) and name not in provided_params:
missing.append(name)
return missing
def load_schemas(path) -> Dict[str, Any]:
"""
从 YAML 文件中读取 script 输入参数定义
返回格式:
{
"script": "Slider",
"inputs": {
"min": {...},
"max": {...}
}
}
"""
if not path.exists():
raise FileNotFoundError(f"Script yaml not found: {yaml_path}")
with path.open("r", encoding="utf-8") as f:
data = yaml.safe_load(f)
return DictObject(**data)
class SkillkitWrapper:
def __init__(self, user_skillsroot, sys_skillsroot=None):
self.client = SkillManager(project_skill_dir=user_skillsroot,
anthropic_config_dir=sys_skillsroot)
self.client.discover()
self.schemas = {}
def list_skills(self):
return self.client.list_skills()
def load_skill(self, skill_name):
skill = self.client.load_skill(skill_name)
schemaspath = skill.base_directory / 'schemas.yaml'
if schemaspath.exists():
if not self.schemas.get(skill_name):
data = load_schemas(schemaspath)
self.schemas[skill_name] = data
return skill
def get_script_schema(self, skill_name, script_name):
skill = self.load_skill(skill_name)
d = self.schemas.get(skill_name)
if not d:
# debug(f'{skill_name=}, {self.schemas=} ,has not schemas.yaml')
return None
return d.scripts.get(script_name)
def get_script_params(self, skill_name, script_name):
m = self.get_script_schema(skill_name, script_name)
if not m:
return []
return m.inputs
def get_skill_scripts(self, skill_name):
skill = self.load_skill(skill_name)
return skill.scripts
def execute_skill_script(self, skill_name, script_name, args={}):
return self.client.execute_skill_script(
skill_name=skill_name,
script_name=script_name,
arguments=args
)
def invoke_skill(self, skill_name: str, script_name: str, params: dict):
return self.client.invoke_skill(skill_nmae, params)