68 lines
2.9 KiB
Python
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(100, 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()
|