Download agent.py from Yofran23/Venezuela: direct link, hf CLI and curl.
- Browser
- Download file 3.44 kB
-
https://huggingface.co/spaces/Yofran23/Venezuela/resolve/main/agent.py
- Command line
-
hf download hf://spaces/Yofran23/Venezuela/agent.py
-
curl -L -o agent.py https://huggingface.co/spaces/Yofran23/Venezuela/resolve/main/agent.py
3.44 kB
| import os | |
| import shutil | |
| import time | |
| from pathlib import Path | |
| import ai_processor as ai | |
| import database as db | |
| # Configuración de carpetas | |
| BASE_DIR = Path(os.path.dirname(os.path.abspath(__file__))) | |
| INPUT_DIR = BASE_DIR / "input_files" | |
| PROCESSED_DIR = BASE_DIR / "procesados" | |
| FAILED_DIR = BASE_DIR / "fallidos" | |
| def setup_dirs(): | |
| """Crea las carpetas necesarias si no existen.""" | |
| for d in [INPUT_DIR, PROCESSED_DIR, FAILED_DIR]: | |
| d.mkdir(parents=True, exist_ok=True) | |
| # Inicializar DB si no está inicializada | |
| db.init_db() | |
| print(f"Directorios listos: {INPUT_DIR.name}/, {PROCESSED_DIR.name}/, {FAILED_DIR.name}/") | |
| def procesar_archivo(file_path: Path): | |
| """Procesa un archivo individual y lo envía a la base de datos.""" | |
| print(f"\nProcesando: {file_path.name}") | |
| res = ai.extraer_lista(str(file_path)) | |
| if not res.get("procesable"): | |
| print(f"Error al procesar {file_path.name}: {res.get('error', 'Causa desconocida')}") | |
| # Mover a fallidos | |
| dest = FAILED_DIR / file_path.name | |
| shutil.move(str(file_path), str(dest)) | |
| return False | |
| personas = res.get("personas", []) | |
| if not personas: | |
| print(f"No se detectaron personas legibles en {file_path.name}.") | |
| dest = FAILED_DIR / file_path.name | |
| shutil.move(str(file_path), str(dest)) | |
| return False | |
| print(f"Se extrajeron {len(personas)} persona(s). Guardando en base de datos...") | |
| # Agregar a la DB | |
| resultado_db = db.agregar_personas_bulk( | |
| personas, | |
| hospital_default="Lista Automatizada", | |
| fuente="agente_automatico", | |
| saltar_duplicados=True | |
| ) | |
| agregados = resultado_db.get("agregados", 0) | |
| omitidos = resultado_db.get("omitidos", 0) | |
| print(f"Resultados: {agregados} agregados, {omitidos} omitidos (duplicados).") | |
| # Mover a procesados | |
| dest = PROCESSED_DIR / file_path.name | |
| try: | |
| shutil.move(str(file_path), str(dest)) | |
| print(f"Archivo movido a {PROCESSED_DIR.name}/") | |
| except Exception as e: | |
| print(f"Error al mover el archivo: {e}") | |
| return True | |
| def correr_agente(modo_continuo=False): | |
| setup_dirs() | |
| print("Agente de extraccion iniciado.") | |
| while True: | |
| archivos = [] | |
| for ext in ai.TIPOS_IMAGEN | ai.TIPOS_PDF | ai.TIPOS_EXCEL: | |
| archivos.extend(INPUT_DIR.glob(f"*{ext}")) | |
| archivos.extend(INPUT_DIR.glob(f"*{ext.upper()}")) | |
| archivos = list(set(archivos)) # Eliminar duplicados si hay cruce | |
| if archivos: | |
| print(f"\nEncontrados {len(archivos)} archivo(s) para procesar.") | |
| for file_path in archivos: | |
| procesar_archivo(file_path) | |
| time.sleep(2) # Pausa breve para evitar rate limits si usa la API gratuita | |
| if not modo_continuo: | |
| print("\nProcesamiento por lotes finalizado.") | |
| break | |
| print("\nEsperando nuevos archivos en 'input_files/'... (Presiona Ctrl+C para salir)") | |
| time.sleep(10) | |
| if __name__ == "__main__": | |
| import argparse | |
| parser = argparse.ArgumentParser(description="Agente automático de procesamiento de listas") | |
| parser.add_argument("--continuo", action="store_true", help="Mantener el agente ejecutándose esperando archivos nuevos.") | |
| args = parser.parse_args() | |
| correr_agente(modo_continuo=args.continuo) | |