
    UhB                       d dl mZ d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlZd dlZd dl	Z	d dl
Zd dl
mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlZd dlZej0                  j3                  ej0                  j5                  e            Zej0                  j;                  ed      Zej0                  j?                  e      s  ej@                  de         e!d	e        ee       g d
Z"g Z#i Z$e"D ]1  Z% ejL                  e%      Z'e'se%dk7  re#jQ                  e%       e'e$e%<   3 e#r2ddj;                  e#       de dZ) ej@                  e)        e*e)      e$d   Z+e$d   Z,e$d   Z-e$d   Z.e$d   Z/e$d   Z0e$d   Z1e0re0je                  d      se0dz  Z0e1re1je                  d      se1dz  Z1 e3e+      Z4 e3e,      Z5 e3e/      Z6 ejn                  d        ejn                  de0         ejn                  de1        d Z8d Z9d Z:de;de;de;fd Z<d!e;d"e;d#e;d$e;d%e;d&e;fd'Z=d( Z>d) Z?d* Z@d+ ZAd, ZBd- ZCd. ZDd/ ZEd0 ZFd1 ZGd2 ZHd3 ZId4 ZJd5 ZKd6 ZLd7 ZMd8 ZNd9 ZOd: ZPd; ZQd< ZRd@d=ZSd> ZTd? ZUy)A    )OpenAIN)Pinecone)datetime)Error)load_dotenvz.envzArchivo .env no encontrado en: u#   No se encontró el archivo .env en )OPENAI_API_KEYPINECONE_API_KEYOPENAI_API_VALOR_MAS
SERVER_ENV
XI_API_KEY	AUDIO_URL
RUTA_AUDIOr   zVariables faltantes en .env: , z
Archivo .env: z5
Por favor verifica las variables en el archivo .env.r   r	   r
   r   r   r   /z*Variables de entorno cargadas exitosamentezAUDIO_URL: zRUTA_AUDIO: c                    t               }|y 	 |j                  d      }|j                  d| f       |j                         }|j                  d| f       |j	                         }|j                          |j                          t        j                         j                  d      }|r|j                  dd      }|j                  dd      }|j                  d	d      }d
| d| d| d| }	|r+dj                  |D 
cg c]  }
|
d   	 c}
      }|	d| z  }	n|	dz  }	|	j                         S yc c}
w # t        j                  j                  $ r}t        d|        Y d }~y d }~ww xY w)NT
dictionarya	  
            SELECT 
                instruccion_saludo_despedida, 
                instruccion_personalidad, 
                instruccion 
            FROM 
                asistentes_instrucciones 
            WHERE 
                id_asistente = %s
            z
            SELECT 
                funcion 
            FROM 
                asistentes_funciones 
            WHERE 
                id_asistente = %s
            %Y-%m-%d %H:%M:%Sinstruccion_saludo_despedida instruccion_personalidadinstruccionz**Hora actual:** z*

**Instrucciones de Saludo y Despedida**
z$

**Instrucciones de Personalidad**
z

**Instrucciones Generales**

funcionz

**Funciones**
zC

**Funciones**
No se encontraron funciones para el asistente dado.z7No se encontraron instrucciones para el asistente dado.Error: )conectar_dbcursorexecutefetchonefetchallcloser   nowstrftimegetjoinstripmysql	connectorr   print)id_asistente
connectionr   instrucciones	funcioneshora_actualsaludo_despedidapersonalidadr   instrucciones_concatenadasr   funciones_textoerrs                @/var/www/catia.catastroantioquia-mas.com/valormas/valormas_ws.pytraer_instruccionesr5   Z   s   JD""d"3 		 O	
 ) 	 O
	
 OO%	lln--.AB ,001OQST(,,-GLL'++M2>K $K= 1<<L;M N66B^ D00;}> ' "&))7@AGWY'A# +0COCT.UU**.vv* +002 M B ??   uos*   C2D8 D3$D8 3D8 8E-E((E-c                 r   t               }|y 	 |j                  d      }|j                  d| f       |j                         }|j	                          |j	                          |rd|d   dS dddS # t
        j                  j                  $ r&}t        d	|        d
t        |      dcY d }~S d }~ww xY w)NTr   z
            SELECT 
                id, 
                telefono, 
                pregunta, 
                hilo 
            FROM 
                conversaciones_ws 
            WHERE 
                telefono = %s
            nohilo)voy_sin_hilor8   sinadar   errorestadomensaje)
conectar_db2r   r   r   r!   r'   r(   r   r)   str)telefonor+   r   clienter3   s        r4   
traer_hilorD      s    J8""d"3 	
 K	
 //#$(76?CC %)&99??   8uo!c#h778s$   AA3 .A3 3B6B1+B61B6c                 d   t               }|y 	 |j                  d      }|j                  d| f       |j                         }|j	                          |j	                          |r|d   S y# t
        j                  j                  $ r&}t        d|        dt        |      dcY d }~S d }~ww xY w)	NTr   a  
            SELECT 
                id, nombres, apellidos, tipo_doc_ident, num_doc_ident, 
                correo, id_user_ciudadano, telefono, direccion, status 
            FROM 
                ciudadanos 
            WHERE 
                telefono = %s
            id0r   r<   r=   )
r   r   r   r   r!   r'   r(   r   r)   rA   )rB   r+   r   	ciudadanor3   s        r4   traer_ciudadanorI      s    J8""d"3 	 K	
 OO%	T?"??   8uo!c#h778s   AA, ,B/	B*$B/*B/urlapi_keyreturnc                    	 t        j                  |       }|j                          t        j                  dd      5 }|j                  |j                         |j                          |j                  }d d d        j                  dd      }t        j                  ddd||gd	       t        |
      }t        |d      5 }|j                  j                  j!                  d|d      }d d d        t#        j$                  |       t#        j$                  |       S # 1 sw Y   xY w# 1 sw Y   AxY w# t&        $ r}	t)        d|	        Y d }	~	yd }	~	ww xY w)N.oggF)suffixdelete.mp3ffmpegz-yz-iT)checkrK   rbz	whisper-1text)modelfileresponse_formatu    ❌ Error al transcribir audio: z:Audio recibido, pero no se pudo transcribir correctamente.)requestsr$   raise_for_statustempfileNamedTemporaryFilewritecontentflushnamereplace
subprocessrunr   openaudiotranscriptionscreateosremove	Exceptionr)   )
rJ   rK   responsetmp_oggogg_pathmp3_pathclient
audio_filetranscriptiones
             r4   transcribir_ogg_a_textort      sA   %L<<$!!#((uE 	$MM(**+MMO||H	$ ##FF3 	d(
 		 ((D! 	Z"LL77>>! & ? M	 			(
		(9	$ 	$"	 	  L045KLsG   <D9 8D!6AD9 )D--3D9 !D*&D9 -D62D9 9	EEE
asistente_	pregunta_instrucciones_id_asistente_
volume_up_	telefono_c           
         | a |a|a|a|adat        dd  at        }t        at        d|       t        |t              rt        |      dk(  r|d   }t        |t              r:|j                         j                  d      rt        d|        t!        ||      an|at        t"        t              r#dj%                  t'        t        t"                    at        t"        t(              rt+        j,                  t"              at        t"              j                         at"        sd	at/        t              at3        t              at5        t              }|d
   a|d   at
        dk(  r%t;        t=        j>                  dt                    a nqt
        dk(  r%t;        t=        j>                  dt                    a nCt
        dk(  r%t;        t=        j>                  dt                    a nt
        dk(  rt;        |      a t         t"        t        t        t6        t        t0        dda!t        dt"                tE        t0        t8        t        t"        t        t        t6        t               tB        S )NINSTR_VALOR_MAS   zPregunta inicial   r   rN   u    🎙️ Detectada URL de audio:  u   Consulta vacía recibida.r9   r8   INSTR_IA_GENERALOPENAI_API_IA_GENERALrT   INSTR_CNX_SUMMITOPENAI_API_ONINSTR_CRED_MANAGER_CLIENTEOPENAI_API_LUCYExito)	asistentepreguntar*   	volume_upr9   rB   	idclienter   z
Pregunta: )#r   r,   r*   r   rB   sourcer
   r   rK   r)   
isinstancelistlenrA   r&   endswithrt   r   r%   mapdictjsondumpsrI   r   r5   rD   r9   	thread_idr   ri   getenvrp   	json_data	verificar)ru   rv   rw   rx   ry   rz   api_valor_masr8   s           r4   main_telefonor     s    I"M LIHF |H )MG	
i( )T"s9~':aL	 )S!ioo&7&@&@&H0<=*9mD (D!88CX./(D!::h'8}""$H .  )I'5MhD'LVI ##		*A> RS	%	%		/> JK	/	/		*;^ LM	$	$.
 $$	I 
Jxj
!" iM8\9Vbdlm    c                      t         j                  } 	 t        j                  j                  di | }|j                         r|S y # t        j                  j                  $ r}t        d|        Y d }~y d }~ww xY wNr    )
conexionesconfigr'   r(   connectis_connectedr   r)   )r   r+   r3   s      r4   r   r   q  si    F__,,6v6
""$??   uo   0A A9!A44A9c                      t         j                  } 	 t        j                  j                  di | }|j                         r|S y # t        j                  j                  $ r}t        d|        Y d }~y d }~ww xY wr   )r   config2r'   r(   r   r   r   r)   )r   r+   r3   s      r4   r@   r@   ~  si      G__,,7w7
""$??   uor   c                      	 t         j                  j                  j                         } | j                  S # t
        $ r}t        d|       Y d }~y d }~ww xY w)NzError al crear el hilo:)rp   betathreadsrh   rF   rk   r)   )thread_responsers   s     r4   
crear_hilor     sI     ++--446!!! '+s   36 	AAAc                     	 t         j                  j                  j                  j	                  | d|       y # t
        $ r}t        d|       Y d }~y d }~ww xY w)Nuser)r   roler_   z!Error al agregar mensaje al hilo:)rp   r   r   messagesrh   rk   r)   )r   r_   rs   s      r4   agregar_mensajer     sQ    6$$++fg 	, 	
  611556s   69 	AAAc            
         g g d} 	 t               }||j                         r|j                         }d}|j                  |       |j	                         }|D ]  }| d   j                  |d   |d   d       ! d}|j                  |       |j	                         }|D ]/  }| d   j                  |d   |d   |d	   |d
   |d   |d   d       1 r1|j                         r!j                          |j                          	 t        j                  | d      S # t        $ r}	t        d|	       Y d }	~	dd }	~	ww xY w# r2|j                         r!j                          |j                          w w w xY w)N)
categoriastiposz)SELECT id, categoria FROM pqrsf_categoriar   r   r~   )rF   	categoriazbSELECT id, categoria, tipo_pqrsf, area_encargada, respuesta_ia, usuario_encargado FROM pqrsf_tiposr   r}            )rF   r   
tipo_pqrsfarea_encargadarespuesta_iausuario_encargadou.   Ocurrió un error en la consulta de los datos:)indent)r   r   r   r   r    appendrk   r)   r!   r   r   )
	resultador+   r   sql_categoriar   r   	sql_tiposr   tipors   s
             r4   consultar_pqrsf_tiposr     s   I
' ]
!j&=&=&?&&(F HMNN=)*J ( 	,'..#A,!*10  }INN9%OO%E  '"))q'!%a"&q'&*1g$(G)-a+  *113LLN ::i**  C>BBC *113LLN 4:s*   C
D 	D:$D50D= 5D::D= =6E3c                 @   |dk(  ry	 t               }|,|j                         r|j                  d      }t        j                         j                  d      }|rdnd}	|	rdnd	}
d
}|j                  ||| ||||||	|
f	       |j                          |j                  }t        j                         j                  d      }| | | }d}|j                  |||f       |j                          d}|j                  || f       |j                         j                  d      }d}|j                  ||f       |j                         j                  d      }|rd}|j                  ||f       |j                         }|r|d   }|d   }| d| }|d   }	 d| d| d| d| d| d| }t        j                  |      }|j                  dk(  rt        d| d|        n%t        d|j                   d |j                          d"| |r2|j                         r!|j!                          |j!                          S S S |r2|j                         r!j!                          |j!                          y y y # t        $ r}t        d!|       Y d }~d }~ww xY w# t        $ rC}d#| cY d }~r2|j                         r!j!                          |j!                          S S S d }~ww xY w# r2|j                         r!j!                          |j!                          w w w xY w)$Nr7   C   ID de cliente no proporcionado porque el usuario no está logueado.Tr   r   Correor   r   r~   a  
            INSERT INTO pqrsf (
                num_radicado, fecha_radicado, id_categoria_pqrs, id_tipo_pqrs,
                contenido_solicid, id_ciudadano, id_predio, id_encargado, tipo_encargado, 
                respuesta_encargado, fecha_respuesta, medio_llegada, medio_respuesta, status
            ) VALUES (
                '', %s, %s, %s, %s, %s, 0, %s, 'Asistente', %s, NULL, 'Catia', %s, %s
            )
            %Y%m%d0UPDATE pqrsf SET num_radicado = %s WHERE id = %sz3SELECT categoria FROM pqrsf_categoria WHERE id = %sr   z0SELECT tipo_pqrsf FROM pqrsf_tipos WHERE id = %sr   z?SELECT nombres, apellidos, correo FROM ciudadanos WHERE id = %snombres	apellidosr   correoEhttps://dev.ayudacatastro.co/api/crm/pqrsf/mailing_pqrsf.php?correos=&ciudadano=z&categoria=z&tipo_pqrsf=z&estado=3&fecha_respuesta=&num_radicado=   zCorreo enviado exitosamente a z: Error en la llamada al PHP: r   u/   Ocurrió un error al intentar enviar el correo:z2Registro insertado exitosamente con num_radicado: u'   Ocurrió un error al registrar el PQR: )r   r   r   r   r"   r#   r   commit	lastrowidr   r$   rZ   status_coder)   rV   rk   r!   )id_categoriaid_tipocontenido_solicitud	encargador   r   r+   r   fecha_radicadomedio_respuestastatus
sql_insertlast_id	fecha_numnum_radicado
sql_updater   categoria_nombresql_tipotipo_nombresql_ciudadanorH   r   r   nombre_completor   url_phprl   rs   s                                r4   registrar_pqrr     s   DTY ]
!j&=&=&?&&$&7F &\\^445HIN +7hBO *QqFJ NN:gObdmox  {G  IX  Z`  (a  b &&G !//9I'[G9=L LJNN:g'>? RMNN=</:%044[AIHNN8gZ0 //+//=K  a}yl;"OO-	'	2G )+ 6I)0	9+&>O&x0FT$ijpiqq|  ~M  }N  NY  Zj  Yk  kw  xC  wD  D^  _m  ^n  n|  }I  |J  #K $,<<#8 $//36!$B6("WI"VW!$@AUAU@VVXYaYfYfXg"hi
 H~V *113LLN 4:*113LLN 4: % TOQRSST
  =8<< *113LLN 4:=
 *113LLN 4:s[   FJ A/I6 J 6	J?JJ JJ 	K$!K%K$&K' K$$K' '6Lc                  $   t               } | y	 | j                  d      }d}|j                  |       i }|j                         D ]7  }|d   }|d   j	                         }||vrg ||<   ||   j                  |       9 d}t        |j                               D ]+  }|| dz  }t        ||         D ]  }	|d	|	 d
z  } |d
z  }- || j                         r!|j                          | j                          S S # t        j                  j                  $ r@}
d|
 cY d }
~
| j                         r!j                          | j                          S S d }
~
ww xY w# | j                         r!j                          | j                          w w xY w)N'Error al conectar con la base de datos.Tr   z,SELECT titulo FROM wiki_bcgs ORDER BY titulotitulor   r   z:
z  - r   %Error al consultar la base de datos: )r   r   r   r    upperr   sortedkeysr   r!   r'   r(   r   )r+   r   queryglosariorowr   
first_charglosario_textolettertitler3   s              r4   obtener_glosarior   0  s   J8 ""d"3 ?u ??$ 	0C]F*J)')$Z ''/	0 X]]_- 	#Fn,N 01 3Dr"223d"N		#  ""$LLN %	 ??   =6se<< ""$LLN %	= ""$LLN %s0   B;C< <EEEE EE 3Fc                 J   t         t        _        t        t              }d}|j                  |      }d } ||       }t        j                  d      }|j                  |       }|r|d   }dd|ii}	ni }	|j                  |dd	|	
      }
|
d   D cg c]  }|d   	 }}|S c c}w )NrT   wikic                 v    t         j                  j                  | d      }|j                  d   j                  S Nztext-embedding-ada-002)inputrW   r   openai
embeddingsrh   data	embeddingtextorl   s     r4   generar_embeddingz$wiki_bcgs.<locals>.generar_embeddingf  :    $$++* , 
 }}Q)))r   \b[A-Z][a-z]+ [A-Z][a-z]+\br   Instruction$eq2   Tvectortop_kinclude_metadatafiltermatchesmetadata
r   r   rK   r   r	   Indexrecompilefindallr   )r   pc
index_nameindexr   embedding_preguntapatron_nombrecoincidenciasnombre_speakerfiltro
resultadosmatch	metadatoss                r4   	wiki_bcgsr  X       $FN 
*	+B J HHZ E* +84
 JJ=>M!))(3M&q)%!89  !	  J 1;90EFuz"FIF G   B c                 J   t         t        _        t        t              }| }|j                  |      }d } ||      }t        j                  d      }|j                  |      }|r|d   }	dd|	ii}
ni }
|j                  |dd|
	      }|d
   D cg c]  }|d   	 }}|S c c}w )NrT   c                 v    t         j                  j                  | d      }|j                  d   j                  S r   r   r   s     r4   r   z-ejecutar_vectorial.<locals>.generar_embedding  r   r   r  r   r  r  r  Tr  r
  r  r  )indexer   r  r  r  r   r  r  r  r  r  r  r  r  s                 r4   ejecutar_vectorialr"    r  r  c                 N   |dk(  ry	 t               }|3|j                         r"|j                  d      }t        j                         j                  d      }t        j                         j                  d      }d}|j                  ||| |||f       |j                          |j                  }t        j                         j                  d      }	|	 | | }
d	}|j                  ||
|f       |j                          t        j                         j                  d      }d
}|j                  |||f       |j                          d}|j                  |||f       |j                          d}|j                  ||f       |j                         }|rx|d   }|d   }| d| }|d   }	 d| d| d| d|
 }t        j                  |      }|j                  dk(  r
|t        d<   n%t        d|j                   d|j                          d|r2|j                         r!|j#                          |j#                          S S S |r2|j                         r!j#                          |j#                          y y y # t         $ r}t        d|       Y d }~d }~ww xY w# t         $ rC}d| cY d }~r2|j                         r!j#                          |j#                          S S S d }~ww xY w# r2|j                         r!j#                          |j#                          w w w xY w)Nr7   r   Tr   r   z%Y-%m-%da  
            INSERT INTO pqrsf (
                num_radicado, fecha_radicado, id_categoria_pqrs, id_tipo_pqrs, contenido_solicid, 
                id_ciudadano, id_predio, id_encargado, tipo_encargado, respuesta_encargado, fecha_respuesta, medio_llegada, medio_respuesta, status
            ) VALUES (
                '', %s, 1, 13, %s, %s, 0, 1, 'Asistente', %s, %s, 'Catia', 'Correo', 3
            )
            r   r   z
            INSERT INTO pqrsf_logs (id_pqrsf, fecha_hora, evento, descripcion, id_usuario, leida)
            VALUES (%s, %s, 'Inicio de respuesta', 'Inicio del proceso de respuesta', 1, 0)
            u   
            INSERT INTO pqrsf_logs (id_pqrsf, fecha_hora, evento, descripcion, id_usuario, leida)
            VALUES (%s, %s, 'Solución PQR', 'Se ha dado una respuesta al PQR', 1, 0)
            zq
            SELECT nombres, apellidos, correo
            FROM ciudadanos
            WHERE id = %s
            r   r   r   r   r   r   uZ   &categoria=Petición&tipo_pqrsf=Horario de atención en taquilla&estado=3&fecha_respuesta=r   r   Whatsappr   r   u1   Ocurrió un error al intentar enviar el WhatsApp:u   Horario de atención en  taquilla	PETICION	De lunes a jueves a 7:30 am a 12:00 m y de 1:15 pm a 5:30 pm y los viernes de 7:30 am a 12:00 m y de 1:30 pm a 4:00 pm.u.   Ocurrió un error al registrar el PQR y logs: )r   r   r   r   r"   r#   r   r   r   r   rZ   r$   r   r   r)   rV   rk   r!   )r   	respuestar   r+   r   r   fecha_respuestasql_insert_pqrsfr   r   r   r   
fecha_hora
log_iniciolog_solucionr   rH   r   r   r   r   r   rl   rs   s                           r4   pqr_horarior+    sR   DT\ ]
!j&=&=&?&&$&7F &\\^445HIN&lln55jAO  NN+nh	S\^m-no &&G !//9I'[G9=L LJNN:g'>? "001DEJJ NN:'<=L NN<':)>?M
 NN=9,7)I#I.%k2	%,IQyk":"8,R eflemmx  zI  yJ  Jd  et  du  uC  DP  CQ  RG  (||G4H  ++s207	*- <X=Q=Q<RRTU]UbUbTcde
 | *113LLN 4:*113LLN 4: ! RMqQQR
  D?sCC *113LLN 4:D
 *113LLN 4:s[   F(J 1A!I= J =	JJJ JJ 	K+(K&,K+-K. &K++K. .6L$c                 j   |dk(  ry	 t               }|`|j                         rO|j                  d      }d}|j                  ||f       |j	                         }|rC|d   }|| k7  rsddd	|r2|j                         r!|j                          |j                          S S S dd
|d|r2|j                         r!|j                          |j                          S S S d}|j                  ||f       |j                         }|r9d|d|r2|j                         r!|j                          |j                          S S S ddd	|r2|j                         r!|j                          |j                          S S S |r2|j                         r!j                          |j                          y y y # t        $ rF}	dd|	 d	cY d }	~	r2|j                         r!j                          |j                          S S S d }	~	ww xY w# r2|j                         r!j                          |j                          w w w xY w)Nr7   uN   El usuario no esta logueado. No se puede proporcionar información de predios.Tr   k
            SELECT `num_doc_ident`
            FROM `ciudadanos`
            WHERE `id` = %s;
            num_doc_identr<   uk   El documento proporcionado no coincide con el registrado. No se puede proporcionar información de predios.r   messageuX   La persona no se encuentra registrada. No se puede proporcionar información de predios.)r   r0  r   a  
            SELECT 
                p.id AS predio_id,
                p.total_registros,
                p.nro_orden,
                p.cod_municipio,
                p.mncpio_nombre,
                p.npn,
                p.sector,
                p.corregimiento,
                p.barrio,
                p.mnzver,
                p.terreno,
                p.nro_cons,
                p.ficha,
                p.circulo,
                p.matricula,
                p.direccion,
                p.numero,
                p.puntos,
                p.pisos,
                p.cocinas,
                p.habitaciones,
                p.locales,
                p.banos,
                p.tip_const,
                p.iduso,
                p.vr_idnuso_nombre,
                p.tip_nombre,
                p.edad,
                p.porc_cons,
                p.undprd_coeficiente,
                p.terreno_ha,
                p.area_constrm2,
                p.area_constr_total_m2,
                p.valor_constr,
                p.avaluo_constr_total,
                p.avaluo_terreno,
                p.avaluo_total,
                p.vigencia,
                p.cedcatas,
                p.caracteristica,
                p.tipo_predio,
                p.sector_nom
            FROM 
                predios p
            INNER JOIN 
                propietarios pr ON p.npn = pr.npn
            WHERE 
                pr.documento = %s;
            success)r   r   z(La persona no tiene predios registrados.u,   Ocurrió un error al consultar los predios: )r   r   r   r   r   r!   r    rk   )
documento_pasador   r+   r   sql_query_clienterC   	documentosql_query_prediosprediosrs   s
             r4   predios_de_propietarior7    sA    D_a ]
!j&=&=&?&&$&7F! NN,yl;oo'G #O4	 00&-  ;h  iP *113LLN 4:K #*  7Q  `i  jJ *113LLN 4:E2!j NN,yl;oo'G"+W= *113LLN 4: #*6`a *113LLN 4:*113LLN 4:  b!0\]^\_.`aa *113LLN 4:b
 *113LLN 4:sB   A%F* "F* +F* <F* *	G93G4:G9;G< 4G99G< <6H2c                    |dk(  ry	 t               }||j                         r|j                  d      }d}|j                  ||f       |j	                         }|r|d   }n9ddd	|r2|j                         r!|j                          |j                          S S S d
}|j                  || f       |j                         }|rd|  d}	|D ]  }
|	d|
d    d|
d    d|
j                  dd       d|
j                  dd       d|
j                  dd       d|
j                  dd       d|
j                  dd       d|
d    d|
d    d|
d     d!z  }	 |	|r2|j                         r!|j                          |j                          S S S d"|  d#|r2|j                         r!|j                          |j                          S S S |r2|j                         r!j                          |j                          y y y # t        $ rC}d$| cY d }~r2|j                         r!j                          |j                          S S S d }~ww xY w# r2|j                         r!j                          |j                          w w w xY w)%Nr7   uS   El usuario no esta logueado. No se puede proporcionar información de propietarios.Tr   r-  r.  r<   u]   La persona no se encuentra registrada. No se puede proporcionar información de propietarios.r/  a:  
            SELECT 
                pr.id AS propietario_id,
                pr.total_registros,
                pr.nro_orden,
                pr.cod_municipio,
                pr.mncpio_nombre,
                pr.npn,
                pr.ficha,
                pr.circulo,
                pr.matricula,
                pr.caracteristica,
                pr.direccion,
                pr.tip_doc,
                pr.documento,
                pr.genero,
                pr.nombre1,
                pr.nombre2,
                pr.apellido1,
                pr.apellido2,
                pr.razon_social,
                pr.nombre_nat_jur,
                pr.area_terreno_ha,
                pr.area_total_cons_m2,
                pr.destinoeconomico,
                pr.porc_derecho,
                pr.modo_adquisicion,
                pr.escritura,
                pr.fecha_escritura,
                pr.fecha_registro,
                pr.calidad_propietario,
                pr.coeficiente_copropiedad,
                pr.avaluo,
                pr.avaluo_terreno,
                pr.avaluo_construccion,
                pr.vigencia,
                pr.sector,
                pr.tipo_predio,
                pr.padre_con_inf
            FROM 
                propietarios pr
            WHERE 
                pr.npn = %s;
            z)Propietarios asociados al predio con NPN z:

zPropietario ID: propietario_idz
Documento: r4  z	
Nombre: nombre1r   r   nombre2	apellido1	apellido2u   
Razón Social: razon_socialzN/Au
   
Avalúo: avaluo   
Dirección: 	direccionz
Tipo Predio: tipo_predioz,
------------------------------------------
z:No se encontraron propietarios para el NPN proporcionado: .u1   Ocurrió un error al consultar los propietarios: )	r   r   r   r   r   r!   r    r$   rk   )npnr   r+   r   r3  rC   r4  sql_query_prediopropietariostexto_resultadopropietariors   s               r4   propietarios_del_prediorI    s   Dde ]
!j&=&=&?&&$&7F! NN,yl;oo'G #O4	 #*  7V  WX *113LLN 4:S+ \ NN+cV4!??,L$McURW"X#/ K#*;7G+H*I J&&1+&>%? @##.??9b#A"B!KOOT]_aDbCccd&??;;<Akook[]>^=_ `**5//.%*P)Q R$$/$9#: ;''2;'?&@ A((3M(B'C DGG
O ' *113LLN 4: TTWSXXYZ *113LLN 4:*113LLN 4:  GB1#FF *113LLN 4:G
 *113LLN 4:s=   A!G: B8G: G: :	IIII	 II	 	6I?c                 @   t               }|y	 |j                  d      }d}|j                  || f       |j                         }|rd|d    d|d    d	|d
    d|d    d|d    d|d    d|d    d|d    d|d    d|d    d|d    d|d    d|d    d|d    d |d!    }||j	                         r!|j                          |j                          S S 	 |j	                         r!|j                          |j                          y"y"# t        j                  j                  $ r@}d#| cY d }~|j	                         r!j                          |j                          S S d }~ww xY w# |j	                         r!j                          |j                          w w xY w)$Nr   Tr   a)  
            SELECT 
                pq.id AS id_radicado,
                pq.num_radicado,
                pq.fecha_radicado,
                cat.categoria AS categoria_pqrs,
                tipos.tipo_pqrsf AS tipo_pqrs,
                tipos.area_encargada,
                pq.contenido_solicid,
                ciu.nombres AS nombre_ciudadano,
                ciu.apellidos AS apellido_ciudadano,
                emp.nombres AS nombre_encargado,
                emp.apellidos AS apellido_encargado,
                tipos.respuesta_ia,
                pq.respuesta_encargado,
                pq.fecha_respuesta,
                est.status AS estado
            FROM pqrsf pq
            INNER JOIN pqrsf_categoria cat ON pq.id_categoria_pqrs = cat.id
            INNER JOIN pqrsf_tipos tipos ON pq.id_tipo_pqrs = tipos.id
            INNER JOIN ciudadanos ciu ON pq.id_ciudadano = ciu.id
            INNER JOIN empleados emp ON pq.id_encargado = emp.id
            INNER JOIN pqrsf_status est ON pq.status = est.id
            WHERE pq.num_radicado = %s
        zID del Radicado: id_radicado   
Número de Radicado: r   
Fecha de Radicado: r      
Categoría PQRs: categoria_pqrs
Tipo PQRs: 	tipo_pqrsu   
Área Encargada: r   
Contenido de la Solicitud: contenido_solicidz
Ciudadano: nombre_ciudadanor   apellido_ciudadanoz
Encargado: nombre_encargadoapellido_encargadoz
Respuesta IA: r   
Respuesta del Encargado: respuesta_encargado
Fecha de Respuesta: r&  	
Estado: r>   u9   No se encontraron resultados para el número de radicado.r   )	r   r   r   r   r   r!   r'   r(   r   )r   r+   r   r   resultresult_textr3   s          r4   consulta_radicador^    s+   J8<""d"32 	u|o. " $F=$9#: ;((.~(>'? @&&,-=&>%? @$$*+;$<#= >$[12 3$$*+;$<#= >..45H.I-J K$%7896BV;W:X Y$%7896BV;W:X Y!!'!7 8 9,,23H,I+J K''-.?'@&A B!(+,.   ""$LLN % O ""$LLN %	 ??   =6se<< ""$LLN %	= ""$LLN %s0   BD
 
E''E"+E',E* "E''E* *3Fc                    t               }|y	 |j                  d      }d}|j                  || f       |j                         }|s3	 |j	                         r!|j                          |j                          yyd}|j                  || f       |j                         }d|d    d	|d
    d|d    d|d    d|d    d|d    d|d    d|d    d|d    d}|rI|dz  }|D ]>  }|d|d    d|d    d|d     d!|d"    d#|d$    d%|d&    d'|d(    d)|d*    d|d+    d,z  }@ n|d-z  }||j	                         r!|j                          |j                          S S # t        j                  j                  $ r@}	d.|	 cY d }	~	|j	                         r!j                          |j                          S S d }	~	ww xY w# |j	                         r!j                          |j                          w w xY w)/Nr   Tr   aH  
            SELECT 
                id, 
                nombres, 
                apellidos, 
                tipo_doc_ident, 
                num_doc_ident, 
                correo, 
                telefono, 
                direccion, 
                status 
            FROM ciudadanos 
            WHERE id = %s
        uG   No se encontró información para el ciudadano con el ID proporcionado.a  
            SELECT 
                pq.id AS id_radicado,
                pq.num_radicado,
                pq.fecha_radicado,
                cat.categoria AS categoria_pqrs,
                tipos.categoria AS tipo_pqrs,
                pq.contenido_solicid,
                pq.respuesta_encargado,
                pq.fecha_respuesta,
                est.status AS estado
            FROM pqrsf pq
            INNER JOIN pqrsf_categoria cat ON pq.id_categoria_pqrs = cat.id
            INNER JOIN pqrsf_tipos tipos ON pq.id_tipo_pqrs = tipos.id
            INNER JOIN pqrsf_status est ON pq.status = est.id
            WHERE pq.id_ciudadano = %s
        zDatos del Ciudadano:
ID: rF   z
Nombre Completo: r   r   r   z
Tipo de Documento: tipo_doc_identu   
Número de Documento: r.  z	
Correo: r   u   
Teléfono: rB   r@  rA  r[  r   z

zRegistros Asociados en PQRSF:
z
ID del Radicado: rK  rL  r   rM  r   rN  rO  rP  rQ  rR  rS  rX  rY  rZ  r&  r>   r   z/No se encontraron registros asociados en PQRSF.r   )
r   r   r   r   r   r!   r    r'   r(   r   )
id_ciudadanor+   r   query_ciudadanorH   query_pqrsfregistros_pqrsfr   registror3   s
             r4   consulta_ciudadanorf  4  s   J8T""d"3 	8OO%	\x ""$LLN %s" 	{\O4 //+T?# $  )) 45Qy7M6N O""+,<"=!> ?%%.%?$@ A *+ ,#J/0 1$[12 3 *+41 	 ::I+ )(=*A)B C,,4^,D+E F**23C*D)E F((01A(B'C D""*;"7!8 922:;N2O1P Q0089N0O/P Q++34E+F*G H'12"6
	 JJI ""$LLN %	 ??   =6se<< ""$LLN %	= ""$LLN %s6   9E ;B/E F99F4=F9>F< 4F99F< <3G/c            	         t               } | y	 | j                  d      }d}|j                  |       g }|j                         D ]+  }|d   }|d   }|d   }|j	                  d| d	| d
|        - dj                  |      }|| j                         r!|j                          | j                          S S # t        j                  j                  $ r@}	d|	 cY d }	~	| j                         r!j                          | j                          S S d }	~	ww xY w# | j                         r!j                          | j                          w w xY w)Nr   Tr   u\   SELECT `id`, `Municipio`, `Dirección`, `Name_Operador` FROM `municipios_operadores` WHERE 1	Municipio
   DirecciónName_OperadorMunicipio:    , Dirección: , Operador:  | r   r   r   r   r    r   r%   r   r!   r'   r(   r   )
r+   r   r   municipios_listar   	municipiorA  operadormunicipios_textor3   s
             r4   municipios_actualizacionesrt    sW   J8""d"3 ou ??$ 	nCK(IL)I?+H##k)N9+Uabjak$lm		n !::&67 ""$LLN %	 ??   =6se<< ""$LLN %	= ""$LLN %s0   A7B8 8DDDD DD 3Ec                    	 t         j                  j                  j                  j	                  |       }|j
                  D ]e  }|j                  dv st         j                  j                  j                  j                  | |j                         t        j                  d       g y# t        $ r}t        d|        Y d}~yd}~ww xY w)zO
    Cancela cualquier run activo en el thread antes de iniciar uno nuevo.
    r   )queuedin_progressrequires_actionr   run_idr~   zError al limpiar runs activos: N)rp   r   r   runsr   r   r   cancelrF   timesleeprk   r)   )r   r|  rd   rs   s       r4   limpiar_runs_activosr    s    5{{""'',,y,A99 	CzzII##((//)CFF/S

1	  5/s3445s   AB+ AB+ +	C4CCc           	         t               }|y	 |j                  d      }d}|j                  |d|  df       g }|j                         D ]+  }|d   }|d   }|d   }|j	                  d	| d
| d|        - |rGdj                  |      }	d|	 |j                         r!|j                          |j                          S S 	 |j                         r!|j                          |j                          yy# t        j                  j                  $ r@}
d|
 cY d }
~
|j                         r!j                          |j                          S S d }
~
ww xY w# |j                         r!j                          |j                          w w xY w)Nr   Tr   u   
            SELECT `id`, `Municipio`, `Dirección`, `Name_Operador`
            FROM `municipios_operadores`
            WHERE `Municipio` LIKE %s
        %rh  ri  rj  rk  rl  rm  rn  uY   Por favor, dirígete al operador en el municipio correspondiente para resolver tu queja. zGNo se encontraron municipios que coincidan con el nombre proporcionado.r   ro  )nombre_municipior+   r   r   rp  r   rq  rA  rr  rs  r3   s              r4   buscar_municipior    s   J8"""d"3 	u#3"4A689 ??$ 	nCK(IL)I?+H##k)N9+Uabjak$lm		n $zz*:;no  oA  B ""$LLN % ] ""$LLN %	 ??   =6se<< ""$LLN %	= ""$LLN %s0   BC6 6EEEE EE 3F	c           
         d}|dk(  rd}da nd}	 |dk7  r7t        j                  j                  j                  j                  | d|       n6t        j                  j                  j                  j                  | d|       t        j                  j                  j                  j                  | t        t              }t        d      D ]  }t        j                  j                  j                  j                  | |j                  	      }|j                  d
k(  r nD|j                  dk(  rdt        d<   |j                  }|j                  j                   }g }	|D ]w  }
|
j"                  j$                  }|
j"                  j&                  }t)        j*                  |      at)        j*                  |      a|t        d<   d}d }d }	 |dk(  rt-               }|t        d<   d}|dk(  rBt/        t&        d   t&        d   t&        d   t&        d   t&        d   t0              }|t        d<   d}|dk(  rt3               }|t        d<   d}|dk(  rt5        t&        d         }|t        d<   d}|dk(  r*t7        t&        d   t&        d   t0              }|t        d<   d}|dk(  r"t9        t&        d   t0              }|t        d<   d}|dk(  r"t;        t&        d   t0              }|t        d<   d}|dk(  rt=        t&        d          }|t        d<   d}|d!k(  rt?        t&        d          }|t        d<   d}|d"k(  rtA        t&        d#   |      }|t        d<   d}|d$k(  r*tC               }|t        d<   |t        d%<   tE        |          y |d&k(  r2tG        t&        d'         }|t        d<   |t        d%<   tE        |          y |	jI                  |
j                  tK        |      d(       z |	rA	 t        j                  j                  j                  j                  | |j                  |	,      }t]        j^                  d1       |j                  ja                  d2d3      t        d4<    tO        d5       y t        j                  j                  j                  jc                  | 6      }|jd                  D ]8  }|jf                  d7k(  s|jh                  d   jj                  jl                  }|c S  y # tL        $ rK}tO        d)|       tO        d*t&               tO        d+t)        jP                  t                     Y d }~ Ud }~ww xY w# tL        $ r}tO        d-|       tO        d.tS        |      jT                         tW        jX                          t        j                  j                  j                  j[                  | |j                  	      }tO        d/|j                         Y d }~ y0d }~ww xY w# tL        $ r}tO        d8|       Y d }~y d }~ww xY w)9Nr7   r   r   r:   r   )r   r_   )r   assistant_idinstructions(   rz  	completedry  ejecutando_funcionr   rtamysqlr   r   r   r   r   r   r   r  palabra_glosarior+  r   r%  r7  r4  rI  rD  r^  numerorf  r"  nombrert  	Respuestar  rq  )tool_call_idoutputz,Error al enviar la respuesta al asistente 3:zArgumentos:zJson hasta el momento:)r   r{  tool_outputsz,Error al enviar la respuesta al asistente 2:u   Tipo de excepción:zRun cancelado:zOParece que hay intermitencia en la red, por favor envia tu pregunta nuevamente.r~   rx  zPensando...
run_statusu7   Tiempo de espera excedido para la ejecución del 'run'.rv  	assistantzError al hacer la pregunta:)7   tamaño_archivorp   r   r   r   rh   r|  r   r,   rangeretrieverF   r   r   required_actionsubmit_tool_outputs
tool_callsfunctionra   	argumentsr   loadsr   r   r   r   r  r+  r7  rI  r^  rf  r"  rt  r  r  r   rA   rk   r)   r   type__name__	traceback	print_excr}  r~  r  rb   r   r   r   r_   rV   value)r   r   archivofile_idrd   _r  r  r  tools_outputs	tool_callnombre_funcionarguments_jsonflag_archivor  consultars   cancelarr   r0  r%  s                        r4   hacer_preguntar    s   G$hb=KK((// 0  KK((// 0  kk!!&&--im . 

 r P	A,,11::#CFF ; J   K/  $55/@	+,","<"<,@@KK
 !#!+ gI%.%7%7%<%<N%.%7%7%A%AN $

> :I !%

> :I6DI23 $(L#H#HW)-DD'<'>H4<Ij1+/L)_<'4 ). 9 )) 4 )*? @ )+ 6 ). 9 )(H 5=Ij1+/L)-??'7'9H4<Ij1+/L)[8'0;M1N'OH4<Ij1+/L)]:'2 )* 5 )+ 6 )(H
 5=Ij1+/L)-EE'= )+ 6 )(H 5=Ij1+/L)-FF'> )% 0 )(H 5=Ij1+/L)-@@'8 )( 3(H 5=Ij1+/L)-AA'9 )( 3(H 5=Ij1+/L)-AA'9)H:Mx'XH4<Ij1+/L)-II'A'CH4<Ij15=Ik20;")-??'7	+8N'OH4<Ij15=Ik20;" &,,,5LL&)(m. {gT !q$kk1166JJ&/#&66)6 K " JJqM&0&7&7&?&?}&]Il#[P	^ KL;;&&//44y4I}} 	!G||{*#OOA.3399	  	!G % LaP}i87I9NO % 
qLaP3T!W5E5EF!++- $*;;#6#6#;#;#B#B&/ $C $ .@p
q0  +Q/s   F8W" 	F-S 6W" 94S -W" 0'S W" A T7AW" $AW" 7&W" W"  	T4)?T/(W" /T44W" 7	W BWW" WW" "	X+W<<Xc                     ddddddddd	d
dddd}|j                         D ]  \  }}| j                  ||      }  t        j                  dd|       j	                         } | S )N   á   é   í   ó   ú   ñ   Ñ   ü   É   Ú   Ó   Í   À)u   Ã¡u   Ã©u   Ã­u   Ã³u   Ãºu   Ã±u   Ã‘u   Ã¼u   Ã‰u   Ãšu   Ã“u   Ã�u   Ã€z\s+r   )itemsrb   r  subr&   )r   
reemplazos
incorrectocorrectos       r4   limpiar_textor    sy     dD$tTD$tJ !+ 0 0 2 4
Hj(34 FF63&,,.ELr   c                    t        |      }t               }|ddiS 	 |j                  d      }d}|j                  || f       |j	                         }|s5ddi|j                         r!|j                          |j                          S S |d   dk(  rdnd	}||d
   |d   |d   |dd}d|d    d}	dt        d}
t        j                  |	|
|      }|j                  dk(  rt        j                  dd      }d| d|  d}t         | }t         | }|t        d<   t!        |d      5 }|j#                  |j$                         d d d        ||j                         r!|j                          |j                          S S d	d|j                   d|j&                   d|j                         r!|j                          |j                          S S # 1 sw Y   xY w# t(        j*                  j,                  $ rC}d	d | dcY d }~|j                         r!j                          |j                          S S d }~wt        j.                  $ rC}d	d!| dcY d }~|j                         r!j                          |j                          S S d }~ww xY w# |j                         r!j                          |j                          w w xY w)"Nr<   r   Tr   a  
            SELECT 
                asistentes.id_voz,
                voces.nombre_voz,
                voces.id_eleven,
                asistentes_voces.similarity_boost,
                asistentes_voces.stability,
                asistentes_voces.style,
                asistentes_voces.use_speaker_boost
            FROM asistentes
            INNER JOIN asistentes_voces ON asistentes.id_voz = asistentes_voces.id
            INNER JOIN voces ON asistentes_voces.id_modelo_voz = voces.id
            WHERE asistentes.id = %s
        u5   No se encontró un asistente con el ID proporcionado.use_speaker_boostr~   Fsimilarity_boost	stabilitystyle)r  r  r  r  )rV   voice_settingsz,https://api.elevenlabs.io/v1/text-to-speech/	id_elevenz9?optimize_streaming_latency=0&output_format=mp3_44100_128zapplication/json)zContent-Typez
xi-api-key)headersr   r   i'  i audio_r  rQ   
ParametroswbzError en ElevenLabs: z - )r1  r<   zError en la base de datos: z$Error en la solicitud a ElevenLabs: )r  r   r   r   r   r   r!   r   rZ   postr   randomrandintr   r   r   re   r^   r_   rV   r'   r(   r   RequestException)r*   r   texto_limpior+   r   	query_vozr   r  payloadapi_urlr  rl   numero_aleatorionombre_archivo
ruta_audio	audio_urlrq   r3   rs   s                      r4   )obtener_configuracion_voz_y_generar_audior    s    'L JBCCS""d"3	 	y</2OO%	TUv ""$LLN %q %..A$Ba$GDU !$-.@$A&{3"7+%6	
 A;AW@X  YR  S /$
 =='H3&%~~eU;  &&6%7qdKN '<'78J$+n%56I&-Il# j$' 3:  !1!123  ""$LLN % !01E1E0Fc(--Y ""$LLN %#3 3 ??   P -H+NOO ""$LLN %	 $$ W -QRSQT+UVV ""$LLN %	W ""$LLN %sl   <G B G +G	G G GG J;H9JJ 9JJJJ JJ 3Kc                 f   t               }|dddS 	 |j                         }|j                  d| ||f       |j                          |j	                          |j	                          dddS # t
        j                  j                  $ r&}t        d|        dt        |      dcY d }~S d }~ww xY w)Nr<   z&No se pudo conectar a la base de datosr=   zr
            INSERT INTO conversaciones_ws (telefono, pregunta, hilo)
            VALUES (%s, %s, %s)
            exitozMensaje insertado correctamenter   )
r@   r   r   r   r!   r'   r(   r   r)   rA   )rB   r   r   r+   r   r3   s         r4   insertar_mensaje_wsr    s    J!.VWW8""$ 	 x+	
 	!.OPP??   8uo!c#h778s   AA- -B0
B+%B0+B0c                 `    t        j                  |      }t        |j                  |             S )u5   Calcula el número de tokens consumidos por un texto.)tiktokenencoding_for_modelr   encode)r   modeloencodings      r4   contar_tokensr  (  s&    **62Hxu%&&r   c           
         t               }|y	 |j                         }d}d}t        |t        t        f      rt        j                  |d      }nt        |      j                         }t        |t        t        f      rt        j                  |d      }nt        |      j                         }t        |       } t        |      }t        |      }t        ||      }	t        ||      }
d}| ||t        j                         |||	|
||f
}|j                  ||       |j                          	 |j                         r!|j                          |j                          yy# t         j"                  j$                  $ rN}t'        d	|        d
| cY d}~|j                         r!j                          |j                          S S d}~ww xY w# |j                         r!j                          |j                          w w xY w)uZ   Registra la interacción en la base de datos con el cálculo de tokens usando GPT-4 Turbo.Nr   zgpt-4-turboWhatsAppF)ensure_asciiz
        INSERT INTO conversaciones (
            id_asistente, modelo, llegada, fecha_hora, 
            pregunta, respuesta, input, output, usuario, telefono
        )
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
        z!Registro insertado correctamente.u.   ⚠️ Error al insertar en la base de datos: z'Error al insertar en la base de datos: )r@   r   r   r   r   r   r   rA   r&   r  r   r"   r   r   r   r!   r'   r(   r   r)   )r*   r   r%  r   rB   r+   r   r  llegadatokens_inputtokens_outputr   valoresr3   s                 r4   insertar_logsr  -  s    J84""$ ht-zz(?H8}**,Hi$.

95AII,,.I <(	N	x= %Xv6%i8 &'8<<>i}x
 	ug&2 ""$LLN % ??   ?>seDE8>> ""$LLN %?
 ""$LLN %s0   DE G
<GG
G G

G 3H c                 :   | dk(  r	 t               }||j                         r|j                  d      }	d}
|	j                  |
|f       |	j	                         }|rt        j                  |      d   }nd}|t        d<   t        |||| |       t        t        j                  t                     r0|j                         r 	j                          |j                          y |d
k(  rat!               }|rSt#        ||       |t        d<   |dk(  r7	 t               }||j                         r|j                  d      }	d}
|	j                  |
|f       |	j	                         }|r t        j                  |      }|d   }|d   }nd}d}|t        d<   |t        d<   d}|	j                  || f       |	j%                         }|rd|v r|d   }dt        d<   r1|j                         r!	j                          |j                          	 t)        |||       t        ||| |       t        t        j                  t                     y y y t+        ||      }|rU|dk(  rt-        ||      }|t        d<   t        |||| |       |t        d<   t        t        j                  t                     y y # t        j                  j                  $ r9}d| t        d	<   t        t        j                  t                     Y d }~Od }~ww xY w# r2|j                         r!	j                          |j                          w w w xY w# t&        $ r}d| t        d	<   Y d }~d }~ww xY w# r2|j                         r!	j                          |j                          w w w xY w)NrG   Tr   zDSELECT respuesta FROM asistente_sin_registro WHERE id_asistente = %sr%  u   ¡Hola! 😊 Soy Catia, tu asistente virtual de Catastro Antioquia. Para chatear con nosotros, primero regístrate aquí: https://ayudacatastro.co/#/inicio. ¡Es rápido y sencillo!r  z%Error al acceder a la base de datos: Error_DBr;   Tarea_Creadar:   zOSELECT respuesta, video_url FROM asistente_con_registro WHERE id_asistente = %s	video_urlu
  ¡Hola! Bienvenido al portal de atención de Catastro Antioquia. Soy Catia, tu asistente virtual. Estoy aquí para ayudarte a obtener certificados, guiarte en tus trámites catastrales y resolver tus preguntas de forma fácil y segura. ¿En qué puedo asistirte hoy?z=https://ayudacatastro.co/api/crm/asistente/videos/Video_1.mp4Videoz-SELECT telefono FROM ciudadanos WHERE id = %srB   Mostrar_videosr   r  )r   r   r   r   r    r  choicer   r  r)   r   r   r'   r(   r   r!   r   r   r   rk   r  r  r  )r   r   r,   r   r*   volumenr9   rB   r+   r   r   r  respuesta_aleatoriars   saludovideosql_telefonorH   r%  r  s                       r4   r   r   k  sd   C	#$J%**A*A*C#**d*; _u|o6#__.
*0--
*CK*P' +b' *=	+&lH6I9V^_djj+, j557  " FL	I}5(1In%t#%+!,J!-*2I2I2K!+!2!2d!2!C !ru|o>%+__%6
%28--
2K/%8%EF$7$DE &rF$cE17	+.-2	'* (W|i\B$*OO$5	$y)@'0'<H:>I&67 "j&=&=&?"((*#Hh	BlHfiRdjj+,W $ b #9h7	$F|U^_
*4	,',)YQ%.Ik"$**Y'( } $$ 	)&KA3$OIj!$**Y'((	) j557  " 8zV ! X.STUSV,WIj)X "j&=&=&?"((* '@zsU   B*J/ CM /L.L :L  LL 6L>	M!
MM$ M!!M$ $6N)zgpt-3.5-turbo)Vr   r   r   r~  r  pineconer   r   r   
a_env_varsmysql.connectorr'   r   sysrZ   r\   r  r  r  rc   dotenvr   ri   loggingpathdirnameabspath__file__current_dirr%   env_file_pathexistsr<   FileNotFoundErrorREQUIRED_KEYSmissing_keysconfig_varskeyr   r  r   	error_msg
ValueErrorr   r	   r
   r   r   r   r   r   boolOPENAI_API_KEY_VALIDATEDPINECONE_API_KEY_VALIDATEDXI_API_KEY_VALIDATEDinfor5   rD   rI   rA   rt   r   r   r@   r   r   r   r   r   r  r"  r+  r7  rI  r^  rf  rt  r  r  r  r  r  r  r  r  r   r   r   r4   <module>r     s<       	       ! 
        	  ggoobggooh78[&1 
ww~~m$GMM3M?CD
A-Q
RR M   CBIIcNESL(C K	 
'		,(?'@ A& (?	? 
 GMM)
Y
 -.12 "#9: &
&
$	&
 Y'',Ij))#.#J  / !"23 J'  9 : {9+& ' |J<( )JX$8L!8F&L &Ls &Ls &LPWc Wc W"%W69W!W.1Wt60+d^@&P0d0d_BfPiVBHZx D5(Vrh"\|86'
<|^)r   