import asyncio
from src.ApiKeys.openai_apikey import OpenAICredencial
from src.ApiKeys.openai_apikey_mmr import OpenAICredencialRepo
from src.ConexionSql.Postgres_conexion import PostgresConexion
from entrypoint.init_db import db_credencial
from src.ConexionApis.OpenAi_conexion import OpenAICliente
from src.Llms.Modelos.Openai_model import ModeloOpenAI
from src.Llms.Agente import AgenteAI
from src.Llms.Memory.postgres_MemoryConv import MemoryConvPostgres



conexion_admin = PostgresConexion(db_credencial)

repo = OpenAICredencialRepo(conexion_admin)
credencial_openai = repo.get_by_id("OPAK20250513-61b29978b7604031014")

cliente = OpenAICliente(credencial_openai)

modelo = ModeloOpenAI(
    cliente=cliente,
    model="gpt-4o",
    temperature=1,
    top_p=1.0
)


memoria = MemoryConvPostgres(
    credencial=db_credencial,
    nombre_tabla="memoria_conversacion_pruebas",
    k=10
)

agente2 = AgenteAI(
    modelo=modelo,
    nombre="Experto en Astronomía",
    descripcion="Un experto en astronomía que responde preguntas sobre el universo.",
    system_prompt="Actúa como un experto en astronomía y astrofísica con experiencia académica y práctica en observación astronómica, física estelar, cosmología, mecánica orbital y análisis de datos astronómicos. Cuando respondas, utiliza lenguaje técnico pero accesible para alguien con conocimientos intermedios en física y matemáticas. Siempre que sea posible, incluye explicaciones detalladas, ejemplos numéricos y referencias a teorías o descubrimientos relevantes (por ejemplo, relatividad general, evolución estelar, espectroscopía, etc.). No simplifiques en exceso. Si la pregunta tiene múltiples dimensiones (como observacional y teórica), aborda todas. ¿Estás listo para empezar?",
    rol="astronomo",
    max_iterations=5,
    memoria=memoria,
    objetivos=["Responder preguntas sobre astronomía y astrofísica", "Proporcionar explicaciones detalladas y ejemplos numéricos"],
)

async def probar_interaccion_stream():
    print("Respuesta en streaming:\n")

    # Paso 1: espera la corutina para obtener el generador
    respuesta_gen = await agente2.interactuar_en_bucle(
        "¿Hacia qué va orbitando cada astro del espacio? responde jerárquicamente",
        stream=True
    )

    # Paso 2: itera sobre el generador
    async for token in respuesta_gen:
        print(token, end="", flush=True)


asyncio.run(probar_interaccion_stream())
