- Introduction of API-functionality (to be continued). Deduplication of document and url uploads between views and api. - Improvements on document processing - introduction of processor classes to streamline document inputs - Removed pure Youtube functionality, as Youtube retrieval of documents continuously changes. But added upload of srt, mp3, ogg and mp4
299 lines
9.8 KiB
Python
299 lines
9.8 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"
|
|
SECURITY_EMAIL_SUBJECT_PASSWORD_RESET = 'Reset Your Password'
|
|
SECURITY_EMAIL_SUBJECT_PASSWORD_NOTICE = 'Your Password Has Been Reset'
|
|
SECURITY_EMAIL_PLAINTEXT = False
|
|
SECURITY_EMAIL_HTML = True
|
|
|
|
# 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 = 50 * 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"}
|
|
}
|
|
|
|
# flask-mailman settings
|
|
MAIL_SERVER = environ.get('MAIL_SERVER')
|
|
MAIL_PORT = int(environ.get('MAIL_PORT', 465))
|
|
MAIL_USE_TLS = False
|
|
MAIL_USE_SSL = True
|
|
MAIL_USERNAME = environ.get('MAIL_USERNAME')
|
|
MAIL_PASSWORD = environ.get('MAIL_PASSWORD')
|
|
MAIL_DEFAULT_SENDER = ('eveAI Admin', MAIL_USERNAME)
|
|
|
|
SUPPORTED_FILE_TYPES = ['pdf', 'html', 'md', 'txt', 'mp3', 'mp4', 'ogg', 'srt']
|
|
|
|
|
|
|
|
|
|
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}
|
|
|
|
# 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)
|