
    i7#                     p   d dl 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	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 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mZ  ee      jA                         jB                  Z" ee"dz  d        e jF                  d      Z$ e jF                  d      Z% e jF                  d      Z&e$s e'd       ejP                  d      Z) ejT                  e)      Z+e+jY                  d      Z-e+jY                  d      Z. ej^                  ej`                  dd        ejb                  e2      Z3 ejb                  d      ji                  ejj                          ejb                  d      ji                  ejj                          e	ddd      Z6 e       Z7 ejp                  e&d      Z9 ee$d d!"      Z:i Z;i Z< G d# d$e      Z=d%e>fd&Z?d'e>d(e@fd)ZAd'e>d*e@fd+ZBd%e>fd,ZCe7j                  d-      d.e=fd/       ZEe6j                  e7       e6j                  d0      d1        ZHy)2    N)Path)datetime)FastAPIHTTPException	APIRouter)	BaseModel)load_dotenv)
ChatOpenAI)AgentExecutorcreate_openai_functions_agent)ConversationBufferMemory)MultiServerMCPClient)get_padel_prompt)get_restaurante_promptz.envT)override
OPENAI_KEYMCP_URL	REDIS_URLu*   ⚠️ Falta OPENAI_KEY en el archivo .envzAmerica/Guayaquilz%Y-%m-%dz%H:%Mz'%(asctime)s [%(levelname)s] %(message)s)levelformatforcehttpxlangchain_mcp_adapterszCliente MULTIAGENTE MCPzQEndpoint para recibir mensajes de WhatsApp e interactuar con el Agente LangChain.z/multiagente-mcp)titledescription	root_path)decode_responseszgpt-4og?)openai_api_keymodeltemperaturec                   "    e Zd ZU eed<   eed<   y)UserMessagewhatsapp_idmensajeN)__name__
__module____qualname__str__annotations__     3/opt/tws/multiagentes-mcp/cliente-mcp/client_mcp.pyr"   r"   M   s    Lr+   r"   user_idc                 L    | t         vrt        dd      t         | <   t         |    S )u8   Crea o recupera la memoria de conversación del usuario.historyT)
memory_keyreturn_messages)CONVERSATION_MEMORIESr   )r-   s    r,   get_or_create_memoryr3   T   s.    ++)A  *
g& !))r+   r#   estadoc                    K   t         j                  d|  d|i       d{    t        j                  d|  d|        y7  w)u7   Guarda el estado del usuario (1=pádel, 2=restaurante).	whatsapp:r4   )mappingNu   💾 Estado de z guardado como )redis_clienthsetloggerinfor#   r4   s     r,   set_user_stater=   ]   sJ     


i}5&?Q

RRR
KK/+ofXFG Ss    AA!Areturnc                 n   K   t         j                  d|  d       d{   }|rt        |      S dS 7 w)z%Obtiene el estado actual del usuario.r6   r4   Nr   )r8   hgetintr<   s     r,   get_user_staterB   b   s9     $$y%>IIF 3v;'a' Js   535c           	        
K   t        |        d{   }|dk(  rd}t        t        t        d      }n|dk(  rd}t	        t        t        d      }nyt        |t        dd	i      }|j                          d{   }t        j                  d
| d|D cg c]  }|j                   c}        t        t        t        ||      |dd      }|j                  D ]  }|j                  
|d
fd
}	|	|_         |S 7 7 c c}w w)uG   Devuelve el agente (pádel o restaurante) según el estado del usuario.N   padel[RESERVA_CREADA_EXITOSAMENTE]   restaurante[RESTAURANTE_RESERVA]streamable_httpurl	transportu%   🔧 Herramientas detectadas en MCP (): llmtoolspromptTagentrQ   memoryverbose_toolc           	         K   t         j                  d| j                   d| d|         |i | d {   }t         j                  d| j                   dt        j                  |d              |S 7 @wNu   🛠️ Ejecutando tool: z	 | args: z	 kwargs: u	   ✅ Tool z ejecutada. Resultado: F)ensure_asciir:   r;   namejsondumpsrX   argskwargsresultoriginal_funcs       r,   wrapperz#get_agent_by_state.<locals>.wrapper   su     KK3EJJ<yiX^W_`a($9&99FKK)EJJ</FtzzRXglGmFnopM :   4A:A8AA:)rB   r   CURRENT_DATE_ECCURRENT_TIME_ECr   r   r   	get_toolsr:   r;   r]   r   r   rP   rQ   func)r-   r4   agenterR   
mcp_client	all_toolstexecutortoolre   rd   s             @r,   get_agent_by_staterq   j   s    !'**F{!/?Dcd	1'Jab &vwM^/_&`aJ **,,I
KK7xsT]C^qAFFC^B_`a +9VT	H  			'+ 	 		 OI + -C^s5   DC>A&D9D :DD(AD DDz/messagemsgc                 >  K   t         j                  d| j                   d| j                          t	        | j                        }t        | j                         d{   }| j                  j                         j                         dk(  r#t        | j                  d       d{    dddS |dk(  rd	}| j                  j                         d
k(  rDt        | j                  d       d{    d}t         j                  d| j                   d       n| j                  j                         dk(  rDt        | j                  d       d{    d}t         j                  d| j                   d       n't         j                  d| j                          d|dS t        | j                         d{   }|sdddS ||_
        d| j                   d| j                   }	 t         j                  d| d|        |j                  d|i       d{   }t         j                  d| d|d           d|d   dS 7 7 7 ]7 7 7 7# t        $ r<}t         j                  d| j                   d| d       t        dd | !      d}~ww xY ww)"zARecibe mensajes de WhatsApp y redirige al agente correspondiente.u   👤 CLIENTE [z]: Nsalirr   okzKHas salido del sistema. Para iniciar nuevamente, escribe cualquier mensaje.)status	respuestau   ¡Hola! 👋 Bienvenido al sistema MultiAgente.
Por favor elige una opción:
1️⃣ Reservar una cancha de pádel
2️⃣ Reservar una mesa en el restaurante1rD   u   🟢 Usuario u    seleccionó agente PÁDEL2rG   u    seleccionó agente RESTAURANTEu   📋 Mostrando menú inicial a z-No hay agente asignado para tu estado actual.[z] u!   ➡️ Enviando input al agente (rN   inputu   🤖 AGENTE [u   ] respondió: outputu    ❌ Error procesando mensaje de z: T)exc_infoi  zError procesando mensaje: )status_codedetail)r:   r;   r#   r$   r3   rB   striplowerr=   rq   rU   ainvoke	Exceptionerrorr   )rr   rU   r4   menu_msgagent_executor
user_inputrc   es           r,   receive_messager      ss     KK. 1S[[MBC!#//2F!#//22F {{  "g-S__a000-z{{ {: 	 ;;#% !444FKK-'88RST[[ C' !444FKK-'88WXYKK9#//9JKL":: .coo>>N-\]]"NS__%R}5JV7xs:,OP%--w
.CDDmF8>&:J9KLMVH-=>>Q 3 	1 5 5 ? E  V77H1#NY]^6PQRPS4TUUVs   AJI AJ(I	)AJ/I0A JIA)J:I;.J*1I I)I J	JJJJI 	J7JJJstartupc                  d  
K   t         j                  d       t        t        t        d      t        t        t        d      d} i }| j                         D ]  \  }}t        |t        ddi      }|j                          d{   }t        t        t        ||      |dd	
      }|j                  D ]  }|j                  
|d
fd
}||_         |t        |<   |D 	cg c]  }	|	j                    c}	||<    t         j                  d|        t         j                  d       y7 c c}	w w)zBInicializa los agentes y sus herramientas al arrancar el servidor.u   🚀 Servidor arrancando...rF   rI   )rE   rH   rJ   rK   NrO   TrS   rW   c           	         K   t         j                  d| j                   d| d|         |i | d {   }t         j                  d| j                   dt        j                  |d              |S 7 @wrZ   r\   r`   s       r,   re   zstartup_event.<locals>.wrapper   sv     7

|9TFR[\b[cde,d=f==i

|3J4::V\kpKqJrst >rf   u3   🔍 Herramientas cargadas para todos los agentes: u9   ✅ Agentes inicializados y listos para recibir mensajes.)r:   r;   r   rg   rh   r   itemsr   r   ri   r   r   rP   rQ   rj   AGENT_EXECUTORSr]   )agentes_configall_tools_infoagente_namerR   rl   rQ   ro   rp   re   rn   rd   s             @r,   startup_eventr      s$     KK-. "/?Dcd-oPghN
 N-335 >V);Vg8h*ij
 **,, /CuVT	
 NN 		 D IIM+/   DI		  (0$7<&=!qvv&={#/>2 KKEnEUVW
KKKL1 -* '>s%   B D0D)AD0 D+37D0+D0)Iospathlibr   r   pytzredis.asyncioasyncioredisfastapir   r   r   pydanticr   loggingr^   dotenvr	   langchain_openair
   langchain.agentsr   r   langchain.memoryr   langchain_mcp_adapters.clientr   agents.padel_agentr   agents.restaurante_agentr   __file__resolveparentBASE_DIRgetenvr   r   r   
ValueErrortimezoneEC_TZnowCURRENT_DATETIME_ECstrftimerg   rh   basicConfigINFO	getLoggerr%   r:   setLevelWARNINGapprouterfrom_urlr8   rP   r2   r   r"   r(   r3   rA   r=   rB   rq   postr   include_routeron_eventr   r*   r+   r,   <module>r      sM   	     5 5     ' I 5 > 0 ;
 >!!#** Hv -RYY|$

"))I
BIIk"	
A
BB 	)*"hll5) %..z:%..w7
   
,,4

 
		8	$   '  # #GOO 4   * + 4 4W__ E
 
#c  
u~~i$?
  
) *# *Hc H3 H
(c (c (&c &V Z0V{ 0V 0Vd   6 
 i%M %Mr+   