feat: route background ai workloads by model

This commit is contained in:
2026-07-31 17:25:16 +08:00
parent 0008903e8d
commit da313f88ed
22 changed files with 714 additions and 63 deletions

View File

@@ -19,6 +19,7 @@ from app.models.knowledge import Knowledge
from app.schemas.admin import (
AgentDebugRequest,
AgentRuntimeConfigSaveRequest,
DefaultModelRequest,
EnableModelRequest,
ModelSaveRequest,
PromptSaveRequest,
@@ -246,7 +247,13 @@ def save_agent_runtime_config(
@router.get("/model/list")
def list_models(db: Session = Depends(get_db), current_admin: Admin = Depends(get_current_admin)) -> dict:
models = db.scalars(select(ModelConfig).order_by(ModelConfig.id.desc())).all()
models = db.scalars(
select(ModelConfig).order_by(
ModelConfig.is_default.desc(),
ModelConfig.enabled.desc(),
ModelConfig.id.desc(),
)
).all()
return api_success([_model_dict(model) for model in models])
@@ -289,6 +296,7 @@ def create_model(
allow_fixed_info=payload.allowFixedInfo,
allow_deep_chat=payload.allowDeepChat,
enabled=0,
is_default=0,
)
db.add(model)
db.flush()
@@ -351,14 +359,46 @@ def enable_model(
payload: EnableModelRequest,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin),
) -> dict:
target = db.get(ModelConfig, payload.modelId)
if target is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="模型不存在")
if payload.enabled == 0 and target.is_default == 1:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="默认主模型不能直接停用,请先设置另一个默认主模型",
)
target.enabled = payload.enabled
if payload.enabled == 1 and _explicit_default_model(db) is None:
target.is_default = 1
db.add(target)
action = "enable" if payload.enabled == 1 else "disable"
OperationLogService.write(db, admin_id=current_admin.id, module="model", action=action, target_id=target.id)
db.commit()
return api_success()
@router.post("/model/default")
def set_default_model(
payload: DefaultModelRequest,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin),
) -> dict:
target = db.get(ModelConfig, payload.modelId)
if target is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="模型不存在")
for model in db.scalars(select(ModelConfig)).all():
model.enabled = 1 if model.id == target.id else 0
model.is_default = 1 if model.id == target.id else 0
if model.id == target.id:
model.enabled = 1
db.add(model)
OperationLogService.write(db, admin_id=current_admin.id, module="model", action="enable", target_id=target.id)
OperationLogService.write(
db,
admin_id=current_admin.id,
module="model",
action="set_default",
target_id=target.id,
)
db.commit()
return api_success()
@@ -372,6 +412,11 @@ def delete_model(
model = db.get(ModelConfig, model_id)
if model is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="模型不存在")
if model.is_default == 1:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="不能删除默认主模型,请先设置另一个默认主模型",
)
db.delete(model)
OperationLogService.write(db, admin_id=current_admin.id, module="model", action="delete", target_id=model.id)
db.commit()
@@ -449,6 +494,7 @@ def _model_dict(model: ModelConfig) -> dict:
"remark": model.remark,
"timeoutSecond": model.timeout_second,
"enabled": model.enabled,
"isDefault": model.is_default,
"inputPricePer1k": float(model.input_price_per_1k) if model.input_price_per_1k is not None else None,
"outputPricePer1k": float(model.output_price_per_1k) if model.output_price_per_1k is not None else None,
"currency": model.currency,
@@ -461,9 +507,13 @@ def _model_dict(model: ModelConfig) -> dict:
def _enabled_model(db: Session) -> ModelConfig | None:
return ModelClientService._get_enabled_model(db)
def _explicit_default_model(db: Session) -> ModelConfig | None:
return db.scalar(
select(ModelConfig)
.where(ModelConfig.enabled == 1)
.where(ModelConfig.enabled == 1, ModelConfig.is_default == 1)
.order_by(ModelConfig.id.desc())
.limit(1)
)