feat: 后台管理增加提供商动态管理功能
- 新增:添加新的大模型接口提供商 - 新增:编辑已有提供商的参数(API地址、Key、模型列表等) - 新增:删除提供商 - 新增:拖拽排序调整auto模式的优先级顺序 - 新增:启用/禁用提供商开关 - 优化:主服务动态读取配置,后台修改实时生效
This commit is contained in:
@@ -1,12 +1,19 @@
|
||||
"""
|
||||
大模型API中转系统配置
|
||||
大模型API中转系统配置 - 支持动态修改
|
||||
"""
|
||||
|
||||
# 上游模型配置(按优先级排序,从高到低)
|
||||
UPSTREAM_PROVIDERS = [
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
# 配置文件路径
|
||||
CONFIG_FILE = Path(__file__).parent.parent / 'data' / 'config.json'
|
||||
|
||||
# 默认上游模型配置
|
||||
DEFAULT_PROVIDERS = [
|
||||
{
|
||||
"name": "local-qwen",
|
||||
"priority": 1, # 数字越小优先级越高
|
||||
"id": "local-qwen",
|
||||
"name": "Local Qwen",
|
||||
"priority": 1,
|
||||
"base_url": "http://192.168.2.5:1234/v1",
|
||||
"api_key": "sk-lm-fuP5tGU8:Hi7YU87jHyDP6Ay8Tl2j",
|
||||
"models": ["qwen3.5-4b", "qwen3.5", "qwen"],
|
||||
@@ -15,7 +22,8 @@ UPSTREAM_PROVIDERS = [
|
||||
"enabled": True,
|
||||
},
|
||||
{
|
||||
"name": "siliconflow-deepseek",
|
||||
"id": "siliconflow-deepseek",
|
||||
"name": "SiliconFlow DeepSeek",
|
||||
"priority": 2,
|
||||
"base_url": "https://api.siliconflow.cn/v1",
|
||||
"api_key": "sk-fhpoexpptvjghpnphtaxbkhjwulzovoqfffbckcfscjmwhcg",
|
||||
@@ -26,22 +34,118 @@ UPSTREAM_PROVIDERS = [
|
||||
},
|
||||
]
|
||||
|
||||
# 模型别名映射
|
||||
MODEL_ALIASES = {
|
||||
# auto 自动选择可用模型
|
||||
# 默认模型别名
|
||||
DEFAULT_MODEL_ALIASES = {
|
||||
"auto": "auto",
|
||||
|
||||
# Qwen别名
|
||||
"qwen": "qwen3.5-4b",
|
||||
"qwen3.5": "qwen3.5-4b",
|
||||
"qwen3.5-4b": "qwen3.5-4b",
|
||||
|
||||
# DeepSeek别名
|
||||
"deepseek": "Pro/deepseek-ai/DeepSeek-V3.2",
|
||||
"deepseek-v3": "Pro/deepseek-ai/DeepSeek-V3.2",
|
||||
"deepseek-v3.2": "Pro/deepseek-ai/DeepSeek-V3.2",
|
||||
}
|
||||
|
||||
def load_config():
|
||||
"""加载配置"""
|
||||
if CONFIG_FILE.exists():
|
||||
try:
|
||||
data = json.loads(CONFIG_FILE.read_text(encoding='utf-8'))
|
||||
return data
|
||||
except:
|
||||
pass
|
||||
return {
|
||||
"providers": DEFAULT_PROVIDERS,
|
||||
"model_aliases": DEFAULT_MODEL_ALIASES,
|
||||
}
|
||||
|
||||
def save_config(config):
|
||||
"""保存配置"""
|
||||
CONFIG_FILE.parent.mkdir(parents=True, exist_ok=True)
|
||||
CONFIG_FILE.write_text(json.dumps(config, ensure_ascii=False, indent=2), encoding='utf-8')
|
||||
|
||||
def get_providers():
|
||||
"""获取提供商列表"""
|
||||
config = load_config()
|
||||
return config.get("providers", DEFAULT_PROVIDERS)
|
||||
|
||||
def get_provider(provider_id):
|
||||
"""获取单个提供商"""
|
||||
providers = get_providers()
|
||||
for p in providers:
|
||||
if p.get("id") == provider_id:
|
||||
return p
|
||||
return None
|
||||
|
||||
def add_provider(provider):
|
||||
"""添加提供商"""
|
||||
config = load_config()
|
||||
providers = config.get("providers", [])
|
||||
|
||||
# 生成ID
|
||||
if not provider.get("id"):
|
||||
provider["id"] = provider["name"].lower().replace(" ", "-").replace(".", "-")
|
||||
|
||||
providers.append(provider)
|
||||
config["providers"] = providers
|
||||
save_config(config)
|
||||
return provider
|
||||
|
||||
def update_provider(provider_id, data):
|
||||
"""更新提供商"""
|
||||
config = load_config()
|
||||
providers = config.get("providers", [])
|
||||
|
||||
for i, p in enumerate(providers):
|
||||
if p.get("id") == provider_id:
|
||||
providers[i] = {**p, **data}
|
||||
config["providers"] = providers
|
||||
save_config(config)
|
||||
return providers[i]
|
||||
return None
|
||||
|
||||
def delete_provider(provider_id):
|
||||
"""删除提供商"""
|
||||
config = load_config()
|
||||
providers = config.get("providers", [])
|
||||
providers = [p for p in providers if p.get("id") != provider_id]
|
||||
config["providers"] = providers
|
||||
save_config(config)
|
||||
return True
|
||||
|
||||
def update_priority(provider_ids):
|
||||
"""更新优先级顺序"""
|
||||
config = load_config()
|
||||
providers = config.get("providers", [])
|
||||
|
||||
# 按新顺序设置优先级
|
||||
for i, pid in enumerate(provider_ids):
|
||||
for p in providers:
|
||||
if p.get("id") == pid:
|
||||
p["priority"] = i + 1
|
||||
|
||||
config["providers"] = providers
|
||||
save_config(config)
|
||||
return providers
|
||||
|
||||
def get_model_aliases():
|
||||
"""获取模型别名"""
|
||||
config = load_config()
|
||||
return config.get("model_aliases", DEFAULT_MODEL_ALIASES)
|
||||
|
||||
def update_model_alias(alias, target):
|
||||
"""更新模型别名"""
|
||||
config = load_config()
|
||||
aliases = config.get("model_aliases", {})
|
||||
aliases[alias] = target
|
||||
config["model_aliases"] = aliases
|
||||
save_config(config)
|
||||
return aliases
|
||||
|
||||
# 初始化配置
|
||||
config = load_config()
|
||||
UPSTREAM_PROVIDERS = config.get("providers", DEFAULT_PROVIDERS)
|
||||
MODEL_ALIASES = config.get("model_aliases", DEFAULT_MODEL_ALIASES)
|
||||
|
||||
# 服务配置
|
||||
SERVER_CONFIG = {
|
||||
"host": "0.0.0.0",
|
||||
@@ -59,18 +163,11 @@ LOG_CONFIG = {
|
||||
# 重试配置
|
||||
RETRY_CONFIG = {
|
||||
"max_retries": 3,
|
||||
"retry_delay": 1, # 秒
|
||||
"retry_delay": 1,
|
||||
"retry_on_errors": [
|
||||
"connection_error",
|
||||
"timeout",
|
||||
"rate_limit",
|
||||
"server_error",
|
||||
],
|
||||
}
|
||||
|
||||
# 健康检查配置
|
||||
HEALTH_CHECK = {
|
||||
"enabled": True,
|
||||
"interval": 60, # 秒
|
||||
"timeout": 10,
|
||||
}
|
||||
Reference in New Issue
Block a user