77 lines
4.6 KiB
Python
77 lines
4.6 KiB
Python
"""Read local configuration without changing the process environment or storage."""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT_DIR = Path(__file__).resolve().parents[1]
|
|
ALLOWED_EXT = {'.png', '.jpg', '.jpeg', '.gif', '.webp', '.pdf', '.txt', '.csv'}
|
|
MAX_UPLOAD_MB = 10
|
|
|
|
|
|
def default_config():
|
|
from dotenv import dotenv_values
|
|
|
|
local_config = dotenv_values(ROOT_DIR / '.env', encoding='utf-8-sig', interpolate=False)
|
|
api_key = os.environ.get('DEEPSEEK_API_KEY', local_config.get('DEEPSEEK_API_KEY'))
|
|
rate_limit_value = os.environ.get('RATE_LIMIT_PER_MIN', local_config.get('RATE_LIMIT_PER_MIN', '600'))
|
|
try:
|
|
rate_limit_per_min = int(rate_limit_value)
|
|
except (TypeError, ValueError):
|
|
raise ValueError('RATE_LIMIT_PER_MIN must be a positive integer') from None
|
|
if rate_limit_per_min < 1:
|
|
raise ValueError('RATE_LIMIT_PER_MIN must be a positive integer')
|
|
return {
|
|
'DATABASE': ROOT_DIR / 'history.db',
|
|
'UPLOAD_DIR': ROOT_DIR / 'uploads',
|
|
'BACKUP_DIR': ROOT_DIR / 'backups',
|
|
'LOG_DIR': ROOT_DIR / 'logs',
|
|
'DEEPSEEK_API_KEY': (api_key or '').strip(),
|
|
'CHAT_API_KEY': str(os.environ.get('CHAT_API_KEY', local_config.get('CHAT_API_KEY')) or '').strip(),
|
|
'CHAT_USE_MODEL_TOOLS': str(os.environ.get('CHAT_USE_MODEL_TOOLS', local_config.get('CHAT_USE_MODEL_TOOLS', 'true'))).lower() in ('1', 'true', 'yes'),
|
|
'ASR_API_KEY': str(os.environ.get('ASR_API_KEY', local_config.get('ASR_API_KEY')) or '').strip(),
|
|
'ASR_PROVIDER': str(os.environ.get('ASR_PROVIDER', local_config.get('ASR_PROVIDER')) or 'baidu').strip().lower(),
|
|
'BAIDU_ASR_API_KEY': str(os.environ.get('BAIDU_ASR_API_KEY', local_config.get('BAIDU_ASR_API_KEY')) or '').strip(),
|
|
'BAIDU_ASR_SECRET_KEY': str(os.environ.get('BAIDU_ASR_SECRET_KEY', local_config.get('BAIDU_ASR_SECRET_KEY')) or '').strip(),
|
|
'FFMPEG_BIN': str(os.environ.get('FFMPEG_BIN', local_config.get('FFMPEG_BIN')) or '').strip(),
|
|
'ASR_URL': str(os.environ.get('ASR_URL', local_config.get('ASR_URL')) or
|
|
'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions').strip(),
|
|
'ASR_MODEL': str(os.environ.get('ASR_MODEL', local_config.get('ASR_MODEL')) or 'qwen3-asr-flash').strip(),
|
|
'ORDER_DATA_TENANT_ID': str(os.environ.get('ORDER_DATA_TENANT_ID', local_config.get('ORDER_DATA_TENANT_ID')) or '').strip(),
|
|
'CUSTOMER_DEMO_ENABLED': str(os.environ.get('CUSTOMER_DEMO_ENABLED', local_config.get('CUSTOMER_DEMO_ENABLED', 'true'))).lower() in ('1','true','yes'),
|
|
'CUSTOMER_DEMO_USERNAME': str(os.environ.get('CUSTOMER_DEMO_USERNAME', local_config.get('CUSTOMER_DEMO_USERNAME', 'admin')) or '').strip(),
|
|
'CUSTOMER_DEMO_PASSWORD_HASH': str(os.environ.get('CUSTOMER_DEMO_PASSWORD_HASH', local_config.get('CUSTOMER_DEMO_PASSWORD_HASH',
|
|
'pbkdf2:sha256:600000$vY5fe7GwJQRQbhKV$a4c4eeb96e2bda18bfa6b82d263c0cd61dead2e3f224f694e01fc497152df72f')) or ''),
|
|
'CUSTOMER_DEMO_TENANT_ID': str(os.environ.get('CUSTOMER_DEMO_TENANT_ID', local_config.get('CUSTOMER_DEMO_TENANT_ID')) or '').strip(),
|
|
'CUSTOMER_DEMO_LOCAL_ORDERS': str(os.environ.get('CUSTOMER_DEMO_LOCAL_ORDERS', local_config.get('CUSTOMER_DEMO_LOCAL_ORDERS', 'true'))).lower() in ('1','true','yes'),
|
|
'MODEL_URL': str(os.environ.get('MODEL_URL', local_config.get('MODEL_URL')) or 'https://api.deepseek.com/v1/chat/completions').strip(),
|
|
'MODEL_NAME': str(os.environ.get('MODEL_NAME', local_config.get('MODEL_NAME')) or 'deepseek-chat').strip(),
|
|
'MODEL_PROVIDER': str(os.environ.get('MODEL_PROVIDER', local_config.get('MODEL_PROVIDER')) or 'auto').strip(),
|
|
'MODEL_THINKING': str(os.environ.get('MODEL_THINKING', local_config.get('MODEL_THINKING')) or 'disabled').strip(),
|
|
'MODEL_TOOL_CHOICE': str(os.environ.get('MODEL_TOOL_CHOICE', local_config.get('MODEL_TOOL_CHOICE')) or 'required').strip(),
|
|
'MODEL_MAX_TOOL_ROUNDS': 3,
|
|
'MODEL_MAX_TOOL_CALLS': 6,
|
|
'MODEL_TURN_TIMEOUT': 75,
|
|
'MODEL_MAX_CONTEXT_CHARS': 24000,
|
|
'MODEL_MAX_EVIDENCE_CHARS': 24000,
|
|
'MAX_CONTEXT': 4,
|
|
'MAX_ANSWER_CHARS': 800,
|
|
'MAX_ANSWER_CHARS_EN': 1400,
|
|
'RATE_LIMIT_PER_MIN': rate_limit_per_min,
|
|
'ALLOWED_EXT': set(ALLOWED_EXT),
|
|
'MAX_UPLOAD_MB': MAX_UPLOAD_MB,
|
|
'HOST': '0.0.0.0',
|
|
'PORT': 5000,
|
|
'INITIALIZE_RUNTIME': True,
|
|
}
|
|
|
|
|
|
def get_setting(name):
|
|
try:
|
|
from flask import current_app, has_app_context
|
|
except ImportError:
|
|
return default_config()[name]
|
|
if has_app_context():
|
|
return current_app.config[name]
|
|
return default_config()[name]
|