feat: route background ai workloads by model
This commit is contained in:
@@ -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)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user