from src.TextManager.biblioteca import Biblioteca from src.TextManager.biblioteca_mmr import BibliotecaRepo from src.Llms.Embedders.Openai_embedder import OpenAIEmbedder from src.ApiKeys.openai_apikey_mmr import OpenAICredencialRepo from src.ConexionSql.Postgres_conexion import PostgresConexion from src.TextManager.nota import Nota from src.TextManager.notas_biblioteca_mmr import generar_tabla_nota_para_biblioteca, NotaRepo from sqlalchemy import MetaData def crear_biblioteca(nombre_biblioteca: str, conexion: PostgresConexion, descripcion: str): cred_repo = OpenAICredencialRepo(conexion) credencial = cred_repo.get_by_id("OPAK20250510-ac2cea8af3110632314") embedder = OpenAIEmbedder(credencial, model="text-embedding-3-large") biblioteca = Biblioteca(nombre=nombre_biblioteca, embedder=embedder, descripcion=descripcion) repo = BibliotecaRepo(conexion) repo.add(biblioteca=biblioteca) biblioteca.generar_modelo_notas(conexion) return { "mensaje": f"Biblioteca '{nombre_biblioteca}' creada con éxito.", "id": biblioteca.id } def listar_bibliotecas(conexion: PostgresConexion) -> list[dict]: repo = BibliotecaRepo(conexion) bibliotecas: list[Biblioteca] = repo.get_all() return [ { "id": b.id, "nombre": b.nombre, "descripcion": b.descripcion, "vector_dim": b.vector_dim } for b in bibliotecas ] def agregar_nota_a_biblioteca( conexion: PostgresConexion, biblioteca_id: str, titulo: str, texto: str = "", tags: list[str] = None, conexiones: list[str] = None, resumen: str = "" ): print("[INFO] Iniciando el proceso de agregar nota a la biblioteca...") # Obtener la biblioteca print(f"[INFO] Buscando biblioteca con ID: {biblioteca_id}") repo_biblioteca = BibliotecaRepo(conexion) biblioteca = repo_biblioteca.get_by_id(biblioteca_id) if biblioteca is None: print(f"[ERROR] No se encontró la biblioteca con ID {biblioteca_id}") raise ValueError(f"No se encontró la biblioteca con ID {biblioteca_id}") print(f"[INFO] Biblioteca encontrada: {biblioteca.nombre} (vector_dim={biblioteca.vector_dim})") # Crear objeto Nota print(f"[INFO] Creando objeto Nota con título: {titulo}") nota = Nota( titulo=titulo, texto=texto, tags=tags or [], conexiones=conexiones or [], resumen=resumen or "", # vector=biblioteca.embedder.embed_text(texto), # vector_resumen=biblioteca.embedder.embed_text(resumen) if resumen else None ) # Mostrar atributos seguros print( f"[DEBUG] Nota creada: titulo='{nota.titulo}', " f"texto_len={len(nota.texto)}, " f"tags={len(nota.tags)}, " f"conexiones={len(nota.conexiones)}, " f"resumen_len={len(nota.resumen)}" ) # Preparar tabla y modelo de nota print(f"[INFO] Generando tabla y modelo de Nota para la biblioteca: {biblioteca.nombre}") metadata = MetaData() tabla, ModeloNota = generar_tabla_nota_para_biblioteca( biblioteca.nombre, biblioteca.vector_dim, metadata ) print(f"[INFO] Creando tabla en la base de datos si no existe...") metadata.create_all(conexion.get_engine()) print(f"[INFO] Tabla '{tabla.name}' verificada/creada.") # Guardar la nota print(f"[INFO] Guardando nota en la base de datos...") repo_nota = NotaRepo(conexion.get_session(), ModeloNota) nota_id = repo_nota.add(nota) print(f"[INFO] Nota guardada con ID: {nota_id}") resultado = { "mensaje": f"Nota '{titulo}' agregada con éxito a la biblioteca '{biblioteca.nombre}'.", "nota_id": nota_id } print(f"[SUCCESS] {resultado['mensaje']}") return resultado def listar_notas_de_biblioteca(conexion: PostgresConexion, biblioteca_id: str) -> list[dict]: repo_biblioteca = BibliotecaRepo(conexion) biblioteca = repo_biblioteca.get_by_id(biblioteca_id) if not biblioteca: raise ValueError(f"No se encontró la biblioteca con ID: {biblioteca_id}") metadata = MetaData() tabla, ModeloNota = generar_tabla_nota_para_biblioteca(biblioteca.nombre, biblioteca.vector_dim, metadata) metadata.create_all(conexion.get_engine()) repo_nota = NotaRepo(conexion.get_session(), ModeloNota) notas = repo_nota.get_all() return [ { "id": n.id, "titulo": n.titulo, "tags": n.tags, "texto": n.texto, "resumen": n.resumen, "conexiones": n.conexiones } for n in notas ]