Daniel00611 commited on
Commit
37d659a
verified
1 Parent(s): a17773a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -26
app.py CHANGED
@@ -1,11 +1,13 @@
1
- from flask import Flask, request, jsonify
 
2
  import chromadb
3
  from langchain_community.vectorstores import Chroma
4
  from langchain_openai import OpenAIEmbeddings
5
  import os
6
  from openai import OpenAI
7
 
8
- app = Flask(__name__)
 
9
 
10
  # Configurar la API Key de OpenAI
11
  OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
@@ -14,7 +16,7 @@ OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
14
  client = OpenAI(api_key=OPENAI_API_KEY)
15
 
16
  # Inicializar el cliente de ChromaDB en Hugging Face Space
17
- chroma_client = chromadb.PersistentClient(path="/app/chroma_db") # Usa la ruta dentro del contenedor
18
 
19
  # Cargar la base de datos de Chroma como un vector store
20
  vectorstore = Chroma(
@@ -26,36 +28,35 @@ vectorstore = Chroma(
26
  # Crear un retriever
27
  retriever = vectorstore.as_retriever()
28
 
29
- def obtener_extractos(pregunta):
30
  """Obtiene documentos relevantes desde ChromaDB"""
31
  docs_relevantes = retriever.invoke(pregunta)
32
  return [(doc.page_content, doc.metadata.get("url", "URL no disponible")) for doc in docs_relevantes]
33
 
34
- @app.route('/chat', methods=['POST'])
35
- def chat():
36
- """Endpoint para generar respuestas usando OpenAI y ChromaDB"""
37
- data = request.json
38
- message = data.get("message", "")
39
- system_message = data.get("system_message", "Eres un asistente virtual.")
40
- max_tokens = data.get("max_tokens", 512)
41
- temperature = data.get("temperature", 0.7)
42
- top_p = data.get("top_p", 0.95)
43
-
44
- if not message:
45
- return jsonify({"error": "El campo 'message' es obligatorio."}), 400
46
 
 
 
 
 
47
  # Obtener documentos relevantes
48
- contexto = obtener_extractos(message)
49
 
50
  # Construir el mensaje del sistema con el contexto
51
- system_message_final = f"""{system_message}
52
  Informaci贸n relevante extra铆da de los documentos:
53
  {contexto}
54
  """
55
 
56
  messages = [
57
  {"role": "system", "content": system_message_final},
58
- {"role": "user", "content": message}
59
  ]
60
 
61
  try:
@@ -63,17 +64,18 @@ def chat():
63
  response = client.chat.completions.create(
64
  model="gpt-4o-mini",
65
  messages=messages,
66
- max_tokens=max_tokens,
67
- temperature=temperature,
68
- top_p=top_p
69
  )
70
 
71
  completion = response.choices[0].message.content
72
- return jsonify({"response": completion, "context": contexto})
73
 
74
  except Exception as e:
75
- return jsonify({"error": str(e)}), 500
76
 
 
77
  if __name__ == "__main__":
78
- from waitress import serve # Usa un servidor WSGI ligero
79
- serve(app, host="0.0.0.0", port=7860)
 
1
+ from fastapi import FastAPI, HTTPException
2
+ from pydantic import BaseModel
3
  import chromadb
4
  from langchain_community.vectorstores import Chroma
5
  from langchain_openai import OpenAIEmbeddings
6
  import os
7
  from openai import OpenAI
8
 
9
+ # Inicializar FastAPI
10
+ app = FastAPI()
11
 
12
  # Configurar la API Key de OpenAI
13
  OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
 
16
  client = OpenAI(api_key=OPENAI_API_KEY)
17
 
18
  # Inicializar el cliente de ChromaDB en Hugging Face Space
19
+ chroma_client = chromadb.PersistentClient(path="/app/chroma_db")
20
 
21
  # Cargar la base de datos de Chroma como un vector store
22
  vectorstore = Chroma(
 
28
  # Crear un retriever
29
  retriever = vectorstore.as_retriever()
30
 
31
+ def obtener_extractos(pregunta: str):
32
  """Obtiene documentos relevantes desde ChromaDB"""
33
  docs_relevantes = retriever.invoke(pregunta)
34
  return [(doc.page_content, doc.metadata.get("url", "URL no disponible")) for doc in docs_relevantes]
35
 
36
+ # Modelo de datos para la solicitud
37
+ class ChatRequest(BaseModel):
38
+ message: str
39
+ system_message: str = "Eres un asistente virtual."
40
+ max_tokens: int = 512
41
+ temperature: float = 0.7
42
+ top_p: float = 0.95
 
 
 
 
 
43
 
44
+ @app.post("/chat")
45
+ async def chat(request: ChatRequest):
46
+ """Endpoint para generar respuestas usando OpenAI y ChromaDB"""
47
+
48
  # Obtener documentos relevantes
49
+ contexto = obtener_extractos(request.message)
50
 
51
  # Construir el mensaje del sistema con el contexto
52
+ system_message_final = f"""{request.system_message}
53
  Informaci贸n relevante extra铆da de los documentos:
54
  {contexto}
55
  """
56
 
57
  messages = [
58
  {"role": "system", "content": system_message_final},
59
+ {"role": "user", "content": request.message}
60
  ]
61
 
62
  try:
 
64
  response = client.chat.completions.create(
65
  model="gpt-4o-mini",
66
  messages=messages,
67
+ max_tokens=request.max_tokens,
68
+ temperature=request.temperature,
69
+ top_p=request.top_p
70
  )
71
 
72
  completion = response.choices[0].message.content
73
+ return {"response": completion, "context": contexto}
74
 
75
  except Exception as e:
76
+ raise HTTPException(status_code=500, detail=str(e))
77
 
78
+ # Punto de entrada para ejecutar con Uvicorn en Hugging Face
79
  if __name__ == "__main__":
80
+ import uvicorn
81
+ uvicorn.run(app, host="0.0.0.0", port=7860)