ManualEmbAPI / app.py
Daniel00611's picture
Create app.py
39555a8 verified
raw
history blame
2.49 kB
from flask import Flask, request, jsonify
import chromadb
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
import os
from openai import OpenAI
app = Flask(__name__)
# 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="/app/chroma_db") # Usa la ruta dentro del contenedor
# 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):
"""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]
@app.route('/chat', methods=['POST'])
def chat():
"""Endpoint para generar respuestas usando OpenAI y ChromaDB"""
data = request.json
message = data.get("message", "")
system_message = data.get("system_message", "Eres un asistente virtual.")
max_tokens = data.get("max_tokens", 512)
temperature = data.get("temperature", 0.7)
top_p = data.get("top_p", 0.95)
if not message:
return jsonify({"error": "El campo 'message' es obligatorio."}), 400
# Obtener documentos relevantes
contexto = obtener_extractos(message)
# Construir el mensaje del sistema con el contexto
system_message_final = f"""{system_message}
Información relevante extraída de los documentos:
{contexto}
"""
messages = [
{"role": "system", "content": system_message_final},
{"role": "user", "content": message}
]
try:
# Llamar a la API de OpenAI
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
max_tokens=max_tokens,
temperature=temperature,
top_p=top_p
)
completion = response.choices[0].message.content
return jsonify({"response": completion, "context": contexto})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(host="0.0.0.0", port=7860)