Files
loom/backend/app/api/v1/skills.py
T
2026-04-24 17:46:03 +08:00

105 lines
3.3 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, Depends, Query
from app.core.deps import CurrentUser, DbDep, require_perm
from app.core.exceptions import ok
from app.schemas.skill import (
SkillCallLogRead,
SkillCreate,
SkillTestRequest,
SkillUpdate,
)
from app.services import skill_service
router = APIRouter(prefix="/skills", tags=["skill"])
@router.get("", dependencies=[Depends(require_perm("skill:view"))])
async def list_skills(
db: DbDep,
page: int = Query(1, ge=1),
size: int = Query(20, ge=1, le=200),
keyword: str | None = None,
executor_type: str | None = None,
category: str | None = None,
) -> dict:
rows, total = await skill_service.paginate(db, page, size, keyword, executor_type, category)
return ok({
"list": [skill_service.to_read(s).model_dump() for s in rows],
"total": total,
"page": page,
"size": size,
})
@router.get("/{sid}", dependencies=[Depends(require_perm("skill:view"))])
async def get_skill(sid: int, db: DbDep) -> dict:
s = await skill_service.get(db, sid)
return ok(skill_service.to_read(s).model_dump())
@router.post("", dependencies=[Depends(require_perm("skill:create"))])
async def create_skill(data: SkillCreate, db: DbDep) -> dict:
s = await skill_service.create(db, data)
return ok(skill_service.to_read(s).model_dump())
@router.patch("/{sid}", dependencies=[Depends(require_perm("skill:update"))])
async def update_skill(sid: int, data: SkillUpdate, db: DbDep) -> dict:
s = await skill_service.update(db, sid, data)
return ok(skill_service.to_read(s).model_dump())
@router.delete("/{sid}", dependencies=[Depends(require_perm("skill:delete"))])
async def delete_skill(sid: int, db: DbDep) -> dict:
await skill_service.delete(db, sid)
return ok()
@router.post("/{sid}/test", dependencies=[Depends(require_perm("skill:test"))])
async def test_skill(sid: int, body: SkillTestRequest, db: DbDep, user: CurrentUser) -> dict:
log = await skill_service.test_skill(db, sid, body.input_data, body.product_id, user)
return ok(_log_to_dict(log))
def _log_to_dict(log) -> dict:
return {
"id": log.id,
"skill_id": log.skill_id,
"skill_code": log.skill_code,
"operator_id": log.operator_id,
"operator_name": log.operator_name,
"executor_type": log.executor_type,
"product_id": log.product_id,
"input_data": log.input_data,
"output_data": log.output_data,
"result": log.result,
"message": log.message,
"cost_ms": log.cost_ms,
"source": log.source,
"created_at": log.created_at.isoformat() if log.created_at else None,
}
# Skill 调用日志
log_router = APIRouter(prefix="/skill-logs", tags=["skill-log"])
@log_router.get("", dependencies=[Depends(require_perm("skill:log:view"))])
async def list_skill_logs(
db: DbDep,
page: int = Query(1, ge=1),
size: int = Query(20, ge=1, le=200),
skill_id: int | None = None,
result: str | None = None,
source: str | None = None,
) -> dict:
rows, total = await skill_service.paginate_logs(db, page, size, skill_id, result, source)
return ok({
"list": [_log_to_dict(r) for r in rows],
"total": total,
"page": page,
"size": size,
})