
    EN8iT              
       B   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mZ d dlZd dlZd dlmZmZ d dlmZ d dlZd dlZd dlZd d	lmZ d dl Z  G d
 d      Z!	  e!       Z"ejP                  dxx   dz  cc<    G d d      Z) G d d      Z*d Z+	  e+        	  e)       Z- e*       Z. ej^                  d        G d  d!      Z<d" Z=d# Z>d$e&d%e?d&e&fd'Z@d( ZAd) ZBd* ZCd+e&d$e&d%e?d&e&d,e&f
d-ZDd. ZEy# e#$ rZ$ e%d e&e$               e'd      dZ$[$ww xY w#   ejX                  d       Y xY w# e#$ rZ$ ej`                  de$        dZ1 ejd                  e1      Z3 ejh                  ejj                  jm                         rdnd      Z4 ejd                  e1dejn                  dddd      Z8 e9e8jD                  d      rde8jD                  _:        e8jw                          dZ-dZ.Y dZ$[$1dZ$[$ww xY w)/    )OpenAIN)Pinecone)datetime)Error)load_dotenv)AutoTokenizerAutoModelForCausalLM)ChatResponse)ThreadPoolExecutorc                   0     e Zd ZdZg dZ fdZd Z xZS )ConfigManagerN)OPENAI_API_KEYPINECONE_API_KEYOPENAI_API_VALOR_MAS
SERVER_ENV
XI_API_KEY	AUDIO_URL
RUTA_AUDIOc                     | j                   .t        | 	  |       | _         | j                   j                          | j                   S N)	_instancesuper__new___load_configcls	__class__s    G/var/www/catia.catastroantioquia-mas.com/valormas/valormas_llama_crm.pyr   zConfigManager.__new__)   s7    == !GOC0CMMM&&(}}    c                 t   t        j                  dd      }t         j                  j                  |      st	        d|       t        |       g }| j                  D ]<  }t        j                  |      }|s|dk7  r|j                  |       t        | ||       > |r!t        ddj                  |       d| d      | j                  r0| j                  j                  d	      s| xj                  d	z  c_        | j                  r2| j                  j                  d	      s| xj                  d	z  c_        y y y )
NENV_PATHz6/var/www/catia.catastroantioquia-mas.com/valormas/.envzArchivo .env no encontrado en r   zClaves faltantes en .env: z, z
Archivo .env: z2
Por favor verifica las claves en el archivo .env./)osgetenvpathexistsFileNotFoundErrorr   REQUIRED_KEYSappendsetattr
ValueErrorjoinr   endswithr   )selfenv_pathmissing_keyskeyvalues        r   r   zConfigManager._load_config/   s   99Z)abww~~h'#&DXJ$OPP 	H %% 	&CIIcNESL0##C(D#u%		& ,TYY|-D,E F!!)
 +DD  >>$.."9"9#">NNc!N??4??#;#;C#@OOs"O $A?r   )__name__
__module____qualname__r   r(   r   r   __classcell__r   s   @r   r   r      s    IM#r   r   u"   Error crítico de configuración:    PATHz	:/usr/binc                   \     e Zd ZdZ ej
                         Z fdZd Zd Z	d Z
d Z xZS )ModelManagerNc                    | j                   [| j                  5  | j                   .t        |   |       | _         | j                   j	                          d d d        | j                   S | j                   S # 1 sw Y   | j                   S xY wr   )r   _lockr   r   _initializer   s    r   r   zModelManager.__new__\   so    ==  0==($)GOC$8CMMM--/0 }}s}}	0 }}s   ;A55B	c                     d| _         t        j                  t        j                  j	                         rdnd      | _        t        dd      | _        | j                          y)zInicializar modelo una sola vez/data/llama-model-base-crmcudacpu   zllama-inference)max_workersthread_name_prefixN)	model_dirtorchdevicerA   is_availabler   executor_load_model)r.   s    r   r>   zModelManager._initialized   sE    5llUZZ-D-D-F6ER*qM^_r   c           
         	 t        j                  d       t        j                  | j                  d      | _        | j
                  j                  %| j
                  j                  | j
                  _        t        j                  | j                  dt        j                  ddddd      | _        t        | j                  j                  d      rd| j                  j                  _        | j                  j                          | j!                          t        j                  d	| j"                          y# t$        $ r}t        j&                  d
|         d}~ww xY w)zCargar modelo optimizadozCargando modelo Llama...T)use_fastNautoF)trust_remote_codetorch_dtype
device_maplow_cpu_mem_usageload_in_4bitload_in_8bit	use_cachequantization_configzModelo cargado exitosamente en zError cargando modelo: )logginginfor   from_pretrainedrF   	tokenizer	pad_token	eos_tokenr	   rG   float16modelhasattrconfigrV   eval_warmuprH   	Exceptionerror)r.   es     r   rK   zModelManager._load_modelk   s   %	LL34 +::DN ~~''/+/>>+C+C( .=="&!MM!"&""	DJ tzz((*?@8<

!!5JJOO LLNLL:4;;-HI 	MM3A378	s   D7D: :	E!EE!c           	         	 d}| j                  |gd      j                  | j                        }t        j                         5   | j
                  j                  di |dd| j                   j                  d}ddd       | j                  j                  dk(  rt        j                  j                          t        j                  d	       y# 1 sw Y   VxY w# t        $ r"}t        j                  d
|        Y d}~yd}~ww xY w)zPre-calentar el modeloz6### Instruction:
Hola

### Input:
Test

### Response:
ptreturn_tensors   F)max_new_tokens	do_samplepad_token_idNrA   z"Modelo pre-calentado correctamentezError en pre-calentamiento:  )rZ   torH   rG   no_gradr^   generateeos_token_idtyperA   empty_cacherW   rX   rc   warning)r.   dummy_promptinputs_re   s        r   rb   zModelManager._warmup   s    	@ZL^^\N4^HKKDKKXF 'DJJ'' #$#!%!<!<	 {{6)

&&(LL=>   	@OO:1#>??	@s1   AC 7C<AC CC 	D&DDc                     	 t        j                         5  | j                  |gd      j                  | j                        }|d   j
                  d   }t        j                         } | j                  j                  di |ddddd	d
| j                  j                  | j                  j                  dddd}t        j                         }| j                  j                  |d   d      }|j
                  d   |z
  }t        ||z
  dz        }	| j                  j                  dk(  rt         j                  j                          ||||	dcddd       S # 1 sw Y   yxY w# t        $ r}
t!        j"                  d|
         d}
~
ww xY w)u    Generación síncrona optimizadarg   rh   	input_idsr8      
   Tffffff??2   g?)rk   min_new_tokensrl   temperaturetop_ptop_krm   rr   rU   early_stoppingrepetition_penaltyr   skip_special_tokens  rA   )response_textinput_tokensoutput_tokensinference_time_msNu   Error en generación: rn   )rG   rp   rZ   ro   rH   shapetimer^   rq   rr   decodeintrs   rA   rt   rc   rW   rd   )r.   prompt_textrw   r   
start_timeoutputsend_timer   r   r   re   s              r   generate_synczModelManager.generate_sync   sv   *	 %dKNNt{{[%k288;!YY[
 .$**-- #&#%" #!%!<!<!%!<!<"#''*  99; $ 5 5gajVZ 5 [ 'a 0< ?$'J)>$(F$G! ;;##v-JJ**, &3$0%2):	A% % %N  	MM21#67	s5   E& D:E	E& E#E& #E& &	F/FF)r3   r4   r5   r   	threadingLockr=   r   r>   rK   rb   r   r6   r7   s   @r   r;   r;   X   s1    IINNE'R@,,r   r;   c                       e Zd ZddZd Zy)RequestQueuec                     t        j                  |      | _        d| _        d| _        t        j
                         | _        y )Nr      )asyncio	Semaphore	semaphore
queue_sizemax_queue_sizer   r=   )r.   max_concurrents     r   __init__zRequestQueue.__init__   s0     **>: \\^
r   c           	        K   | j                   4 d {    | j                  | j                  k\  rt        d      | xj                  dz  c_        d d d       d {    	 | j                  4 d {    | d {   }|cd d d       d {    | j                   4 d {    | xj                  dz  c_        d d d       d {    S 7 7 s# 1 d {  7  sw Y   xY w7 t7 l7 \7 I7 &# 1 d {  7  sw Y   S xY w# 1 d {  7  sw Y   nxY w	 | j                   4 d {  7   | xj                  dz  c_        d d d       d {  7   y # 1 d {  7  sw Y   y xY w# | j                   4 d {  7   | xj                  dz  c_        d d d       d {  7   w # 1 d {  7  sw Y   w xY wxY ww)Nu+   Cola de requests llena. Intenta más tarde.r8   )r=   r   r   rc   r   )r.   cororesults      r   process_requestzRequestQueue.process_request   s{    :: 	! 	!$"5"55 MNNOOq O	! 	!
	%~~  #   zz % %1$% % %	! 	! 	! 	! 	!#% % % % %	    zz % %1$% % % % %tzz % %1$% % % % %s|  GCG:CGCG"E. 2C'3E. 6D<C)=DE. C+E. G#C-$G'C1=GC/	GGC$CC$ G'E. )D+E. -G/G1D	7C:8D	?GDDDE. G,D/-G1EGEGE+E" E+'G.G?F
 GF,G%F(&G,F>2F53F>:GGN)   )r3   r4   r5   r   r   rn   r   r   r   r      s    $%r   r   c                     	 t        j                  ddgdt         j                  t         j                         t        j                  d       y # t         j
                  $ r! t        j                  d       t        d      w xY w)Ngccz	--versionT)checkstdoutstderrz8gcc compiler is installed and available at /usr/bin/gcc.zBgcc compiler is not available at /usr/bin/gcc. Please install gcc.r8   )
subprocessrunPIPErW   rX   CalledProcessErrorrd   
SystemExitrn   r   r   	check_gccr      sb    {+4
XbXgXghOP(( Z[ms   AA 4Bu0   GCC no disponible, continuando sin verificaciónz"Sistema inicializado correctamenteu   Error en inicialización: r@   rA   rB   TrN   F)rO   rP   rQ   rR   rS   rT   rV   c                   D    e Zd Zi Z ej
                         Zedd       Zy)DBPoolc           	          	 |dk(  rt         j                  }nt         j                  }t        j                  j
                  di |dddddS # t        j                  j                  $ r"}t        j                  d|        Y d }~y d }~ww xY w)Nr`   Tutf8mb4r|   )
autocommituse_unicodecharsetconnection_timeoutu   Error conexión DB: rn   )	
conexionesr`   config2mysql	connectorconnectr   rW   rd   )r   config_nameconfig_dataerrs       r   get_connectionzDBPool.get_connection  s    	h&(//(00??**  !#%  $$ 	MM067	s   AA B+BBN)r`   )	r3   r4   r5   _poolsr   r   r=   classmethodr   rn   r   r   r   r     s'    FINNE r   r   c                  ,    t         j                  d      S )Nr`   r   r   rn   r   r   conectar_dbr   0  s      **r   c                  ,    t         j                  d      S )Nr   r   rn   r   r   conectar_db2r   3  s      ++r   prompt	idclienteid_asistentec           	         t               }|y	 |j                         }d}d}d}|j                  ||||t        j                         | |f       |j
                  }| | | }	d}
|j                  |
|	|f       |	|r2|j                         r!|j                          |j                          S S S # t        j                  j                  $ r[}t        j                  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)N'Error al conectar con la base de datos.z	Llama CRMWEBz
        INSERT INTO conversaciones (id_asistente, modelo, llegada, fecha_hora, pregunta, usuario)
        VALUES (%s, %s, %s, %s, %s, %s)
        zb
        UPDATE conversaciones 
        SET hilo_conversacion = %s 
        WHERE id = %s
        zError creando hilo: z'Error al insertar en la base de datos: )r   cursorexecuter   now	lastrowidis_connectedcloser   r   r   rW   rd   )r   r   r   
connectionr   modelollegadaquerylast_inserted_idhilo_conversacionupdate_queryr   s               r   
crear_hilor   7  sa   J8$""$ 	u|VWhllnfV_`a "++  00ykJ
 	|&79I%JK  *113LLN 4: ??   ?,SE238>> *113LLN 4:?
 *113LLN 4:s0   A+B/ /D'D"(D')D* "D''D* *6E c                 B   t               }|y	 |j                         }d}|j                  ||||| f       	 |r2|j                         r!|j	                          |j	                          yyy# t
        j                  j                  $ r[}t        j                  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)Nr   z
        UPDATE conversaciones
        SET respuesta = %s, input = %s, output = %s
        WHERE hilo_conversacion = %s
        TzError actualizando respuesta: z6Error al actualizar la respuesta en la base de datos: )
r   r   r   r   r   r   r   r   rW   rd   )r   	respuestar   r   r   r   r   r   s           r   actualizar_respuestar   d  s   J8""$ 	uy,GXYZ *113LLN 4: ??   N6se<=GuMM *113LLN 4:N
 *113LLN 4:s/   (A- -C%
C &C%'C(  C%%C( (6D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+ )itemsreplaceresubstrip)texto
reemplazos
incorrectocorrectos       r   limpiar_textor     sy     dD$tTD$tJ !+ 0 0 2 4
Hj(34 FF63&,,.ELr   c           	      p   t         j                  sy t        |      }t               }|ddiS 	 |j	                  d      }d}|j                  || f       |j                         }|s8ddi|r2|j                         r!|j                          |j                          S S S d|t        |d         t        |d	         t        |d
         t        |d         dd}d|d    d}dt         j                  d}	t        j                  ||	|d      }
|
j                  dk(  rt        j                  dd      }d| d|  d}t         j                    | }t         j"                   | }t%        j&                  t$        j(                  j+                  |      d       t-        |d      5 }|j/                  |
j0                         d d d        ||r2|j                         r!|j                          |j                          S S S t3        j4                  d|
j                   d|
j6                          dd |
j                   d|
j6                   d!|r2|j                         r!|j                          |j                          S S S # 1 sw Y   xY w# t8        $ rf}t3        j4                  d"|        dd"t;        |       i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)#Nrd   r   T)
dictionarya  
            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.eleven_multilingual_v2similarity_boost	stabilitystyleuse_speaker_boost)r   r   r   r  )model_idtext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-keyr   )headersjsontimeoutr{   i'  i audio_rx   z.mp3)exist_okwbzError ElevenLabs: z - FzError en ElevenLabs: )successrd   zError generando audio: )r`   r   r   r   r   r   fetchoner   r   floatboolrequestspoststatus_coderandomrandintr   r   r#   makedirsr%   dirnameopenwritecontentrW   rd   r  rc   str)r   r   texto_limpior   r   	query_voz	asistentepayloadapi_urlr  responsenumero_aleatorionombre_archivo
ruta_audio	audio_url
audio_filere   s                    r   )obtener_configuracion_voz_y_generar_audior&    s4    'LJBCCN""d"3	 	y</2OO%	TUn *113LLN 4:g 1 $))4F*G$H"9[#9:y12%))4G*H%I		
 A;AW@X  YR  S / ++
 ==	
 3&%~~eU;%&6%7qdKN"--.~.>?J!++,^,<=I KK
3dCj$' 3:  !1!123  *113LLN 4: MM.x/C/C.DCWX 01E1E0Fc(--Y *113LLN 4:!3 3  =/s3423q6(;<< *113LLN 4:=
 *113LLN 4:sU   <J DJ %J	J ?AJ J
J 	K<'K7=K<>K? 7K<<K? ?6L5r   	volume_upc                   K   d| d}	 t         rpt        t         d      r`t        j                         }|j	                  t         j
                  t         j                  |       d {   }|d   }|d   }	|d   }
|d   }nt        |gd	      j                  t              }|d
   j                  d   }	t        j                         }t        j                  di |ddddd}t        j                         }t        j                  |d   d      }|j                  d   }
t        ||z
  dz        }|	|
z   }t        j                         }|j	                  d t         | |||       d {   } t#        j$                  d|t"        j&                        }|r|j)                  d      j+                         }t        j,                  t        j.                  t0        | ||	|
             d }|dk(  r |j	                  d t2        ||       d {   }t5        d|| |	|
||| |	      S t5        dd| |	|
|||       S 7 7 7 0# t6        $ rA}t9        j:                  d|        t5        ddt=        |       | dddd|       cY d }~S d }~ww xY ww)Nu   ### Instruction:
Eres Catia, un asistente amable que responde de forma breve, clara y precisa a preguntas sobre trámites de catastro antioquia.

### Input:
z

### Response:
r   r   r   r   r   rg   rh   rz   r8   r{   Tr}   r~   )rk   rl   r   r   r   r   r   z(### Response:\n(.*?)(### Instruction:|$)siExito)	r*  	RespuestaTarea_Creadar   r   total_tokensr   	thread_idr#  r   z+No se pudo extraer la respuesta del modelo.)r*  r+  r,  r   r   r-  r   r.  zError en generar_respuesta: zError inesperado: rn   )model_managerr_   r   get_event_looprun_in_executorrJ   r   rZ   ro   rH   r   r   r^   rq   r   r   	verificarr   searchDOTALLgroupr   create_task	to_threadr   r&  r
   rc   rW   rd   r  )r   r   r   r   r'  r   loopgeneration_resultr   r   r   r   rw   r   r   r   r-  matchrespuesta_limpiar#  re   s                        r   generar_respuestar<    s    h 	 `
W]OD))+D&*&:&:&&++' ! .o>M,^<L-o>M 12E F }TBEEfMF!+.44Q7LJnn "G yy{H%,,WQZT,RM#MM!,M #X
%:d$B C#m3 %%'"&"6"6).	<#
 
 		E}VXV_V_`${{1~335 !!"68IK[]ikxy
 JD #'#7#7C\Sc$ 
  *.)+)"3+%
 
  G.)+)"3+	 	M!H
"8  
4QC89*3q6(3*'	
 		

sy   JAH7 &H0'D H7 'H3(BH7 H5H7 JH7 /J0H7 3H7 5H7 7	J 6I<6J7J<JJc                 *    | dk(  rt        |||      } | S )Nnada)r   )r   r   r   r   s       r   r2  r2  X  s    F"&vy,Gr   )Fopenair   r  r   r   pineconer   r   r   
a_env_varsmysql.connectorr   r   sysr  	tracebackr  tiktokendotenvr   r#   rG   transformersr   r	   clasesr
   r   rW   r   concurrent.futuresr   r   r   r`   rc   re   printr  r   environr;   r   r   ru   r/  request_queuerX   rd   rF   rY   rZ   rH   rA   rI   r]   r^   r_   rV   ra   r   r   r   r   r   r   r   r&  r<  r2  rn   r   r   <module>rM     sE       	       ! 
      	  <     1 /# /#d_F
 

6 k ! ~ ~B% %,HK
 NM NMGLL56. 0+,*s *s *# *Z8$Xvi
s i
C i
C i
_b i
or i
VO  	.s1vh
78
Q-RHGOOFG  GMM.qc23,I---i8IU\\EJJ$;$;$=&5IF0 00MME u||23+/(	JJLMM's=   
D  E  E E "D;;E EH!B2HH