109 lines
4.3 KiB
Python
109 lines
4.3 KiB
Python
"""
|
||
配置管理
|
||
统一从项目根目录的 .env 文件加载配置
|
||
"""
|
||
|
||
import os
|
||
from dotenv import load_dotenv
|
||
|
||
# 加载项目根目录的 .env 文件
|
||
# 路径: MiroFish/.env (相对于 backend/app/config.py)
|
||
project_root_env = os.path.join(os.path.dirname(__file__), '../../.env')
|
||
|
||
if os.path.exists(project_root_env):
|
||
load_dotenv(project_root_env, override=True)
|
||
else:
|
||
# 如果根目录没有 .env,尝试加载环境变量(用于生产环境)
|
||
load_dotenv(override=True)
|
||
|
||
|
||
class Config:
|
||
"""Flask配置类"""
|
||
|
||
# Flask配置
|
||
SECRET_KEY = os.environ.get('SECRET_KEY', 'mirofish-secret-key')
|
||
DEBUG = os.environ.get('FLASK_DEBUG', 'True').lower() == 'true'
|
||
PRESERVE_SIMULATIONS_ON_RELOAD = os.environ.get(
|
||
'MIROFISH_PRESERVE_SIMULATIONS_ON_RELOAD',
|
||
'true' if DEBUG else 'false'
|
||
).lower() == 'true'
|
||
|
||
# Agent engine配置
|
||
MIROFISH_MODE = os.environ.get('MIROFISH_MODE', 'agent')
|
||
MIROFISH_LLM_PROVIDER = os.environ.get(
|
||
'MIROFISH_LLM_PROVIDER',
|
||
'agent_queue' if MIROFISH_MODE == 'agent' else 'openai_compatible'
|
||
)
|
||
MIROFISH_GRAPH_PROVIDER = os.environ.get(
|
||
'MIROFISH_GRAPH_PROVIDER',
|
||
'graphiti' if MIROFISH_MODE == 'agent' else 'zep'
|
||
)
|
||
MIROFISH_RUNS_DIR = os.environ.get('MIROFISH_RUNS_DIR', './runs')
|
||
|
||
# JSON配置 - 禁用ASCII转义,让中文直接显示(而不是 \uXXXX 格式)
|
||
JSON_AS_ASCII = False
|
||
|
||
# LLM配置(统一使用OpenAI格式)
|
||
LLM_API_KEY = os.environ.get('LLM_API_KEY')
|
||
LLM_BASE_URL = os.environ.get('LLM_BASE_URL', 'https://api.openai.com/v1')
|
||
LLM_MODEL_NAME = os.environ.get('LLM_MODEL_NAME', 'gpt-4o-mini')
|
||
|
||
# Zep配置
|
||
ZEP_API_KEY = os.environ.get('ZEP_API_KEY')
|
||
|
||
# Graphiti / Neo4j配置
|
||
NEO4J_URI = os.environ.get('NEO4J_URI', 'bolt://localhost:7687')
|
||
NEO4J_USER = os.environ.get('NEO4J_USER', 'neo4j')
|
||
NEO4J_PASSWORD = os.environ.get('NEO4J_PASSWORD', 'password')
|
||
NEO4J_DATABASE = os.environ.get('NEO4J_DATABASE', 'neo4j')
|
||
OLLAMA_BASE_URL = os.environ.get('OLLAMA_BASE_URL', 'http://localhost:11434')
|
||
OLLAMA_EMBEDDING_MODEL = os.environ.get('OLLAMA_EMBEDDING_MODEL', 'nomic-embed-text')
|
||
|
||
# 文件上传配置
|
||
MAX_CONTENT_LENGTH = 50 * 1024 * 1024 # 50MB
|
||
UPLOAD_FOLDER = os.path.join(os.path.dirname(__file__), '../uploads')
|
||
ALLOWED_EXTENSIONS = {'pdf', 'md', 'txt', 'markdown'}
|
||
|
||
# 文本处理配置
|
||
DEFAULT_CHUNK_SIZE = 500 # 默认切块大小
|
||
DEFAULT_CHUNK_OVERLAP = 50 # 默认重叠大小
|
||
|
||
# OASIS模拟配置
|
||
OASIS_DEFAULT_MAX_ROUNDS = int(os.environ.get('OASIS_DEFAULT_MAX_ROUNDS', '10'))
|
||
OASIS_SIMULATION_DATA_DIR = os.path.join(os.path.dirname(__file__), '../uploads/simulations')
|
||
|
||
# OASIS平台可用动作配置
|
||
OASIS_TWITTER_ACTIONS = [
|
||
'CREATE_POST', 'LIKE_POST', 'REPOST', 'FOLLOW', 'DO_NOTHING', 'QUOTE_POST'
|
||
]
|
||
OASIS_REDDIT_ACTIONS = [
|
||
'LIKE_POST', 'DISLIKE_POST', 'CREATE_POST', 'CREATE_COMMENT',
|
||
'LIKE_COMMENT', 'DISLIKE_COMMENT', 'SEARCH_POSTS', 'SEARCH_USER',
|
||
'TREND', 'REFRESH', 'DO_NOTHING', 'FOLLOW', 'MUTE'
|
||
]
|
||
|
||
# Report Agent配置
|
||
REPORT_AGENT_MAX_TOOL_CALLS = int(os.environ.get('REPORT_AGENT_MAX_TOOL_CALLS', '5'))
|
||
REPORT_AGENT_MAX_REFLECTION_ROUNDS = int(os.environ.get('REPORT_AGENT_MAX_REFLECTION_ROUNDS', '2'))
|
||
REPORT_AGENT_TEMPERATURE = float(os.environ.get('REPORT_AGENT_TEMPERATURE', '0.5'))
|
||
|
||
@classmethod
|
||
def validate(cls) -> list[str]:
|
||
"""验证必要配置"""
|
||
errors: list[str] = []
|
||
mode = os.environ.get('MIROFISH_MODE', cls.MIROFISH_MODE)
|
||
llm_provider = os.environ.get(
|
||
'MIROFISH_LLM_PROVIDER',
|
||
'agent_queue' if mode == 'agent' else cls.MIROFISH_LLM_PROVIDER
|
||
)
|
||
graph_provider = os.environ.get(
|
||
'MIROFISH_GRAPH_PROVIDER',
|
||
'graphiti' if mode == 'agent' else cls.MIROFISH_GRAPH_PROVIDER
|
||
)
|
||
|
||
if llm_provider == 'openai_compatible' and not os.environ.get('LLM_API_KEY', cls.LLM_API_KEY or ''):
|
||
errors.append("LLM_API_KEY 未配置(openai_compatible provider 需要)")
|
||
if graph_provider == 'zep' and not os.environ.get('ZEP_API_KEY', cls.ZEP_API_KEY or ''):
|
||
errors.append("ZEP_API_KEY 未配置(legacy zep provider 需要)")
|
||
return errors
|