65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
"""Skill Schema 定义"""
|
|
from typing import Optional, List, Dict, Any, Union
|
|
from pydantic import BaseModel, Field, field_serializer
|
|
import uuid
|
|
from datetime import datetime
|
|
|
|
|
|
class SkillBase(BaseModel):
|
|
"""Skill 基础 Schema"""
|
|
name: str = Field(..., description="技能名称")
|
|
description: Optional[str] = Field(None, description="技能描述")
|
|
tools: List[Dict[str, str]] = Field(default_factory=list, description="工具对象列表: [{\"tool_id\": \"xxx\", \"operation\": \"yyy\"}]")
|
|
config: Dict[str, Any] = Field(default_factory=dict, description="技能配置")
|
|
prompt: Optional[str] = Field(None, description="技能专属提示词")
|
|
is_active: bool = Field(True, description="是否激活")
|
|
is_public: bool = Field(False, description="是否公开到市场")
|
|
|
|
|
|
class SkillCreate(SkillBase):
|
|
"""创建 Skill"""
|
|
pass
|
|
|
|
|
|
class SkillUpdate(BaseModel):
|
|
"""更新 Skill"""
|
|
name: Optional[str] = None
|
|
description: Optional[str] = None
|
|
tools: Optional[List[Dict[str, str]]] = None
|
|
config: Optional[Dict[str, Any]] = None
|
|
prompt: Optional[str] = None
|
|
is_active: Optional[bool] = None
|
|
is_public: Optional[bool] = None
|
|
|
|
|
|
class Skill(BaseModel):
|
|
"""Skill 响应 Schema"""
|
|
id: uuid.UUID
|
|
tenant_id: uuid.UUID
|
|
name: str
|
|
description: Optional[str] = None
|
|
tools: Union[List[Dict[str, Any]], List[Dict[str, str]]] = Field(default_factory=list, description="工具列表,可以是简单格式或包含工具详情")
|
|
config: Dict[str, Any] = Field(default_factory=dict)
|
|
prompt: Optional[str] = None
|
|
is_active: bool = True
|
|
is_public: bool = False
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
@field_serializer('created_at', 'updated_at')
|
|
def serialize_datetime_to_timestamp(self, value: datetime) -> int:
|
|
"""(毫秒级)时间戳"""
|
|
return int(value.timestamp() * 1000)
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class SkillQuery(BaseModel):
|
|
"""Skill 查询参数"""
|
|
search: Optional[str] = None
|
|
is_active: Optional[bool] = None
|
|
is_public: Optional[bool] = None
|
|
page: int = Field(1, ge=1)
|
|
pagesize: int = Field(10, ge=1, le=100)
|