1- from fastapi import APIRouter
2- from sqlmodel import select
1+ import json
2+ from typing import List , Union
3+ from apps .system .schemas .ai_model_schema import AiModelConfigItem , AiModelCreator , AiModelEditor , AiModelGridItem
4+ from fastapi import APIRouter , Query
5+ from sqlmodel import func , select
36
47from apps .system .models .system_model import AiModelDetail
5- from apps .system .schemas .system_schema import model_status
68from common .core .deps import SessionDep
7- from common .core .pagination import Paginator
8- from common .core .schemas import PaginatedResponse , PaginationParams
99from common .utils .time import get_timestamp
1010
1111router = APIRouter (tags = ["system/aimodel" ], prefix = "/system/aimodel" )
1212
13-
14- @router .get ("/pager/{pageNum}/{pageSize}" , response_model = PaginatedResponse [AiModelDetail ])
15- async def pager (
13+ @router .get ("" , response_model = list [AiModelGridItem ])
14+ async def query (
1615 session : SessionDep ,
17- pageNum : int ,
18- pageSize : int
16+ keyword : Union [str , None ] = Query (default = None , max_length = 255 )
1917):
20- pagination = PaginationParams (page = pageNum , size = pageSize )
21- paginator = Paginator (session )
22- filters = {}
23- return await paginator .get_paginated_response (
24- model = AiModelDetail ,
25- pagination = pagination ,
26- ** filters )
27-
18+ statement = select (AiModelDetail .id ,
19+ AiModelDetail .name ,
20+ AiModelDetail .model_type ,
21+ AiModelDetail .base_model ,
22+ AiModelDetail .supplier ,
23+ AiModelDetail .default_model )
24+ if keyword is not None :
25+ statement = statement .where (AiModelDetail .name .like (f"%{ keyword } %" ))
26+
27+ items = session .exec (statement ).all ()
28+ return items
2829
29- @router .get ("/{id}" , response_model = AiModelDetail )
30+ @router .get ("/{id}" , response_model = AiModelEditor )
3031async def get_model_by_id (
3132 session : SessionDep ,
3233 id : int
3334):
34- term = session .get (AiModelDetail , id )
35- return term
35+ db_model = session .get (AiModelDetail , id )
36+ if not db_model :
37+ raise ValueError (f"AiModelDetail with id { id } not found" )
3638
39+ config_list : List [AiModelConfigItem ] = []
40+ if db_model .config :
41+ try :
42+ raw = json .loads (db_model .config )
43+ config_list = [AiModelConfigItem (** item ) for item in raw ]
44+ except Exception :
45+ pass
46+ data = AiModelDetail .model_validate (db_model ).model_dump (exclude_unset = True )
47+ data .pop ("config" , None )
48+ data ["config_list" ] = config_list
49+ return AiModelEditor (** data )
3750
38- @router .post ("" , response_model = AiModelDetail )
51+ @router .post ("" )
3952async def add_model (
4053 session : SessionDep ,
41- creator : AiModelDetail
54+ creator : AiModelCreator
4255):
43- data = AiModelDetail .model_validate (creator )
44- data .create_time = get_timestamp ()
45- session .add (data )
56+ data = creator .model_dump (exclude_unset = True )
57+ data ["config" ] = json .dumps ([item .model_dump (exclude_unset = True ) for item in creator .config_list ])
58+ data .pop ("config_list" , None )
59+ detail = AiModelDetail .model_validate (data )
60+ detail .create_time = get_timestamp ()
61+ count = session .exec (select (func .count (AiModelDetail .id ))).one ()
62+ if count == 0 :
63+ detail .default_model = True
64+ session .add (detail )
4665 session .commit ()
47- return creator
4866
49-
50- @router .put ("" , response_model = AiModelDetail )
51- async def update_terminology (
67+ @router .put ("" )
68+ async def update_model (
5269 session : SessionDep ,
53- model : AiModelDetail
70+ editor : AiModelEditor
5471):
55- model .id = int (model .id )
56- term = session .exec (select (AiModelDetail ).where (AiModelDetail .id == model .id )).first ()
57- update_data = model .model_dump (exclude_unset = True )
58- for field , value in update_data .items ():
59- setattr (term , field , value )
60- session .add (term )
72+ id = int (editor .id )
73+ data = editor .model_dump (exclude_unset = True )
74+ data ["config" ] = json .dumps ([item .model_dump (exclude_unset = True ) for item in editor .config_list ])
75+ data .pop ("config_list" , None )
76+ db_model = session .get (AiModelDetail , id )
77+ update_data = AiModelDetail .model_validate (data )
78+ db_model .sqlmodel_update (update_data )
79+ session .add (db_model )
6180 session .commit ()
62- return model
63-
6481
65- @router .delete ("/{id}" , response_model = AiModelDetail )
66- async def delete_terminology (
82+ @router .delete ("/{id}" )
83+ async def delete_model (
6784 session : SessionDep ,
6885 id : int
6986):
70- term = session .exec (select (AiModelDetail ).where (AiModelDetail .id == id )).first ()
71- session .delete (term )
72- session .commit ()
73- return {
74- "message" : f"AiModel with ID { id } deleted successfully."
75- }
76-
77-
78- @router .patch ("/status" , response_model = dict )
79- async def status (session : SessionDep , dto : model_status ):
80- ids = dto .ids
81- status = dto .status
82- if not ids :
83- return {"message" : "ids is empty" }
84- statement = select (AiModelDetail ).where (AiModelDetail .id .in_ (ids ))
85- terms = session .exec (statement ).all ()
86- for term in terms :
87- term .status = status
88- session .add (term )
87+ item = session .get (AiModelDetail , id )
88+ session .delete (item )
8989 session .commit ()
90- return { "message" : f"AiModel with IDs { ids } updated successfully." }
90+
0 commit comments