salomonsky commited on
Commit
0159975
verified
1 Parent(s): 1cb13bf

Upload routes.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. routes.py +559 -0
routes.py ADDED
@@ -0,0 +1,559 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import render_template, request, jsonify, session, abort
2
+ import base64
3
+ import os
4
+ import yaml
5
+ import logging
6
+ from datetime import datetime, timedelta
7
+ import traceback
8
+
9
+ class Routes:
10
+ def __init__(self, app, chatbot):
11
+ self.app = app
12
+ self.chatbot = chatbot
13
+
14
+ # Crear directorios necesarios
15
+ self.temp_dir = os.path.join(os.path.dirname(__file__), 'temp')
16
+ self.session_dir = os.path.join(os.path.dirname(__file__), 'sessions')
17
+ self.log_dir = os.path.join(os.path.dirname(__file__), 'logs')
18
+
19
+ # Asegurar que existan los directorios
20
+ for directory in [self.temp_dir, self.session_dir, self.log_dir]:
21
+ os.makedirs(directory, exist_ok=True)
22
+
23
+ # Configurar el manejo de sesiones
24
+ self.app.config['SESSION_TYPE'] = 'filesystem'
25
+ self.app.config['SESSION_FILE_DIR'] = self.session_dir
26
+ self.app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
27
+
28
+ # Inicializar logger
29
+ self.setup_logger()
30
+
31
+ # Configurar rutas
32
+ self.setup_routes()
33
+
34
+ def setup_logger(self):
35
+ """Configurar el logger para la aplicaci贸n"""
36
+ log_file = os.path.join(self.log_dir, 'routes.log')
37
+ self.logger = logging.getLogger('routes')
38
+ self.logger.setLevel(logging.DEBUG)
39
+
40
+ handler = logging.FileHandler(log_file)
41
+ handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
42
+ self.logger.addHandler(handler)
43
+
44
+ self.logger.info("Rutas inicializadas")
45
+
46
+ def setup_routes(self):
47
+ @self.app.route('/')
48
+ def index():
49
+ try:
50
+ # Asegurar que existe la sesi贸n
51
+ session_id = self.chatbot.session_manager.get_session()
52
+ self.logger.info(f"Nueva sesi贸n iniciada: {session_id}")
53
+
54
+ # Crear directorio de sesi贸n si no existe
55
+ session_path = os.path.join(self.session_dir, session_id)
56
+ os.makedirs(session_path, exist_ok=True)
57
+
58
+ return render_template('index.html', config=self.app.config)
59
+ except Exception as e:
60
+ self.logger.error(f"Error en index: {str(e)}")
61
+ return render_template('error.html', error="Error al cargar la p谩gina")
62
+
63
+ @self.app.route('/inferencia', methods=['POST'])
64
+ def inferencia():
65
+ try:
66
+ if not request.is_json:
67
+ abort(400, "Se requiere contenido JSON")
68
+
69
+ data = request.get_json()
70
+ session_id = self.chatbot.session_manager.get_session()
71
+ mensaje = data.get('mensaje')
72
+
73
+ if not mensaje:
74
+ return jsonify({
75
+ 'success': False,
76
+ 'error': 'Mensaje vac铆o'
77
+ }), 400
78
+
79
+ # Obtener respuesta del modelo
80
+ respuesta = self.chatbot.procesar_mensaje(mensaje)
81
+ if not respuesta:
82
+ return jsonify({
83
+ 'success': False,
84
+ 'error': 'Error al procesar el mensaje'
85
+ }), 500
86
+
87
+ # Guardar mensajes en el historial
88
+ self.chatbot.session_manager.add_message_to_history(session_id, mensaje, 'user')
89
+ self.chatbot.session_manager.add_message_to_history(session_id, respuesta, 'bot')
90
+
91
+ return jsonify({
92
+ 'success': True,
93
+ 'texto': respuesta,
94
+ 'session_id': session_id
95
+ })
96
+
97
+ except Exception as e:
98
+ self.logger.error(f"Error en inferencia: {str(e)}\n{traceback.format_exc()}")
99
+ return jsonify({
100
+ 'success': False,
101
+ 'error': 'Error interno del servidor'
102
+ }), 500
103
+
104
+ @self.app.route('/generar_audio', methods=['POST'])
105
+ def generar_audio():
106
+ try:
107
+ session_id = self.chatbot.session_manager.get_session()
108
+ data = request.get_json()
109
+ texto = data.get('texto', '')
110
+ tts_model = data.get('tts', 'EDGE')
111
+
112
+ if not texto:
113
+ return jsonify({
114
+ 'success': False,
115
+ 'error': 'No se recibi贸 texto para generar audio'
116
+ })
117
+
118
+ # Crear directorio temporal si no existe
119
+ temp_dir = os.path.join(os.path.dirname(__file__), 'temp')
120
+ os.makedirs(temp_dir, exist_ok=True)
121
+
122
+ # Generar nombre 煤nico para el archivo temporal
123
+ temp_file = os.path.join(temp_dir, f"temp_audio_{os.urandom(4).hex()}.mp3")
124
+
125
+ # Generar el audio
126
+ print(f"Generando audio para: {texto[:50]}...")
127
+ audio_path = self.chatbot.tts.text_to_speech(texto, save_path=temp_file)
128
+
129
+ if not audio_path or not os.path.exists(audio_path):
130
+ raise Exception('No se pudo generar el archivo de audio')
131
+
132
+ # Verificar tama帽o del archivo
133
+ if os.path.getsize(audio_path) == 0:
134
+ raise Exception('El archivo de audio generado est谩 vac铆o')
135
+
136
+ # Convertir audio a base64
137
+ try:
138
+ with open(audio_path, 'rb') as audio_file:
139
+ audio_data = base64.b64encode(audio_file.read()).decode('utf-8')
140
+ finally:
141
+ # Limpiar archivo temporal
142
+ try:
143
+ os.remove(audio_path)
144
+ except Exception as e:
145
+ print(f"Error eliminando archivo temporal: {e}")
146
+
147
+ # Actualizar estado del audio en la sesi贸n
148
+ self.chatbot.session_manager.update_audio_state(
149
+ session_id,
150
+ is_playing=True,
151
+ current_audio=audio_data
152
+ )
153
+
154
+ print("Audio generado correctamente")
155
+ return jsonify({
156
+ 'success': True,
157
+ 'audio': audio_data,
158
+ 'audio_type': 'mp3'
159
+ })
160
+
161
+ except Exception as e:
162
+ print(f"Error generando audio: {str(e)}")
163
+ return jsonify({
164
+ 'success': False,
165
+ 'error': str(e)
166
+ })
167
+
168
+ @self.app.route('/chat', methods=['POST'])
169
+ def chat():
170
+ try:
171
+ session_id = self.chatbot.session_manager.get_session()
172
+ data = request.get_json()
173
+
174
+ # Obtener todos los par谩metros necesarios
175
+ mensaje = data.get('mensaje', '')
176
+ mode = data.get('mode', 'soporte')
177
+ model = data.get('model', 'gemini')
178
+ tts = data.get('tts', 'EDGE')
179
+
180
+ self.logger.info(f"Chat - Sesi贸n: {session_id} | Mensaje: {mensaje} | Modo: {mode}")
181
+
182
+ if not mensaje:
183
+ return jsonify({
184
+ 'success': False,
185
+ 'error': 'No se recibi贸 mensaje para procesar'
186
+ })
187
+
188
+ # Crear directorio de sesi贸n si no existe
189
+ session_path = os.path.join(self.session_dir, session_id)
190
+ os.makedirs(session_path, exist_ok=True)
191
+
192
+ # Guardar mensaje en archivo de historial
193
+ history_file = os.path.join(session_path, 'chat_history.txt')
194
+ with open(history_file, 'a', encoding='utf-8') as f:
195
+ f.write(f"Usuario ({datetime.now()}): {mensaje}\n")
196
+
197
+ # Actualizar modo y modelo en la sesi贸n
198
+ self.chatbot.session_manager.update_session(session_id, 'mode', mode)
199
+ self.chatbot.session_manager.update_session(session_id, 'model', model)
200
+ self.chatbot.session_manager.update_session(session_id, 'tts', tts)
201
+
202
+ # Obtener respuesta del modelo
203
+ respuesta = self.chatbot.procesar_mensaje(mensaje)
204
+ if not respuesta:
205
+ return jsonify({
206
+ 'success': False,
207
+ 'error': 'No se pudo obtener respuesta del modelo'
208
+ })
209
+
210
+ print(f"Respuesta generada: {respuesta}")
211
+
212
+ # Guardar mensajes en el historial
213
+ self.chatbot.session_manager.add_message_to_history(session_id, mensaje, 'user')
214
+ self.chatbot.session_manager.add_message_to_history(session_id, respuesta, 'bot')
215
+
216
+ # Generar el audio
217
+ try:
218
+ temp_dir = os.path.join(os.path.dirname(__file__), 'temp')
219
+ os.makedirs(temp_dir, exist_ok=True)
220
+ temp_file = os.path.join(temp_dir, f"temp_audio_{os.urandom(4).hex()}.wav")
221
+
222
+ print("Generando audio para la respuesta...")
223
+ audio_path = self.chatbot.tts.text_to_speech(respuesta, save_path=temp_file)
224
+
225
+ if not audio_path or not os.path.exists(audio_path):
226
+ print("No se pudo generar el archivo de audio")
227
+ return jsonify({
228
+ 'success': True,
229
+ 'texto': respuesta,
230
+ 'session_id': session_id
231
+ })
232
+
233
+ with open(audio_path, 'rb') as audio_file:
234
+ audio_data = base64.b64encode(audio_file.read()).decode('utf-8')
235
+
236
+ try:
237
+ os.remove(audio_path)
238
+ except:
239
+ pass
240
+
241
+ self.chatbot.session_manager.update_audio_state(
242
+ session_id,
243
+ is_playing=True,
244
+ current_audio=audio_data
245
+ )
246
+
247
+ print("Audio generado correctamente")
248
+ return jsonify({
249
+ 'success': True,
250
+ 'texto': respuesta,
251
+ 'audio': audio_data,
252
+ 'audio_type': 'wav',
253
+ 'session_id': session_id
254
+ })
255
+
256
+ except Exception as audio_error:
257
+ print(f"Error generando audio: {audio_error}")
258
+ return jsonify({
259
+ 'success': True,
260
+ 'texto': respuesta,
261
+ 'session_id': session_id
262
+ })
263
+
264
+ except Exception as e:
265
+ print(f"Error en chat: {str(e)}")
266
+ return jsonify({
267
+ 'success': False,
268
+ 'error': str(e)
269
+ })
270
+
271
+ @self.app.route('/procesar_voz', methods=['POST'])
272
+ def procesar_voz():
273
+ try:
274
+ session_id = self.chatbot.session_manager.get_session()
275
+ data = request.get_json()
276
+
277
+ # Obtener todos los par谩metros necesarios
278
+ texto = data.get('texto', '')
279
+ mode = data.get('mode', 'soporte')
280
+ model = data.get('model', 'gemini')
281
+ tts = data.get('tts', 'EDGE')
282
+
283
+ self.logger.info(f"Voz - Sesi贸n: {session_id} | Texto: {texto} | Modo: {mode}")
284
+
285
+ if not texto:
286
+ return jsonify({
287
+ 'success': False,
288
+ 'error': 'No se recibi贸 texto para procesar'
289
+ })
290
+
291
+ # Crear directorio de sesi贸n si no existe
292
+ session_path = os.path.join(self.session_dir, session_id)
293
+ os.makedirs(session_path, exist_ok=True)
294
+
295
+ # Guardar mensaje en archivo de historial
296
+ history_file = os.path.join(session_path, 'chat_history.txt')
297
+ with open(history_file, 'a', encoding='utf-8') as f:
298
+ f.write(f"Voz ({datetime.now()}): {texto}\n")
299
+
300
+ # Actualizar modo y modelo en la sesi贸n
301
+ self.chatbot.session_manager.update_session(session_id, 'mode', mode)
302
+ self.chatbot.session_manager.update_session(session_id, 'model', model)
303
+ self.chatbot.session_manager.update_session(session_id, 'tts', tts)
304
+
305
+ # Obtener respuesta del modelo
306
+ respuesta = self.chatbot.procesar_mensaje(texto)
307
+ if not respuesta:
308
+ self.logger.error(f"No se pudo obtener respuesta para: {texto}")
309
+ return jsonify({
310
+ 'success': False,
311
+ 'error': 'No se pudo obtener respuesta del modelo'
312
+ })
313
+
314
+ self.logger.info(f"Respuesta generada: {respuesta}")
315
+
316
+ # Guardar respuesta en historial
317
+ with open(history_file, 'a', encoding='utf-8') as f:
318
+ f.write(f"Bot ({datetime.now()}): {respuesta}\n")
319
+
320
+ # Guardar mensajes en el historial de sesi贸n
321
+ self.chatbot.session_manager.add_message_to_history(session_id, texto, 'user')
322
+ self.chatbot.session_manager.add_message_to_history(session_id, respuesta, 'bot')
323
+
324
+ # Generar el audio
325
+ try:
326
+ temp_file = os.path.join(self.temp_dir, f"temp_audio_{os.urandom(4).hex()}.wav")
327
+
328
+ self.logger.info("Generando audio para la respuesta de voz...")
329
+ audio_path = self.chatbot.tts.text_to_speech(respuesta, save_path=temp_file)
330
+
331
+ if not audio_path or not os.path.exists(audio_path):
332
+ self.logger.error("No se pudo generar el archivo de audio")
333
+ return jsonify({
334
+ 'success': True,
335
+ 'texto': respuesta,
336
+ 'session_id': session_id
337
+ })
338
+
339
+ with open(audio_path, 'rb') as audio_file:
340
+ audio_data = base64.b64encode(audio_file.read()).decode('utf-8')
341
+
342
+ try:
343
+ os.remove(audio_path)
344
+ except Exception as e:
345
+ self.logger.warning(f"Error limpiando archivo temporal: {e}")
346
+
347
+ self.chatbot.session_manager.update_audio_state(
348
+ session_id,
349
+ is_playing=True,
350
+ current_audio=audio_data
351
+ )
352
+
353
+ self.logger.info("Audio generado correctamente")
354
+ return jsonify({
355
+ 'success': True,
356
+ 'texto': respuesta,
357
+ 'audio': audio_data,
358
+ 'audio_type': 'wav',
359
+ 'session_id': session_id
360
+ })
361
+
362
+ except Exception as audio_error:
363
+ self.logger.error(f"Error generando audio: {audio_error}")
364
+ return jsonify({
365
+ 'success': True,
366
+ 'texto': respuesta,
367
+ 'session_id': session_id
368
+ })
369
+
370
+ except Exception as e:
371
+ self.logger.error(f"Error en procesar_voz: {str(e)}")
372
+ return jsonify({
373
+ 'success': False,
374
+ 'error': str(e)
375
+ })
376
+
377
+ @self.app.route('/cambiar_modo', methods=['POST'])
378
+ def cambiar_modo():
379
+ try:
380
+ session_id = self.chatbot.session_manager.get_session()
381
+ data = request.get_json()
382
+ mode = data.get('mode')
383
+
384
+ if not mode:
385
+ return jsonify({
386
+ 'success': False,
387
+ 'error': 'No se especific贸 el modo'
388
+ })
389
+
390
+ self.logger.info(f"Cambiando modo - Sesi贸n: {session_id} | Modo: {mode}")
391
+
392
+ if mode in self.chatbot.flow_bot.FLOWS:
393
+ self.chatbot.session_manager.update_session(session_id, 'mode', mode)
394
+ mensaje = self.chatbot.flow_bot.get_success_message(mode)
395
+
396
+ # Guardar cambio de modo en historial
397
+ session_path = os.path.join(self.session_dir, session_id)
398
+ os.makedirs(session_path, exist_ok=True)
399
+ history_file = os.path.join(session_path, 'chat_history.txt')
400
+ with open(history_file, 'a', encoding='utf-8') as f:
401
+ f.write(f"Sistema ({datetime.now()}): Cambio a modo {mode}\n")
402
+ f.write(f"Bot ({datetime.now()}): {mensaje}\n")
403
+
404
+ # Generar audio para el mensaje
405
+ try:
406
+ temp_file = os.path.join(self.temp_dir, f"temp_audio_{os.urandom(4).hex()}.wav")
407
+
408
+ self.logger.info("Generando audio para cambio de modo...")
409
+ audio_path = self.chatbot.tts.text_to_speech(mensaje, save_path=temp_file)
410
+
411
+ if not audio_path or not os.path.exists(audio_path):
412
+ self.logger.error("No se pudo generar el archivo de audio para el modo")
413
+ return jsonify({
414
+ 'success': True,
415
+ 'texto': mensaje
416
+ })
417
+
418
+ with open(audio_path, 'rb') as audio_file:
419
+ audio_data = base64.b64encode(audio_file.read()).decode('utf-8')
420
+
421
+ try:
422
+ os.remove(audio_path)
423
+ except Exception as e:
424
+ self.logger.warning(f"Error limpiando archivo temporal: {e}")
425
+
426
+ self.logger.info("Audio de modo generado correctamente")
427
+ return jsonify({
428
+ 'success': True,
429
+ 'texto': mensaje,
430
+ 'audio': audio_data,
431
+ 'audio_type': 'wav'
432
+ })
433
+
434
+ except Exception as audio_error:
435
+ self.logger.error(f"Error generando audio de modo: {audio_error}")
436
+ return jsonify({
437
+ 'success': True,
438
+ 'texto': mensaje
439
+ })
440
+
441
+ return jsonify({
442
+ 'success': False,
443
+ 'error': 'Modo no v谩lido'
444
+ })
445
+
446
+ except Exception as e:
447
+ self.logger.error(f"Error cambiando modo: {str(e)}")
448
+ return jsonify({
449
+ 'success': False,
450
+ 'error': str(e)
451
+ })
452
+
453
+ @self.app.route('/cambiar_modelo', methods=['POST'])
454
+ def cambiar_modelo():
455
+ try:
456
+ session_id = self.chatbot.session_manager.get_session()
457
+ data = request.get_json()
458
+ model = data.get('model', 'gemini')
459
+ self.chatbot.session_manager.update_session(session_id, 'model', model)
460
+ print(f"Modelo cambiado a: {model}")
461
+ return jsonify({'success': True})
462
+ except Exception as e:
463
+ print(f"Error cambiando modelo: {str(e)}")
464
+ return jsonify({'success': False, 'error': str(e)})
465
+
466
+ @self.app.route('/cambiar_tts', methods=['POST'])
467
+ def cambiar_tts():
468
+ try:
469
+ session_id = self.chatbot.session_manager.get_session()
470
+ data = request.get_json()
471
+ tts = data.get('model')
472
+
473
+ print(f"Solicitud de cambio de modelo TTS recibida: {tts}")
474
+
475
+ if not tts or tts not in ['EDGE', 'EDGE_ES', 'VITS']:
476
+ print(f"Modelo TTS inv谩lido: {tts}")
477
+ return jsonify({
478
+ 'error': 'Modelo de voz inv谩lido'
479
+ }), 400
480
+
481
+ # Actualizar el modelo TTS
482
+ self.chatbot.tts.current_model = tts
483
+ self.chatbot.session_manager.update_session(session_id, 'tts', tts)
484
+
485
+ print(f"TTS cambiado exitosamente a: {tts}")
486
+ return jsonify({'success': True})
487
+ except Exception as e:
488
+ print(f"Error cambiando TTS: {str(e)}")
489
+ return jsonify({'success': False, 'error': str(e)})
490
+
491
+ @self.app.route('/get_session_data', methods=['GET'])
492
+ def get_session_data():
493
+ try:
494
+ session_id = self.chatbot.session_manager.get_session()
495
+ data = self.chatbot.session_manager.get_session_data(session_id)
496
+ return jsonify(data)
497
+ except Exception as e:
498
+ print(f"Error obteniendo datos de sesi贸n: {str(e)}")
499
+ return jsonify({'error': str(e)})
500
+
501
+ @self.app.route('/update_audio_state', methods=['POST'])
502
+ def update_audio_state():
503
+ session_id = self.chatbot.session_manager.get_session()
504
+ is_playing = request.json.get('is_playing', False)
505
+ current_audio = request.json.get('current_audio')
506
+ self.chatbot.session_manager.update_audio_state(
507
+ session_id,
508
+ is_playing=is_playing,
509
+ current_audio=current_audio
510
+ )
511
+ return jsonify({'success': True})
512
+
513
+ @self.app.route('/save_config', methods=['POST'])
514
+ def save_config():
515
+ try:
516
+ config_data = request.json
517
+
518
+ # Actualizar el archivo config.yaml
519
+ config_path = os.path.join(os.path.dirname(__file__), 'config.yaml')
520
+ with open(config_path, 'r') as file:
521
+ current_config = yaml.safe_load(file) or {}
522
+
523
+ # Actualizar solo las claves de API
524
+ current_config['OPENAI_API_KEY'] = config_data.get('openai_key', '')
525
+ current_config['HUGGINGFACE_TOKEN'] = config_data.get('huggingface_key', '')
526
+ current_config['ELEVENLABS_API_KEY'] = config_data.get('elevenlabs_key', '')
527
+
528
+ with open(config_path, 'w') as file:
529
+ yaml.dump(current_config, file)
530
+
531
+ # Reiniciar los componentes que usan las APIs
532
+ self.chatbot.reinit_components()
533
+
534
+ return jsonify({'status': 'success'})
535
+ except Exception as e:
536
+ return jsonify({'status': 'error', 'message': str(e)}), 500
537
+
538
+ @self.app.route('/get_config')
539
+ def get_config():
540
+ try:
541
+ config_path = os.path.join(os.path.dirname(__file__), 'config.yaml')
542
+ with open(config_path, 'r') as file:
543
+ current_config = yaml.safe_load(file) or {}
544
+
545
+ return jsonify({
546
+ 'openai_key': current_config.get('OPENAI_API_KEY', ''),
547
+ 'huggingface_key': current_config.get('HUGGINGFACE_TOKEN', ''),
548
+ 'elevenlabs_key': current_config.get('ELEVENLABS_API_KEY', '')
549
+ })
550
+ except Exception as e:
551
+ return jsonify({'status': 'error', 'message': str(e)}), 500
552
+
553
+ @self.app.errorhandler(404)
554
+ def not_found_error(error):
555
+ return jsonify({'error': 'Recurso no encontrado'}), 404
556
+
557
+ @self.app.errorhandler(500)
558
+ def internal_error(error):
559
+ return jsonify({'error': 'Error interno del servidor'}), 500