v2.1.1: Auto配置改为模型粒度拖动排序 + 历史缓存复用 + 对话生图

- Auto配置编辑: 粒度从提供商改为具体模型, 原生HTML5拖动排序, 修复已保存模型不显示勾选(字符串/对象混拼bug)
- 历史缓存: 带历史上下文的auto请求按首条消息识别会话, 优先复用上次模型命中上游前缀缓存
  (可配置: prefer_cache_model + cache_ttl_seconds, 系统配置页开关 + /api/admin/routing)
- 对话生图: chat页选 auto-image/Qwen-Image 直接调生图接口并在对话内展示图片
- 修复: Flask模板缓存导致改模板不生效 -> TEMPLATES_AUTO_RELOAD
- 修复: 自动回退/显式有序模型列表路由, 空列表回退提供商能力选择
This commit is contained in:
2026-08-28 12:16:25 +08:00
parent 178968ba1a
commit d387d5ba09
7 changed files with 538 additions and 143 deletions
+54 -7
View File
@@ -114,59 +114,106 @@ DEFAULT_MODEL_ALIASES = {
# 默认Auto配置:每个auto配置固定绑定一个能力
# capability: 固定此auto的功能类型(取自 CAPABILITY_DEFS
# models: 有序的**具体模型**列表(按优先级,可拖动排序);为空时回退为按提供商能力选择
# providers: 候选提供商(* 表示所有启用的、且具备该能力模型的提供商)
DEFAULT_AUTO_PROFILES = {
"auto": {
"name": "默认Auto",
"description": "文本推理 - 自动选择可用提供商",
"description": "文本推理 - 按模型列表顺序自动选择",
"capability": "text",
"models": [
"unsloth/Qwen3.8-27B-Q6_K",
"unsloth/Qwen3.8-27B-Q4_K_M",
"deepseek-ai/DeepSeek-V4-Flash",
"meituan-longcat/LongCat-2.0",
"qwen3.6-plus",
"GLM-5.3-flash",
],
"providers": ["*"],
"strategy": "priority",
},
"auto-text": {
"name": "文本推理",
"description": "纯文本推理,自动选择文本模型",
"description": "纯文本推理,按模型列表顺序自动选择",
"capability": "text",
"models": [
"unsloth/Qwen3.8-27B-Q6_K",
"unsloth/Qwen3.8-27B-Q4_K_M",
"deepseek-ai/DeepSeek-V4-Flash",
"meituan-longcat/LongCat-2.0",
"qwen3.6-plus",
"GLM-5.3-flash",
],
"providers": ["*"],
"strategy": "priority",
},
"auto-vision": {
"name": "视觉能力",
"description": "多模态视觉理解,自动选择视觉模型",
"description": "多模态视觉理解,按模型列表顺序自动选择",
"capability": "vision",
"models": [
"unsloth/Qwen3.8-27B-Q6_K",
"unsloth/Qwen3.8-27B-Q4_K_M",
"qwen3.6-plus",
"GLM-5.3-flash",
],
"providers": ["*"],
"strategy": "priority",
},
"auto-image": {
"name": "图片生成",
"description": "文生图,自动选择生图模型",
"description": "文生图,按模型列表顺序自动选择",
"capability": "image_gen",
"models": ["Qwen-Image"],
"providers": ["*"],
"strategy": "priority",
},
"auto-voice-out": {
"name": "语音输出",
"description": "语音合成(TTS),自动选择语音输出模型",
"description": "语音合成(TTS)按模型列表顺序自动选择",
"capability": "audio_out",
"models": [],
"providers": ["*"],
"strategy": "priority",
},
"auto-voice-in": {
"name": "语音输入",
"description": "语音识别(ASR),自动选择语音输入模型",
"description": "语音识别(ASR)按模型列表顺序自动选择",
"capability": "audio_in",
"models": [],
"providers": ["*"],
"strategy": "priority",
},
"auto-video": {
"name": "视频生成",
"description": "文生视频,自动选择视频生成模型",
"description": "文生视频,按模型列表顺序自动选择",
"capability": "video_gen",
"models": [],
"providers": ["*"],
"strategy": "priority",
},
}
# 路由缓存配置(历史上下文优先复用上次模型,命中前缀缓存节省成本)
ROUTING_CONFIG = {
"prefer_cache_model": True, # 开启后:带历史上下文的 auto 请求优先复用上次使用的模型
"cache_ttl_seconds": 3600, # 记忆有效期(秒)
}
def load_routing_config():
"""加载路由缓存配置(运行时配置优先)"""
config = load_config()
return {**ROUTING_CONFIG, **config.get("routing_config", {})}
def save_routing_config(data):
"""保存路由缓存配置"""
config = load_config()
config["routing_config"] = {**ROUTING_CONFIG, **data}
save_config(config)
return config["routing_config"]
def load_config():
"""加载配置"""