"""雅文内容创造工作台 - 配置""" import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent # server/ # 双环境:YAWAN_ENV=dev → 数据在 data-dev/(开发库,随便折腾);默认/空 → data/(生产库,公网用)。 # 可用 YAWAN_DATA_DIR 将某个环境的数据根目录切到外接盘或其他持久化卷。 # 只接受绝对路径;未配置时保持原有的 server/data* 路径,避免插拔硬盘影响现有服务。 _ENV = os.environ.get("YAWAN_ENV", "prod").strip().lower() _DATA_SUB = "data-dev" if _ENV == "dev" else "data" _DATA_OVERRIDE = os.environ.get("YAWAN_DATA_DIR", "").strip() if _DATA_OVERRIDE: _override_path = Path(_DATA_OVERRIDE).expanduser() if not _override_path.is_absolute(): raise RuntimeError("YAWAN_DATA_DIR 必须是绝对路径") DATA_DIR = _override_path else: DATA_DIR = BASE_DIR / _DATA_SUB KB_DIR = DATA_DIR / "kb" # 知识库素材文件 ARTIFACTS_DIR = DATA_DIR / "artifacts" # 段产物/组合产物 OCR_DIR = DATA_DIR / "ocr" # 导图 OCR 输出 MODELS_DIR = DATA_DIR / "models" # 本地 embedding 模型 DB_PATH = DATA_DIR / "workspace.db" CHROMA_DIR = DATA_DIR / "chroma" for d in (DATA_DIR, KB_DIR, ARTIFACTS_DIR, OCR_DIR, MODELS_DIR): d.mkdir(parents=True, exist_ok=True) # 预置模型 provider(值从本机已有配置读取,运行时可改) DEFAULT_PROVIDERS = [ { "name": "DeepSeek", "base_url": "https://api.deepseek.com/v1", "api_key": "" if _ENV == "dev" else os.environ.get("DEEPSEEK_API_KEY", ""), "models": ["deepseek-chat", "deepseek-reasoner"], "default_model": "deepseek-chat", "builtin": True, }, { "name": "MiMo", "base_url": "https://api.xiaomimimo.com/v1", "api_key": "" if _ENV == "dev" else os.environ.get("MIMO_API_KEY", ""), "models": ["mimo-v2.5-pro"], "default_model": "mimo-v2.5-pro", "builtin": True, }, ] # 从 hurryyhao/.env 读取 DeepSeek key(用户主用账号) _HY_ENV = Path.home() / "hurryyhao" / ".env" if _ENV != "dev" and _HY_ENV.exists(): for line in _HY_ENV.read_text(encoding="utf-8", errors="ignore").splitlines(): line = line.strip() if line.startswith("AI_API_KEY="): DEFAULT_PROVIDERS[0]["api_key"] = line.split("=", 1)[1].strip().strip('"').strip("'") elif line.startswith("MIMO_API_KEY="): DEFAULT_PROVIDERS[1]["api_key"] = line.split("=", 1)[1].strip().strip('"').strip("'") # AI 聚合网(环境变量) _JUHE = "" if _ENV == "dev" else os.environ.get("AI_JUHE_API_KEY", "") if _JUHE: DEFAULT_PROVIDERS.append({ "name": "AI聚合网", "base_url": "https://api.lk888.ai/api", "api_key": _JUHE, "models": ["deepseek-chat"], "default_model": "deepseek-chat", "builtin": True, "note": "接口格式为聚合网专用,M1 后适配", }) EMBEDDING_MODEL = os.environ.get("EMBEDDING_MODEL", "BAAI/bge-small-zh-v1.5") # M1 用 small 跑通,可换 bge-m3 EMBEDDING_DIM = 512 # 本地开发只允许工作台前端来源;生产环境通过环境变量显式配置,不再用通配符。 CORS_ORIGINS = [origin.strip().rstrip("/") for origin in os.environ.get( "YAWEN_CORS_ORIGINS", "http://localhost:5173,http://127.0.0.1:5173,https://agent.pducv.cn,http://agent.pducv.cn" ).split(",") if origin.strip()]