86 lines
3.3 KiB
Python
86 lines
3.3 KiB
Python
"""
|
|
Configuration management.
|
|
Loads configuration from the ``.env`` file at the project root.
|
|
"""
|
|
|
|
import os
|
|
from dotenv import load_dotenv
|
|
|
|
# Load the project-root .env file.
|
|
# Path: MiroFish/.env (relative to 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:
|
|
# If no .env at the root, fall back to environment variables (production-style).
|
|
load_dotenv(override=True)
|
|
|
|
|
|
class Config:
|
|
"""Flask configuration class."""
|
|
|
|
# Flask configuration
|
|
SECRET_KEY = os.environ.get('SECRET_KEY', 'mirofish-secret-key')
|
|
DEBUG = os.environ.get('FLASK_DEBUG', 'True').lower() == 'true'
|
|
|
|
# JSON configuration - disable ASCII escaping so Chinese characters are emitted
|
|
# directly instead of being encoded as \\uXXXX.
|
|
JSON_AS_ASCII = False
|
|
|
|
# LLM configuration (uniformly using the OpenAI-compatible interface)
|
|
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')
|
|
|
|
# FalkorDB configuration (replaces Zep)
|
|
FALKORDB_HOST = os.environ.get('FALKORDB_HOST', 'localhost')
|
|
FALKORDB_PORT = int(os.environ.get('FALKORDB_PORT', '6379'))
|
|
FALKORDB_USERNAME = os.environ.get('FALKORDB_USERNAME', None) or None
|
|
FALKORDB_PASSWORD = os.environ.get('FALKORDB_PASSWORD', None) or None
|
|
|
|
# Embedding model: local sentence-transformers (pre-downloaded in image)
|
|
EMBEDDING_MODEL = os.environ.get(
|
|
'EMBEDDING_MODEL',
|
|
'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2',
|
|
)
|
|
|
|
# File upload configuration
|
|
MAX_CONTENT_LENGTH = 50 * 1024 * 1024 # 50MB
|
|
UPLOAD_FOLDER = os.path.join(os.path.dirname(__file__), '../uploads')
|
|
ALLOWED_EXTENSIONS = {'pdf', 'md', 'txt', 'markdown'}
|
|
|
|
# Text processing configuration
|
|
DEFAULT_CHUNK_SIZE = 500 # default chunk size
|
|
DEFAULT_CHUNK_OVERLAP = 50 # default overlap
|
|
|
|
# OASIS simulation configuration
|
|
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 platform available actions
|
|
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 configuration
|
|
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]:
|
|
"""Validate required configuration."""
|
|
errors: list[str] = []
|
|
if not cls.LLM_API_KEY:
|
|
errors.append("LLM_API_KEY is not configured")
|
|
# FalkorDB host defaults to localhost; only fail if explicitly empty
|
|
if not cls.FALKORDB_HOST:
|
|
errors.append("FALKORDB_HOST is not configured")
|
|
return errors
|