
    ۾ht              	          d dl mZ d dlZd dlm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ej                  j                  d       d dlmZ d dlmZ d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z e	j                  jC                  e	j                  jE                  e#            Z$e	j                  jC                  e$      Z%e	j                  jM                  e%dd      Z' ee'        e	jP                  dd      jS                         Z* e	jP                  dd      jS                         jW                  d      Z,d#de-de.de/d e0fd!Z1d" Z2y)$    )
subprocessN)datetime)JSONResponsez/var/www/html/config)get_connection)load_dotenvc                      t               } | dddS 	 | j                  d      }d}|j                  |       |j                         }|r%d|d|j	                          | j	                          S dd	d|j	                          | j	                          S # t
        $ r;}dd
t        |       dcY d }~j	                          | j	                          S d }~ww xY w# j	                          | j	                          w xY w)Nr      Error de conexiónsuccessmessageT
dictionaryao  
            SELECT id, idempresa, empresa, id_asistente, nombre, descripcion, instrucciones,
                   modelo_predeterminado, modelo_actual, cambiar_modelo, openai, anthropic, google,
                   llama, cic, esuchar, hablar, archivos, codigo, tavily, wikipedia, pdf, bi, video, 
                   imgurl, status 
            FROM asistentes
           r   datazNo se encontraron asistentesError en la consulta: r   cursorexecutefetchallclose	Exceptionstr)
conexionBDr   query
assistantses        I/var/www/dev.api.imparables.com.co/api_imparables/crm/asistente/api_ia.pylistAssistantsr      s    !J)=>>""d"3 	u__&
 *5 	  !-KL 	  L+A#a&)JKK 	L 	5   ;B /B 	CC-C.C CC "C=c                      t               } | dddS 	 | j                  d      }d}|j                  |       |j                         }|r%d|d|j	                          | j	                          S dd	d|j	                          | j	                          S # t
        $ r;}dd
t        |       dcY d }~j	                          | j	                          S d }~ww xY w# j	                          | j	                          w xY w)Nr   r	   r
   Tr   zZ
            SELECT id, modelo, empresa, descripcion 
            FROM modelos_ia
        r   r   zNo se encontraron modelosr   r   )r   r   r   modelosr   s        r   listModelosr#   4   s    !J)=>>""d"3 	u//# '2 	  !-HI 	  L+A#a&)JKK 	L 	r    c                      t               } | dddS 	 | j                  d      }d}|j                  |       |j                         }|r%d|d|j	                          | j	                          S dd	d|j	                          | j	                          S # t
        $ r;}dd
t        |       dcY d }~j	                          | j	                          S d }~ww xY w# j	                          | j	                          w xY w)Nr   r	   r
   Tr   zP
            SELECT id, nombre_voz, ejemplo_voz 
            FROM voces
        r   r   zNo se encontraron vocesr   r   )r   r   r   vocesr   s        r   	listVocesr&   P   s    !J)=>>""d"3 	u! %0 	  !-FG 	  L+A#a&)JKK 	L 	r    c                 4   | j                  d      }|sdddS t               }|dddS 	 |j                  d      }d}|j                  ||f       |j	                         }|r%d	|d
|j                          |j                          S ddd|j                          |j                          S # t        $ r;}ddt        |       dcY d }~j                          |j                          S d }~ww xY w# j                          |j                          w xY w)N	idEmpresar   zPlease retryr
   r	   Tr   a  
            SELECT 
                a.id, 
                a.idempresa, 
                a.empresa, 
                a.id_asistente, 
                a.nombre, 
                a.descripcion, 
                a.instrucciones, 
                a.modelo_predeterminado, 
                a.modelo_actual, 
                a.cambiar_modelo, 
                a.openai, 
                a.anthropic, 
                a.google, 
                a.llama, 
                a.cic, 
                a.esuchar, 
                a.hablar, 
                a.archivos, 
                a.codigo, 
                a.pinecone, 
                a.tavily, 
                a.wikipedia, 
                a.pdf, 
                a.bi, 
                a.video, 
                a.imgurl, 
                a.id_voz,
                a.status,
                ia.instruccion AS instrucciones_assistan,
                ia.instruccion_saludo_despedida AS instrucciones_saludo_despedida,
                ia.instruccion_personalidad AS instrucciones_personalidad,
                ia.restricciones,
                av.id_modelo_voz,
                av.similarity_boost,
                av.stability,
                av.style,
                av.use_speaker_boost,
                av.optimize_streaming_latency,
                v.nombre_voz,
                v.id_eleven,
                v.ejemplo_voz,
                m.empresa as empresa_modelo
            FROM asistentes a
            LEFT JOIN asistentes_instrucciones ia ON a.id = ia.id_asistente
            LEFT JOIN asistentes_voces av ON a.id_voz = av.id
            LEFT JOIN voces v ON av.id_modelo_voz = v.id
            LEFT JOIN modelos_ia m ON a.id = m.id
            WHERE a.idempresa = %s
        r   r   zAsistentes not foundr   getr   r   r   r   r   r   r   )r   
id_empresar   r   r   
asistentesr   s          r   r,   r,   o   s   +&J88  !J)=>>C""d"32h 	uzm,__&
 *5 	  !-CD 	  L+A#a&)JKK 	L 	5   =B. 	B. .	C27C-C2C5 -C22C5 5"Dc                 4   | j                  d      }|sdddS t               }|dddS 	 |j                  d      }d}|j                  ||f       |j	                         }|r%d	|d
|j                          |j                          S ddd|j                          |j                          S # t        $ r;}ddt        |       dcY d }~j                          |j                          S d }~ww xY w# j                          |j                          w xY w)NidAsistenter   zidAsistente es requeridor
   r	   Tr   a  
            SELECT 
                id_asistente,
                instruccion_saludo_despedida,
                instruccion_personalidad,
                instruccion,
                restricciones
            FROM asistentes_instrucciones 
            WHERE id_asistente = %s
        r   r   zNo se encontraron instruccionesr   r)   )r   r+   r   r   r   instruccionesr   s          r    obtener_instrucciones_asistentesr1      s   -(J)CDD  !J)=>>""d"3	 	uzm,) -8 	  !-NO 	  L+A#a&)JKK 	L 	r-   c                     t               } | dddS 	 | j                  d      }d}|j                  |       |j                         }|D ]"  }|j	                         D ]  \  }}|	d||<    $ dd	|d
|j                          | j                          S # t        $ r;}ddt        |       dcY d }~j                          | j                          S d }~ww xY w# j                          | j                          w xY w)Nr   r	   r
   Tr   a  
            SELECT 
                id,
                id_asistente,
                nombre_archivo,
                nombre_indexe,
                proposito_archivo,
                extencion
            FROM 
                asistentes_archivos
         r   zDatos obtenidos correctamenter   r   r   z$Error al obtener datos de archivos: )r   r   r   r   itemsr   r   r   )r   r   r   datos_archivosdatokeyvaluer   s           r   obtenerVectorialesr:      s   !J)=>>&""d"3
 	u* # 	#D"jjl #
U= "DI#	# 6"
 	  
 =c!fXF
 	
 	
 	s6   AB &B 	CC.C/C CC "C>c                    t               }|dddS 	 |j                  d      }d}|j                  || f       |j                         }|r%d|d|j	                          |j	                          S dd	d|j	                          |j	                          S # t
        $ r;}dd
t        |       dcY d }~j	                          |j	                          S d }~ww xY w# j	                          |j	                          w xY w)Nr   r	   r
   Tr   a  
            SELECT
                chats.id,
                chats.id_asistente,
                chats.imageUrl,
                chats.name,
                chats.thread_id,
                chats.log_conversacion,
                chats.lastMessage,
                chats.unreadCount,
                chats.timestamp,
                a.instrucciones,
                a.id_asistente AS asistente_id,
                modelos_ia.empresa AS empresa_modelo,
                modelos_ia.endpoint AS endpoint_modelo
            FROM chats
            LEFT JOIN asistentes AS a ON chats.id_asistente = a.id
            LEFT JOIN modelos_ia ON modelos_ia.id = a.modelo_actual
            WHERE chats.id_asistente = %s
        r   r   zNo se encontraron chatszError al obtener los chats: r   )assistant_idr   r   r   
chats_datar   s         r   chatsr>     s    !J)=>>$""d"3* 	u|o.__&
 *5 	  !-FG 	  R+GAx)PQQ 	R 	s5   =B 1B 	CC/C0C CC "C?c                    | j                  d      }| j                  d      }| j                  d      }| j                  d      }|rf|rd|rb|r`t               }|dddS 	 |j                         }d}|j                  |||||f       |j	                          |j                          d	d
| dS dddS # t        $ r>}|j                          r|j                          ddt        |       | dcY d }~S d }~ww xY w)Nidinstruccion_saludo_despedidainstruccion_personalidadr0   r   r	   r
   z
                INSERT INTO asistentes_instrucciones 
                (id_asistente, instruccion_saludo_despedida, instruccion_personalidad, instruccion) 
                VALUES (%s, %s, %s, %s)
            r   z#Instrucciones creadas correctamenter4   z"Error al crear las instrucciones: 1Por favor, proporciona todos los datos necesarios)	r*   r   r   r   commitr   r   rollbackr   )	r   id_asistenterA   rB   instruccionr   r   r   r   s	            r   createIntructionsrH   B  s    88D>L#'88,J#K #xx(BC((?+K49QVa#%
 -ABB"	&&(FE NN5,(	#  LLN @ " )\]]  		!?AxH 		s   AB2 2	C9;3C4.C94C9c           
         | j                  d      }| j                  d      }| j                  d      }| j                  d      }| j                  d      }| j                  d      }| j                  d      }|r|r|r|r|r|r|rt               }|dd	d
S 	 |j                         }	d}
|	j                  |
|||||||f       |	j                  }d}|	j                  |||f       |j                          |	j                          dd| dS ddd
S # t        $ r>}|j                          	r|	j                          ddt        |       | dcY d }~S d }~ww xY w)Nr@   id_modelo_vozsimilarity_boost	stabilitystyleuse_speaker_boostoptimize_streaming_latencyr   r	   r
   z
                INSERT INTO asistentes_voces 
                (id_asistente, id_modelo_voz, similarity_boost, stability, style, use_speaker_boost, optimize_streaming_latency) 
                VALUES (%s, %s, %s, %s, %s, %s, %s)
            zM
                UPDATE asistentes SET id_voz = %s WHERE id = %s
            r   z0Voz creada y asistente actualizado correctamenter4   Error: rC   )
r*   r   r   r   	lastrowidrD   r   r   rE   r   )r   rF   rJ   rK   rL   rM   rN   rO   r   r   r   id_vozupdate_queryr   s                 r   createVoicerT   u  s   88D>LHH_-Mxx 23%IHHWE!45!%*F!G*:yUWh  nH#%
 -ABB/	&&(FE
 NN5 !*#  %%FL NN<&,)?@ LLN M " )\]]  		!$SVH- 		s   A2D 	E3EEEc           	         	 | j                  d      }| j                  d      }| j                  d      }| j                  d      }d}t        j                  j                  |      st	        d|       | d| d| d| d| 	}t        j                  |dt
        j                  d	      }t        j                  d
|t        j                        }|r'|j                  d      }	t        j                  |	      }
nt	        d      |
r!d|
v r|
d   }t        j                  d|d      S t	        d|	       # t        $ r/}t        j                  ddt        |       d d      cY d }~S d }~ww xY w)Nnombremodelo_actualcodigoarchivosz9/var/www/cobra/ia_general/ejecutable_ia_general_params.shz8El script bash no se encuentra en la ruta especificada:  T)shellstderrtextz\{.*\}r   z3No se pudo extraer el JSON de la salida del script.rF   )r   rF   z.No se pudo obtener el ID del asistente. JSON: FrP   r4   )r*   ospathexistsr   r   check_outputSTDOUTresearchDOTALLgroupjsonloadsdumpsr   )r   rV   rW   rX   rY   ruta_script_bashcomandooutputmatchjson_outputresponserF   r   s                r   generateAsistantsrp     st   )(#1(#88J'V ww~~./VWgVhijj &&axqq(T ((ZEVEV]ab 		)VRYY7++a.Kzz+.HQRR (2#N3L:: ,  
 L[MZ[[ zz Q)
  	s$   D%D6 (D6 6	E.?$E)#E.)E.c                    t               }|dddS 	 d|_        |j                         }d}|j                  ||d   |d   |d   |d	   | f       d
}|j                  ||d   |d   |d   |d   | f       |j	                          |j                          dd|dS # t        $ r>}|j                          r|j                          ddt        |       |dcY d }~S d }~ww xY w)Nr   r	   r
   Fz
            UPDATE asistentes SET 
                modelo_predeterminado = %s, 
                modelo_actual = %s, 
                archivos = %s, 
                codigo = %s
            WHERE id = %s
        modelo_predeterminadorW   rY   rX   a  
            UPDATE asistentes_instrucciones SET 
                instruccion_saludo_despedida = %s, 
                instruccion_personalidad = %s, 
                instruccion = %s,
                restricciones = %s
            WHERE id_asistente = %s
        rA   rB   r0   restriccionesr   u&   Parámetros actualizados correctamenter4   rP   	r   
autocommitr   r   rD   r   r   rE   r   )r@   r   r   r   query1query2r   s          r   updateParamsrx     s    !J)=>>,K %
""$ 	v()!N 
 	 	v/0+,!! 
 	 	)Q[_`` KLLN73q6();TJJ	Ks   BB 	C!#3CC!C!c                    t               }|dddS 	 d|_        |j                         }d}|j                  ||d   |d   |d   |d	   |d
   |d   |d   |d   |d   | f
       |j	                          |j                          dd|dS # t        $ r>}|j                          r|j                          ddt        |       |dcY d }~S d }~ww xY w)Nr   r	   r
   FaY  
            UPDATE asistentes SET 
                modelo_actual = %s,
                cambiar_modelo = %s,
                openai = %s,
                anthropic = %s,
                google = %s,
                llama = %s,
                cic = %s,
                esuchar = %s,
                hablar = %s
            WHERE id = %s
        rW   cambiar_modeloopenai	anthropicgooglellamacicescucharhablarr   u+   Características actualizadas correctamenter4   rP   rt   r@   r   r   r   r   r   s         r   updateFeaturer     s   !J)=>>&K %
""$ 	u!!"NNMKN
 	 	)V`dee KLLN73q6();TJJ	Ks   A5B	 		C3CCCc           
         t               }|dddS 	 d|_        |j                         }d}|j                  ||d   |d   |d   |d	   |d
   |d   | f       |j	                          |j                          dd|dS # t        $ r>}|j                          r|j                          ddt        |       |dcY d }~S d }~ww xY w)Nr   r	   r
   Fa:  
            UPDATE asistentes_voces SET 
                id_modelo_voz = %s, 
                similarity_boost = %s, 
                stability = %s, 
                style = %s, 
                use_speaker_boost = %s, 
                optimize_streaming_latency = %s
            WHERE id_asistente = %s
        rJ   rK   rL   rM   rN   rO   r   zVoz actualizada correctamenter4   rP   rt   r   s         r   updateVoicer   J  s    !J)=>> K %
""$	 	u!#$M$%-.
 	 	)HRVWW KLLN73q6();TJJ	Ks   A)A= =	C3B?9C?Cc                    |j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      } |j                  d      }d|v r	 |d   }|d   }t        j                  j                  |d	         d
   }	|  d|	 }
t        j                  dd      }t        j                  dd      }t        j                  dd      }d|
 }t        j                  |df      }|j                  ||       t
        j                  j                  |      }|j                  ||       |j                          |j                          d|
 }|r|r|r|r~	 t!               }|t        j                  ddd      S |j#                         }d}|j%                  |||||| f       |j'                          |j                          t)        d
d|d      S t        j                  ddd      S # t        $ r.}t        j                  ddt        |       d      cY d }~S d }~ww xY w# t        $ r.}t        j                  ddt        |       d      cY d }~S d }~ww xY w)N	idempresarV   descripcionimgurlr@   empresafiletmp_namenamer   .SFTP_SERVERr3   SFTP_USERNAMESFTP_PASSWORDz?/var/www/dev.api.cic-ware.com/api-1/asistente/imagen_asistente/   )usernamepasswordz&assets/img/asistente/imagen_asistente/r   z%Error durante la subida del archivo: r
   %   Error de conexión a la base de datosz
                UPDATE asistentes 
                SET idempresa = %s, nombre = %s, descripcion = %s, imgurl = %s
                WHERE id = %s
            z#Asistente actualizado correctamenter4   )contentzError de base de datos: rC   )r*   r^   r_   splitextgetenvparamiko	Transportconnect
SFTPClientfrom_transportputr   r   rg   ri   r   r   r   r   rD   r   )r@   r   r   rV   r   r   r   r   	temp_pathfile_extensionnombre_archivosftp_serversftp_usernamesftp_passworddestination_file	transportsftpr   r   r   r   s                        r   updateAssistantr   t  s{   %IXXhF((=)KXXhF	$Bhhy!G ~	k<DZ(IWW--d6l;A>N "t1^$45N ))M26KIIor:MIIor:M!`ao`pq !**K+<=I}}M&&55i@DHHY 01JJLOO >n=MNF V	')J!zza<c"dee&&(FE
 NN59fk62"NO LLN@)   zzJ
  	M  	k::!:_`cde`f_g8hijj	k>  	::5c!fX>  	sD   ,C=H 2#I AI 	H>#H93H>9H>	I8
#I3-I83I8c                 :   |j                  d      }|dddS 	 t               }|dddS |j                         }d}|j                  ||| f       |j	                          |j                          dddS # t        $ r}dd	t        |       dcY d }~S d }~ww xY w)
Nstatusr   z El campo 'status' es obligatorior
   r   z/UPDATE asistentes SET status = %s WHERE id = %sr   z.Estado del asistente actualizado correctamentezError en la base de datos: )r*   r   r   r   rD   r   r   r   )r@   r   nuevo_statusr   r   r   r   s          r   updateAssistantStatusr     s    88H%L)KLLQ#%
 -TUU""$Au|R01 G
 	

  Q+Fs1vh)OPPQs#   A6 A
A6 6	B?BBBconfiguracionesz.envOPENAI_API_KEYr3   
OPENAI_URL/audiofilename	keep_casereturnc                    	 |j                         }|j                  d      rd}n|j                  d      rd}nr|j                  d      rd}n^|j                  d      s|j                  d      rd	}n9|j                  d
      rd}n%|j                  d      rd}nd}t        d| d       t        d| d|        t        j                  d      5 }|| |fdd}ddt
         i}|j                  t        ||      }ddd       j                  dk7  rs|j                  j                  d      dk(  r|j                         n|j                  }t        d|j                   d|        dd |j                   d!d"t        |      d#S |j                         }	|	j                  d$d"      }
|s|
rt        d% |
D              t        d&t        d' |
D                    z  }|d(kD  r|t!        j"                  d)|
j                               }d"}d*}|D ]?  }|r0|r.|d   j%                         r|d   j'                         |d&d z   }d+}|d,v rd*}||z  }A |j)                         }
d&d-|
d.S # 1 sw Y   hxY w# t*        $ rK}ddl}|j/                         }t        d/t        |       d0|        dd/t        |       d"|d#cY d}~S d}~ww xY w)1uj  
    Envía un archivo de audio a OpenAI Whisper para transcripción (Versión Síncrona).
    
    :param audio: Contenido del archivo de audio en bytes.
    :param filename: Nombre del archivo de audio.
    :param keep_case: Si es False, normaliza el texto para evitar mayúsculas innecesarias.
    :return: Diccionario con resultado de la transcripción.
    z.mp3z
audio/mpegz.wavz	audio/wavz.webmz
audio/webmz.mp4z.m4az	audio/mp4z.aacz	audio/aacz.oggz	audio/oggz/ADVERTENCIA: Formato de archivo no reconocido: z!. Usando audio/wav como fallback.zIntentando transcribir audio: z con MIME type: g      >@)timeout)Nz	whisper-1)r   modelAuthorizationzBearer )headersfilesN   zcontent-typezapplication/jsonzError API OpenAI: Status z, Info: r   u   Error en API OpenAI (código )r3   )r   r   r   error_detailsr]   c              3   d   K   | ](  }|j                         s|j                         s%d  * ywr   N)isupperisalpha.0cs     r   	<genexpr>z$transcribir_audio.<locals>.<genexpr>/  s      !QQYY[QYY[!!Qs   000r   c              3   B   K   | ]  }|j                         sd   ywr   )r   r   s     r   r   z$transcribir_audio.<locals>.<genexpr>/  s     ^~efrsr{r{r}_`^~s   gffffff?z
([.!?]\s+)TF)z. z! z? u   Transcripción exitosar4   u   Error en transcripción: 
)lowerendswithprinthttpxClientr   postr   status_coder   r*   rg   r]   r   summaxrc   splitr   upperstripr   	traceback
format_exc)r   r   r   	mime_typeclientr   r   ro   
error_infor   r]   uppercase_ratio	sentencesnormalized_textcapitalize_nextpartr   r   error_traces                      r   transcribir_audior     s   P
>>#V$$Iv&#Iw'$Iv&(*;*;F*C#Iv&#Iv&#I $ICH:Mnop.xj8HTU\\$' 	M6!5)4,E ''.1A(BCG{{:we{LH	M 3&,4,<,<,@,@,PTf,fltlylyJ-h.B.B-C8J<XY:8;O;O:PPQR!$Z	  }}xx# T!!QT!QQTWXY[^^~jn^~[~TO$HH]DJJLA	"$"&% ,D&4DGOO4E#Aw}}ab9*/11*.#t+O, ',,. /
 	
W	M 	Mb  	
**,)#a&K=AB23q6(;(	
 	
		
s?   CI2 ,I%?B	I2 	CI2 %I/*I2 2	K;A K;KKc                    | j                  d      }| j                  d      }	 t               }|dddS d}|j                         }|j                  ||t	        j
                  |      f       |j                          |j                          |j                          dd| d	S # t        $ r}dd
t        |       dcY d }~S d }~ww xY w)NrF   funcionr   r	   r
   zt
            INSERT INTO data_catastro.funciones_openai (id_asistente, funcion)
            VALUES (%s, %s)
        r   zDatos insertados correctamenter4   zError al insertar datos: )
r*   r   r   r   rg   ri   rD   r   r   r   )r   rF   r   r   r   r   r   s          r   insertar_funcion_openiar   P  s    88N+Lhhy!GO#%
 -ABB

 ""$u|TZZ-@AB 	)ISWXX O+DSVH)MNNOs#   B$ A.B$ $	C-C=CC)F)3asyncior   rg   r   hashlibsysfastapi.responsesr   r   r^   r   rc   r_   appendcnxpdor   dotenvr   r   r#   r&   r,   r1   r:   r>   rH   rT   rp   rx   r   r   r   r   dirnameabspath__file__
script_dircrm_dirjoinenv_pathr   r   r   rstripr   bytesr   booldictr   r        r   <module>r      sb       
 *  	  	 & ' ! 
>8>N`&P,\*Z0^f@^J*\2Kh,K\&KTNbQ: WW__RWW__X67
 ''//*
% 77<<!2F; H  +R0668RYY|R(..077<
Y
U Y
c Y
d Y
t Y
tOr   