Skip to content
20 changes: 20 additions & 0 deletions openhands-sdk/openhands/sdk/context/skills/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
from openhands.sdk.context.skills.exceptions import SkillValidationError
from openhands.sdk.context.skills.skill import (
RESOURCE_DIRECTORIES,
Skill,
SkillResources,
discover_skill_resources,
expand_mcp_variables,
find_mcp_config,
find_skill_md,
load_mcp_config,
load_project_skills,
load_public_skills,
load_skills_from_dir,
load_user_skills,
to_prompt,
validate_skill,
validate_skill_name,
)
from openhands.sdk.context.skills.trigger import (
BaseTrigger,
Expand All @@ -16,6 +26,7 @@

__all__ = [
"Skill",
"SkillResources",
"BaseTrigger",
"KeywordTrigger",
"TaskTrigger",
Expand All @@ -25,4 +36,13 @@
"load_project_skills",
"load_public_skills",
"SkillValidationError",
"find_skill_md",
"validate_skill_name",
"validate_skill",
"find_mcp_config",
"load_mcp_config",
"expand_mcp_variables",
"discover_skill_resources",
"RESOURCE_DIRECTORIES",
"to_prompt",
]
12 changes: 11 additions & 1 deletion openhands-sdk/openhands/sdk/context/skills/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,15 @@ class SkillError(Exception):
class SkillValidationError(SkillError):
"""Raised when there's a validation error in skill metadata."""

def __init__(self, message: str = "Skill validation failed") -> None:
def __init__(
self,
message: str = "Skill validation failed",
errors: list[str] | None = None,
) -> None:
super().__init__(message)
self.errors = errors or []

def __str__(self) -> str:
if self.errors:
return f"{self.args[0]}: {'; '.join(self.errors)}"
return str(self.args[0])
Loading
Loading