53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
"""Skill schemas for AGI skill library and compilation."""
|
|
|
|
from datetime import datetime, timezone
|
|
from enum import Enum
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel, Field, field_validator
|
|
|
|
|
|
def _utc_now() -> datetime:
|
|
return datetime.now(timezone.utc)
|
|
|
|
|
|
class SkillKind(str, Enum):
|
|
"""Type of skill."""
|
|
|
|
WORKFLOW = "workflow"
|
|
PROCEDURE = "procedure"
|
|
TOOL_NATIVE = "tool_native"
|
|
COMPOSITE = "composite"
|
|
|
|
|
|
class Skill(BaseModel):
|
|
"""Reusable skill: declarative description + executable steps."""
|
|
|
|
skill_id: str = Field(..., min_length=1)
|
|
name: str = Field(..., min_length=1)
|
|
description: str = Field(default="")
|
|
kind: SkillKind = Field(default=SkillKind.WORKFLOW)
|
|
steps: list[dict[str, Any]] = Field(default_factory=list, description="Declarative steps (plan-like)")
|
|
tool_names: list[str] = Field(default_factory=list, description="Tools this skill uses")
|
|
version: int = Field(default=1, ge=1)
|
|
metadata: dict[str, Any] = Field(default_factory=dict)
|
|
created_at: datetime = Field(default_factory=_utc_now)
|
|
|
|
@field_validator("skill_id", "name")
|
|
@classmethod
|
|
def validate_non_whitespace(cls, v: str) -> str:
|
|
if not v.strip():
|
|
raise ValueError("Field cannot be empty or whitespace")
|
|
return v
|
|
|
|
|
|
class SkillVersionInfo(BaseModel):
|
|
"""Version and performance tracking for a skill."""
|
|
|
|
skill_id: str = Field(..., min_length=1)
|
|
version: int = Field(..., ge=1)
|
|
success_count: int = Field(default=0, ge=0)
|
|
failure_count: int = Field(default=0, ge=0)
|
|
last_success_at: datetime | None = Field(default=None)
|
|
regression_test_ids: list[str] = Field(default_factory=list)
|