From b34d52036e3404020ce17271a877a9d4c3e58dcc Mon Sep 17 00:00:00 2001 From: egutierrez Date: Sat, 10 May 2025 20:08:51 +0200 Subject: [PATCH] endpoint_biblioteca_funcionando --- Apikeys_embedding.ipynb | 2 +- backend/api/v1/endpoints/ping.py | 2 +- backend/api/v1/endpoints/text_manager.py | 26 --------------- .../api/v1/endpoints/text_manager_endpoint.py | 21 ++++++++++++ backend/api/v1/router.py | 4 +-- backend/db/conexion.py | 23 ++++--------- backend/services/text_manager.py | 30 +++++++++++++++++ borrar_pycache.py | 17 ++++++++++ entrypoint/init_db.py | 2 +- frontend/src/components/LlamadorAPI.tsx | 2 +- src/ConexionSql/Base_conexion.py | 33 +++++++++++++++++-- src/ConexionSql/Postgres_conexion.py | 16 ++++++--- 12 files changed, 123 insertions(+), 55 deletions(-) delete mode 100644 backend/api/v1/endpoints/text_manager.py create mode 100644 backend/api/v1/endpoints/text_manager_endpoint.py create mode 100644 backend/services/text_manager.py create mode 100644 borrar_pycache.py diff --git a/Apikeys_embedding.ipynb b/Apikeys_embedding.ipynb index b8d265f..b7a974c 100644 --- a/Apikeys_embedding.ipynb +++ b/Apikeys_embedding.ipynb @@ -121,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "943d0deb", "metadata": {}, "outputs": [ diff --git a/backend/api/v1/endpoints/ping.py b/backend/api/v1/endpoints/ping.py index c07cffb..ae9322c 100644 --- a/backend/api/v1/endpoints/ping.py +++ b/backend/api/v1/endpoints/ping.py @@ -4,6 +4,6 @@ from fastapi import APIRouter router = APIRouter() -@router.get("/ping") +@router.get("/") async def ping(): return {"message": "pong"} diff --git a/backend/api/v1/endpoints/text_manager.py b/backend/api/v1/endpoints/text_manager.py deleted file mode 100644 index a71ea68..0000000 --- a/backend/api/v1/endpoints/text_manager.py +++ /dev/null @@ -1,26 +0,0 @@ -from fastapi import APIRouter, HTTPException -from pydantic import BaseModel -from typing import Optional -from backend.db.conexion import get_conexion -from src.TextManager.biblioteca import Biblioteca - -router = APIRouter() - -class BibliotecaIn(BaseModel): - nombre: str - descripcion: Optional[str] = "" - vector_dim: Optional[int] = None - -@router.post("/") -def crear_biblioteca(biblio: BibliotecaIn): - try: - biblioteca = Biblioteca( - nombre=biblio.nombre, - descripcion=biblio.descripcion, - vector_dim=biblio.vector_dim - ) - conexion = get_conexion() - modelo = biblioteca.generar_modelo_notas(conexion) - return {"id": biblioteca.id, "modelo": str(modelo.__name__)} - except Exception as e: - raise HTTPException(status_code=400, detail=str(e)) diff --git a/backend/api/v1/endpoints/text_manager_endpoint.py b/backend/api/v1/endpoints/text_manager_endpoint.py new file mode 100644 index 0000000..f497391 --- /dev/null +++ b/backend/api/v1/endpoints/text_manager_endpoint.py @@ -0,0 +1,21 @@ +# backend/api/v1/biblioteca.py +from fastapi import APIRouter, Depends +from pydantic import BaseModel +from backend.db.conexion import get_conexion +from backend.services.text_manager import crear_biblioteca +from src.ConexionSql.Postgres_conexion import PostgresConexion + +router = APIRouter() + +class BibliotecaInput(BaseModel): + nombre_biblioteca: str + descripcion: str + +@router.post("/") +def crear_biblioteca_endpoint( + data: BibliotecaInput, + conexion: PostgresConexion = Depends(get_conexion) +): + return crear_biblioteca(nombre_biblioteca=data.nombre_biblioteca, + descripcion=data.descripcion, + conexion=conexion) diff --git a/backend/api/v1/router.py b/backend/api/v1/router.py index 52140eb..c97b716 100644 --- a/backend/api/v1/router.py +++ b/backend/api/v1/router.py @@ -1,8 +1,8 @@ # backend/api/router.py from fastapi import APIRouter -from backend.api.v1.endpoints import ping, nota, text_manager +from backend.api.v1.endpoints import ping, text_manager_endpoint router = APIRouter() router.include_router(ping.router, prefix="/api/v1/ping") -router.include_router(text_manager.router, prefix="/api/v1/bibliotecas") \ No newline at end of file +router.include_router(text_manager_endpoint.router, prefix="/api/v1/text_manager") diff --git a/backend/db/conexion.py b/backend/db/conexion.py index 514653f..f638259 100644 --- a/backend/db/conexion.py +++ b/backend/db/conexion.py @@ -1,19 +1,10 @@ +# backend/db/conexion.py +from entrypoint.init_db import db_credencial from src.ConexionSql.Postgres_conexion import PostgresConexion -from src.Credenciales.postgres_credencial import PostgresCredencial -from dotenv import load_dotenv -import os -from entrypoint import ENV_PATH - -# Cargar .env -load_dotenv(ENV_PATH) def get_conexion(): - db_credencial = PostgresCredencial( - titulo=os.getenv("DB_TITLE"), - user=os.getenv("DB_USER"), - password=os.getenv("DB_PASSWORD"), - host=os.getenv("DB_HOST"), - port=os.getenv("DB_PORT"), - dbname=os.getenv("DB_NAME") - ) - return PostgresConexion(db_credencial) \ No newline at end of file + conexion = PostgresConexion(db_credencial) + try: + yield conexion + finally: + conexion.close() \ No newline at end of file diff --git a/backend/services/text_manager.py b/backend/services/text_manager.py new file mode 100644 index 0000000..fdc5e64 --- /dev/null +++ b/backend/services/text_manager.py @@ -0,0 +1,30 @@ +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 backend.db.conexion import get_conexion + + +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 + } + + +if __name__ == "__main__": + crear_biblioteca("hola_intento5") \ No newline at end of file diff --git a/borrar_pycache.py b/borrar_pycache.py new file mode 100644 index 0000000..3136839 --- /dev/null +++ b/borrar_pycache.py @@ -0,0 +1,17 @@ +import os +import shutil + +def eliminar_pycache(directorio): + eliminados = 0 + for root, dirs, files in os.walk(directorio): + for d in dirs: + if d == "__pycache__": + ruta = os.path.join(root, d) + print(f"🗑️ Eliminando: {ruta}") + shutil.rmtree(ruta) + eliminados += 1 + print(f"\n✅ Eliminados {eliminados} directorios '__pycache__'.") + +if __name__ == "__main__": + ruta_raiz = os.path.dirname(os.path.abspath(__file__)) # Carpeta actual + eliminar_pycache(ruta_raiz) diff --git a/entrypoint/init_db.py b/entrypoint/init_db.py index e7672e3..1d97fc9 100644 --- a/entrypoint/init_db.py +++ b/entrypoint/init_db.py @@ -43,7 +43,7 @@ def init_db(): # Crear engine desde la clase de conexión PostgreSQL conexion = PostgresConexion(db_credencial) - engine = conexion.engine # Recuperamos el engine directamente + engine = conexion.get_engine() # Recuperamos el engine directamente print("Creando tablas...") Base.metadata.create_all(engine) diff --git a/frontend/src/components/LlamadorAPI.tsx b/frontend/src/components/LlamadorAPI.tsx index 4426f37..3ff349a 100644 --- a/frontend/src/components/LlamadorAPI.tsx +++ b/frontend/src/components/LlamadorAPI.tsx @@ -13,7 +13,7 @@ import { MetodoSelect } from './MetodoSelect'; import { useMantineTheme } from '@mantine/core'; export function LlamadorAPI() { - const [direccion, setDireccion] = useState('http://localhost:8000/api/saludo'); + const [direccion, setDireccion] = useState('http://localhost:8000/api/v1/ping/'); const [metodo, setMetodo] = useState('GET'); const [contenido, setContenido] = useState(''); const [respuesta, setRespuesta] = useState(''); diff --git a/src/ConexionSql/Base_conexion.py b/src/ConexionSql/Base_conexion.py index 36a153f..975bcd3 100644 --- a/src/ConexionSql/Base_conexion.py +++ b/src/ConexionSql/Base_conexion.py @@ -1,12 +1,39 @@ from abc import ABC, abstractmethod -from sqlalchemy.orm import Session +from datetime import datetime, timezone +from sqlalchemy.orm import Session, sessionmaker from sqlalchemy.engine import Engine +from sqlalchemy import create_engine, text +from sqlalchemy.exc import SQLAlchemyError class ConexionBase(ABC): + def __init__(self, uri: str): + self.estado = "pendiente" + self.timestamp = datetime.now(timezone.utc) + self._engine: Engine = create_engine(uri) + self._Session = sessionmaker(bind=self._engine) + self._session_instance: Session | None = None + @abstractmethod def get_session(self) -> Session: - pass + if self._session_instance is None: + self._session_instance = self._Session() + return self._session_instance @abstractmethod def get_engine(self) -> Engine: - pass \ No newline at end of file + return self._engine + + def probar_conexion(self) -> bool: + try: + with self._engine.connect() as connection: + connection.execute(text("SELECT 1")) + self.estado = "exito" + return True + except SQLAlchemyError: + self.estado = "fallo" + return False + + def close(self): + if self._session_instance is not None: + self._session_instance.close() + self._session_instance = None \ No newline at end of file diff --git a/src/ConexionSql/Postgres_conexion.py b/src/ConexionSql/Postgres_conexion.py index e8fe04c..4141dd3 100644 --- a/src/ConexionSql/Postgres_conexion.py +++ b/src/ConexionSql/Postgres_conexion.py @@ -4,7 +4,6 @@ from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import sessionmaker, Session from sqlalchemy.engine import Engine - from src.ConexionSql.Base_conexion import ConexionBase from src.Credenciales.postgres_credencial import PostgresCredencial @@ -32,10 +31,14 @@ class PostgresConexion(ConexionBase): self._engine: Engine = create_engine(uri) self._Session = sessionmaker(bind=self._engine) + # ✅ INICIALIZAR LA SESIÓN AQUÍ + self._session_instance: Session | None = None def get_session(self) -> Session: - return self._Session() - + if self._session_instance is None: + self._session_instance = self._Session() + return self._session_instance + def get_engine(self) -> Engine: return self._engine @@ -47,4 +50,9 @@ class PostgresConexion(ConexionBase): return True except SQLAlchemyError: self.estado = "fallo" - return False \ No newline at end of file + return False + + def close(self): + if self._session_instance is not None: + self._session_instance.close() + self._session_instance = None