# 文件位置: config.py # 文件名: config.py import os from datetime import timedelta from dotenv import load_dotenv # 加载环境变量 load_dotenv() class Config: """基础配置""" # Flask配置 SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key-change-in-production') DEBUG = False TESTING = False # API配置 DEEPSEEK_API_KEY = os.environ.get('DEEPSEEK_API_KEY') DEEPSEEK_BASE_URL = os.environ.get('DEEPSEEK_BASE_URL', 'https://api.deepseek.com/v1') TAVILY_API_KEY = os.environ.get('TAVILY_API_KEY') # 模型配置 R1_MODEL = "deepseek-reasoner" # R1-0528 V3_MODEL = "deepseek-chat" # V3-0324 # 研究配置 MAX_CONCURRENT_SUBTOPICS = 10 MAX_SEARCHES_HIGH_PRIORITY = 15 MAX_SEARCHES_MEDIUM_PRIORITY = 10 MAX_SEARCHES_LOW_PRIORITY = 5 # 搜索配置 TAVILY_MAX_RESULTS = 10 TAVILY_SEARCH_DEPTH = "advanced" TAVILY_INCLUDE_ANSWER = True TAVILY_INCLUDE_RAW_CONTENT = False # 任务管理配置(替代Celery) TASK_POOL_SIZE = 10 # 线程池大小 TASK_TIMEOUT = { 'question_analysis': 60, 'outline_creation': 120, 'search': 30, 'report_generation': 180 } # 重试配置 MAX_RETRIES = 3 RETRY_DELAY = 5 # 秒 # 存储配置 DATA_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data') SESSIONS_DIR = os.path.join(DATA_DIR, 'sessions') REPORTS_DIR = os.path.join(DATA_DIR, 'reports') CACHE_DIR = os.path.join(DATA_DIR, 'cache') # 日志配置 LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') LOG_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logs') # MongoDB配置(可选) MONGODB_URI = os.environ.get('MONGODB_URI', 'mongodb://localhost:27017/deepresearch') # WebSocket配置 SOCKETIO_ASYNC_MODE = 'eventlet' @staticmethod def init_app(app): """初始化应用配置""" # 确保必要的目录存在 for dir_path in [Config.DATA_DIR, Config.SESSIONS_DIR, Config.REPORTS_DIR, Config.CACHE_DIR, Config.LOG_DIR]: os.makedirs(dir_path, exist_ok=True) class DevelopmentConfig(Config): """开发环境配置""" DEBUG = True class ProductionConfig(Config): """生产环境配置""" DEBUG = False @classmethod def init_app(cls, app): Config.init_app(app) # 生产环境特定的初始化 import logging from logging.handlers import RotatingFileHandler if not app.debug and not app.testing: file_handler = RotatingFileHandler( os.path.join(cls.LOG_DIR, 'deepresearch.log'), maxBytes=10485760, backupCount=10 ) file_handler.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]' )) file_handler.setLevel(logging.INFO) app.logger.addHandler(file_handler) app.logger.setLevel(logging.INFO) app.logger.info('DeepResearch startup') class TestingConfig(Config): """测试环境配置""" TESTING = True config = { 'development': DevelopmentConfig, 'production': ProductionConfig, 'testing': TestingConfig, 'default': DevelopmentConfig }