
    SgV                        d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlZd dlmZ d dlZd dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dl mZmZ d dlmZ d dl m!Z! d dl"m#Z# d dl$Z$ e       Z% e       Z& e
dd      Z'dZ(dZ) e
dd      Z'e%jU                  d       e	e'      d               Z+e%jU                  d       e	e'      de,fd              Z-e%jU                  d       e	e'      de,fd              Z-e%jU                  d      d         Z-e%jU                  d!       e	e'      d"e,fd#              Z-e%jU                  d$       e	e'      d%               Z-e%jU                  d&       e	e'      d'               Z-e%jU                  d(       e	e'      d)e,d*e,d+e,fd,              Z-e%jU                  d-       e	e'      d.               Z- e	e'      e%jU                  d/      d0               Z.e%jU                  d1       e	e'      d)e,d*e,fd2              Z-e%jU                  d3      d)e,d*e,fd4       Z-e%jU                  d5       e	e'      d6               Z-e%jU                  d7       e	e'      d8               Z-e%jU                  d9       e	e'      d:               Z/e%ja                  d;      d<e#fd=       Z1e%ja                  d>      d<e!fd?       Z2d@e,fdAZ3e%ja                  dB      d<e!fdC       Z4y)D    )FastAPIHTTPExceptionRequest)IncidentConnection)IncidenSchema)cachedTTLCacheN)StreamingResponse)LLMChain)
ChatOpenAI)ConversationBufferMemory)PromptTemplate)create_qa_with_sources_chain)StuffDocumentsChain)ConversationalRetrievalChain)r   r   )
Embeddings)MessageRequest)TicketRequest   ,  )maxsizettlaJ  https://hawa.proactivanet.com/proactivanet/api/table/data?url=https%3A%2F%2Fhawa.proactivanet.com%2Fproactivanet%2Fservicedesk%2Fincidents%2FallIncidents%2FallIncidents.paw%3Fsource%3DviewAllGlobalIncidents%26pawNodeExtra%3D%26pawParentNode%3Dnode%26pawParentData%3D%26pawNode%3DtreeAllTickets%26pawData%3DshowArchivedButton%253D1a  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJqYW5hdmFycm9AaGF3YXNvbHV0aW9ucy5jb20iLCJvdnIiOiJmYWxzZSIsImF1dCI6IjAiLCJuYmYiOjE3MDk2NzY5NDYsImV4cCI6MTc0MTIxMjk0NiwiaWF0IjoxNzA5Njc2OTQ2LCJpc3MiOiJwcm9hY3RpdmFuZXQiLCJhdWQiOiJhcGkifQ.UVvUmjo0yO3R-PjBimNsvHeIHjbbdO8v6Ou6_TjlcGw/c                      g } t         j                         D ]-  }i }|d   |d<   |d   |d<   |d   |d<   | j                  |       / | S )Nr   zVer Registro   codigo   zfecha de registro)connread_allappenditemsdata
dictionarys      %/opt/lhia/hawa/backend/python/main.pyrootr&   #   sa     E !
%)!W
>"#Aw
8*.q'
&'Z ! L    z*/api/promed_R_by_tecnico/{technician_name}technician_namec                     g }t         j                  |       D ].  }|d   |d   |d   |d   |d   |d   d}|j                  |       0 |S )Nr   r   r            	CategoriaTiposervicioclientetecnicozPromedio tiempo resolucion)r   read_by_technicianr    )r(   r"   r#   r$   s       r%   getAllr4   1   si     E''8 	!aGQAwAw*.q'

 	Z 	! Lr'   z/api/categoria/{categoria}	categoriac                 ,    t         j                  |       S )N)r   read_by_category)r5   s    r%   r4   r4   C   s       ++r'   z/api/Url_provider_categoriac                     K   t         j                  t        t              } d| v r:g }| d   D ].  }|d   |d   |d   |d   |d   |d   d}|j	                  |       0 |S g S w)	N	dataTablecodeincidentTitlestatuspadCustomersNamePawSvcAuthUsersResponsFullNameformattedResponseTimer-   )r   get_data_in_urlurltokenr    )r#   r"   itemr$   s       r%   r4   r4   J   s     E*Dd% 		%D!&\_- N 23 @A.23J.KJ LL$		% 	s   AA!z/api/ticket_sla/{sla_prefix}
sla_prefixc                     g }t         j                  |       D ].  }|d   |d   |d   |d   |d   |d   d}|j                  |       0 |S Nr   r   r   r*   r+   r,   )SlaTotal ticketsTickets CaducadosTickets no caducadosPorcentaje caducadosPorcentaje no caducados)r   read_all_tickets_by_slar    )rD   r"   r#   r$   s       r%   r4   r4   _   si     E,,Z8 	!7!!W!%a$(G$(G'+Aw

 	Z 	! Lr'   z/api/ticket_sla_no_paramsc                      g } t         j                         D ].  }|d   |d   |d   |d   |d   |d   d}| j                  |       0 | S rF   )r   read_all_tickets_noparams_slar    r!   s      r%   r4   r4   q   sg     E224 	!7!!W!%a$(G$(G'+Aw

 	Z 	! Lr'   z/api/ticket_sla_no_params_c_t_sc                      g } t         j                         D ]:  }|d   |d   |d   |d   |d   |d   |d   |d   |d	   d
	}| j                  |       < | S )Nr   r   r   r*   r+   r,            )	rG   r.   r/   ServiciorH   zTickets caducadosrJ   rK   zporcentaje caducados)r   $read_all_tickets_no_params_sla_c_t_sr    r!   s      r%   r4   r4      s|     E99; !7aGQ!!W!%a$(G$(G$(G


 	Z ! Lr'   zB/api/tickets_repetitivos_Y_Comparativa_Anual/{anio1}/{anio2}/{mes}anio1anio2mesc                     g }t         j                  | ||      D ]&  }|d   |d   |d   |d   d}|j                  |       ( |S )Nr   r   r   r*   )r5   tipoincidentes_2019incidentes_2020)r   read_ticket_rep_and_comp_yearr    )rV   rW   rX   r"   r#   r$   s         r%   r4   r4      s_     E225%E !aG#Aw#Aw	

 	Z ! Lr'   z!/api/tickets_cad_y_nocad_by_yearsc            	          g } t         j                         D ]2  }|d   |d   |d   |d   |d   |d   |d   d}| j                  |       4 | S )	Nr   r   r   r*   r+   r,   rQ   )u   Añor.   rT   r/   zTotal incidentes caducadoszTotal incidentes no caducadoszTotal incidentes)r   read_ticket_cad_y_nocad_yearr    r!   s      r%   r4   r4      sn     E113 
!GaQG*.q'-1!W $Q

 	Z 
! Lr'   z/api/total_incidents_by_groupc                  |    g } t         j                         D ]"  }|d   |d   |d   d}| j                  |       $ | S )Nr   r   r   )grupototal_incidentesyear_with_most_incidents)r   read_total_incidents_by_groupr    r!   s      r%   get_total_incidents_by_groupre      sR     E224 !!W $Q(,Q


 	Z ! Lr'   z#/api/tendencia_tipo/{anio1}/{anio2}c                     g }t         j                  | |      D ]5  }i }|d   |d<   |d   |d<   |d   |d<   |d   |d<   |j                  |       7 |S )	Nr   rZ   r   titulor   cantidad_tickets_2019r*   cantidad_tickets_2020)r   read_tendencia_by_tipor    )rV   rW   r"   r#   r$   s        r%   r4   r4      sw     E++E59 !
!!W
6#Aw
8.21g
*+.21g
*+Z ! Lr'   z*/api/tendencia_tipo_imagen/{anio1}/{anio2}c                    g }t         j                  | |      D ]5  }i }|d   |d<   |d   |d<   |d   |d<   |d   |d<   |j                  |       7 |D cg c]  }|d   	 }}|D cg c]  }|d   	 }}|D cg c]  }|d   	 }}t        j                  d	
       t        j
                  ||ddd       t        j
                  ||ddd|       t        j                  d       t        j                  d       t        j                  d       t        j                          t        j                         }	t        j                  |	d       |	j                  d       t        |	d      S c c}w c c}w c c}w )Nr   rZ   r   rg   r   rh   r*   ri   )
   r,   )figsizebluegffffff?2019)coloralphalabelred2020)rp   rq   rr   bottomr/   zCantidad de TicketszTendencia por Tipopng)formatz	image/png)
media_type)r   rj   r    pltfigurebarxlabelylabeltitlelegendioBytesIOsavefigseekr
   )
rV   rW   r"   r#   r$   rC   tipostickets_2019tickets_2020bufs
             r%   r4   r4      s^   E++E59 !
!!W
6#Aw
8.21g
*+.21g
*+Z ! ',,dT&\,E,>CDdD01DLD>CDdD01DLDJJwGGE<vSGGGE<uCvl[JJvJJ$%II"#JJL **,CKKE"HHQK S[99% -DDs   E.'E39E8z/api/sla_cads_nocads_percentsc                      g } t         j                         D ]E  }i }|d   |d<   |d   |d<   |d   |d<   |d   |d<   |d	   |d
<   |d   |d<   | j                  |       G | S )Nr   SLAr   rH   r   rI   r*   rJ   r+   rK   r,   rL   )r   read_sla_cads_nocads_percentsr    r!   s      r%   r4   r4      s     E224 !
 G
5&*1g
?#*.q'
&'-1!W
)*-1!W
)*04Q
,-Z ! Lr'   z /api/tendencias_by_c_t_all_aniosc                      g } t         j                         D ]U  }i }|d   |d<   |d   |d<   |d   |d<   |d   |d<   |d	   |d
<   |d   |d<   |d   |d<   |d   |d<   | j                  |       W | S )Nr   r.   r   r/   r   zCantidad tickets 2019r*   zCantidad tickets 2020r+   zCantidad tickets 2021r,   zCantidad tickets 2022rQ   zCantidad tickets 2023rR   zCantidad tickets 2024)r   !read_tendencias_tickets_all_aniosr    r!   s      r%   r4   r4     s     E668 
!
"&q'
;!!W
6.21g
*+.21g
*+.21g
*+.21g
*+.21g
*+.21g
*+Z 
! Lr'   z/api/califications_Empc                  "   g } t         j                         D ]u  }i }|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                  |       w | S )Nr   Empresar   total_calificacionesr   zMuy Satisfechor*   
Satisfechor+   Neutralr,   InsatisfechorQ   zMuy InsatisfechorR   porcentaje_muy_satisfechorS   porcentaje_satisfecho	   porcentaje_neutralrl   porcentaje_insatisfecho   porcentaje_muy_insatisfecho)r   read_all_calificationsr    r!   s      r%   getallr     s     E++- !
 $Q
9-1!W
)*'+Aw
#$#'7
<  $Q
9%)!W
>")-a
%&26q'
./.21g
*++/7
'(04R
,-48H
01Z ! Lr'   z/extraer_decisionrequestc                 t  K   	 t        ddd      }|j                  d| j                   d       d {   }d|j                         v rd	d
iS d| j                  j                         v r=| j                  j                         j                  dd      j                         }d|dS d| j                  j                         v r| j                  j                         j                  dd      j                         }| j                  j                  dd      }t        ||d      }t        j                  d|j                         ddi      }|j                  dk(  rd	||diS t        |j                  d      d	diS 7 K# t         $ r)}t#        dt%        |              t        dd      d }~ww xY ww)N      ?zgpt-43sk-BJBMLzenOAiK9uGa5s5DT3BlbkFJdlwQPbVPKBFOkChjfD8rtemperaturemodelopenai_api_keyzDel siguiente texto: u   , extrae la decisión de si el usuario quiere crear un ticket. Luego, pregunta por el motivo del ticket y pide una descripción.)textzcrear un ticketresponsez-Claro, ingresa el motivo de tu requerimiento.zmotivo: zDescribe tu caso.)r   motivozdescripcion:r   z$0f2afbe5-7f66-4a47-ae46-20373d64038c)TitleDescriptionPanUsers_idSourcez:https://hawasolutions.proactivanet.com/panet/api/IncidentszContent-Typezapplication/json)jsonheaders   )rg   descripcionzError al crear el ticketstatus_codedetailu   No se ha reconocido una solicitud válida. Por favor, indica si deseas crear un ticket, proporciona un motivo o una descripción.Error:   Internal Server Error)r   apredictmessagelowerr~   replacestripdescriptionr   getr   requestspostdictr   r   	Exceptionprintstr)r   llmr   r   r   ticket_dataes          r%   extractdesitionr   3  s    *MSH}~ ((9  :z  { & 
 
  00 OPP '----//]]((*229bAGGIF 3vFF w2288::!--335==nbQWWYK__((26F''"HK  }}L %%'');<H
 ##s*"vk$RSS#0D0DMghh   !d  e  eC
F  MAx !4KLLMs^   F81F F F F8AF (F8)B;F $F8%F ?F8 F 	F5$F00F55F8z/consulta_apic                   K   	 t        ddd      }d}t        |ddg      }t        ||	      }t        dd
d      }d}t        |ddg      }t        |||      }|j	                  |j                  i       d   | j                         d {   }	|j	                  |j                  i       d   |	       d {   }
t        | j                         d {   }|j                  d| j                  id|
i       |
|dS 7 s7 H7 -# t        $ r)}t        dt        |              t        dd      d }~ww xY ww)Nr   gpt-4o-minir   r      Toma la última pregunta del historial de chat y únela a la pregunta de entrada de seguimiento y crea una pregunta independiente.
        Historial de Chat:
        {chat_history}
        Entrada de seguimiento: {question}
        Pregunta independiente:chat_historyquestiontemplateinput_variablesr   promptTr*   
memory_keyreturn_messageskue  
        Actúa como un asistente de soporte técnico con Conocimeintoes en ITIL, COBIT, ISO 27001, CISCO que permite al usuario interactuar y obtener una solución de un problema, 
        debes ser preciso en la resolución del problema que el usuario plantea, debe enfocarse solo en lo que se refiere a soporte técnico 
        de mesa de servicios, mantenimiento de equipos tecnológicos, si el usuario hace preguntas que no tengan nada que ver con la mesa de servicios simplemente no respondas.. 
        
        Historial de Chat:
        {chat_history}
        Entrada de seguimiento: {question}
        r   r   memoryr   r   inputoutputanswer	sentimentr   r   r   r   )r   r   r   r   r   load_memory_variablesr   replace_product_codessave_contextr   r   r   r   )r   r   !condense_question_prompt_templatecondense_question_promptcondense_question_chainr   qa_prompt_template	qa_promptqa_chaincondensed_questionr   sentiment_analysisr   s                r%   apiConsultaTWSr   b  s    >MS  OD  E-#)
 $26+Z8$
 
 #++#

 *^UY\]^ #'+Z8
	
 IfE $;#C#C55b9.I__ $D $
 
 "**55b9.I' + 
 

 $9#II 	Wgoo688LM"/1 	1#


 J  MAx !4KLLMs_   D>BD	 D,D	 <D=D	 D(D	 D>D	 D	 D	 		D;$D66D;;D>r   c                    K   	 d}t        d|dd      }ddd| z   d	z   | z   d
z   fg}|j                  |      }|j                  S # t        $ r)}t	        dt        |              t        dd      d }~ww xY ww)Nr   zgpt-4og        r   )r   
max_tokensr   api_key)systemzAeres un generador json de resumen y sentimiento de conversacioneshumanu   De la siguiente conversación:u`    extrae en formato json el resumen y el sentimiento de la conversación. si no te llega nada en z no respondasr   r   r   r   )r   invokecontentr   r   r   r   )r   r   r   messagesai_msgr   s         r%   r   r     s     M
!I	
	

 5d:  <^  ^  _c  c  ds  s	

 H% ~~ MAx !4KLLMs(   A9?A A9	A6$A11A66A9z/consulta_api_bgrc                   K   	 t        ddd      }d}t        |ddg      }t        d	t        |               t        d
|         t        d| j                          t        ||      }t        ddd      }d}t        |ddg      }t        |||      }|j                  i       }	|	j                  dd      }
|j                  |
| j                         d {   }|j                  |j                  i       d   |       d {   }t        | j                         d {   }|j                  d| j                  id|i       ||dS 7 s7 H7 -# t        $ r)}t        dt        |              t        dd      d }~ww xY ww)Nr   r   r   r   r   r   r   r   zTipo de request: zContenido del request: zMensaje recibido: r   Tr*   r   u  
        Eres LHIA es un asistente de soporte técnico del Banco General Rumiñahui desarrollado por TWS . te enfocas exclusivamente en resolver problemas relacionados con la mesa de servicios, ITIL, COBIT, ISO 27001, y tecnologías CISCO, brindando soluciones precisas y eficientes en mantenimiento de equipos tecnológicos y que permite al usuario interactuar y obtener una solución de un problema. 

        **Reglas y restricciones**:
        1. LHIA solo responde a consultas directamente relacionadas con soporte técnico de mesa de servicios y mantenimiento de equipos tecnológicos.
        2. No proporciona respuestas ni sugerencias sobre temas no relacionados con soporte técnico, ITIL, COBIT, ISO 27001, o tecnologías CISCO.
        3. Mantén siempre la precisión en las respuestas, enfocándote en la resolución del problema técnico planteado.
        4. Rechaza educadamente cualquier solicitud fuera del alcance del soporte técnico, aclarando que solo se manejan problemas relacionados con soporte técnico y mantenimiento de equipos.
        5. Siempre mantén un tono profesional y cortés, siguiendo los estándares del Banco General Rumiñahui.

        **Historial de Chat**:
        {chat_history}

        **Entrada de seguimiento**: {question}
        r   r   r   r   r   r   r   r   r   r   )r   r   r   typer   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   memory_variablesr   r   r   r   r   s                  r%   apiConsultaBGRr     s    JMS  OD  E-#)
 $26+Z8$
  	!$w-12'y12 	"7??"345"*+#

 *^UY\]^ #'+Z8
	
 IfE!77;'++NB? $;#C#C%__ $D $
 
 "**55b9.I' + 
 

 $9#II 	Wgoo688LM"/1 	1#


 J  MAx !4KLLMs_   FCE E,E 
EE 'E((E FE E E 	F	 $FF		F)5fastapir   r   r   models.incident_connectionr   schema.incident_schemar   
cachetoolsr   r	   matplotlib.pyplotpyplotry   r   fastapi.responsesr
   uuidlangchain.chainsr   langchain_openair   langchain.memoryr   langchain.promptsr   r   (langchain.chains.combine_documents.stuffr   r   langchain_core.embeddingsr   models.MessageRequestr   models.TicketRequestr   r   appr   cacherA   rB   r   r&   r   r4   re   r   r   r   r   r   r    r'   r%   <module>r     s   2 2 9 0 '  	 /  % ' 5 , 9 H 9 * 0 0 . i#& S 	^#&    	56C   7  	%&,c ,  ',
 	&' (( 	'(s   )  	$%  &  	*+  ,& 	MN
# 
c 
 
  O
 	,-  ." 	()	 * 	 	./	# 	c 	  0	 	56:# :c : 7:@ 	()  * 	+,  -" 	!"  #& 
+M= +M +M\ /?M. ?M ?MD!MS !MJ 
KM. KM KMr'   