80 lines
3.3 KiB
Python
80 lines
3.3 KiB
Python
"""全局配置:环境变量优先,提供默认值便于开箱即用。"""
|
|
import os
|
|
from pathlib import Path
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent.parent # backend/
|
|
|
|
|
|
class Settings:
|
|
# ---- 基础 ----
|
|
APP_NAME = "随身助手"
|
|
API_PREFIX = "/api"
|
|
DEBUG = os.environ.get("DEBUG", "1") == "1"
|
|
HOST = os.environ.get("HOST", "0.0.0.0")
|
|
PORT = int(os.environ.get("PORT", "16080"))
|
|
PUBLIC_BASE_URL = os.environ.get("PUBLIC_BASE_URL", "http://121.40.164.32:16080")
|
|
|
|
# ---- 数据库 ----
|
|
DATABASE_URL = os.environ.get("DATABASE_URL", f"sqlite:///{BASE_DIR}/data/assistant.db")
|
|
|
|
# ---- JWT ----
|
|
SECRET_KEY = os.environ.get("SECRET_KEY", "companion-assistant-secret-change-me-7f3a9c")
|
|
ALGORITHM = "HS256"
|
|
ACCESS_TOKEN_EXPIRE_MINUTES = int(os.environ.get("ACCESS_TOKEN_EXPIRE_MINUTES", "43200")) # 30 天
|
|
|
|
# ---- 存储 ----
|
|
DATA_DIR = BASE_DIR / "data"
|
|
UPLOAD_DIR = DATA_DIR / "uploads"
|
|
WORKSPACE_DIR = DATA_DIR / "workspace"
|
|
MAX_UPLOAD_MB = int(os.environ.get("MAX_UPLOAD_MB", "500"))
|
|
|
|
# ---- LLM 提供商(OpenAI 兼容)----
|
|
# api_key 留空则使用环境变量 <NAME>_API_KEY
|
|
LLM_PROVIDERS = {
|
|
"doubao": {
|
|
"base_url": os.environ.get("DOUBAO_BASE_URL", "https://ark.cn-beijing.volces.com/api/plan/v3"),
|
|
"api_key": os.environ.get("DOUBAO_API_KEY", "ark-2b06dc9d-8878-4c6e-b201-f422376e79cb-246d9"),
|
|
"models": ["doubao-seed-evolving", "doubao-1.5-vision-pro", "doubao-1-5-thinking"],
|
|
},
|
|
"deepseek": {
|
|
"base_url": os.environ.get("DEEPSEEK_BASE_URL", "https://api.deepseek.com"),
|
|
"api_key": os.environ.get("DEEPSEEK_API_KEY", "sk-edb9df58ff574f8c98df1cd6a425e97c"),
|
|
"models": ["deepseek-chat", "deepseek-reasoner"],
|
|
},
|
|
"qwen": {
|
|
"base_url": os.environ.get("QWEN_BASE_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1"),
|
|
"api_key": os.environ.get("QWEN_API_KEY", ""),
|
|
"models": ["qwen-max", "qwen-plus", "qwen-vl-max"],
|
|
},
|
|
"autodl": {
|
|
"base_url": os.environ.get("AUTODL_BASE_URL", "https://www.autodl.art/api/v1"),
|
|
"api_key": os.environ.get("AUTODL_API_KEY", "F9MBfolzuapqTsD4KmUf9qen720rXvUZ3Sp3IrWiCTukqonx"),
|
|
"models": [],
|
|
},
|
|
}
|
|
|
|
# 默认模型(对话/通用)
|
|
DEFAULT_MODEL = os.environ.get("DEFAULT_MODEL", "doubao-seed-evolving")
|
|
# 视觉模型(视频/图片分析)—— plan 端点下 seed-evolving 支持多模态
|
|
VISION_MODEL = os.environ.get("VISION_MODEL", "doubao-seed-evolving")
|
|
# 思考模型(复杂任务)
|
|
THINKING_MODEL = os.environ.get("THINKING_MODEL", "deepseek-reasoner")
|
|
|
|
def find_provider(self, model: str):
|
|
"""根据模型名找到对应 provider 配置。"""
|
|
for name, cfg in self.LLM_PROVIDERS.items():
|
|
if model in cfg["models"] or model == name:
|
|
return name, cfg
|
|
# 兜底:按名称前缀匹配
|
|
for name, cfg in self.LLM_PROVIDERS.items():
|
|
if model.startswith(name) or name in model:
|
|
return name, cfg
|
|
return "doubao", self.LLM_PROVIDERS["doubao"]
|
|
|
|
def ensure_dirs(self):
|
|
for d in (self.DATA_DIR, self.UPLOAD_DIR, self.WORKSPACE_DIR):
|
|
d.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
settings = Settings()
|