-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.py
More file actions
93 lines (75 loc) · 3.49 KB
/
config.py
File metadata and controls
93 lines (75 loc) · 3.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import os
from dotenv import load_dotenv
import logging
# Load environment variables
load_dotenv()
class Config:
"""Enhanced configuration with environment variable support and validation"""
# Flask Configuration
SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret-key-change-in-production')
DEBUG = os.getenv('FLASK_DEBUG', 'false').lower() == 'true'
ENV = os.getenv('FLASK_ENV', 'development')
PORT = int(os.getenv('PORT', 8080))
HOST = os.getenv('HOST', '0.0.0.0')
# Ollama Configuration
OLLAMA_BASE_URL = os.getenv('OLLAMA_BASE_URL', 'http://localhost:11434')
OLLAMA_MODEL = os.getenv('OLLAMA_MODEL', 'llama2')
OLLAMA_TIMEOUT = int(os.getenv('OLLAMA_TIMEOUT', 300))
# Database Configuration
VECTOR_DB_PATH = os.getenv('VECTOR_DB_PATH', './data/vector_db')
REDIS_URL = os.getenv('REDIS_URL', 'redis://localhost:6379/0')
# AWS S3 Configuration
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
S3_BUCKET_NAME = os.getenv('S3_BUCKET_NAME')
S3_REGION = os.getenv('S3_REGION', 'us-east-1')
# File Upload Configuration
MAX_FILE_SIZE_MB = int(os.getenv('MAX_FILE_SIZE_MB', 10))
ALLOWED_EXTENSIONS = os.getenv('ALLOWED_EXTENSIONS', 'pdf,txt,docx,md').split(',')
UPLOAD_FOLDER = os.getenv('UPLOAD_FOLDER', './uploads')
# AI/ML Configuration
CHUNK_SIZE = int(os.getenv('CHUNK_SIZE', 1000))
CHUNK_OVERLAP = int(os.getenv('CHUNK_OVERLAP', 200))
EMBEDDING_MODEL = os.getenv('EMBEDDING_MODEL', 'sentence-transformers/all-MiniLM-L6-v2')
TOP_K_RETRIEVAL = int(os.getenv('TOP_K_RETRIEVAL', 5))
SIMILARITY_THRESHOLD = float(os.getenv('SIMILARITY_THRESHOLD', 0.7))
# Performance Configuration
MAX_CONCURRENT_UPLOADS = int(os.getenv('MAX_CONCURRENT_UPLOADS', 3))
QUERY_TIMEOUT = int(os.getenv('QUERY_TIMEOUT', 30))
# Cache Configuration
CACHE_TTL_SECONDS = int(os.getenv('CACHE_TTL_SECONDS', 3600))
ENABLE_QUERY_CACHE = True # Re-enabled after debugging
# Rate Limiting
RATE_LIMIT_PER_MINUTE = int(os.getenv('RATE_LIMIT_PER_MINUTE', 60))
RATE_LIMIT_PER_HOUR = int(os.getenv('RATE_LIMIT_PER_HOUR', 1000))
# Logging Configuration
LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO')
LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
# Monitoring
ENABLE_METRICS = os.getenv('ENABLE_METRICS', 'true').lower() == 'true'
SENTRY_DSN = os.getenv('SENTRY_DSN')
@classmethod
def validate_config(cls):
"""Validate critical configuration values"""
errors = []
if cls.MAX_FILE_SIZE_MB <= 0:
errors.append("MAX_FILE_SIZE_MB must be positive")
if cls.CHUNK_SIZE <= 0:
errors.append("CHUNK_SIZE must be positive")
if errors:
raise ValueError(f"Configuration errors: {', '.join(errors)}")
@classmethod
def setup_logging(cls):
"""Setup application logging"""
logging.basicConfig(
level=getattr(logging, cls.LOG_LEVEL.upper()),
format=cls.LOG_FORMAT,
handlers=[
logging.StreamHandler(),
logging.FileHandler('app.log')
]
)
# Reduce verbosity of external libraries
logging.getLogger('urllib3').setLevel(logging.WARNING)
logging.getLogger('botocore').setLevel(logging.WARNING)
logging.getLogger('s3transfer').setLevel(logging.WARNING)