Complete admin model management

This commit is contained in:
2026-07-07 12:58:26 +08:00
parent 08c301c136
commit 55b7c5b0ea
12 changed files with 859 additions and 40 deletions

View File

@@ -11,6 +11,7 @@ from app.models.admin import Admin
from app.models.ai_config import ModelConfig, Prompt, SystemConfig
from app.schemas.admin import EnableModelRequest, ModelSaveRequest, PromptSaveRequest, SystemConfigSaveRequest
from app.services.admin_service import OperationLogService
from app.services.model_service import ModelClientService
router = APIRouter()
@@ -59,13 +60,29 @@ def create_model(
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin),
) -> dict:
if not payload.apiKey:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="API Key 不能为空")
model = ModelConfig(
provider=payload.provider,
display_name=payload.displayName,
api_type=payload.apiType,
model_name=payload.modelName,
base_url=payload.baseUrl,
api_url=payload.apiUrl,
api_key=payload.apiKey,
auth_type=payload.authType,
api_version=payload.apiVersion,
temperature=payload.temperature,
top_p=payload.topP,
top_k=payload.topK,
presence_penalty=payload.presencePenalty,
frequency_penalty=payload.frequencyPenalty,
max_token=payload.maxToken,
context_window=payload.contextWindow,
stream_enabled=payload.streamEnabled,
response_format=payload.responseFormat,
extra_params=payload.extraParams,
remark=payload.remark,
timeout_second=payload.timeoutSecond,
enabled=0,
)
@@ -77,6 +94,46 @@ def create_model(
return api_success(_model_dict(model))
@router.put("/model/{model_id}")
def update_model(
model_id: int,
payload: ModelSaveRequest,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin),
) -> dict:
model = db.get(ModelConfig, model_id)
if model is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="模型不存在")
model.provider = payload.provider
model.display_name = payload.displayName
model.api_type = payload.apiType
model.model_name = payload.modelName
model.base_url = payload.baseUrl
model.api_url = payload.apiUrl
if payload.apiKey:
model.api_key = payload.apiKey
model.auth_type = payload.authType
model.api_version = payload.apiVersion
model.temperature = payload.temperature
model.top_p = payload.topP
model.top_k = payload.topK
model.presence_penalty = payload.presencePenalty
model.frequency_penalty = payload.frequencyPenalty
model.max_token = payload.maxToken
model.context_window = payload.contextWindow
model.stream_enabled = payload.streamEnabled
model.response_format = payload.responseFormat
model.extra_params = payload.extraParams
model.remark = payload.remark
model.timeout_second = payload.timeoutSecond
db.add(model)
OperationLogService.write(db, admin_id=current_admin.id, module="model", action="update", target_id=model.id)
db.commit()
db.refresh(model)
return api_success(_model_dict(model))
@router.post("/model/enable")
def enable_model(
payload: EnableModelRequest,
@@ -109,6 +166,21 @@ def delete_model(
return api_success()
@router.post("/model/{model_id}/test")
def test_model(
model_id: int,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin),
) -> dict:
model = db.get(ModelConfig, model_id)
if model is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="模型不存在")
result = ModelClientService.test_model(model)
OperationLogService.write(db, admin_id=current_admin.id, module="model", action="test", target_id=model.id)
db.commit()
return api_success(result)
@router.get("/config")
def list_config(db: Session = Depends(get_db), current_admin: Admin = Depends(get_current_admin)) -> dict:
configs = db.scalars(select(SystemConfig).order_by(SystemConfig.config_key.asc())).all()
@@ -139,11 +211,25 @@ def _model_dict(model: ModelConfig) -> dict:
return {
"id": model.id,
"provider": model.provider,
"displayName": model.display_name,
"apiType": model.api_type,
"modelName": model.model_name,
"baseUrl": model.base_url,
"apiUrl": model.api_url,
"apiKeyMasked": "******" if model.api_key else "",
"authType": model.auth_type,
"apiVersion": model.api_version,
"temperature": float(model.temperature) if model.temperature is not None else None,
"topP": float(model.top_p) if model.top_p is not None else None,
"topK": model.top_k,
"presencePenalty": float(model.presence_penalty) if model.presence_penalty is not None else None,
"frequencyPenalty": float(model.frequency_penalty) if model.frequency_penalty is not None else None,
"maxToken": model.max_token,
"contextWindow": model.context_window,
"streamEnabled": model.stream_enabled,
"responseFormat": model.response_format,
"extraParams": model.extra_params,
"remark": model.remark,
"timeoutSecond": model.timeout_second,
"enabled": model.enabled,
}