o
    x͝fF                     @   s  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dZ'dZ(dZ)e
dddZ'e%*de	e'dd Z+e%*de	e'de,fddZ-e%*de	e'de,fd dZ-e%*d!d"d Z-e%*d#e	e'd$e,fd%dZ-e%*d&e	e'd'd Z-e%*d(e	e'd)d Z-e%*d*e	e'd+e,d,e,d-e,fd.dZ-e%*d/e	e'd0d Z-e	e'e%*d1d2d3 Z.e%*d4e	e'd+e,d,e,fd5dZ-e%*d6d+e,d,e,fd7dZ-e%*d8e	e'd9d Z-e%*d:e	e'd;d Z-e%*d<e	e'd=d> Z/e%0d?d@e#fdAdBZ1e%0dCd@e!fdDdEZ2dFe,fdGdEZ2dS )H    )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                  C   sH   g } t  D ]}i }|d |d< |d |d< |d |d< | | q| S )Nr   zVer Registro   codigo   zfecha de registro)connread_allappenditemsdata
dictionary r#   /opt/lhia/hawa/python/main.pyroot#   s   r%   z*/api/promed_R_by_tecnico/{technician_name}technician_namec                 C   L   g }t | D ]}|d |d |d |d |d |d d}|| q|S )Nr   r   r            	CategoriaTiposervicioclientetecnicozPromedio tiempo resolucion)r   read_by_technicianr   )r&   r    r!   r"   r#   r#   r$   getAll1      r2   z/api/categoria/{categoria}	categoriac                 C   s
   t | S )N)r   read_by_category)r4   r#   r#   r$   r2   C   s   
z/api/Url_provider_categoriac                     sd   t tt} d| v r0g }| d D ]}|d |d |d |d |d |d d}|| q|S g S )	N	dataTablecodeincidentTitlestatuspadCustomersNamePawSvcAuthUsersResponsFullNameformattedResponseTimer+   )r   get_data_in_urlurltokenr   )r!   r    itemr"   r#   r#   r$   r2   J   s   z/api/ticket_sla/{sla_prefix}
sla_prefixc                 C   r'   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   )rA   r    r!   r"   r#   r#   r$   r2   _   r3   z/api/ticket_sla_no_paramsc                  C   sJ   g } t  D ]}|d |d |d |d |d |d d}| | q| S rB   )r   read_all_tickets_noparams_slar   r   r#   r#   r$   r2   q   s   z/api/ticket_sla_no_params_c_t_sc                  C   s\   g } t  D ]%}|d |d |d |d |d |d |d |d |d	 d
	}| | q| S )Nr   r   r   r(   r)   r*            )	rC   r,   r-   ServiciorD   zTickets caducadosrF   rG   zporcentaje caducados)r   $read_all_tickets_no_params_sla_c_t_sr   r   r#   r#   r$   r2      s   zB/api/tickets_repetitivos_Y_Comparativa_Anual/{anio1}/{anio2}/{mes}anio1anio2mesc                 C   sD   g }t | ||D ]}|d |d |d |d d}|| q	|S )Nr   r   r   r(   )r4   tipoincidentes_2019incidentes_2020)r   read_ticket_rep_and_comp_yearr   )rP   rQ   rR   r    r!   r"   r#   r#   r$   r2      s   z!/api/tickets_cad_y_nocad_by_yearsc               	   C   sP   g } t  D ]}|d |d |d |d |d |d |d d}| | q| S )	Nr   r   r   r(   r)   r*   rK   )u   Añor,   rN   r-   zTotal incidentes caducadoszTotal incidentes no caducadoszTotal incidentes)r   read_ticket_cad_y_nocad_yearr   r   r#   r#   r$   r2      s   	z/api/total_incidents_by_groupc                  C   s8   g } t  D ]}|d |d |d d}| | q| S )Nr   r   r   )grupototal_incidentesyear_with_most_incidents)r   read_total_incidents_by_groupr   r   r#   r#   r$   get_total_incidents_by_group   s   r\   z#/api/tendencia_tipo/{anio1}/{anio2}c                 C   sX   g }t | |D ]!}i }|d |d< |d |d< |d |d< |d |d< || q|S )	Nr   rS   r   titulor   cantidad_tickets_2019r(   cantidad_tickets_2020)r   read_tendencia_by_tipor   )rP   rQ   r    r!   r"   r#   r#   r$   r2      s   z*/api/tendencia_tipo_imagen/{anio1}/{anio2}c           	      C   s  g }t | |D ]!}i }|d |d< |d |d< |d |d< |d |d< || qd	d
 |D }dd
 |D }dd
 |D }tjdd tj||dddd tj||ddd|d td td td t	  t
 }tj|dd |d t|ddS )Nr   rS   r   r]   r   r^   r(   r_   c                 S      g | ]}|d  qS )rS   r#   .0r@   r#   r#   r$   
<listcomp>       zgetAll.<locals>.<listcomp>c                 S   ra   )r^   r#   rb   r#   r#   r$   rd      re   c                 S   ra   )r_   r#   rb   r#   r#   r$   rd      re   )
   r*   )figsizebluegffffff?2019)coloralphalabelred2020)rj   rk   rl   bottomr-   zCantidad de TicketszTendencia por Tipopng)formatz	image/png)
media_type)r   r`   r   pltfigurebarxlabelylabeltitlelegendioBytesIOsavefigseekr	   )	rP   rQ   r    r!   r"   tipostickets_2019tickets_2020bufr#   r#   r$   r2      s,   



z/api/sla_cads_nocads_percentsc                  C   sl   g } t  D ]-}i }|d |d< |d |d< |d |d< |d |d< |d	 |d
< |d |d< | | q| S )Nr   SLAr   rD   r   rE   r(   rF   r)   rG   r*   rH   )r   read_sla_cads_nocads_percentsr   r   r#   r#   r$   r2      s   z /api/tendencias_by_c_t_all_aniosc                  C   s   g } t  D ]9}i }|d |d< |d |d< |d |d< |d |d< |d	 |d
< |d |d< |d |d< |d |d< | | q| S )Nr   r,   r   r-   r   zCantidad tickets 2019r(   zCantidad tickets 2020r)   zCantidad tickets 2021r*   zCantidad tickets 2022rK   zCantidad tickets 2023rL   zCantidad tickets 2024)r   !read_tendencias_tickets_all_aniosr   r   r#   r#   r$   r2     s   z/api/califications_Empc                  C   s   g } t  D ]Q}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< | | q| S )Nr   Empresar   total_calificacionesr   zMuy Satisfechor(   
Satisfechor)   Neutralr*   InsatisfechorK   zMuy InsatisfechorL   porcentaje_muy_satisfechorM   porcentaje_satisfecho	   porcentaje_neutralrf   porcentaje_insatisfecho   porcentaje_muy_insatisfecho)r   read_all_calificationsr   r   r#   r#   r$   getall  s"   r   z/extraer_decisionrequestc              
      s4  z}t dddd}|jd| j ddI d H }d| v r"d	d
iW S d| j v r:| j dd }d|dW S d| j v rz| j dd }| j	dd}t
||dd}tjd| ddid}|jdkrsd	||diW S t|jddd	diW S  ty } ztdt|  tdddd }~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   )r]   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lowerrx   replacestripdescriptionr   getr   requestspostdictr   r   	Exceptionprintstr)r   llmr   r   r   ticket_dataer#   r#   r$   extractdesition3  sB   


r   z/consulta_apic              
      s  zgt dddd}d}t|ddgd}t||d	}tdd
dd}d}t|ddgd}t|||d}|j|i d | jdI d H }	|j|i d |	dI d H }
t| jI d H }|d| jid|
i |
|dW S  t	y } zt
dt|  tdddd }~ww )Nr   zgpt-4o-minir   r   u   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   r#   r#   r$   r   b  sJ   	r   r   c              
      s|   z!d}t d|ddd}ddd|  d	 |  d
 fg}||}|jW S  ty= } ztdt|  tdddd }~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   r#   r#   r$   r     s(   
		)3fastapir   r   r   models.incident_connectionr   schema.incident_schemar   
cachetoolsr   r   matplotlib.pyplotpyplotrs   rz   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   cacher>   r?   r   r%   r   r2   r\   r   r   r   r   r#   r#   r#   r$   <module>   s    
 .B