feat(api): 添加万川平台模型配置获取和同步功能 - 新增 getWanchuanModelConfig 函数,按模型编码获取平台模型配置 - 新增 syncWanchuanModelToSettings 函数,从万川平台拉取模型配置并写入后端 AI 设置 - 支持按用途分多个模型编码(generic/vision/voice)分别同步配置 - 配置失败时跳过对应字段,不影响其他模型同步 feat(settings): 重构AI模型配置界面支持多模块分组 - 将AI配置按话题分析、报告生成、视觉、语音四个模块分组展示 - 每个模块独立配置接口地址、密钥和模型名称 - 添加从万川平台获取配置的按钮和同步功能 - 优化配置状态指示和错误提示信息 refactor(config): 扩展AI配置支持独立的语音视觉报告网关 - 新增 voice_base_url/voice_api_key 配置项 - 新增 vision_base_url/vision_api_key 配置项 - 新增 summary_base_url/summary_api_key 配置项 - 留空时回退到 ai_base_url/ai_api_key 兼容单网关场景 refactor(http): 统一使用共享HTTP客户端减少连接开销 - 替换各处 httpx.AsyncClient 为 shared_client - 在 lifespan 中正确关闭共享客户端资源 - 优化 get_current_wxid 和 health 检查中的HTTP请求 refactor(ai): 按用途缓存AI客户端支持不同网关配置 - 重构 get_openai_client 支持按(base_url, api_key)缓存 - 新增 get_client_for 函数按用途获取对应客户端 - 支持语音、视觉、报告等不同用途使用独立网关和密钥 ```
64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
import os
|
||
import tempfile
|
||
from pathlib import Path
|
||
from pydantic_settings import BaseSettings
|
||
from typing import List
|
||
|
||
|
||
def _default_data_dir() -> str:
|
||
configured = os.environ.get("CHATLAB_DATA_DIR")
|
||
if configured:
|
||
return str(Path(configured).expanduser())
|
||
appdata = os.environ.get("APPDATA")
|
||
if appdata:
|
||
return str(Path(appdata) / "ChatLab")
|
||
return str(Path.home() / ".chatlab")
|
||
|
||
|
||
def _default_static_dir() -> str:
|
||
configured = os.environ.get("CHATLAB_STATIC_DIR")
|
||
if configured:
|
||
return str(Path(configured).expanduser())
|
||
return str((Path(__file__).resolve().parents[1] / "chatlab-web" / "frontend" / "dist"))
|
||
|
||
|
||
class Settings(BaseSettings):
|
||
chatlog_base_url: str = "http://127.0.0.1:5030"
|
||
ai_base_url: str = "https://dashscope.aliyuncs.com/compatible-mode/v1"
|
||
ai_api_key: str = ""
|
||
ai_model: str = "" # 不设默认值,必须由用户在设置页配置
|
||
summary_model: str = "" # 不设默认值,必须由用户在设置页配置
|
||
voice_model: str = "" # 不设默认值,必须由用户在设置页配置
|
||
vision_model: str = "" # 不设默认值,必须由用户在设置页配置
|
||
# 语音/视觉/报告生成可使用与话题分析不同的网关与密钥(如万川平台不同 code)。
|
||
# 留空则回退到 ai_base_url / ai_api_key。
|
||
voice_base_url: str = ""
|
||
voice_api_key: str = ""
|
||
vision_base_url: str = ""
|
||
vision_api_key: str = ""
|
||
summary_base_url: str = ""
|
||
summary_api_key: str = ""
|
||
data_dir: str = _default_data_dir()
|
||
static_dir: str = _default_static_dir()
|
||
db_path: str = str(Path(_default_data_dir()) / "data" / "knowledge.db")
|
||
cors_origins: List[str] = [
|
||
"http://127.0.0.1:5173",
|
||
"http://localhost:5173",
|
||
"http://localhost:3000",
|
||
]
|
||
|
||
class Config:
|
||
env_file = ".env"
|
||
|
||
settings = Settings()
|
||
|
||
try:
|
||
Path(settings.data_dir).mkdir(parents=True, exist_ok=True)
|
||
Path(settings.db_path).parent.mkdir(parents=True, exist_ok=True)
|
||
except PermissionError:
|
||
fallback_dir = Path(tempfile.gettempdir()) / "ChatLab"
|
||
fallback_dir.mkdir(parents=True, exist_ok=True)
|
||
settings.data_dir = str(fallback_dir)
|
||
settings.db_path = str(fallback_dir / "data" / "knowledge.db")
|
||
Path(settings.db_path).parent.mkdir(parents=True, exist_ok=True)
|