import os from dotenv import load_dotenv BASE_DIR = os.path.dirname(os.path.abspath(__file__)) env_path = os.path.join(BASE_DIR, ".env") load_dotenv(env_path) def _load_accounts(): accounts = [] # 1. Try reading from accounts.txt accounts_file = os.path.join(BASE_DIR, "accounts.txt") if os.path.exists(accounts_file): try: with open(accounts_file, "r", encoding="utf-8") as f: for line in f: line = line.strip() if line and ":" in line and not line.startswith("#"): accounts.append(line) except Exception: pass # 2. Try environments if not accounts: env_acc = os.getenv("ONYX_ACCOUNTS", "") if env_acc: accounts = [a.strip() for a in env_acc.split(",") if a.strip() and ":" in a] return accounts ONYX_ACCOUNTS = _load_accounts() # --- Onyx settings --- ONYX_BASE_URL = os.getenv("ONYX_BASE_URL", "https://cloud.onyx.app").rstrip("/") ONYX_AUTH_COOKIE_RAW = os.getenv("ONYX_AUTH_COOKIE", "") ONYX_AUTH_COOKIES = [c.strip() for c in ONYX_AUTH_COOKIE_RAW.split(",") if c.strip()] # 为了保持向下兼容或作为默认值,保留单数变量指向第一个 Cookie ONYX_AUTH_COOKIE = ONYX_AUTH_COOKIES[0] if ONYX_AUTH_COOKIES else "" try: ONYX_PERSONA_ID = int(os.getenv("ONYX_PERSONA_ID", "0")) except ValueError: ONYX_PERSONA_ID = 0 ONYX_ORIGIN = os.getenv("ONYX_ORIGIN", "webapp") ONYX_REFERER = os.getenv("ONYX_REFERER", "https://cloud.onyx.app/app") # --- Server settings --- API_KEY = os.getenv("API_KEY", "") # Empty = no auth required try: PORT = int(os.getenv("PORT", "8896")) except ValueError: PORT = 8896 LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO") try: REQUEST_TIMEOUT = int(os.getenv("REQUEST_TIMEOUT", "300")) except ValueError: REQUEST_TIMEOUT = 300 # --- Stealth settings --- STEALTH_MODE = os.getenv("STEALTH_MODE", "true").lower() == "true" STEALTH_MIN_DELAY = float(os.getenv("STEALTH_MIN_DELAY", "0.05")) STEALTH_MAX_DELAY = float(os.getenv("STEALTH_MAX_DELAY", "0.3")) # --- Model mapping: external name -> (provider, version) --- MODEL_MAP = { "claude-opus-4.7": ("Anthropic", "claude-opus-4-7"), "claude-opus-4.6": ("Anthropic", "claude-opus-4-6"), "claude-opus-4.5": ("Anthropic", "claude-opus-4-5"), "claude-sonnet-4.5": ("Anthropic", "claude-sonnet-4-5"), "gpt-5.4": ("OpenAI", "gpt-5.4"), "gpt-5.2": ("OpenAI", "gpt-5.2"), "gpt-5-mini": ("OpenAI", "gpt-5-mini"), "gpt-4.1": ("OpenAI", "gpt-4.1"), "gpt-4o": ("OpenAI", "gpt-4o"), "o3": ("OpenAI", "o3"), }