Files
IPSExtractor/application/config.py
T

68 lines
2.9 KiB
Python

"""Configuración centralizada de la aplicación.
Usa Pydantic BaseSettings para cargar valores por defecto y variables de entorno.
Se lee automáticamente un archivo `.env` en la raíz del proyecto si existe.
"""
from __future__ import annotations
from typing import Optional, Tuple
import logging
import os
# Cargar variables desde .env en el entorno (para que otros módulos que usan os.environ las vean)
try:
from dotenv import load_dotenv # type: ignore
# En desarrollo, dar precedencia al archivo .env sobre variables previas del entorno
load_dotenv(override=True)
except Exception:
pass
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import AliasChoices
class ApiSettings(BaseSettings):
"""Parámetros del backend compatible con OpenAI/Ollama (usando os.getenv)."""
base_url: str = os.getenv("EXTRACTOR_BASE_URL", "http://10.8.0.4:11434/v1")
api_key: str = os.getenv("EXTRACTOR_API_KEY", "ollama")
model: str = os.getenv("EXTRACTOR_MODEL", "gpt-4.1")
request_timeout_s: int = int(os.getenv("EXTRACTOR_TIMEOUT_S", 120))
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
class ImagingSettings(BaseSettings):
"""Parámetros de conversión de documentos a imágenes."""
poppler_path: Optional[str] = Field(None, validation_alias=AliasChoices("POPPLER_PATH"))
pdf_dpi: int = Field(600, validation_alias=AliasChoices("PDF_DPI"))
pdf_thread_count: int = Field(10, validation_alias=AliasChoices("PDF_THREAD_COUNT"))
tiff_pages: Optional[Tuple[int, int]] = Field((2, 3), validation_alias=AliasChoices("TIFF_PAGES"))
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
class RetrySettings(BaseSettings):
"""Estrategia de reintentos para llamadas al backend."""
max_attempts: int = Field(3, validation_alias=AliasChoices("RETRY_MAX_ATTEMPTS"))
wait_min_s: float = Field(1.0, validation_alias=AliasChoices("RETRY_WAIT_MIN_S"))
wait_max_s: float = Field(8.0, validation_alias=AliasChoices("RETRY_WAIT_MAX_S"))
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
class ProcessingSettings(BaseSettings):
"""Configuración de procesamiento y concurrencia."""
concurrency_limit: int = Field(20, validation_alias=AliasChoices("CONCURRENCY_LIMIT"))
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
class AppSettings(BaseSettings):
"""Configuración raíz agrupada."""
api: ApiSettings = ApiSettings()
imaging: ImagingSettings = ImagingSettings()
retry: RetrySettings = RetrySettings()
processing: ProcessingSettings = ProcessingSettings()
csv_delimiter: str = Field("|", validation_alias=AliasChoices("CSV_DELIMITER"))
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
settings = AppSettings()