final-agent-course / agent.py
jjvelezo's picture
Update agent.py
5bafa85 verified
import os
import requests
from huggingface_hub import hf_api
import time
# Cargar el token de Hugging Face desde el entorno
HF_TOKEN = os.getenv("HF_TOKEN")
MODEL_NAME = os.getenv("MODEL_NAME", "google/gemma-2b-it")
print("HF_TOKEN desde agent.py:", HF_TOKEN[:10] if HF_TOKEN else "NO DEFINIDO")
# Función para llamar al modelo y obtener respuesta
def call_model(prompt, max_retries=5, wait_seconds=10):
"""
Llama al modelo de Hugging Face y devuelve la respuesta generada.
Reintenta si el modelo aún se está cargando.
"""
headers = {
"Authorization": f"Bearer {HF_TOKEN}",
"Content-Type": "application/json"
}
payload = {
"inputs": prompt,
"parameters": {"max_new_tokens": 512}
}
for attempt in range(1, max_retries + 1):
try:
response = requests.post(
f"https://api-inference.huggingface.co/models/{MODEL_NAME}",
headers=headers,
json=payload,
timeout=60
)
result = response.json()
# Verificar si hay un error
if isinstance(result, dict) and result.get("error"):
error_msg = result["error"]
print(f"[Intento {attempt}] Error del modelo: {error_msg}")
if "is currently loading" in error_msg and attempt < max_retries:
print(f"🔁 Esperando {wait_seconds} segundos antes de reintentar...")
time.sleep(wait_seconds)
continue
else:
raise ValueError(f"Error al procesar la solicitud: {error_msg}")
# Respuesta válida
return result[0]["generated_text"] if isinstance(result, list) else result
except requests.exceptions.RequestException as e:
print(f"[Intento {attempt}] Error de red: {e}")
if attempt < max_retries:
time.sleep(wait_seconds)
continue
else:
raise ValueError(f"Error de conexión con el modelo: {str(e)}")
except Exception as e:
raise ValueError(f"Error al obtener respuesta del modelo: {str(e)}")
def wait_for_model():
"""
Espera hasta que el modelo esté completamente cargado y disponible para hacer solicitudes.
"""
headers = {
"Authorization": f"Bearer {HF_TOKEN}",
"Content-Type": "application/json"
}
print(f"Esperando que el modelo {MODEL_NAME} esté completamente cargado...")
while True:
try:
response = requests.get(
f"https://api-inference.huggingface.co/models/{MODEL_NAME}",
headers=headers,
timeout=30
)
if response.status_code == 200:
json_response = response.json()
if isinstance(json_response, dict) and json_response.get("status") == "loaded":
print(f"✅ Modelo {MODEL_NAME} completamente cargado.")
break
else:
print(f"⏳ Modelo aún cargando... Estado actual: {json_response.get('status', 'desconocido')}")
else:
print(f"❌ Estado inesperado: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"🌐 Error de red: {e}")
time.sleep(10) # Espera 10 segundos antes del siguiente intento
# Clase para representar la lógica del agente
class Agente:
def __init__(self):
self.name = "Agente Hugging Face"
self.version = "1.0"
def procesar_pregunta(self, pregunta):
"""
Procesa la pregunta y devuelve la respuesta generada por el modelo.
"""
print(f"Procesando pregunta: {pregunta}")
try:
respuesta = call_model(pregunta)
return respuesta
except ValueError as e:
print(f"Error al procesar la pregunta: {e}")
return f"ERROR: {e}"
# Función para ejecutar la evaluación de preguntas
def evaluar_preguntas(preguntas):
"""
Toma una lista de preguntas, las procesa y devuelve las respuestas generadas.
"""
agente = Agente()
respuestas = []
# Esperar a que el modelo esté listo
wait_for_model()
for pregunta in preguntas:
print(f"Evaluando: {pregunta}")
respuesta = agente.procesar_pregunta(pregunta)
respuestas.append(respuesta)
return respuestas