291 lines
9.5 KiB
Python
291 lines
9.5 KiB
Python
from os import environ, path
|
|
from datetime import timedelta
|
|
import redis
|
|
|
|
from common.utils.prompt_loader import load_prompt_templates
|
|
|
|
basedir = path.abspath(path.dirname(__file__))
|
|
|
|
|
|
class Config(object):
|
|
DEBUG = False
|
|
DEVELOPMENT = False
|
|
SECRET_KEY = environ.get('SECRET_KEY')
|
|
SESSION_COOKIE_SECURE = False
|
|
SESSION_COOKIE_HTTPONLY = True
|
|
SESSION_KEY_PREFIX = f'{environ.get('COMPONENT_NAME')}_'
|
|
|
|
WTF_CSRF_ENABLED = True
|
|
WTF_CSRF_TIME_LIMIT = None
|
|
WTF_CSRF_SSL_STRICT = False # Set to True if using HTTPS
|
|
|
|
# flask-security-too settings
|
|
# SECURITY_URL_PREFIX = '/admin'
|
|
SECURITY_LOGIN_URL = '/admin/login'
|
|
SECURITY_LOGOUT_URL = '/admin/logout'
|
|
# SECURITY_REGISTER_URL = '/admin/register'
|
|
# SECURITY_RESET_URL = '/admin/reset'
|
|
# SECURITY_CHANGE_URL = '/admin/change'
|
|
# SECURITY_POST_LOGIN_VIEW = '/admin/user/tenant_overview'
|
|
# SECURITY_POST_LOGOUT_VIEW = '/admin'
|
|
# SECURITY_POST_REGISTER_VIEW = '/admin/user/tenant_overview'
|
|
# SECURITY_POST_RESET_VIEW = '/admin/login'
|
|
# SECURITY_POST_CHANGE_VIEW = '/admin/login'
|
|
# SECURITY_BLUEPRINT_NAME = 'security_bp'
|
|
SECURITY_PASSWORD_SALT = environ.get('SECURITY_PASSWORD_SALT')
|
|
REMEMBER_COOKIE_SAMESITE = 'strict'
|
|
SESSION_COOKIE_SAMESITE = 'Lax'
|
|
SECURITY_CONFIRMABLE = True
|
|
SECURITY_TRACKABLE = True
|
|
SECURITY_PASSWORD_COMPLEXITY_CHECKER = 'zxcvbn'
|
|
SECURITY_POST_LOGIN_VIEW = '/user/tenant_overview'
|
|
SECURITY_RECOVERABLE = True
|
|
SECURITY_EMAIL_SENDER = "eveai_super@flow-it.net"
|
|
|
|
# Ensure Flask-Security-Too is handling CSRF tokens when behind a proxy
|
|
SECURITY_CSRF_PROTECT_MECHANISMS = ['session']
|
|
SECURITY_CSRF_COOKIE_NAME = 'XSRF-TOKEN'
|
|
SECURITY_CSRF_HEADER = 'X-XSRF-TOKEN'
|
|
WTF_CSRF_CHECK_DEFAULT = False
|
|
|
|
# file upload settings
|
|
MAX_CONTENT_LENGTH = 16 * 1024 * 1024
|
|
UPLOAD_EXTENSIONS = ['.txt', '.pdf', '.png', '.jpg', '.jpeg', '.gif']
|
|
|
|
# supported languages
|
|
SUPPORTED_LANGUAGES = ['en', 'fr', 'nl', 'de', 'es']
|
|
|
|
# supported LLMs
|
|
SUPPORTED_EMBEDDINGS = ['openai.text-embedding-3-small', 'openai.text-embedding-3-large', 'mistral.mistral-embed']
|
|
SUPPORTED_LLMS = ['openai.gpt-4o', 'anthropic.claude-3-5-sonnet', 'openai.gpt-4o-mini']
|
|
|
|
ANTHROPIC_LLM_VERSIONS = {'claude-3-5-sonnet': 'claude-3-5-sonnet-20240620', }
|
|
|
|
# Load prompt templates dynamically
|
|
PROMPT_TEMPLATES = {model: load_prompt_templates(model) for model in SUPPORTED_LLMS}
|
|
|
|
# Annotation text chunk length
|
|
ANNOTATION_TEXT_CHUNK_LENGTH = {
|
|
'openai.gpt-4o': 10000,
|
|
'openai.gpt-4o-mini': 10000,
|
|
'anthropic.claude-3-5-sonnet': 8000
|
|
}
|
|
|
|
# OpenAI API Keys
|
|
OPENAI_API_KEY = environ.get('OPENAI_API_KEY')
|
|
|
|
# Groq API Keys
|
|
GROQ_API_KEY = environ.get('GROQ_API_KEY')
|
|
|
|
# Anthropic API Keys
|
|
ANTHROPIC_API_KEY = environ.get('ANTHROPIC_API_KEY')
|
|
|
|
# Portkey API Keys
|
|
PORTKEY_API_KEY = environ.get('PORTKEY_API_KEY')
|
|
|
|
# Celery settings
|
|
CELERY_TASK_SERIALIZER = 'json'
|
|
CELERY_RESULT_SERIALIZER = 'json'
|
|
CELERY_ACCEPT_CONTENT = ['json']
|
|
CELERY_TIMEZONE = 'UTC'
|
|
CELERY_ENABLE_UTC = True
|
|
|
|
# SocketIO settings
|
|
# SOCKETIO_ASYNC_MODE = 'threading'
|
|
SOCKETIO_ASYNC_MODE = 'gevent'
|
|
|
|
# Session Settings
|
|
SESSION_TYPE = 'redis'
|
|
SESSION_PERMANENT = True
|
|
SESSION_USE_SIGNER = True
|
|
PERMANENT_SESSION_LIFETIME = timedelta(minutes=60)
|
|
SESSION_REFRESH_EACH_REQUEST = True
|
|
|
|
# JWT settings
|
|
JWT_SECRET_KEY = environ.get('JWT_SECRET_KEY')
|
|
|
|
# API Encryption
|
|
API_ENCRYPTION_KEY = environ.get('API_ENCRYPTION_KEY')
|
|
|
|
# Fallback Algorithms
|
|
FALLBACK_ALGORITHMS = [
|
|
"RAG_TENANT",
|
|
"RAG_WIKIPEDIA",
|
|
"RAG_GOOGLE",
|
|
"LLM"
|
|
]
|
|
|
|
# Interaction algorithms
|
|
INTERACTION_ALGORITHMS = {
|
|
"RAG_TENANT": {"name": "RAG_TENANT", "description": "Algorithm using only information provided by the tenant"},
|
|
"RAG_WIKIPEDIA": {"name": "RAG_WIKIPEDIA", "description": "Algorithm using information provided by Wikipedia"},
|
|
"RAG_GOOGLE": {"name": "RAG_GOOGLE", "description": "Algorithm using information provided by Google"},
|
|
"LLM": {"name": "LLM", "description": "Algorithm using information integrated in the used LLM"}
|
|
}
|
|
|
|
|
|
class DevConfig(Config):
|
|
DEVELOPMENT = True
|
|
DEBUG = True
|
|
FLASK_DEBUG = True
|
|
EXPLAIN_TEMPLATE_LOADING = False
|
|
|
|
# Database Settings
|
|
DB_HOST = environ.get('DB_HOST', 'localhost')
|
|
DB_USER = environ.get('DB_USER', 'luke')
|
|
DB_PASS = environ.get('DB_PASS', 'Skywalker!')
|
|
DB_NAME = environ.get('DB_NAME', 'eveai')
|
|
SQLALCHEMY_DATABASE_URI = f'postgresql+pg8000://{DB_USER}:{DB_PASS}@{DB_HOST}:5432/{DB_NAME}'
|
|
SQLALCHEMY_BINDS = {'public': SQLALCHEMY_DATABASE_URI}
|
|
|
|
# flask-mailman settings
|
|
MAIL_SERVER = 'mail.flow-it.net'
|
|
MAIL_PORT = 587
|
|
MAIL_USE_TLS = True
|
|
MAIL_USE_SSL = False
|
|
MAIL_DEFAULT_SENDER = ('eveAI Admin', 'eveai_admin@flow-it.net')
|
|
MAIL_USERNAME = environ.get('MAIL_USERNAME')
|
|
MAIL_PASSWORD = environ.get('MAIL_PASSWORD')
|
|
|
|
# Define the nginx prefix used for the specific apps
|
|
EVEAI_APP_LOCATION_PREFIX = '/admin'
|
|
EVEAI_CHAT_LOCATION_PREFIX = '/chat'
|
|
|
|
# file upload settings
|
|
# UPLOAD_FOLDER = '/app/tenant_files'
|
|
|
|
# Celery settings
|
|
# eveai_app Redis Settings
|
|
CELERY_BROKER_URL = 'redis://redis:6379/0'
|
|
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'
|
|
# eveai_chat Redis Settings
|
|
CELERY_BROKER_URL_CHAT = 'redis://redis:6379/3'
|
|
CELERY_RESULT_BACKEND_CHAT = 'redis://redis:6379/3'
|
|
|
|
# Unstructured settings
|
|
# UNSTRUCTURED_API_KEY = 'pDgCrXumYhM3CNvjvwV8msMldXC3uw'
|
|
# UNSTRUCTURED_BASE_URL = 'https://flowitbv-16c4us0m.api.unstructuredapp.io'
|
|
# UNSTRUCTURED_FULL_URL = 'https://flowitbv-16c4us0m.api.unstructuredapp.io/general/v0/general'
|
|
|
|
# SocketIO settings
|
|
SOCKETIO_MESSAGE_QUEUE = 'redis://redis:6379/1'
|
|
SOCKETIO_CORS_ALLOWED_ORIGINS = '*'
|
|
SOCKETIO_LOGGER = True
|
|
SOCKETIO_ENGINEIO_LOGGER = True
|
|
SOCKETIO_PING_TIMEOUT = 20000
|
|
SOCKETIO_PING_INTERVAL = 25000
|
|
SOCKETIO_MAX_IDLE_TIME = timedelta(minutes=60) # Changing this value ==> change maxConnectionDuration value in
|
|
# eveai-chat-widget.js
|
|
|
|
# Google Cloud settings
|
|
GC_PROJECT_NAME = 'eveai-420711'
|
|
GC_LOCATION = 'europe-west1'
|
|
GC_KEY_RING = 'eveai-chat'
|
|
GC_CRYPTO_KEY = 'envelope-encryption-key'
|
|
|
|
# Session settings
|
|
SESSION_REDIS = redis.from_url('redis://redis:6379/2')
|
|
|
|
# PATH settings
|
|
ffmpeg_path = '/usr/bin/ffmpeg'
|
|
|
|
# MINIO
|
|
MINIO_ENDPOINT = 'minio:9000'
|
|
MINIO_ACCESS_KEY = 'minioadmin'
|
|
MINIO_SECRET_KEY = 'minioadmin'
|
|
MINIO_USE_HTTPS = False
|
|
|
|
|
|
class ProdConfig(Config):
|
|
DEVELOPMENT = False
|
|
DEBUG = False
|
|
DEBUG = False
|
|
FLASK_DEBUG = False
|
|
EXPLAIN_TEMPLATE_LOADING = False
|
|
|
|
# SESSION SETTINGS
|
|
SESSION_COOKIE_SECURE = True
|
|
|
|
WTF_CSRF_SSL_STRICT = True # Set to True if using HTTPS
|
|
|
|
# Database Settings
|
|
DB_HOST = environ.get('DB_HOST')
|
|
DB_USER = environ.get('DB_USER')
|
|
DB_PASS = environ.get('DB_PASS')
|
|
DB_NAME = environ.get('DB_NAME')
|
|
DB_PORT = environ.get('DB_PORT')
|
|
SQLALCHEMY_DATABASE_URI = f'postgresql+pg8000://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_NAME}'
|
|
SQLALCHEMY_BINDS = {'public': SQLALCHEMY_DATABASE_URI}
|
|
|
|
# flask-mailman settings
|
|
MAIL_SERVER = 'mail.askeveai.com'
|
|
MAIL_PORT = 587
|
|
MAIL_USE_TLS = True
|
|
MAIL_USE_SSL = False
|
|
MAIL_DEFAULT_SENDER = ('Evie Admin', 'evie_admin@askeveai.com')
|
|
MAIL_USERNAME = environ.get('MAIL_USERNAME')
|
|
MAIL_PASSWORD = environ.get('MAIL_PASSWORD')
|
|
|
|
# Define the nginx prefix used for the specific apps
|
|
EVEAI_APP_LOCATION_PREFIX = '/admin'
|
|
EVEAI_CHAT_LOCATION_PREFIX = '/chat'
|
|
|
|
# flask-mailman settings
|
|
MAIL_USERNAME = 'eveai_super@flow-it.net'
|
|
MAIL_PASSWORD = '$6xsWGbNtx$CFMQZqc*'
|
|
|
|
# file upload settings
|
|
# UPLOAD_FOLDER = '/app/tenant_files'
|
|
|
|
# Redis Settings
|
|
REDIS_USER = environ.get('REDIS_USER')
|
|
REDIS_PASS = environ.get('REDIS_PASS')
|
|
REDIS_URL = environ.get('REDIS_URL')
|
|
REDIS_PORT = environ.get('REDIS_PORT', '6379')
|
|
REDIS_BASE_URI = f'redis://{REDIS_USER}:{REDIS_PASS}@{REDIS_URL}:{REDIS_PORT}'
|
|
|
|
# Celery settings
|
|
# eveai_app Redis Settings
|
|
CELERY_BROKER_URL = f'{REDIS_BASE_URI}/0'
|
|
CELERY_RESULT_BACKEND = f'{REDIS_BASE_URI}/0'
|
|
# eveai_chat Redis Settings
|
|
CELERY_BROKER_URL_CHAT = f'{REDIS_BASE_URI}/3'
|
|
CELERY_RESULT_BACKEND_CHAT = f'{REDIS_BASE_URI}/3'
|
|
|
|
# Session settings
|
|
SESSION_REDIS = redis.from_url(f'{REDIS_BASE_URI}/2')
|
|
|
|
# SocketIO settings
|
|
SOCKETIO_MESSAGE_QUEUE = f'{REDIS_BASE_URI}/1'
|
|
SOCKETIO_CORS_ALLOWED_ORIGINS = '*'
|
|
SOCKETIO_LOGGER = True
|
|
SOCKETIO_ENGINEIO_LOGGER = True
|
|
SOCKETIO_PING_TIMEOUT = 20000
|
|
SOCKETIO_PING_INTERVAL = 25000
|
|
SOCKETIO_MAX_IDLE_TIME = timedelta(minutes=60) # Changing this value ==> change maxConnectionDuration value in
|
|
# eveai-chat-widget.js
|
|
|
|
# Google Cloud settings
|
|
GC_PROJECT_NAME = 'eveai-420711'
|
|
GC_LOCATION = 'europe-west1'
|
|
GC_KEY_RING = 'eveai-chat'
|
|
GC_CRYPTO_KEY = 'envelope-encryption-key'
|
|
|
|
# PATH settings
|
|
ffmpeg_path = '/usr/bin/ffmpeg'
|
|
|
|
# MINIO
|
|
MINIO_ENDPOINT = environ.get('MINIO_ENDPOINT')
|
|
MINIO_ACCESS_KEY = environ.get('MINIO_ACCESS_KEY')
|
|
MINIO_SECRET_KEY = environ.get('MINIO_SECRET_KEY')
|
|
MINIO_USE_HTTPS = True
|
|
|
|
|
|
def get_config(config_name='dev'):
|
|
configs = {
|
|
'dev': DevConfig,
|
|
'prod': ProdConfig,
|
|
'default': DevConfig,
|
|
}
|
|
return configs.get(config_name)
|