ManualEmbAPI / app.py
Daniel00611's picture
Update app.py
ca4c4fc verified
raw
history blame
2.54 kB
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
@app.post("/chat")
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)