Daniel00611 commited on
Commit
b246767
·
verified ·
1 Parent(s): 766e84b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +83 -52
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": system_message_final},
109
  {"role": "user", "content": request.message}
110
  ]
111
-
112
  tools = [
113
- {
114
- "type": "function",
115
- "function": {
116
- "name": "enviar_contacto",
117
- "description": "Envía el contacto de WhatsApp de soporte",
118
- "parameters": {
119
- "type": "object",
120
- "properties": {
121
- "formatted_name": {"type": "string", "description": "Nombre completo del contacto"},
122
- "first_name": {"type": "string", "description": "Primer nombre del contacto"}
123
- },
124
- "required": ["formatted_name", "first_name"]
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 llamar a una función
161
  if choice.message.tool_calls:
162
  for tool_call in choice.message.tool_calls:
163
  name = tool_call.function.name
164
- arguments = json.loads(tool_call.function.arguments)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
 
166
- if name == "enviar_contacto":
 
 
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
- return {"response": f"✅ Acción ejecutada: {name}", "result": result}
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