628cddc3ae
- Updated LoggerDB to remove all active sinks on initialization. - Added a new PostgresCredencial setup in notas_mmr.py for database connection. - Replaced print statements with logger calls for better logging in notas_mmr.py. - Introduced new FastAPI endpoints for various chart types (bar, line, pie, scatter). - Created Editor_biblioteca.css for styling the rich text editor. - Implemented Editor_Test.tsx to test the rich text editor functionality.
189 lines
6.6 KiB
Python
189 lines
6.6 KiB
Python
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_mmr import generar_tabla_nota_para_biblioteca, NotaRepo
|
|
from sqlalchemy import MetaData
|
|
from backend.schemas.text_manager_schema import NotaInput
|
|
|
|
from entrypoint.init_db import db_credencial
|
|
from src.Logger.logger_db import LoggerDB, logger
|
|
LoggerDB(db_credencial, "logger_textos", created_by="sistema")
|
|
|
|
def crear_biblioteca(nombre_biblioteca: str, conexion: PostgresConexion, descripcion: str = None):
|
|
logger.info("[INICIO] Creando biblioteca...")
|
|
|
|
try:
|
|
logger.info("[Paso 1] Obteniendo credencial...")
|
|
cred_repo = OpenAICredencialRepo(conexion)
|
|
credencial = cred_repo.get_by_id("OPAK20250513-61b29978b7604031014")
|
|
logger.debug(f"[OK] Credencial obtenida: {credencial.titulo if credencial else '❌ None'}")
|
|
|
|
logger.info("[Paso 2] Instanciando embedder...")
|
|
embedder = OpenAIEmbedder(credencial, model="text-embedding-3-large")
|
|
logger.debug("[OK] Embedder instanciado")
|
|
|
|
logger.info("[Paso 3] Instanciando biblioteca...")
|
|
biblioteca = Biblioteca(
|
|
nombre=nombre_biblioteca,
|
|
embedder=embedder,
|
|
descripcion=descripcion
|
|
)
|
|
logger.debug(f"[OK] Biblioteca instanciada con ID: {biblioteca.id}")
|
|
|
|
logger.info("[Paso 4] Guardando en base de datos...")
|
|
repo = BibliotecaRepo(conexion)
|
|
repo.add(biblioteca=biblioteca)
|
|
logger.success("[OK] Biblioteca guardada")
|
|
|
|
logger.info("[Paso 5] Generando modelo de notas...")
|
|
biblioteca.generar_modelo_notas(conexion)
|
|
logger.success("[OK] Modelo de notas generado")
|
|
|
|
logger.success("[FIN] Biblioteca creada correctamente")
|
|
return {
|
|
"mensaje": f"Biblioteca '{nombre_biblioteca}' creada con éxito.",
|
|
"id": biblioteca.id
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.exception("[ERROR] Ocurrió una excepción:")
|
|
raise
|
|
|
|
|
|
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 = ""
|
|
):
|
|
repo_biblioteca = BibliotecaRepo(conexion)
|
|
biblioteca = repo_biblioteca.get_by_id(biblioteca_id)
|
|
if biblioteca is None:
|
|
raise ValueError(f"No se encontró la biblioteca con ID {biblioteca_id}")
|
|
|
|
nota = Nota(
|
|
titulo=titulo,
|
|
texto=texto,
|
|
tags=tags or [],
|
|
conexiones=conexiones or [],
|
|
resumen=resumen or "",
|
|
)
|
|
logger.debug(
|
|
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)}"
|
|
)
|
|
|
|
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)
|
|
nota_id = repo_nota.add(nota)
|
|
|
|
resultado = {
|
|
"mensaje": f"Nota '{titulo}' agregada con éxito a la biblioteca '{biblioteca.nombre}'.",
|
|
"nota_id": nota_id
|
|
}
|
|
|
|
logger.success(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
|
|
]
|
|
|
|
|
|
def eliminar_nota(conexion: PostgresConexion, biblioteca_id: str, nota_id: str) -> 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()
|
|
_, 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)
|
|
fue_eliminada = repo_nota.delete_by_id(nota_id)
|
|
|
|
if fue_eliminada:
|
|
logger.success(f"Nota '{nota_id}' eliminada correctamente.")
|
|
return {"mensaje": f"Nota '{nota_id}' eliminada correctamente."}
|
|
else:
|
|
raise ValueError(f"No se encontró la nota con ID: {nota_id}")
|
|
|
|
|
|
def actualizar_nota(conexion: PostgresConexion, biblioteca_id: str, nota_id: str, nota_input: NotaInput) -> 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()
|
|
_, 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)
|
|
nota_actualizada = Nota(
|
|
titulo=nota_input.titulo,
|
|
texto=nota_input.texto,
|
|
tags=nota_input.tags or [],
|
|
conexiones=nota_input.conexiones or [],
|
|
resumen=nota_input.resumen or ""
|
|
)
|
|
fue_actualizada = repo_nota.update(nota_id, nota_actualizada)
|
|
|
|
if fue_actualizada:
|
|
logger.success(f"Nota '{nota_id}' actualizada correctamente.")
|
|
return {"mensaje": f"Nota '{nota_id}' actualizada correctamente."}
|
|
else:
|
|
raise ValueError(f"No se encontró la nota con ID: {nota_id}")
|