98 lines
3.0 KiB
Python
98 lines
3.0 KiB
Python
from fastapi import APIRouter, Depends, HTTPException
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from database import get_db
|
|
from models.ai_model import AiModel
|
|
from schemas.schemas import AiModelCreate, AiModelUpdate, Response
|
|
from services.security import decrypt_text, encrypt_text, mask_secret
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
def _serialize_model(model: AiModel) -> dict:
|
|
api_key = decrypt_text(model.api_key_encrypted)
|
|
return {
|
|
"id": model.id,
|
|
"name": model.name,
|
|
"provider": model.provider,
|
|
"api_format": model.api_format,
|
|
"api_endpoint": model.api_endpoint,
|
|
"api_key_preview": mask_secret(api_key),
|
|
"status": model.status,
|
|
"created_at": model.created_at,
|
|
}
|
|
|
|
|
|
@router.get("")
|
|
async def list_models(db: AsyncSession = Depends(get_db)):
|
|
result = await db.execute(select(AiModel).order_by(AiModel.id.desc()))
|
|
items = [_serialize_model(item) for item in result.scalars().all()]
|
|
return Response(data=items)
|
|
|
|
|
|
@router.post("")
|
|
async def create_model(body: AiModelCreate, db: AsyncSession = Depends(get_db)):
|
|
model = AiModel(
|
|
name=body.name,
|
|
provider=body.provider,
|
|
api_format=body.api_format,
|
|
api_endpoint=body.api_endpoint,
|
|
api_key_encrypted=encrypt_text(body.api_key),
|
|
status=body.status,
|
|
)
|
|
db.add(model)
|
|
await db.commit()
|
|
await db.refresh(model)
|
|
return Response(data=_serialize_model(model))
|
|
|
|
|
|
@router.put("/{model_id}")
|
|
async def update_model(model_id: int, body: AiModelUpdate, db: AsyncSession = Depends(get_db)):
|
|
model = await db.get(AiModel, model_id)
|
|
if model is None:
|
|
raise HTTPException(status_code=404, detail="模型不存在")
|
|
|
|
if body.name is not None:
|
|
model.name = body.name
|
|
if body.provider is not None:
|
|
model.provider = body.provider
|
|
if body.api_format is not None:
|
|
model.api_format = body.api_format
|
|
if body.api_endpoint is not None:
|
|
model.api_endpoint = body.api_endpoint
|
|
if body.status is not None:
|
|
model.status = body.status
|
|
if body.api_key:
|
|
model.api_key_encrypted = encrypt_text(body.api_key)
|
|
|
|
await db.commit()
|
|
await db.refresh(model)
|
|
return Response(data=_serialize_model(model))
|
|
|
|
|
|
@router.delete("/{model_id}")
|
|
async def delete_model(model_id: int, db: AsyncSession = Depends(get_db)):
|
|
model = await db.get(AiModel, model_id)
|
|
if model is None:
|
|
raise HTTPException(status_code=404, detail="模型不存在")
|
|
|
|
await db.delete(model)
|
|
await db.commit()
|
|
return Response(data={"id": model_id})
|
|
|
|
|
|
@router.post("/{model_id}/test")
|
|
async def test_model(model_id: int, db: AsyncSession = Depends(get_db)):
|
|
model = await db.get(AiModel, model_id)
|
|
if model is None:
|
|
raise HTTPException(status_code=404, detail="模型不存在")
|
|
|
|
return Response(
|
|
data={
|
|
"id": model.id,
|
|
"success": True,
|
|
"message": f"模型 {model.name} 配置校验通过(当前为本地模拟测试)",
|
|
}
|
|
)
|