"""research-worker 配置模块。""" import os try: from dotenv import load_dotenv load_dotenv() except Exception: pass class Config: # 服务 HOST: str = os.getenv("WORKER_HOST", "0.0.0.0") PORT: int = int(os.getenv("RESEARCH_WORKER_PORT", "8091")) CONCURRENCY: int = int(os.getenv("WORKER_CONCURRENCY", "2")) # 数据库 / Redis DATABASE_URL: str = os.getenv("DATABASE_URL", "postgres://aily:aily@localhost:5432/aily_portal") REDIS_URL: str = os.getenv("REDIS_URL", "redis://localhost:6379/0") TASK_QUEUE: str = "research:tasks" TASK_STATUS_PREFIX: str = "research:status:" # LLM(OpenAI 兼容;DashScope 默认) LLM_PROVIDER: str = os.getenv("LLM_PROVIDER", "openai") OPENAI_API_KEY: str = os.getenv("OPENAI_API_KEY", "") OPENAI_BASE_URL: str = os.getenv("OPENAI_BASE_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1") OPENAI_MODEL: str = os.getenv("OPENAI_MODEL", "qwen-plus") # 本地推理(私有化,与后端 T4 一致:vLLM/Ollama 等) LOCAL_LLM_BASE_URL: str = os.getenv("LOCAL_LLM_BASE_URL", "") LOCAL_LLM_MODEL: str = os.getenv("LOCAL_LLM_MODEL", "") LOCAL_LLM_API_KEY: str = os.getenv("LOCAL_LLM_API_KEY", "") # 检索 provider(可插拔,避开 AGPL 的 SearXNG)。留空则不联网,降级为无来源报告。 SEARCH_PROVIDER: str = os.getenv("SEARCH_PROVIDER", "") # tavily | "" SEARCH_API_KEY: str = os.getenv("SEARCH_API_KEY", "") SEARCH_BASE_URL: str = os.getenv("SEARCH_BASE_URL", "https://api.tavily.com") # 研究参数 MAX_SUBQUERIES: int = int(os.getenv("RESEARCH_MAX_SUBQUERIES", "4")) MAX_SOURCES: int = int(os.getenv("RESEARCH_MAX_SOURCES", "6")) @classmethod def effective_llm(cls): """根据 LLM_PROVIDER 解析实际使用的 (base_url, api_key, model)。""" if cls.LLM_PROVIDER == "local" and cls.LOCAL_LLM_BASE_URL: return (cls.LOCAL_LLM_BASE_URL, cls.LOCAL_LLM_API_KEY, cls.LOCAL_LLM_MODEL or cls.OPENAI_MODEL) return (cls.OPENAI_BASE_URL, cls.OPENAI_API_KEY, cls.OPENAI_MODEL) config = Config()