| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- # -*- 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}」,下次请求生效",
- }
|