
    iu2                        d Z ddlmZ ddlmZmZ ddlmZmZ  G d de	e      Z
 G d de      Z G d	 d
e      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d d e      Z G d! d"e      Z G d# d$e      Z G d% d&e      Z G d' d(e      Z G d) d*e      Z G d+ d,e      Z G d- d.e      Zy/)0z7
Modelos Pydantic para requests y responses de la API.
    )Enum)	BaseModelField)OptionalListc                        e Zd ZdZdZdZdZdZy)ProductSyncStatusEnumu3   Estados de sincronización/migración de productos.	pendientenormalnuevo	eliminadoN)__name__
__module____qualname____doc__PENDINGNORMALNEWDELETED     */opt/lhia/marcimex/agent/app/api/models.pyr	   r	   	   s    =GF
CGr   r	   c                   j    e Zd ZU dZ edddd      Zeed<    edddd	      Zeed
<    G d d      Z	y)ChatRequestu   
    Request para el endpoint de chat.
    
    Attributes:
        uuid_conversation: Identificador único del cliente (ej: número de WhatsApp)
        message: Mensaje del usuario
    .6   Identificador único del cliente (número de WhatsApp)   573001234567description
min_lengthexampleuuid_conversationMensaje del usuarioz Hola, busco una lavadora Samsungmessagec                       e Zd ZddddiZy)ChatRequest.Configr!   r   zHola, busco una lavadora barata)r"   r$   Nr   r   r   json_schema_extrar   r   r   Configr&   &   s    %3<
r   r)   N)
r   r   r   r   r   r"   str__annotations__r$   r)   r   r   r   r   r      sP     #L	s  )2	GS 
 
r   r   c                       e Zd ZU dZ edd      Zeed<    edd      Zeed<    edd	
      Z	e
ed<    G d d      Zy)ChatResponseu   
    Response del endpoint de chat.
    
    Attributes:
        uuid_conversation: Identificador del cliente
        response: Respuesta del agente
        session_active: Indica si la sesión está activa
    .Identificador del clienter   r"   zRespuesta del agente de ventasresponseTu!   Indica si la sesión está activadefaultr   session_activec                       e Zd ZdddddiZy)ChatResponse.Configr!   r   u3   ¡Hola! Claro, tengo estas lavadoras disponibles...T)r"   r0   r3   Nr'   r   r   r   r)   r5   E   s    %3Q"&
r   r)   N)r   r   r   r   r   r"   r*   r+   r0   r3   boolr)   r   r   r   r-   r-   /   s]     #/s  4Hc  !7ND 

 
r   r-   c                   j    e Zd ZU dZ edddd      Zeed<    edd	dd
      Ze	ed<    G d d      Z
y)ProductSearchRequestu   
    Request para búsqueda directa de productos por texto.
    Genera embedding y busca en Neo4j sin pasar por el modelo LLM.
    .u+   Texto de búsqueda para encontrar productosr   zlavadora Samsung 15kgr   query   (   Cantidad máxima de productos a retornar2   r2   r   gelelimitc                       e Zd ZddddiZy)ProductSearchRequest.Configr!   ztelevisor 55 pulgadasr:   )r9   r@   Nr'   r   r   r   r)   rB   a   s    0
r   r)   N)r   r   r   r   r   r9   r*   r+   r@   intr)   r   r   r   r8   r8   O   sO     A'	E3  >	E3 
 
r   r8   c                       e Zd ZU dZdZee   ed<   dZee   ed<   dZ	ee   ed<   dZ
ee   ed<   dZee   ed<   dZee   ed<   dZee   ed	<   dZee   ed
<   dZee   ed<   dZee   ed<   y)ProductItemu/   Producto individual retornado por la búsqueda.Nidsku_idnamepricer   link
image_linkcategorybrandscore)r   r   r   r   rF   r   r*   r+   rG   rH   rI   r   rJ   rK   rL   rM   rN   floatr   r   r   rE   rE   j   s    9B FHSM D(3-E8C=!%K#%D(3- $J$"Hhsm"E8C=!E8E?!r   rE   c                   r    e Zd ZU dZ edd      Zeed<    edd      Ze	ed<    eg d	      Z
ee   ed
<   y)ProductSearchResponseu5   
    Response de búsqueda directa de productos.
    .u   Texto de búsqueda originalr/   r9   !Cantidad de productos encontradostotalLista de productos encontradosr1   productsN)r   r   r   r   r   r9   r*   r+   rS   rC   rU   r   rE   r   r   r   rQ   rQ   x   sD     s(EFE3Fs(KLE3L"'@`"aHd;ar   rQ   c                       e Zd ZU dZ edddd      Zeed<    edd	d
      Ze	e   ed<    edddd      Z
eed<    edd      Zeed<    G d d      Zy)ConversationChatRequestu-  
    Request para búsqueda de productos con respuesta del LLM.
    Combina búsqueda vectorial + generación de respuesta natural.

    Para paginación ("ver más"), enviar solo uuid_conversation + next_page=true.
    El servidor recupera automáticamente el query anterior y calcula el offset.
    .r   r   r   r   r"   NuI   Texto de búsqueda. Opcional si next_page=true (se usa el query anterior)   cocinas de inducciónr2   r   r!   questionr:   r;   r<   r=   r@   FuP   Si es true, carga la siguiente página de la búsqueda anterior automáticamenter1   	next_pagec                       e Zd ZdddddiZy)ConversationChatRequest.Configr!   r   rX   r:   )r"   rZ   r@   Nr'   r   r   r   r)   r]      s    %33
r   r)   )r   r   r   r   r   r"   r*   r+   rZ   r   r@   rC   r[   r6   r)   r   r   r   rW   rW      s     #L	s  $_'Hhsm 
 >	E3  fIt 

 
r   rW   c                       e Zd ZU dZ edd      Zeed<    edd      Zeed<    edd	
      Z	e
e   ed<    edd      Zeed<    edd
      Zeed<    edd
      Zeed<    eg d
      Zee   ed<   y)ConversationChatResponsezM
    Response combinada: respuesta natural del LLM + lista de productos.
    .r.   r/   r"   z$Respuesta generada por el modelo LLManswerNuA   Intención clasificada (PRODUCT, AGENT, PAYMENT, GREETING, OTHER)r1   intentu1   Cantidad de productos encontrados en esta páginarS   Fu(   Indica si hay más productos disponibleshas_more<   Indica si la conversación fue redirigida a un asesor humanoredirect_asesorrT   rU   )r   r   r   r   r   r"   r*   r+   r`   ra   r   rS   rC   rb   r6   rd   rU   r   rE   r   r   r   r_   r_      s     #34OPsP)OPFCP!$<  AFHSM  As([\E3\56`aHda!%={|OT|"'@`"aHd;ar   r_   c                   N    e Zd ZU dZ edd      Zeed<    edd      Zeed<   y	)
HealthResponsez0
    Response del endpoint de health check.
    okzEstado del servicior1   statuszService is runningzMensaje de estador$   N)	r   r   r   r   r   rh   r*   r+   r$   r   r   r   rf   rf      s.     2GHFCH!5CVWGSWr   rf   c                      e Zd ZU dZdZee   ed<   dZee   ed<   dZ	ee   ed<   dZ
ee   ed<   dZee   ed<   dZee   ed<   dZee   ed	<   dZee   ed
<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   y)XMLProductItemz+Producto parseado desde el XML de Marcimex.N
product_idrG   titler   summaryrL   global_categorysub_categoryproduct_typerM   rpx_coderJ   rK   rI   in_stockavailabilityrh   colorspecifications
short_linkstatus_product)r   r   r   r   rk   r   r*   r+   rG   rl   r   rm   rL   rn   ro   rp   rM   rq   rJ   rK   rI   rr   rs   rh   rt   ru   rv   rw   r	   r   r   r   rj   rj      s-   5 $J$ FHSM E8C=!%K#%!GXc]!"Hhsm"%)OXc])"&L(3-&"&L(3-&E8C="Hhsm"D(3- $J$E8C="Hhsm""&L(3-& FHSM E8C=$(NHSM( $J$6:NH23:r   rj   c                       e Zd ZU dZ edd      Zeed<    edd      Ze	ed<    edd	      Z
ee	   ed
<    eg d      Zee   ed<   y)XMLProductsResponsez+Response con la lista de productos del XML..zTotal de productos parseadosr/   rS   zURL del XML fuente
source_urlNu   Fecha de actualización del XML
updated_atLista de productosr1   rU   )r   r   r   r   r   rS   rC   r+   rz   r*   r{   r   rU   r   rj   r   r   r   ry   ry      sV    5s(FGE3GC-ABJB %d8Y ZJZ%*2CW%XHd>"Xr   ry   c                   >   e Zd ZU dZ edd      Zeed<    edd      Zeed<    edd      Z	eed	<    edd
      Z
eed<    edd      Zeed<    edd      Zeed<    edd      Zeed<    edd      Zeed<    edd      Zeed<    edd      Zeed<   y)SyncProductsResponseu5   Response de sincronización de productos XML a Neo4j..z'Productos creados/actualizados en Neo4jr/   created"   Errores durante la sincronizaciónerrorsz%Total de productos procesados del XMLrS   u8   Modo de sincronización: initial_load o incremental_syncmoder   z#Cantidad de productos previos en BDr1   previous_countu%   Productos nuevos (no existían en BD)newu%   Productos actualizados (ya existían)updatedu0   Productos eliminados de Neo4j (no están en XML)deletedz'Productos actualizados a promotion=truepromotions_updated!Mensaje descriptivo del resultador$   N)r   r   r   r   r   r   rC   r+   r   rS   r   r*   r   r   r   r   r   r$   r   r   r   r~   r~      s    ?*STGST)MNFCNs(OPE3Pc'abD#b7\]NC]Q,STCT0WXGSX0bcGSc#A;dee*MNGSNr   r~   c                       e Zd ZU dZdZee   ed<   dZee   ed<   dZ	ee   ed<   dZ
ee   ed<   dZee   ed<   dZee   ed<   y)	DocumentItemuH   Documento genérico almacenado en Neo4j (FAQ, políticas, guías, etc.).NrF   doc_typerl   contentsourcerN   )r   r   r   r   rF   r   r*   r+   r   rl   r   r   rN   rO   r   r   r   r   r      sY    RB"Hhsm"E8C=!GXc]! FHSM !E8E?!r   r   c                       e Zd ZU dZ edd      Zeed<    edd      Zeed<    edd      Z	eed	<    ed
d      Z
eed<    edd      Zeed<    edd      Zeed<   y)FaqSyncResponseu+   Response de sincronización de FAQ a Neo4j..zFAQs creadas en Neo4jr/   r   r   r   zTotal de FAQs procesadasrS   r   zFAQs previas en BDr1   r   faqzTipo de documento sincronizador   r   r$   N)r   r   r   r   r   r   rC   r+   r   rS   r   r   r*   r$   r   r   r   r   r      sq    5*ABGSB)MNFCNs(BCE3C7KLNCL%5UVHcV*MNGSNr   r   c                       e Zd ZU dZdZee   ed<   dZee   ed<   dZ	ee   ed<   dZ
ee   ed<   dZee   ed<   dZee   ed<   y)	SearchProductInstallmentu&   Información de cuotas de un producto.NValueInterestRateTotalValuePlusInterestRateNumberOfInstallmentsNamePaymentSystemName)r   r   r   r   r   r   rO   r+   r   r   r   rC   r   r*   r   r   r   r   r   r     s\    0!E8E?!$(L(5/(266*.(3-.D(3-'+x}+r   r   c                      e Zd ZU dZdZee   ed<   dZee   ed<   dZ	ee   ed<   dZ
ee   ed<   dZee   ed<   dZee   ed<   dZee   ed	<   dZee   ed
<   dZee   ed<   dZeed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   y)SearchProductItemu3   Producto retornado por la API externa de búsqueda.N	productIdskuIdrH   rM   rL   rJ   rI   imagespecsF	promotionr   rm   inStockrs   rt   ru   globalCategorysubCategoryproductType
syncStatusrN   )r   r   r   r   r   r   r*   r+   r   rH   rM   rL   rJ   rI   r   r   dictr   r6   r   rm   r   rs   rt   ru   r   r   r   r   rN   rO   r   r   r   r   r     s'   =#Ix}#E8C=D(3-E8C="Hhsm"D(3-E8C=E8C= E8D> It!%K#%!GXc]!"GXd^""&L(3-&E8C=$(NHSM($(NHSM(!%K#%!%K#% $J$!E8E?!r   r   c                       e Zd ZU dZ edddd      Zeed<    edd	d
      Ze	e   ed<    edddd      Z
eed<    edd      Ze	e   ed<    eddd      Ze	e   ed<    eddd      Ze	e   ed<   y)SearchChatRequestz&Request para el endpoint /chat/search..u    Identificador único del clienter   r   r   r"   Nr#   cocinarY   rZ      z Cantidad de productos a retornarr<   r=   countu   Nombres de los últimos productos vistos por el usuario (ya formateados). Se recomiendan si la conversación es nueva y el usuario saluda o pide recomendaciones.r1   resumePurchasezId de la platforma593900000000
platformIdzNick del usuarioAnonimususuario)r   r   r   r   r   r"   r*   r+   rZ   r   r   rC   r   r   r   r   r   r   r   r   )  s    0"6	s  $)Hhsm 
 6	E3  %* x%NHSM  !&(!J 
 #&GXc] r   r   c                       e Zd ZU dZ edd      Zeed<    edd      Zeed<    edd	
      Z	e
e   ed<    edd
      Zeed<    edd
      Zeed<    edd
      Ze
e   ed<    eg d
      Zee   ed<   y)SearchChatResponsez#Response del endpoint /chat/search..r.   r/   r"   z Respuesta generada por el agenter`   NuJ   Intención clasificada (PRODUCT, AGENT, PAYMENT, BALANCE, GREETING, OTHER)r1   ra   r   rR   rS   Frc   rd   ui   Resumen de la conversación generado al redirigir a asesor (redirect_to_agent / redirect_to_agent_direct)summary_agentr|   rU   )r   r   r   r   r   r"   r*   r+   r`   ra   r   rS   rC   rd   r6   r   rU   r   r   r   r   r   r   r   L  s    -"34OPsP)KLFCL!$  =I  JFHSM  Jq.QRE3R!%={|OT|#(  Do  $pM8C=  p(-bFZ([Hd$%[r   r   c                   0    e Zd ZU dZ edd      Zeed<   y)ConversationAnalizeRequestz0Request del endpoint /chat/conversation-analize..zPregunta del usuario a analizarr/   rZ   N)r   r   r   r   r   rZ   r*   r+   r   r   r   r   r   W  s    :#+LMHcMr   r   c                   0    e Zd ZU dZ edd      Zeed<   y)ConversationAnalizeResponsez1Response del endpoint /chat/conversation-analize..zETrue si la pregunta es sobre productos o recomendaciones de productosr/   resultN)r   r   r   r   r   r   r6   r+   r   r   r   r   r   \  s    ;*qrFDrr   r   c                   :    e Zd ZU dZeed<   eed<   eed<   eed<   y)Neo4jSearchResponsez'Response del endpoint /products/search.r9   rS   	elapsed_srU   N)	r   r   r   r   r*   r+   rC   rO   listr   r   r   r   r   a  s    1JJNr   r   N)r   enumr   pydanticr   r   typingr   r   r*   r	   r   r-   r8   rE   rQ   rW   r_   rf   rj   ry   r~   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s(    % !C 
) 
<
9 
@
9 
6") "bI b%
i %
P
by 
bXY X;Y ;2Y) YO9 O"9 "Oi O,y ,"	 "4 	  F\ \N N
s) s
) r   