""" Constants Configuration Module Contains all fixed constant definitions, such as model names, markers, filenames, etc. """ import json import os from dotenv import load_dotenv # Load .env file load_dotenv() # --- Model Related Constants --- MODEL_NAME = os.environ.get('MODEL_NAME', 'AI-Studio_Proxy_API') CHAT_COMPLETION_ID_PREFIX = os.environ.get('CHAT_COMPLETION_ID_PREFIX', 'chatcmpl-') DEFAULT_FALLBACK_MODEL_ID = os.environ.get('DEFAULT_FALLBACK_MODEL_ID', "no model list") # --- Default Parameter Values --- DEFAULT_TEMPERATURE = float(os.environ.get('DEFAULT_TEMPERATURE', '1.0')) DEFAULT_MAX_OUTPUT_TOKENS = int(os.environ.get('DEFAULT_MAX_OUTPUT_TOKENS', '65536')) DEFAULT_TOP_P = float(os.environ.get('DEFAULT_TOP_P', '0.95')) # --- Default Feature Toggles --- ENABLE_URL_CONTEXT = os.environ.get('ENABLE_URL_CONTEXT', 'false').lower() in ('true', '1', 'yes') ENABLE_THINKING_BUDGET = os.environ.get('ENABLE_THINKING_BUDGET', 'false').lower() in ('true', '1', 'yes') DEFAULT_THINKING_BUDGET = int(os.environ.get('DEFAULT_THINKING_BUDGET', '8192')) # Separate defaults for Pro (2 levels) and Flash (4 levels) _raw_level_pro = os.environ.get("DEFAULT_THINKING_LEVEL_PRO", "high").lower() DEFAULT_THINKING_LEVEL_PRO = ( _raw_level_pro if _raw_level_pro in ("high", "low") else "high" ) _raw_level_flash = os.environ.get("DEFAULT_THINKING_LEVEL_FLASH", "high").lower() DEFAULT_THINKING_LEVEL_FLASH = ( _raw_level_flash if _raw_level_flash in ("high", "medium", "low", "minimal") else "high" ) ENABLE_GOOGLE_SEARCH = os.environ.get('ENABLE_GOOGLE_SEARCH', 'false').lower() in ('true', '1', 'yes') # Default Stop Sequences - Support JSON format configuration try: DEFAULT_STOP_SEQUENCES = json.loads(os.environ.get('DEFAULT_STOP_SEQUENCES', '["User:"]')) except (json.JSONDecodeError, TypeError): DEFAULT_STOP_SEQUENCES = ["User:"] # Fallback to default value # --- URL Patterns --- AI_STUDIO_URL_PATTERN = os.environ.get('AI_STUDIO_URL_PATTERN', 'aistudio.google.com/') MODELS_ENDPOINT_URL_CONTAINS = os.environ.get('MODELS_ENDPOINT_URL_CONTAINS', "MakerSuiteService/ListModels") # --- Input Markers --- USER_INPUT_START_MARKER_SERVER = os.environ.get('USER_INPUT_START_MARKER_SERVER', "__USER_INPUT_START__") USER_INPUT_END_MARKER_SERVER = os.environ.get('USER_INPUT_END_MARKER_SERVER', "__USER_INPUT_END__") # --- Filename Constants --- EXCLUDED_MODELS_FILENAME = os.environ.get('EXCLUDED_MODELS_FILENAME', "excluded_models.txt") # --- Stream State Configuration --- STREAM_TIMEOUT_LOG_STATE = { "consecutive_timeouts": 0, "last_error_log_time": 0.0, # Use time.monotonic() "suppress_until_time": 0.0, # Use time.monotonic() "max_initial_errors": int(os.environ.get("STREAM_MAX_INITIAL_ERRORS", "3")), "warning_interval_after_suppress": float( os.environ.get("STREAM_WARNING_INTERVAL_AFTER_SUPPRESS", "60.0") ), "suppress_duration_after_initial_burst": float( os.environ.get("STREAM_SUPPRESS_DURATION_AFTER_INITIAL_BURST", "400.0") ), }