feat: add DeepSeek and Xiaomi MiMo LLM provider presets
- Add providers.py with 5 provider presets (OpenAI, DeepSeek, Xiaomi MiMo, Alibaba DashScope, MiniMax) - Add LLM_PROVIDER env var for one-line provider switching - Improve <think> tag stripping for reasoning models - Add .env.example with documented configuration - Update README with provider configuration section
This commit is contained in:
@@ -17,6 +17,47 @@ else:
|
||||
load_dotenv(override=True)
|
||||
|
||||
|
||||
def _resolve_llm_config() -> tuple[str, str, str | None]:
|
||||
"""
|
||||
解析LLM配置。
|
||||
|
||||
优先级:
|
||||
1. 如果设置了 LLM_PROVIDER,使用提供商预设填充 base_url 和 model(但可被显式值覆盖)
|
||||
2. 否则使用 LLM_BASE_URL / LLM_MODEL_NAME(兼容原有行为)
|
||||
|
||||
Returns:
|
||||
(base_url, model_name, provider_name_or_none)
|
||||
"""
|
||||
from .providers import get_provider
|
||||
|
||||
provider_name = os.environ.get('LLM_PROVIDER', '').strip()
|
||||
explicit_base_url = os.environ.get('LLM_BASE_URL', '').strip()
|
||||
explicit_model = os.environ.get('LLM_MODEL_NAME', '').strip()
|
||||
|
||||
if provider_name:
|
||||
preset = get_provider(provider_name)
|
||||
if preset is None:
|
||||
provider_names = ["openai", "deepseek", "xiaomi_mimo", "alibaba_dashscope", "minimax"]
|
||||
available = ", ".join(provider_names)
|
||||
raise ValueError(
|
||||
f"未知的 LLM_PROVIDER: '{provider_name}'. "
|
||||
f"可用值: {available}"
|
||||
)
|
||||
# 显式值优先于预设默认值
|
||||
base_url = explicit_base_url or preset.base_url
|
||||
model = explicit_model or preset.default_model
|
||||
return base_url, model, provider_name
|
||||
else:
|
||||
# 兼容原有行为:无 LLM_PROVIDER 时直接使用显式值
|
||||
base_url = explicit_base_url or 'https://api.openai.com/v1'
|
||||
model = explicit_model or 'gpt-4o-mini'
|
||||
return base_url, model, None
|
||||
|
||||
|
||||
# 在模块加载时解析配置(避免重复计算)
|
||||
_llm_base_url, _llm_model_name, _llm_provider = _resolve_llm_config()
|
||||
|
||||
|
||||
class Config:
|
||||
"""Flask配置类"""
|
||||
|
||||
@@ -29,8 +70,9 @@ class Config:
|
||||
|
||||
# LLM配置(统一使用OpenAI格式)
|
||||
LLM_API_KEY = os.environ.get('LLM_API_KEY')
|
||||
LLM_BASE_URL = os.environ.get('LLM_BASE_URL', 'https://api.openai.com/v1')
|
||||
LLM_MODEL_NAME = os.environ.get('LLM_MODEL_NAME', 'gpt-4o-mini')
|
||||
LLM_PROVIDER = _llm_provider # e.g. "deepseek" or None
|
||||
LLM_BASE_URL = _llm_base_url
|
||||
LLM_MODEL_NAME = _llm_model_name
|
||||
|
||||
# Zep配置
|
||||
ZEP_API_KEY = os.environ.get('ZEP_API_KEY')
|
||||
@@ -73,3 +115,19 @@ class Config:
|
||||
errors.append("ZEP_API_KEY 未配置")
|
||||
return errors
|
||||
|
||||
@classmethod
|
||||
def get_active_provider_info(cls) -> dict:
|
||||
"""返回当前活跃的LLM提供商信息(用于日志/API展示)"""
|
||||
from .providers import get_provider
|
||||
|
||||
info = {
|
||||
"provider": cls.LLM_PROVIDER or "custom",
|
||||
"base_url": cls.LLM_BASE_URL,
|
||||
"model": cls.LLM_MODEL_NAME,
|
||||
}
|
||||
if cls.LLM_PROVIDER:
|
||||
preset = get_provider(cls.LLM_PROVIDER)
|
||||
if preset:
|
||||
info["display_name"] = preset.display_name
|
||||
info["notes"] = preset.notes
|
||||
return info
|
||||
|
||||
Reference in New Issue
Block a user