Spaces:
Running
Running
# config.py | |
""" | |
Configuration file for Mistral OCR processing. | |
Contains API key and other settings. | |
""" | |
import os | |
import logging | |
from dotenv import load_dotenv | |
# Configure logging | |
logger = logging.getLogger("config") | |
# Load environment variables from .env file if it exists | |
load_dotenv() | |
# Mistral API key handling - get from Hugging Face secrets or environment variable | |
# The priority order is: | |
# 1. HF_MISTRAL_API_KEY environment var (for Hugging Face deployment) | |
# 2. MISTRAL_API_KEY environment var (standard environment variable) | |
# 3. Empty string (will show warning in app) | |
MISTRAL_API_KEY = os.environ.get("HF_MISTRAL_API_KEY", | |
os.environ.get("MISTRAL_API_KEY", "sfSLqRdW31yxodeYFz3m7Ky83X2V7jUH")).strip() | |
# Check if we're in test mode (allows operation without valid API key) | |
# Set to False to use actual API calls | |
TEST_MODE = False | |
# Just check if API key exists | |
if not MISTRAL_API_KEY and not TEST_MODE: | |
logger.warning("No Mistral API key found. OCR functionality will not work unless TEST_MODE is enabled.") | |
if TEST_MODE: | |
logger.info("TEST_MODE is enabled. Using mock responses instead of actual API calls.") | |
# Model settings with fallbacks | |
OCR_MODEL = os.environ.get("MISTRAL_OCR_MODEL", "mistral-ocr-latest") | |
TEXT_MODEL = os.environ.get("MISTRAL_TEXT_MODEL", "mistral-small-latest") # Updated from ministral-8b-latest | |
VISION_MODEL = os.environ.get("MISTRAL_VISION_MODEL", "mistral-small-latest") # Using faster model that supports vision | |
# Image preprocessing settings optimized for historical documents | |
# These can be customized from environment variables | |
IMAGE_PREPROCESSING = { | |
"enhance_contrast": float(os.environ.get("ENHANCE_CONTRAST", "1.8")), # Increased contrast for better text recognition | |
"sharpen": os.environ.get("SHARPEN", "True").lower() in ("true", "1", "yes"), | |
"denoise": os.environ.get("DENOISE", "True").lower() in ("true", "1", "yes"), | |
"max_size_mb": float(os.environ.get("MAX_IMAGE_SIZE_MB", "12.0")), # Increased size limit for better quality | |
"target_dpi": int(os.environ.get("TARGET_DPI", "300")), # Target DPI for scaling | |
"compression_quality": int(os.environ.get("COMPRESSION_QUALITY", "95")), # Higher quality for better OCR results | |
# Enhanced settings for handwritten documents | |
"handwritten": { | |
"contrast": float(os.environ.get("HANDWRITTEN_CONTRAST", "1.2")), # Lower contrast for handwritten text | |
"block_size": int(os.environ.get("HANDWRITTEN_BLOCK_SIZE", "21")), # Larger block size for adaptive thresholding | |
"constant": int(os.environ.get("HANDWRITTEN_CONSTANT", "5")), # Lower constant for adaptive thresholding | |
"use_dilation": os.environ.get("HANDWRITTEN_DILATION", "True").lower() in ("true", "1", "yes"), # Connect broken strokes | |
"clahe_limit": float(os.environ.get("HANDWRITTEN_CLAHE_LIMIT", "2.0")), # CLAHE limit for local contrast | |
"bilateral_d": int(os.environ.get("HANDWRITTEN_BILATERAL_D", "5")), # Bilateral filter window size | |
"bilateral_sigma1": int(os.environ.get("HANDWRITTEN_BILATERAL_SIGMA1", "25")), # Color sigma | |
"bilateral_sigma2": int(os.environ.get("HANDWRITTEN_BILATERAL_SIGMA2", "45")) # Space sigma | |
} | |
} | |
# OCR settings optimized for single-page performance | |
OCR_SETTINGS = { | |
"timeout_ms": int(os.environ.get("OCR_TIMEOUT_MS", "45000")), # Shorter timeout for single pages (45 seconds) | |
"max_retries": int(os.environ.get("OCR_MAX_RETRIES", "2")), # Fewer retries to avoid rate-limiting | |
"retry_delay": int(os.environ.get("OCR_RETRY_DELAY", "1")), # Shorter initial retry delay for faster execution | |
"include_image_base64": os.environ.get("INCLUDE_IMAGE_BASE64", "True").lower() in ("true", "1", "yes"), | |
"thread_count": int(os.environ.get("OCR_THREAD_COUNT", "2")) # Lower thread count to prevent API rate limiting | |
} |