
    ja                     N   d dl Z d dlZ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mZ d dlZd dlmZ d dlm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
ZdZdZ eee          Z eee          Z ee            e	d           dedefdZ d Z!edefd            Z"ededefd            Z#ededefd            Z$ededefd            Z%ededefd            Z&edededededede'fd            Z( edde ed d!"          e"e#e$e%e&e(g#          Z)d$ Z*d% Z+dS )&    N)AgentRunnerfunction_toolModelSettingsFileSearchTool)set_default_openai_clientset_tracing_disabled)AsyncOpenAI)OpenAIChatCompletionsModel)load_dotenv)Any)datetime)Imagezhttp://104.189.92.139:11434/v1ollamazgpt-oss:120b)base_urlapi_key)modelopenai_clientTusrEmailusrPassc                    d}| |d}ddd}t          j        |||          }	 |                                }|                    d          rEd|v rA|d                             d	          }|d         d
                             d          }||dS d|                    dd          iS # t          $ r}	ddt          |	           icY d }	~	S d }	~	ww xY w)N#https://api.sistemaml.net/app/loginapp_usernameapp_password4agk_XGgFnhlBCziMsF6dmx6xMHoTL1hd9cJrFJJOOMAJr828ef60!application/x-www-form-urlencodedzX-Agent-KeyContent-Typedataheaderssuccessr!   access_tokenuserid)r$   user_iderrormessageAuthentication failed.Failed to parse response: requestspostjsonget	Exceptionstr)
r   r   urlpayloadr"   responser!   tokenr'   es
             +/var/www/FlaskApp/Agent_MLCourier_Ollama.pyget_Token_and_Idr9   -   s6   
/C ! G N; G }Sw@@@H
}}88I 
	6T>>L$$^44E6l6*..t44G %"   )-EFF   
 
 
:#a&&::
 	
 	
 	
 	
 	
 	

s$   A-B+ B+ +
C5CCCc                 H   t           j                            |           d                                         }|dk    r=t	          | d          5 }|                                }d d d            n# 1 swxY w Y   ny|dv rft          j        |                               d          }t          j	                    }|
                    |d           |                                }nt          d          t          j        |                              d	          }d
                    |                                                                          }	 t          j        |            t          j        |d           n"# t*          $ r}t          d          |d }~ww xY w|S )N   z.pdfrb)z.jpgz.jpegz.pngRGBPDF)formatzIFormato de archivo no soportado. Usa PDF o una imagen (.jpg, .jpeg, .png)utf-8 T)validatez$Base64 encoding failed or is invalid)ospathsplitextloweropenreadr   convertioBytesIOsavegetvalue
ValueErrorbase64	b64encodedecodejoinstrip
splitlinesremove	b64decoder1   )		file_pathfile_extf	pdf_bytesimage
pdf_buffer
pdf_base64pdf_base64_cleanr7   s	            r8   prepare_invoice_base64r_   T   s   w	**1-3355H 6)T"" 	!aI	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!	.	.	.
9%%--e44Z\\


:e
,,,''))		deee !),,33G<<Jwwz//11<<>>??H
	))D99999 H H H?@@aGH s*   A//A36A3*F   
F
FFc           	      p    d}d| i}ddddddd	d
d}t          j        |||          }t          |          S )Nz,https://api.sistemaml.net/app/password/emailemailno-cachePostmanRuntime/7.43.4*/*gzip, deflate, br
keep-aliveuser_comprateliaz
1nt3l14p1$r   )Cache-Control
User-AgentAcceptAccept-Encoding
Connectionra   passwordr   r    )r-   r.   r2   )r   r3   r4   r"   r5   s        r8   reset_passwordrn   w   s_    
8C 	G $-."":	 	G }Sw@@@Hx==    c           
      (   t          | |          }|d         }|d         }d| }d| ddddd	d
}t          j        ||          }|                                }g }	|                    dg           D ]l}
|	                    |
                    dd          |
                    dd          |
                    dd          |
                    dd          d           mdt          |	           dt          |	          |	d}t          |          S )Nr$   r'   z,https://api.sistemaml.net/app/preAlert/list/Bearer rb   rc   rd   re   rf   Authorizationrh   ri   rj   rk   rl   r"   r!   trackingrA   descriptionpriceinstructions)ru   rv   rw   rx   Tz prealertas encontrados.)r#   r)   totalr!   )r9   r-   r0   r/   appendlenr2   )r   r   credsAccess_tokenr'   r3   r"   r5   response_data	prealertsitemoutputs               r8   prealertlist_processr      sN    Xw//E(LIG
 C
B
BC .|--)* G |C000HMMOOMI!!&"--  R0088M266XXgr** HH^R88	
 
 	 	 	 	 )nn>>>Y	 F v;;ro   c                 D   t          | |          }|d         }|d         }d}d| ddddd	d
}t          j        ||          }|                                }|                    di           }|                    dg           }	g }
d}|	D ]{}|                    dd          }|                    dd          }|                    dd          }|                    dd          }||||d}|
                    |           |dz  }|||
d}t          j        |d          S )Nr$   r'   z.https://api.sistemaml.net/app/requested-guidesrq   rb   rc   rd   re   rf   rr   rt   r!   guidesr   sh_coderA   	recipientry   thumbnailUrl)SH_Coder   total_amountphotor;   )total_shsubspackagesFensure_asciir9   r-   r0   r/   rz   dumps)r   r   r|   r}   r'   r3   r"   r5   r!   packages_listresultr   packager   r   r   r   entryr   s                      r8   shsList_processr      so    Xw//E(LIG <C .|--)* G |C000H}}H
,,vr
"
"DHHXr**M F L !  ++i,,++k"--	[[,,kk.,, "(	
 
 	e % F :f51111ro   c                 D   t          | |          }|d         }|d         }d}d| ddddd	d
}t          j        ||          }|                                }|                    di           }|                    dg           }	g }
d}|	D ]{}|                    dd          }|                    dd          }|                    dd          }|                    dd          }||||d}|
                    |           |dz  }|||
d}t          j        |d          S )Nr$   r'   z0https://api.sistemaml.net/app/warehouse-packagesrq   rb   rc   rd   re   rf   rr   rt   r!   r   r   ru   rA   wrCodestatusr   )ru   	wr_numberr   r   r;   )total_wrsubsr   Fr   r   )r   r   r|   r}   r'   r3   r"   r5   r!   r   r   r   r   ru   WRsr   r   r   r   s                      r8   wrsList_processr     so    Xw//E(LIG >C .|--)* G |C000H}}H
,,vr
"
"DHHZ,,M F L !  ;;z2..KK$${{8B''kk.,, !	
 
 	e % F :f51111ro   c                 ^   d}| |d}ddd}t          j        |||          }	 |                                }|                    d          rd|v r|d                             d	          }|d         d
                             d          }|d         d                             d          }	|d         d
                             d          }
|||	|
|                    dd          dS d|                    dd          iS # t          $ r}ddt          |           icY d }~S d }~ww xY w)Nr   r   r   r   r   r    r#   r!   r$   r%   r&   agentidRnamer)   zLogin success.)r$   r'   agent_idclient_namer)   r(   r*   r+   r,   )r   r   r3   r4   r"   r5   r!   r6   r'   r   r   r7   s               r8   get_credentialsr   H  s   
/C ! G N; G }Sw@@@H
}}88I 	6T>>L$$^44E6l6*..t44GF|G,0077Hff%))&11D !&"$"88I/?@@   )-EFF   
 
 
:#a&&::
 	
 	
 	
 	
 	
 	

s$   CD ,D 
D,D'!D,'D,invoicePathtrackdescripfobc           	         t          |            t          |           t          |           t          |           t          |           t          |           t          | |          }|d         }t          |d                   }|}	t          |	          }
|dd|||d|
d}d}d| d	d
ddddd}d}t	          |dd          5 }t          j        ||dd           d d d            n# 1 swxY w Y   t          j        |||          }|                                }t          t          |                     |	                    d          r|	                    d          }n|	                    d          }t          |          S )Nr$   r'   Amazon   prueba)consigneeIdshipper	carrierIdru   rv   rw   rx   invoicez-https://api.sistemaml.net/app/preAlert/createrq   rb   PostmanRuntime/7.44.0application/jsonrd   re   rf   rs   rh   ri   r   rj   rk   rl   zchat_log.jsonwr@   )encodingF   )r   indentr/   r"   r#   r)   )
printr9   r2   r_   rG   r/   dumpr-   r.   r0   )r   r   r   r   r   r   r|   r}   r'   invoice_file_pathinvoice_base64json_payloadr3   r"   rW   rY   r5   r~   r   s                      r8   createPrealert_proccessr   v  s    
(OOO	'NNN	+	%LLL	'NNN	#JJJ
 Xw//E(L%	"##G#+,=>>N  !	 	L 
9C .|--)%* G  I 
iw	/	/	/ A1	,a@@@@A A A A A A A A A A A A A A A }Sl7CCCHMMOOM	#m

 ## ,  ++  ++v;;s   C,,C03C0Compratelia_Agentu  
    Eres un asistente de atención al cliente de la empresa COMPRATELIA.
    No procedas con ninguna solicitud hasta que el cliente haya sido autenticado.

    🔐 Flujo de Autenticación:
    Pide al cliente su usuario y contraseña para verificar su identidad.
    Ejemplo: "Antes de continuar, ¿podrías proporcionarme tu usuario y contraseña para verificar tu cuenta?"
    Usa la herramienta **get_credentials** con las credenciales proporcionadas.
    Si las credenciales son válidas:
    Guarda en memoria el [nombre del cliente:client_name], el [identificacion de usuario:user_id], y las credenciales [nombre de usuario:usrEmail, password:usrPass] para su uso futuro.
    Dirígete al cliente por su nombre a partir de ese momento.
    Ejemplo: "Gracias, [client_name]. Tus credenciales son válidas. ¿En qué puedo ayudarte hoy?"
    Si las credenciales son inválidas:
    Informa al cliente de manera educada.
    Permite hasta tres intentos.
    Después de 3 fallos, ofrece restablecer la contraseña por correo electrónico:
    Ejemplo: "Parece que has ingresado credenciales incorrectas varias veces. ¿Te gustaría restablecer tu contraseña y recibir una temporal por correo electrónico?"
    Si el cliente acepta, pide su correo electrónico y usa la herramienta **reset_password**.
    Dile al cliente: "Te he enviado una contraseña temporal a tu correo electrónico. Por favor, revisa tu bandeja de entrada y proporciona las nuevas credenciales aquí para verificar tu cuenta."

    ✅ Después de una Autenticación Exitosa:
    Redirige según el tipo de solicitud descrito a continuación.

    📦 Lógica de Enrutamiento y Manejo de Paquetes:
        
    Si el cliente desea:
    Consultar sobre paquetes que ya han sido enviados o el mensaje del cliente incluye palabras como "enviado", "entregado","en transito","ya estan en camino" o equivalentes, usa la herramienta **shsListSent_process** para obtener dicha lista.
    Consultar sobre paquetes que están listos para enviar desde el almacén o el mensaje del cliente incluye palabras como "listo para envio", "aun no enviados","preparados para salir" o equivalentes, usa la herramienta **shsList_process** para obtener dicha lista.
    Consultar sobre paquetes actualmente en el almacén o el mensaje del cliente incluye palabras como "en Miami", "llegados","recibidos en almacen" o equivalentes,usa la herramienta **wrsList_process** para obtener dicha lista.
    
    En el caso de los paquetes actualmente en el almacén (se obtuvieron a traves de la herramienta **wrsList_process** revisar lo siguiente:
    Si verificado es 0 → "El cliente debe proporcionar la factura del paquete."
    Si verificado es 1 → "Esperando a que el cliente solicite el envío."
    
    Si el cliente proporciona un número de seguimiento, tracking number o número WR:
    Consulta las siguientes herramientas o tools:
    **wrsList_process**
    **shsListSent_process** 
    **shsList_process** 
    para obtener las listas de todos los paquetes y busca el número que el cliente dio dentro de cada lista.
    Si se encuentra:
    Proporciona todos los detalles disponibles.
    Solo si aparece en una lista de obtenida de los tools  **shsListSent_process**, aplica:
    status: "ABIERTO" → "El paquete está en proceso de consolidación."
    status: "PROCESADO" y pago_verificar: 0 → "El paquete está esperando pago."
    status: "PROCESADO" y pago_verificar: 1 → "El paquete está en Miami, listo para ser despachado."
    Si no se encuentra:
    Responde: "El número de información que proporcionaste no fue encontrado."
    Sé siempre amable, claro y servicial. Nunca omitas el paso de autenticación.

    
    Tu puedes trabajar con las prealertas como se explica a continuacion:
    1. 📄 **Consultar Prealertas Realizadas**:
   Si el cliente solicita ver sus prealertas anteriores o utiliza frases como:
   - "ver mis prealertas"
   - "consultar mis prealertas"
   - "ya hice una prealerta"
   - "quiero ver las prealertas"
   
   Usa la herramienta **prealertlist_process** para obtener la lista de prealertas registradas.

   → Ejemplo de respuesta:  
   "Estas son tus prealertas registradas hasta el momento, [client_name]: [mostrar lista con detalles como tracking, descripción, precio]."

2. 📦 **Crear una Nueva Prealerta**:
   Si el cliente dice frases como:
   - "quiero hacer una prealerta"
   - "necesito registrar una prealerta"
   - "Hice una compra y quiero notificarla"
   - "quiero subir la factura"

   Solicita al cliente la siguiente información de forma clara y ordenada:
   - **Número de tracking**
   - **Descripción del contenido del paquete**
   - **Precio del paquete (USD)**
   - **Factura del paquete en formato PDF o imagen**

   ➕ Una vez que tengas todos los datos, utiliza la herramienta **create_prealert** y envia la siguiente informacion que es extraida de la conversacion:
   - usrEmail, usrPass ,la direccion del archivo que acaba de enviar,el tracking number o numero de seguimiento,la descripcion del paquete a ser prealertado y el precio del producto o productos.


    
    Si el cliente pregunta por informacion acerca de datos de la empresa courier como direccion fisica,
    horarios de operacion, servicios y costos, asi como datos de los procedimientos aduanales en Ecuador, materiales prohibido segun la aduana de Ecuador,
    impuestos aplicados segun descripcion del producto debes enrutar estos requerimientos al agente  **company_agent**.
    
    No le digas al cliente que lo vas vas a transferir, solo hazlo y espera el resultado.
g?auto)temperaturetool_choice)r   rx   r   model_settingstoolsc                    d}d}d}t          | t                    rd| dg} t          |           D ]H}t          |t                    r1|                    d          dk    r|                    dd          } nIt          |           D ]X}t          |t                    rA|                    dd                              d          r|                    dd          } nYt          |           D ]}t          |t                    r|                    d          d	k    r|                    d
d          }	t          |	t                    rV	 t          j        |	          }
t          |
t                    rd|
v rt          |
d                   } n# t          $ r Y w xY wt          j
                                        d          }||||||d}d}d}dddd}t          j        d|||d          }|                                }|d         }d}d| ddddddd}t          j        |||           }|                                }d S )!NrA   r%   )rolecontentr   r   r&   msg_typefunction_call_outputr   r'   z%Y-%m-%d %H:%M:%S)
message_idassistant_responsecustomer_idmessage_botphone_numberphone_number_idz(https://crmiq.sistemaml.org/api/v1/loginzuser=soporte&password=12345678r   rb   z$5b949b74-4434-a3fb-4e91-33f22b22f02c)zcontent-typezcache-controlzpostman-tokenPOST<   )r!   r"   timeoutr6   z.https://crmiq.sistemaml.org/api/v1/message/botrq   r   r   rd   re   rf   r   r   )
isinstancer2   reverseddictr0   
startswithastliteral_evalr1   r   nowstrftimer-   requestr/   r.   )
input_dataCustomerPhone	respuestar   r   last_msg_idlast_user_messager'   r   r   	user_data	timestampr   r3   r4   r"   r5   	json_datar$   r~   s                       r8   chat_monitorr   Y  s   KG *c"" 
 % 

 $$  dD!! 	dhhv&6&6&&@&@ $B 7 7E $$  dD!! 	dhhtR&8&8&C&CF&K&K 	((4,,KE $$ 
 
dD!! 		dhhv&6&6:P&P&PXXh++F&#&&  # 0 8 8I!)T22 yI7M7M"%i	&:";";    H ''(;<<I "/$ $* L 5C7G 8; G
 '7SUVVVHI W%L 
:C .|--)%* G }Sl7CCCHMMOOMMMs   AF
FFc                    K   t          |            t          j        t          |            d {V }t	          | ||j        ||           |S )N)input)r   r   runComprateliaAgentr   final_output)r   r   r   r   r   s        r8   run_triage_agentr     s^       
* J/jAAAAAAAAAIM)*@___ro   ),r-   asyncioagentsr   r   r   r   r   r   r	   openair
   $agents.models.openai_chatcompletionsr   rC   dotenvr   typingr   r   r/   rO   PILr   rJ   r   
OLLAMA_URLOLLAMA_API_KEY
MODEL_NAMEollama_clientollama_modelr2   r9   r_   rn   r   r   r   r   floatr   r   r   r    ro   r8   <module>r      sW     N N N N N N N N N N N N N N B B B B B B B B       K K K K K K 				                           				 



 .

    *)
    - ( ( (  T   $
c $
3 $
 $
 $
 $
N  F C    8 +3 + + + + +Z ?2c ?2C ?2 ?2 ?2 ?2B @2c @2C @2 @2 @2 @2F *
S *
# *
 *
 *
 *
Z Bc BC BS Bs B[^ Bch B B B BF 5	Wp  =SfEEE.Q`ax
yy] ] ] ~U$ U$ U$r	 	 	 	 	ro   