Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -93,58 +93,59 @@ class ChatRequest(BaseModel):
|
|
| 93 |
|
| 94 |
@app.post("/chat")
|
| 95 |
async def chat(request: ChatRequest):
|
| 96 |
-
"""Endpoint para generar respuestas usando OpenAI y ChromaDB"""
|
| 97 |
-
|
| 98 |
-
# Obtener documentos relevantes
|
| 99 |
-
contexto = obtener_extractos(request.message)
|
| 100 |
-
|
| 101 |
-
# Construir el mensaje del sistema con el contexto
|
| 102 |
-
system_message_final = f"""{request.system_message}
|
| 103 |
-
Información relevante extraída de los documentos:
|
| 104 |
-
{contexto}
|
| 105 |
-
"""
|
| 106 |
-
|
| 107 |
messages = [
|
| 108 |
-
{"role": "system", "content":
|
| 109 |
{"role": "user", "content": request.message}
|
| 110 |
]
|
| 111 |
-
|
| 112 |
tools = [
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
}
|
| 126 |
-
}
|
| 127 |
-
},
|
| 128 |
-
{
|
| 129 |
-
"type": "function",
|
| 130 |
-
"function": {
|
| 131 |
-
"name": "enviar_ubicacion",
|
| 132 |
-
"description": "Envía la ubicacion de las oficinas de WipsHub en WhatsApp",
|
| 133 |
-
"parameters": {
|
| 134 |
-
"type": "object",
|
| 135 |
-
"properties": {
|
| 136 |
-
"latitude": {"type": "string"},
|
| 137 |
-
"longitude": {"type": "string"}
|
| 138 |
-
},
|
| 139 |
-
"required": ["latitude", "longitude"]
|
| 140 |
-
}
|
| 141 |
-
}
|
| 142 |
}
|
| 143 |
-
|
| 144 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 145 |
|
| 146 |
try:
|
| 147 |
-
# Llamar a la API de OpenAI
|
| 148 |
response = client.chat.completions.create(
|
| 149 |
model="gpt-4o-mini",
|
| 150 |
messages=messages,
|
|
@@ -154,35 +155,65 @@ async def chat(request: ChatRequest):
|
|
| 154 |
temperature=request.temperature,
|
| 155 |
top_p=request.top_p
|
| 156 |
)
|
| 157 |
-
|
| 158 |
choice = response.choices[0]
|
| 159 |
|
| 160 |
-
# Si el modelo decide
|
| 161 |
if choice.message.tool_calls:
|
| 162 |
for tool_call in choice.message.tool_calls:
|
| 163 |
name = tool_call.function.name
|
| 164 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
|
| 166 |
-
|
|
|
|
|
|
|
| 167 |
result = enviar_contacto(
|
| 168 |
ACCESS_TOKEN, PHONE_NUMBER_ID, RECIPIENT_NUMBER,
|
| 169 |
formatted_name="Pedro J. Johnson",
|
| 170 |
first_name="Pedro"
|
| 171 |
)
|
|
|
|
|
|
|
| 172 |
elif name == "enviar_ubicacion":
|
| 173 |
result = enviar_ubicacion(
|
| 174 |
ACCESS_TOKEN, PHONE_NUMBER_ID, RECIPIENT_NUMBER,
|
| 175 |
latitude="37.44216251868683",
|
| 176 |
longitude="-122.16153582049394"
|
| 177 |
)
|
|
|
|
| 178 |
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
return {"response": choice.message.content, "context": contexto}
|
| 182 |
|
| 183 |
except Exception as e:
|
| 184 |
raise HTTPException(status_code=500, detail=str(e))
|
| 185 |
|
|
|
|
| 186 |
# Punto de entrada para ejecutar con Uvicorn en Hugging Face
|
| 187 |
if __name__ == "__main__":
|
| 188 |
import uvicorn
|
|
|
|
| 93 |
|
| 94 |
@app.post("/chat")
|
| 95 |
async def chat(request: ChatRequest):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
messages = [
|
| 97 |
+
{"role": "system", "content": request.system_message},
|
| 98 |
{"role": "user", "content": request.message}
|
| 99 |
]
|
| 100 |
+
|
| 101 |
tools = [
|
| 102 |
+
{
|
| 103 |
+
"type": "function",
|
| 104 |
+
"function": {
|
| 105 |
+
"name": "enviar_contacto",
|
| 106 |
+
"description": "Envía el contacto de WhatsApp de soporte",
|
| 107 |
+
"parameters": {
|
| 108 |
+
"type": "object",
|
| 109 |
+
"properties": {
|
| 110 |
+
"formatted_name": {"type": "string"},
|
| 111 |
+
"first_name": {"type": "string"}
|
| 112 |
+
},
|
| 113 |
+
"required": ["formatted_name", "first_name"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
}
|
| 115 |
+
}
|
| 116 |
+
},
|
| 117 |
+
{
|
| 118 |
+
"type": "function",
|
| 119 |
+
"function": {
|
| 120 |
+
"name": "enviar_ubicacion",
|
| 121 |
+
"description": "Envía la ubicación de las oficinas de WipsHub",
|
| 122 |
+
"parameters": {
|
| 123 |
+
"type": "object",
|
| 124 |
+
"properties": {
|
| 125 |
+
"latitude": {"type": "string"},
|
| 126 |
+
"longitude": {"type": "string"}
|
| 127 |
+
},
|
| 128 |
+
"required": ["latitude", "longitude"]
|
| 129 |
+
}
|
| 130 |
+
}
|
| 131 |
+
},
|
| 132 |
+
{
|
| 133 |
+
"type": "function",
|
| 134 |
+
"function": {
|
| 135 |
+
"name": "obtener_extractos",
|
| 136 |
+
"description": "Busca información relevante en la base de datos vectorial con manuales de WipsHub.",
|
| 137 |
+
"parameters": {
|
| 138 |
+
"type": "object",
|
| 139 |
+
"properties": {
|
| 140 |
+
"query": {"type": "string"}
|
| 141 |
+
},
|
| 142 |
+
"required": ["query"]
|
| 143 |
+
}
|
| 144 |
+
}
|
| 145 |
+
}
|
| 146 |
+
]
|
| 147 |
|
| 148 |
try:
|
|
|
|
| 149 |
response = client.chat.completions.create(
|
| 150 |
model="gpt-4o-mini",
|
| 151 |
messages=messages,
|
|
|
|
| 155 |
temperature=request.temperature,
|
| 156 |
top_p=request.top_p
|
| 157 |
)
|
| 158 |
+
|
| 159 |
choice = response.choices[0]
|
| 160 |
|
| 161 |
+
# Si el modelo decide usar una función/tool
|
| 162 |
if choice.message.tool_calls:
|
| 163 |
for tool_call in choice.message.tool_calls:
|
| 164 |
name = tool_call.function.name
|
| 165 |
+
args = json.loads(tool_call.function.arguments)
|
| 166 |
+
|
| 167 |
+
if name == "obtener_extractos":
|
| 168 |
+
contexto = obtener_extractos(args["query"])
|
| 169 |
+
|
| 170 |
+
# Añadir la respuesta de la tool al historial de mensajes
|
| 171 |
+
messages.append({
|
| 172 |
+
"role": "assistant",
|
| 173 |
+
"content": None,
|
| 174 |
+
"tool_calls": [tool_call]
|
| 175 |
+
})
|
| 176 |
+
messages.append({
|
| 177 |
+
"role": "tool",
|
| 178 |
+
"tool_call_id": tool_call.id,
|
| 179 |
+
"name": "obtener_extractos",
|
| 180 |
+
"content": contexto
|
| 181 |
+
})
|
| 182 |
+
|
| 183 |
+
# Segunda llamada a OpenAI ahora con contexto
|
| 184 |
+
response = client.chat.completions.create(
|
| 185 |
+
model="gpt-4o-mini",
|
| 186 |
+
messages=messages,
|
| 187 |
+
max_tokens=request.max_tokens,
|
| 188 |
+
temperature=request.temperature,
|
| 189 |
+
top_p=request.top_p
|
| 190 |
+
)
|
| 191 |
|
| 192 |
+
return {"response": response.choices[0].message.content, "context": contexto}
|
| 193 |
+
|
| 194 |
+
elif name == "enviar_contacto":
|
| 195 |
result = enviar_contacto(
|
| 196 |
ACCESS_TOKEN, PHONE_NUMBER_ID, RECIPIENT_NUMBER,
|
| 197 |
formatted_name="Pedro J. Johnson",
|
| 198 |
first_name="Pedro"
|
| 199 |
)
|
| 200 |
+
return {"response": "✅ Contacto enviado.", "result": result}
|
| 201 |
+
|
| 202 |
elif name == "enviar_ubicacion":
|
| 203 |
result = enviar_ubicacion(
|
| 204 |
ACCESS_TOKEN, PHONE_NUMBER_ID, RECIPIENT_NUMBER,
|
| 205 |
latitude="37.44216251868683",
|
| 206 |
longitude="-122.16153582049394"
|
| 207 |
)
|
| 208 |
+
return {"response": "📍 Ubicación enviada.", "result": result}
|
| 209 |
|
| 210 |
+
# Si no se usa ninguna tool, simplemente devuelve la respuesta
|
| 211 |
+
return {"response": choice.message.content}
|
|
|
|
| 212 |
|
| 213 |
except Exception as e:
|
| 214 |
raise HTTPException(status_code=500, detail=str(e))
|
| 215 |
|
| 216 |
+
|
| 217 |
# Punto de entrada para ejecutar con Uvicorn en Hugging Face
|
| 218 |
if __name__ == "__main__":
|
| 219 |
import uvicorn
|