Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI, HTTPException | |
| from pydantic import BaseModel | |
| import chromadb | |
| from langchain_community.vectorstores import Chroma | |
| from langchain_openai import OpenAIEmbeddings | |
| import os | |
| from openai import OpenAI | |
| import zipfile | |
| # Inicializar FastAPI | |
| app = FastAPI() | |
| # Configurar la API Key de OpenAI | |
| OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") | |
| # Inicializar el cliente de OpenAI | |
| client = OpenAI(api_key=OPENAI_API_KEY) | |
| # Inicializar el cliente de ChromaDB en Hugging Face Space | |
| chroma_client = chromadb.PersistentClient(path="chroma_db") | |
| # Cargar la base de datos de Chroma como un vector store | |
| vectorstore = Chroma( | |
| client=chroma_client, | |
| collection_name="docs", | |
| embedding_function=OpenAIEmbeddings(model="text-embedding-3-small", openai_api_key=OPENAI_API_KEY) | |
| ) | |
| # Crear un retriever | |
| retriever = vectorstore.as_retriever() | |
| def obtener_extractos(pregunta: str): | |
| """Obtiene documentos relevantes desde ChromaDB""" | |
| docs_relevantes = retriever.invoke(pregunta) | |
| return [(doc.page_content, doc.metadata.get("url", "URL no disponible")) for doc in docs_relevantes] | |
| # Modelo de datos para la solicitud | |
| class ChatRequest(BaseModel): | |
| message: str | |
| system_message: str = "Eres un asistente virtual." | |
| max_tokens: int = 512 | |
| temperature: float = 0.7 | |
| top_p: float = 0.95 | |
| async def chat(request: ChatRequest): | |
| """Endpoint para generar respuestas usando OpenAI y ChromaDB""" | |
| # Obtener documentos relevantes | |
| contexto = obtener_extractos(request.message) | |
| # Construir el mensaje del sistema con el contexto | |
| system_message_final = f"""{request.system_message} | |
| Información relevante extraída de los documentos: | |
| {contexto} | |
| """ | |
| messages = [ | |
| {"role": "system", "content": system_message_final}, | |
| {"role": "user", "content": request.message} | |
| ] | |
| print(messages) | |
| try: | |
| # Llamar a la API de OpenAI | |
| response = client.chat.completions.create( | |
| model="gpt-4o-mini", | |
| messages=messages, | |
| max_tokens=request.max_tokens, | |
| temperature=request.temperature, | |
| top_p=request.top_p | |
| ) | |
| completion = response.choices[0].message.content | |
| return {"response": completion, "context": contexto} | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) | |
| # Punto de entrada para ejecutar con Uvicorn en Hugging Face | |
| if __name__ == "__main__": | |
| import uvicorn | |
| uvicorn.run(app, host="0.0.0.0", port=7860) | |