# -*- coding: utf-8 -*- """ 模型管理 API —— 支持前端动态切换 LLM 模型版本 端点: - GET /api/model 获取当前模型和可用模型列表 - POST /api/model/switch 切换运行时模型 """ from fastapi import APIRouter from pydantic import BaseModel, Field from api.model_config import ( get_current_model, set_current_model, get_available_models, get_thinking_level, set_thinking_level, get_available_thinking_levels, invalidate_model_cache, ) router = APIRouter(prefix="/model", tags=["模型管理"]) # ── 请求模型 ── class ModelSwitchRequest(BaseModel): """模型切换请求""" model: str = Field(..., description="模型名称", examples=["deepseek-v4-pro", "deepseek-v4-flash"]) class ThinkingSwitchRequest(BaseModel): """思考级别切换请求""" level: str = Field(..., description="思考级别", examples=["off", "high", "highest"]) # ── GET /api/model ── @router.get("") async def get_model_info(): """获取当前模型、思考级别和可用列表。""" return { "current": get_current_model(), "available": get_available_models(), "thinking_level": get_thinking_level(), "thinking_levels": get_available_thinking_levels(), } # ── POST /api/model/switch ── @router.post("/switch") async def switch_model(req: ModelSwitchRequest): """切换运行时模型。 切换后会自动失效所有 chat_routes 下智能体的 Agent 缓存, 下次请求时将使用新模型重新创建 Agent。 注意:仅影响对话解读 / 配风计划审查智能体, click_routes 下的点选解读智能体不受影响。 """ model_name = req.model.strip() if model_name not in get_available_models(): return { "error": f"不支持的模型: {model_name}", "available": get_available_models(), } # 1. 更新运行时模型配置 set_current_model(model_name) # 2. 失效模型实例缓存 invalidate_model_cache() # 3. 失效所有受影响的 Agent 单例缓存 try: from agents.vent_agent import invalidate_dialog_cache invalidate_dialog_cache() except Exception as e: print(f"[模型切换] 失效 dialog_agent 缓存失败: {e}") try: from agents.review_agent import invalidate_cache invalidate_cache() except Exception as e: print(f"[模型切换] 失效 review_agent 缓存失败: {e}") print(f"[模型切换] 已切换到 {model_name},所有受影响的 Agent 缓存已失效") return { "current": get_current_model(), "message": f"已切换到 {model_name},下次请求生效", } # ── POST /api/model/thinking ── @router.post("/thinking") async def switch_thinking(req: ThinkingSwitchRequest): """切换思考级别。 切换后会自动失效所有 chat_routes 下智能体的 Agent 缓存, 下次请求时将使用新思考级别重新创建模型实例。 """ level = req.level.strip().lower() if level not in get_available_thinking_levels(): return { "error": f"不支持的思考级别: {level}", "available": get_available_thinking_levels(), } # 1. 更新思考级别(内部已清除模型实例缓存) try: set_thinking_level(level) except ValueError as e: return {"error": str(e), "available": get_available_thinking_levels()} # 2. 失效所有受影响的 Agent 单例缓存 try: from agents.vent_agent import invalidate_dialog_cache invalidate_dialog_cache() except Exception as e: print(f"[思考切换] 失效 dialog_agent 缓存失败: {e}") try: from agents.review_agent import invalidate_cache invalidate_cache() except Exception as e: print(f"[思考切换] 失效 review_agent 缓存失败: {e}") print(f"[思考切换] 已切换到 {level},所有受影响的 Agent 缓存已失效") return { "thinking_level": get_thinking_level(), "message": f"思考级别已切换为「{level}」,下次请求生效", }