1. Add the "Skills" module; 2. The loading of the model square has been modified to be controlled through environment variables; 3. Dynamic scheduling of the skill binding tool; 4. Agent Integration Skills
112 lines
3.0 KiB
Python
112 lines
3.0 KiB
Python
"""Skill Repository"""
|
|
from typing import List, Optional, Tuple, Any
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy import and_, or_
|
|
import uuid
|
|
|
|
from app.models.skill_model import Skill
|
|
from app.schemas.skill_schema import SkillCreate, SkillUpdate
|
|
|
|
|
|
class SkillRepository:
|
|
"""Skill 数据访问层"""
|
|
|
|
@staticmethod
|
|
def create(db: Session, data: SkillCreate, tenant_id: uuid.UUID) -> Skill:
|
|
"""创建技能"""
|
|
skill = Skill(
|
|
**data.model_dump(),
|
|
tenant_id=tenant_id
|
|
)
|
|
db.add(skill)
|
|
db.flush()
|
|
return skill
|
|
|
|
@staticmethod
|
|
def get_by_id(db: Session, skill_id: uuid.UUID, tenant_id: Optional[uuid.UUID] = None) -> Optional[Skill]:
|
|
"""根据ID获取技能"""
|
|
query = db.query(Skill).filter(Skill.id == skill_id)
|
|
if tenant_id:
|
|
query = query.filter(
|
|
or_(
|
|
Skill.tenant_id == tenant_id,
|
|
Skill.is_public == True
|
|
)
|
|
)
|
|
return query.first()
|
|
|
|
@staticmethod
|
|
def list_skills(
|
|
db: Session,
|
|
tenant_id: uuid.UUID,
|
|
search: Optional[str] = None,
|
|
is_active: Optional[bool] = None,
|
|
is_public: Optional[bool] = None,
|
|
page: int = 1,
|
|
pagesize: int = 10
|
|
) -> tuple[list[type[Skill]], int]:
|
|
"""列出技能"""
|
|
filters = [
|
|
or_(
|
|
Skill.tenant_id == tenant_id,
|
|
Skill.is_public == True
|
|
)
|
|
]
|
|
|
|
if search:
|
|
filters.append(
|
|
or_(
|
|
Skill.name.ilike(f"%{search}%"),
|
|
# Skill.description.ilike(f"%{search}%")
|
|
)
|
|
)
|
|
|
|
if is_active is not None:
|
|
filters.append(Skill.is_active == is_active)
|
|
|
|
if is_public is not None:
|
|
filters.append(Skill.is_public == is_public)
|
|
|
|
query = db.query(Skill).filter(and_(*filters))
|
|
total = query.count()
|
|
|
|
skills = query.order_by(Skill.created_at.desc()).offset(
|
|
(page - 1) * pagesize
|
|
).limit(pagesize).all()
|
|
|
|
return skills, total
|
|
|
|
@staticmethod
|
|
def update(db: Session, skill_id: uuid.UUID, data: SkillUpdate, tenant_id: uuid.UUID) -> Optional[Skill]:
|
|
"""更新技能"""
|
|
skill = db.query(Skill).filter(
|
|
Skill.id == skill_id,
|
|
Skill.tenant_id == tenant_id
|
|
).first()
|
|
|
|
if not skill:
|
|
return None
|
|
|
|
update_data = data.model_dump(exclude_unset=True)
|
|
for key, value in update_data.items():
|
|
setattr(skill, key, value)
|
|
|
|
db.flush()
|
|
return skill
|
|
|
|
@staticmethod
|
|
def delete(db: Session, skill_id: uuid.UUID, tenant_id: uuid.UUID) -> bool:
|
|
"""删除技能"""
|
|
skill = db.query(Skill).filter(
|
|
Skill.id == skill_id,
|
|
Skill.tenant_id == tenant_id
|
|
).first()
|
|
|
|
if not skill:
|
|
return False
|
|
|
|
# db.delete(skill)
|
|
skill.is_active = False
|
|
db.flush()
|
|
return True
|