
    
8ic                     h   d dl mZmZmZmZm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Zd dlmZ d dl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mZ d d	lmZmZmZm Z 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*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1  G d d      Z2	  e2       Z3 edddd      Z9e+e9jt                  _+        e9jw                  e)e'       e9jy                  e
g dddgdg        ejz                  ej|                         e9j                  d       e+j                  e/      dededeAfd              ZBe9j                  d       e+j                  e/      dededeAfd              ZCe9j                  d       e+j                  e/      dededeAfd              ZDe9j                  d        e+j                  e-       ed!       ed!       ed!       ed!       ed!       ed!       ed!       ed!       ed      f	deded"e7d#e7d$e7d%e7d&e7d'e7d(e7d)e7d*ee7   fd+              ZFe9j                  d,       e+j                  e-      dedefd-              ZFe9j                  d.       e+j                  e.       ed!       ed!       ed!       ed!       ed!      fdeded'e7d#e7d$e7d)e7d%e7fd/              ZGe9j                  d0       e+j                  e.       ed!       ed!       ed!       ed!       ed!      fdeded'e7d#e7d$e7d)e7d%e7fd1              ZHe9j                  d2       e+j                  e-       ed!       ed!       ed!       ed!       ed!       ed!      fdeded'e7d#e7d$eAd"e7d%e7d)eAfd3              ZIe9j                  d4       e+j                  e-       ed!       ed!       ed!       ed!       ed!       ed!      fdeded'e7d#e7d$eAd"e7d%e7d)eAfd5              ZJe9j                  d6       e+j                  e1       ed!      fdeded7ee7   fd8              ZKe9j                  d9       e+j                  e0       ed!      fdeded$e7fd:              ZLe9j                  d;       e+j                  e0       ed!      fdeded$e7fd<              ZMe9j                  d=       e+j                  e0       ed!      fdeded$e7fd>              ZNe9j                  d?       e+j                  e0       ed!       ed!      fdeded@e7dAe7fdB              ZOe9j                  dC       e+j                  e0       ed!       ed!      fdededDe7dEe7fdF              ZPeQdGk(  rd dlRZR eRj                  e9dHdIJ       yy# e4$ r(Z5 ejl                  d e7e5               e8d      dZ5[5ww xY w)K    )FastAPIFormRequestResponseHTTPException)JSONResponseFileResponse)CORSMiddlewareN)datetime)OptionalList)load_dotenv)download_models)predios_de_propietariopropietarios_del_prediodetalle_predioall_prediosdetalles_predios)_rate_limit_exceeded_handler)RateLimitExceeded)limiterRATE_LIMIT_DEFAULTRATE_LIMIT_CHAT_IARATE_LIMIT_HEAVY_MODELSRATE_LIMIT_MODELSRATE_LIMIT_DATABASERATE_LIMIT_SENSITIVEc                   (     e Zd ZdZ fdZd Z xZS )ConfigManagerNc                     | j                   .t        | 	  |       | _         | j                   j                          | j                   S )N)	_instancesuper__new___load_config)cls	__class__s    =/var/www/pru.catia.catastroantioquia-mas.com/valormas/main.pyr#   zConfigManager.__new__(   s7    == !GOC0CMMM&&(}}    c                 T   t        j                  d      | _        | j                  s$t                t        j                  d      | _        | j                  sd| _        t         j                  j                  | j                        s"t        j                  | j                  d       y y )NCARPETA_DESTINOzI/var/www/pru.catia.catastroantioquia-mas.com/valormas/archivos_ciudadanosTexist_ok)osgetenvr*   r   pathexistsmakedirs)selfs    r'   r$   zConfigManager._load_config.   sz    !yy):; ##M#%99->#?D  ###nD  ww~~d223KK,,t< 4r(   )__name__
__module____qualname__r!   r#   r$   __classcell__)r&   s   @r'   r   r   %   s    I=r(   r   u"   Error crítico de configuración:    T)debugdocs_url	redoc_urlopenapi_url)zhttp://localhost:4200zhttp://10.51.20.5z https://pre.crm.ayudacatastro.cozhttps://pre.ayudacatastro.coz%https://pre.miperfil.ayudacatastro.coz8https://evolution.api.cic-ware.com/message/sendContact/tzhttps://demo.agencycic.comzhttps://www.agencycic.comzhttps://agencycic.comz.https://dev.miperfil.catastroantioquia-mas.comz)https://dev.crm.catastroantioquia-mas.comz+https://dev.ayuda.catastroantioquia-mas.comzhttps://n8n.cic-ware.comzhttps://pru.n8n.agencycic.comz%https://n8n.catastroantioquia-mas.comz)https://dev.n8n.catastroantioquia-mas.comzhttps://agencycic.app.n8n.cloudz%https://dev.tasa-chat.valormas.gov.coz)https://pru.crm.catastroantioquia-mas.com*)allow_originsallow_credentialsallow_methodsallow_headers)levelz/model-dataset/{model_id}requestresponsemodel_idc           	        K   	 ddd}||vrt        dd| d      ||   }d| }t        j                  j                  |d	      }t        j                  j	                  |      st        dd
      t        j
                  |      D cg c]  }|j                  d      s| }}|st        dd      |d   }	t        j                  j                  ||	      }
t        |
d|	      S c c}w # t         $ r  t        $ rB}t        j                  d| dt        |              t        ddt        |             d}~ww xY ww)zC
    Descarga el archivo de dataset desde el modelo almacenado
    llama-model-basellama-model-base-crm      i  Modelo  no encontradostatus_codedetail/data/training_dataz3Carpeta de training_data no encontrada en el modelo.jsonz2No se encontraron archivos de dataset en el modelor   zapplication/json)r/   
media_typefilenamez#Error sirviendo dataset del modelo :   Error interno: N)r   r-   r/   joinr0   listdirendswithr	   	Exceptionloggingerrorstr)rB   rC   rD   model_filesmodel_folder
model_pathdataset_dirfdataset_filesdataset_filenamedataset_pathes               r'   get_model_datasetrh   p   sc    0P "%

 ;& 
.9 
 #8,l^,
 ggll:?ww~~k*L  %'JJ{$;Sqqzz'?RSSK  )+ww||K1AB)%
 	
 T$   P;H:RAxPQoc!fX4NOOPsB   EBC/ C*"C*&AC/ )E*C/ /E=D>>EEz/model-dataset-info/{model_id}c           	        K   	 ddd}||vr	dd| ddS ||   }d| }t         j                  j                  |d	      }d
}t         j                  j                  |      r,t	        |dd      5 }t        j                  |      }d
d
d
       t         j                  j                  |d      }	d
}
t         j                  j                  |	      rt        j                  |	      D cg c]  }|j                  d      s| }}|r|d   }t         j                  j                  |	|      }t        j                  |      }	 t	        |dd      5 }t        j                  |      }t        |t              rt        |      nd}d
d
d
       d }| ||j                        |j                  t        j                  |j                         j#                  d      dd}
d|
||
d
uddS # 1 sw Y   cxY wc c}w # 1 sw Y   xxY w#  d}Y xY w# t$        $ r?}t'        j(                  d| dt+        |              ddt+        |       dcY d
}~S d
}~ww xY ww)u@   
    Obtiene información del dataset incluido en el modelo
    rF   rG   rH   r]   rK   rL   statusmessagerP   ztraining_metadata.jsonNrzutf-8)encodingrQ   rR   r   zN/AzError al leerc                     | dk(  ryg d}dd l }t        |j                  |j                  | d                  }|j	                  d|      }t        | |z  d      }| d||    S )Nr   0 B)BKBMBGB   rI    mathintfloorlogpowround
size_bytes
size_namesrx   ipss         r'   format_file_sizez0get_model_dataset_info.<locals>.format_file_size   sg    !Q$!8JDJJtxx
D'ABCAq)Aj1na0AS*Q-11r(   %Y-%m-%d %H:%M:%ST)rT   	file_sizefile_size_bytesmodification_datetotal_entriesdownload_availablesuccess)dataset_infotraining_metadatahas_datasetrk   dataz"Error obteniendo info del dataset rU   rW   )r-   r/   rX   r0   openjsonloadrY   rZ   stat
isinstancelistlenst_sizer   fromtimestampst_mtimestrftimer[   r\   r]   r^   )rB   rC   rD   r_   r`   ra   metadata_pathr   rc   rb   r   rd   re   rf   	stat_infor   r   r   rg   s                      r'   get_model_dataset_infor      sF    HJ!%

 ;&%GH:^2TUU"8,l^,
 Z1IJ 77>>-(mS7; 1q$(IIaL!1 ggll:?77>>+&(*

;(?W11::gCVQWMW#0#3 !ww||K9IJ GGL1	4lC'B Wa#yy|5?d5KD	QVW2 !1!1)2C2C!D'0'8'8)1)?)?	@R@R)S)\)\]p)q%2*.    ,%6+47
 	
Y1 1 XW W4$3M<  J:8*Bs1vhOP!Ax.HIIJs   IH IAH /G&A!H &G3=G3>H  H 3G8H 	AH %I&G0+H 8H=H H
H 	I4I
IIIIz/model-info/{model_id}c           
        K   	 ddd}||vr	dd| ddS ||   }d| }t         j                  j                  |      sdd	| dS d
 }t        j                  |      }t	        j
                  |j                        }t	        j
                  |j                        }	 ||      }
d }t         j                  j                  |      rdnd}d||||j                  d      |	j                  d       ||
      |
|ddS # t        $ r?}t        j                  d| dt        |              ddt        |       dcY d}~S d}~ww xY ww)u   
    Obtiene información básica del modelo entrenado basado en su ID
    model_id 2: llama-model-base
    model_id 5: llama-model-base-crm
    rF   rG   rH   r]   zModelo con ID rL   rj   rP   z$Archivo del modelo no encontrado en c                    t         j                  j                  |       rt         j                  j                  |       S t         j                  j	                  |       rld}t        j
                  |       D ]P  \  }}}|D ]E  }t         j                  j                  ||      }	 |t         j                  j                  |      z  }G R |S y# t        t        f$ r Y ^w xY w)Nr   )	r-   r/   isfilegetsizeisdirwalkrX   OSErrorIOError)r/   
total_sizedirpathdirnames	filenamesrT   filepaths          r'   get_total_sizez&get_model_info.<locals>.get_total_size  s    ww~~d#wwt,,t$
46GGDM %0GXy$- %#%77<<#B%&"''//(*CCJ%% "! !(1 %$%s   ""CCCc                     | dk(  ryg d}dd l }t        |j                  |j                  | d                  }|j	                  d|      }t        | |z  d      }| d||    S )Nr   rp   )rq   rr   rs   rt   TBru   rI   rv   rw   r~   s         r'   r   z(get_model_info.<locals>.format_file_size0  sg    Q6JDJJtxx
D9:;Aq!Aj1na(AS*Q-))r(   
DirectorioArchivor   r   )rD   
model_name
model_typer   creation_dater   r   r/   r   u)   Error obteniendo información del modelo rU   rW   N)r-   r/   r0   r   r   r   r   st_ctimer   r   r[   r\   r]   r^   )rB   rC   rD   r_   model_filenamera   r   r   modification_timecreation_timer   r   r   rg   s                 r'   get_model_infor      s    P
 "%

 ;&!+H:^D 
 %X.n-.
 ww~~j)!A*N 	  GGJ'	$2293E3EF ..y/A/AB $J/
	* &(WW]]:%>\I
  $,(%6%?%?@S%T!.!7!78K!L-j9#-"	
 	
  
A(2cRSfXVW(Q1
 	

sK   EC= E0C= EB5C= <E=	E4E :E;E EEz/catia.	asistentepregunta	idcliente	volume_uphuman_on	thread_idinstruccionesid_asistentearchivoc                 8   	 d}|
r|
dk7  r{	 d}d|
v rM|
j                  dd      }|d   |d   }}d|v r*d|v r&|j                  d      d   j                  d	      d   }|}
n|
}
|
j                         j                  d
d      j                  dd      }
|
dt        |
       dz  z  z  }
	 t	        j
                  |
      }t        j                  |      xs d}t        j                         j                  d      }| d| | }t         j"                  }t%        j&                  |d       t$        j(                  j+                  ||      }t-        |d      5 }|j/                  |       d d d        t        j0                  d|        t7        j8                  |||||||	d||
      }t        j0                  d|        |S # t        j                  t        f$ r'}t        j                  d|        dddcY d }~S d }~ww xY w# 1 sw Y   xY w# t2        $ r<}t        j                  dt5        |              ddt5        |       dcY d }~S d }~ww xY w# t2        $ r9}t        j                  dt5        |              dt5        |      dcY d }~S d }~ww xY w)Nnozapplication/octet-stream,r7   r   zdata:z;base64:;
 =   zBase64 malformado: r]   u6   El archivo enviado no tiene un formato base64 válido.rj   z.binz%Y%m%d%H%M%S-Tr+   wbz"Archivo guardado exitosamente en: z!Error procesando archivo base64: zError al procesar el archivo: zResultado de ValorPlus.main(): z#Error ejecutando ValorPlus.main(): )splitstripreplacer   base64	b64decodebinasciiError
ValueErrorr\   r]   	mimetypesguess_extensionr   nowr   configr*   r-   r1   r/   rX   r   writeinfor[   r^   valormasmain)rB   rC   r   r   r   r   r   r   r   r   r   archivo_path	tipo_mimepartes
encabezadocontenido_base64	contenidorg   	extension	timestampnombre_archivocarpeta_destinorc   	resultados                           r'   catia_endpointr   S  s   <6w$*a6	'>$]]32F39!9fQi 0J*,j1H$.$4$4S$9!$<$B$B3$G$J	.G%G "--/11$;CCD"M33w<-!"344t & 0 0 9I &55i@JF	 %LLN33NC	$-;a	{9+!F #)"8"8Od;!ww||O^L,- 'GGI&' A,PQ MMy(L}lDi
	 	6ykBCC !
3 tMM$7s";<&-:rsst ' '
  a A#a&JK")8VWZ[\W]V^6_``a  6;CF8DE!c!f556s   I BH )G  >BH H( H 7I  H G;5H 6H ;H  H HH 	I1I	I
I II 	J .JJJz	/catia_wsc                   K   	 | j                          d {   }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }t        j                  ||||||      }	|	S 7 # t        $ r:}
t        j                  dt        |
              d	t        |
      	d
cY d }
~
S d }
~
ww xY ww)Nr   r   r   r   r   r   telefonozError ejecutando main(): r]   )rk   rl   r   )r   getvalormas_wsmain_telefonor[   r\   r]   r^   )rB   rC   r   r   r   r   r   r   r   r   rg   s              r'   r   r     s     N\\^#HH["-	88J+HH["-	"5xx388J+  --xi
	
  $   N1#a&:;!c!f9MMNsE   C,B& B$BB& #C,$B& &	C)//C$C)C,$C))C,z/catia-llamac           	        K   	 ddl m}m} |r/|j                   |||t	        |      ||             d {   }	|	S  |||t	        |      ||       d {   }	|	S 7 &7 # t
        $ rS}
t        j                  dt        |
              dt        |
      v rt        dd      d	t        |
      d
cY d }
~
S d }
~
ww xY wwNr   )generar_respuestarequest_queue)hilo_conversacionpromptr   r   r   z,Error ejecutando Valormas Llama optimizado: zCola de requests llenai  u*   Servidor sobrecargado. Intenta más tarde.rM   r]   rj   )
valormas_llamar   r   process_requestry   r[   r\   r]   r^   r   rB   rC   r   r   r   r   r   r   r   	respuestarg   s              r'   catia_llama_endpointr     s     %6C +;;!&/#!)n!-' I&  0"+i.)# I '  
6DSVHMN $s1v-C 
 "c!f55
6a   C 2A! AA! C A! AA! C A! A! !	B=*AB82B=3C 8B==C z/catia-llama-crmc           	        K   	 ddl m}m} |r/|j                   |||t	        |      ||             d {   }	|	S  |||t	        |      ||       d {   }	|	S 7 &7 # t
        $ rS}
t        j                  dt        |
              dt        |
      v rt        dd      d	t        |
      d
cY d }
~
S d }
~
ww xY wwr   )
valormas_llama_crmr   r   r   ry   r[   r\   r]   r^   r   r   s              r'   catia_llama_crm_endpointr     s     %6G +;;!&/#!)n!-' I&  0"+i.)# I '  
6DSVHMN $s1v-C 
 "c!f55
6r   z/catia-geminic                    K   	 t        j                  ||||||      }t        |      S # t        $ r#}	t        ddt	        |	      d      cY d }	~	S d }	~	ww xY wwN)r   r   r   r   r   r   contentrV   r]   rj   rN   r  )valormas_geminir   r   r[   r^   
rB   rC   r   r   r   r   r   r   r   rg   s
             r'   catia_gemini_endpointr    se     ]#((%
	 I.. ]TWXYTZ5[\\]0   A&+ A	AAAAAAz/catia-anthropic-v2c                    K   	 t        j                  ||||||      }t        |      S # t        $ r#}	t        ddt	        |	      d      cY d }	~	S d }	~	ww xY wwr   )valormas_anthropic_v2r   r   r[   r^   r  s
             r'   catia_anthropic_endpointr	  8  se     ])..%
	 I.. ]TWXYTZ5[\\]r  z/descargar_modelosmodel_reposc                    K   	 t        |      \  }}|sdnd}|||dS # t        $ r<}t        j                  dt	        |              ddt	        |       dcY d }~S d }~ww xY ww)Nokpartial_success)rk   downloaded_modelserrorszError en descargar_modelos: r]   zError inesperado: rj   )r   r[   r\   r]   r^   )rB   rC   r
  
downloadedr  rk   rg   s          r'   descargar_modelosr  T  s|     M -[9
F#):!+
 	

  M4SVH=>!0B3q6(.KLLMs0   A& A&	A#1AA#A&A##A&z/catia-prediosc                    K   	 t        |      }t        |      S # t        $ rD}t        j                  dt        |              t        ddt        |      d      cY d }~S d }~ww xY ww)Nr   zError en /catia-predios: rV   r]   rj   r  )r   r   r[   r\   r]   r^   rB   rC   r   r   rg   s        r'   catia_predios_endpointr  k  sc     ]*95	I.. ]1#a&:;TWXYTZ5[\\]s0   A+ A+	A(9A#A(A+#A((A+z/catia-propietariosc                   K   	 t        |      }t        t        |t              r
d|d      S |      S # t        $ rD}t        j                  dt        |              t        ddt        |      d      cY d }~S d }~ww xY ww)	Nr   r   r   zError en /catia-propietarios: rV   r]   rj   r  )r   r   r   r^   r[   r\   r]   r  s        r'   catia_propietarios_endpointr  u  s}     ]+I6	PZ[dfiPjy)$Lzzpyzz ]6s1vh?@TWXYTZ5[\\]9   B)5 B5 B	B9A=7B8B=BBz/catia-detalle-predioc                   K   	 t        |      }t        t        |t              r
d|d      S |      S # t        $ rD}t        j                  dt        |              t        ddt        |      d      cY d }~S d }~ww xY ww)	Nr   r   r   z Error en /catia-detalle-predio: rV   r]   rj   r  )r   r   r   r^   r[   r\   r]   r  s        r'   detalle_predio_endpointr    s     ]"9-	@J9VY@Zy)<
 	
`i
 	
  ]8QABTWXYTZ5[\\]r  z/all-predios-user	documentotipo_consultac                    K   	 t        ||      }t        |      S # t        $ rD}t        j                  dt        |              t        ddt        |      d      cY d }~S d }~ww xY ww)Nr   zError en /all-predios-user: rV   r]   rj   r  )r   r   r[   r\   r]   r^   )rB   rC   r  r  r   rg   s         r'   all_predios_endpointr    se     ]	=9	I.. ]4SVH=>TWXYTZ5[\\]0   A, A,	A)9A$A)A,$A))A,z/detalle-prediofichanpnc                    K   	 t        ||      }t        |      S # t        $ rD}t        j                  dt        |              t        ddt        |      d      cY d }~S d }~ww xY ww)Nr   zError en /detalle-predio: rV   r]   rj   r  )r   r   r[   r\   r]   r^   )rB   rC   r  r   r   rg   s         r'   detalles_predios_endpointr"    se     
$UC0	I.. 
23q6(;<&3q6:
 	

r  __main__z0.0.0.0i  )hostport)Tfastapir   r   r   r   r   fastapi.responsesr   r	   fastapi.middleware.corsr
   r\   r   r   r-   r   r   r   r   typingr   r   dotenvr   r  r  down_models_hfr   asistente_n8nr   r   r   r   r   asynciotimetorchr   slowapir   slowapi.errorsr   limit.rate_limiterr   r   r   r   r   r   r   r   r   r[   rg   r]   r^   
SystemExitappstateadd_exception_handleradd_middlewarebasicConfigINFOr   limitry   rh   r   r   postr   r   r   r  r	  r  r  r  r  r  r"  r3   uvicornrun r(   r'   <module>r?     s/   C C 8 2    	     !    * x x     1 ,  = =4_F
 D 		    +-I J   . %%7  >   ',, '	$% !4PW 4P 4PC 4P " &4Pl 	)* !LJ' LJX LJQT LJ " +LJ\ 	!" !V
' V
X V
 V
 " #V
r (!" #YI#Y#YI#YcS	!$ZI6I6I6 I6 	I6
 I6 I6 I6 I6 I6 I6 c]I6 # I6V +!"N' NX N # N. .&' #YI#YS	#Y.6.6.6 .6 	.6
 .6 .6 .6 ( .6b 
&' #YI#YS	#Y.6.6.6 .6 	.6
 .6 .6 .6 ( .6` /!" #YI#Y#Y#YS	]]] ] 	]
 ] ] ] ] # ]0 
 !" #YI#Y#Y#YS	]]] ] 	]
 ] ] ] ] # !]4 
#$ "#YMMM cM %  M* 
"#X\]`Xa ]' ]X ]RU ] $ ] 
 "#]abe]f ]w ]( ]WZ ] $ !] 
!""#Y]^aYb ]7 ]h ]SV ] $ #] 
"#VZ[^V_vz{~v ] ]8 ]PS ]ps ] $ ] 
"# cCy	


 
 
	
 $ 
" zGKK)$/ Q  GMM6s1vh?@
Q-s   "V V1	#V,,V1