55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
"""Skill 能力包 API(/tools/skills,skills-design §6)。"""
|
||
|
||
from fastapi import APIRouter, Query, status
|
||
|
||
from app.schemas.skills import (
|
||
CreateSkillRequest,
|
||
SkillResponse,
|
||
UpdateSkillRequest,
|
||
)
|
||
from app.services import skills as skills_service
|
||
|
||
router = APIRouter(prefix="/tools/skills", tags=["skills"])
|
||
|
||
|
||
@router.post("", response_model=SkillResponse, status_code=status.HTTP_201_CREATED)
|
||
async def create_skill(payload: CreateSkillRequest) -> SkillResponse:
|
||
"""注册 Skill 能力包(name 唯一)。"""
|
||
return await skills_service.create_skill(
|
||
name=payload.name,
|
||
description=payload.description,
|
||
trigger=payload.trigger,
|
||
prompt_fragment=payload.prompt_fragment,
|
||
tool_bindings=payload.tool_bindings,
|
||
risk_level=payload.risk_level,
|
||
status=payload.status,
|
||
)
|
||
|
||
|
||
@router.get("", response_model=list[SkillResponse])
|
||
async def list_skills(
|
||
status: str | None = Query(default=None, description="按状态过滤:enabled/disabled"),
|
||
) -> list[SkillResponse]:
|
||
"""列举 Skill(可按 status 过滤)。"""
|
||
return await skills_service.list_skills(status=status)
|
||
|
||
|
||
@router.patch("/{skill_id}", response_model=SkillResponse)
|
||
async def update_skill(skill_id: str, payload: UpdateSkillRequest) -> SkillResponse:
|
||
"""更新 / 启用 / 禁用 Skill。"""
|
||
return await skills_service.update_skill(
|
||
skill_id,
|
||
description=payload.description,
|
||
trigger=payload.trigger,
|
||
prompt_fragment=payload.prompt_fragment,
|
||
tool_bindings=payload.tool_bindings,
|
||
risk_level=payload.risk_level,
|
||
status=payload.status,
|
||
)
|
||
|
||
|
||
@router.delete("/{skill_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||
async def delete_skill(skill_id: str) -> None:
|
||
"""删除 Skill。"""
|
||
await skills_service.delete_skill(skill_id)
|