
    i*                        d Z ddlZddlZddlZddlZddlmZmZm	Z	m
Z
 ddlmZmZ ddlmZ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 ddlmZmZm Z m!Z!m"Z" ddl#m$Z$  ejJ                  e&      Z' eddg      Z(dZ) ee$jT                  d      Z+ e       Z, e       Z- ee,      Z.defdZ/defdZ0de1de2de3fdZ4e(jk                  dee
jl                        defd       Z7e(jk                  dee
jl                         ee/       ee0      fded ed!efd"       Z8e(jk                  d#ee
jl                         ee/       ee0      fded ed!efd$       Z9y)%u  
Endpoint de chat con búsqueda de productos via API externa (/chat/search).

Flujo:
- Solo saludo (sin producto) → Saludo cordial + pregunta qué producto busca
- Saludo + producto (ej: "hola, busco cocina") → Saludo breve + búsqueda inmediata
- Mensaje con producto (con historial) → Búsqueda directa sin saludo

Tools integrados en /searchLhia:
- get_payment_options: Opciones de pago via MCP
- consultar_deuda_actual: Consulta de saldo (multi-paso: cédula → fecha → MCP)
- redirect_to_agent: Redirección a agente humano (multi-paso: cédula → tipo_pago → MCP)
- search_product_detail: Detalle de un producto específico via MCP
    N)	APIRouterDependsHTTPExceptionstatus)HumanMessage	AIMessage)SystemMessager   )
ChatOpenAI   )SearchChatRequestSearchChatResponse)session_manager)IdentityService)ProductService)FlowService)SEARCH_GREETINGSEARCH_EXTRACT_QUERY_PROMPTSEARCH_RESPONSE_PROMPTSEARCH_NO_RESULTS_PROMPTMARCI_BASE_IDENTITY)settingsz/chatzchat-search)prefixtags   )modeltemperature)identity_servicereturnc                      t         S N)	_flow_svc     y/home/jorge/Escritorio/TWS/DESARRROLLO TWS/PROYECTOS/0_PRO_MARCI/LHIA/python/lhiav3-marci-agent/api/routes/chat_search.pyget_flow_servicer%   5   s    r#   c                      t         S r    )_product_svcr"   r#   r$   get_product_servicer(   9   s    r#   querycountc                 @  K   t         j                  }| |d}t        j                  d      4 d{   }|j	                  ||       d{   }|j                          |j                         cddd      d{    S 7 P7 77 	# 1 d{  7  sw Y   yxY ww)u1   Llama a la API externa de búsqueda de productos.)qr*   g      >@)timeoutN)params)r   PRODUCTS_SEARCH_API_URLhttpxAsyncClientgetraise_for_statusjson)r)   r*   urlr.   clientresponses         r$   _search_products_apir8   ?   s     

*
*C5)F  .  &C77!!#}}  7   sV   0BBBB	B#B	1B=B>BB	B	BBBBz/search)response_modelstatus_coderequestc                   K   t        j                          }| j                  }| j                  xs dj                         }| j                  }t
        j                  d| d       t
        j                  d| d| d|        	 t        j                  |       d{   }|j                  j                  dg       }t        |      d	k(  }t
        j                  d
| dt        |       d| d       |s|rxt        }|j                  t        d             |j                  t        |             ||j                  d<   t        j                   ||       d{    t#        ||d	g       S t%        t&        j(                  d      t
        j                  d| d       t+        t,              g}	|r|	j/                  |dd        |	j                  t1        |             t2        j5                  |	      }
|
j6                  j                         }t
        j                  d| d| d       |j9                         dk(  r|r t        }t
        j                  d| d       nd}t
        j                  d| d       |j                  t        |             |j                  t        |             t        |      t:        kD  r
|t:         d }||j                  d<   t        j                   ||       d{    t#        ||d	g       S t
        j                  d| d | d|        	 t=        ||       d{   }|j                  d&g       }|j                  d'd	      }t
        j                  d(| d)t        |       d*|        |rd+}d}nd}d,}|rd-jM                  |D cg c]P  }d.|j                  d/d0       d1|j                  d2      xs |j                  d3d4       d5|j                  d6d4       R c}      }tO        jP                  tR        |||||7      }ntU        jP                  tR        |||8      }t+        |      g}t        |      d9kD  r|d:d n|}|j/                  |       |j                  t1        |             t2        j5                  |      }|j6                  }d;|v r;|jW                  d;      d	   j                         }t
        jY                  d<| d=       t
        j                  d>| d?|dd@  dA       tZ        j]                  |      }|}|rLdB}|D ]@  }|d.|j^                   dC|j`                   dD|jb                   dE|jd                  xs d4 d-	z  }B ||z  }|j                  t        |             |j                  t        |             t        |      t:        kD  r
|t:         d }||j                  d<   t        j                   ||       d{    t        j                          |z
  }t
        j                  dF| dGt        |       dH|dIdJ       t#        ||t        |      |      S 7 7 7 V7 # t>        j@                  $ rf}t
        jC                  d!| d"|jD                  jF                          t%        t&        jH                  d#|jD                  jF                         d}~wt>        jJ                  $ r;}t
        jC                  d!| d$|        t%        t&        jH                  d%      d}~ww xY wc c}w 7 6# t$        $ r  tf        $ rP}t
        jC                  d!| dKti        |              t%        t&        jj                  dLti        |             d}~ww xY ww)MuQ  
    Búsqueda conversacional de productos via API externa.

    Flujo inteligente:
    - Solo saludo (sin producto) → Saludo cordial + pregunta qué producto busca
    - Saludo + producto (ej: "hola, busco cocina") → Saludo breve + búsqueda inmediata
    - Mensaje con producto (con historial) → Búsqueda directa sin saludo
        🔍 [z] === INICIO chat_search ===   📥 [] Request: question='	', count=Nmessagesr      📜 [] Historial cargado:  mensajes (primera_vez=)iniciocontent)uuid_conversationanswertotalproducts+   El texto de búsqueda no puede estar vacíor:   detail   🤖 [$   ] Extrayendo término de producto...i   🔄 [   ] Query extraído: ''
NO_PRODUCT   👋 [6   ] Primera interacción sin producto, retornando saludou_   ¿Qué producto te gustaría buscar? Puedes decirme el nombre o tipo de producto que necesitas.   ❓ [u-   ] No se detectó producto, pidiendo más info   🌐 [z] Buscando en API externa: q='   ❌ [u   ] API externa retornó error: u+   Error en la API de búsqueda de productos: z"] Error conectando a API externa: u8   No se pudo conectar con la API de búsqueda de productosrM   
totalFound   📦 [u   ] API retornó:  productos, totalFound=u   Es la PRIMERA interacción. Saluda brevemente (ej: '¡Hola!') y luego presenta los productos. No hagas una presentación larga.u`   IMPORTANTE: Ya hay conversación previa. NO saludes ni digas 'Hola'. Ve directo a los productos.
z- namez
Sin nombrez | Precio: $	spotPricepricezN/Az
 | Marca: brand)marci_identitygreeting_hinthistory_hintr)   rL   products_context)rd   re   rf   r)   
   iz[CONTEXTO DEL SISTEMA   ⚠️ [uB   ] Se eliminó texto '[CONTEXTO DEL SISTEMA...]' copiado por el LLM   📝 [] Respuesta LLM generada: 'd   ...'z;

[CONTEXTO DEL SISTEMA - PRODUCTOS MOSTRADOS AL USUARIO]:
z (ID: z) - Precio: $u    - Categoría:    🏁 [z] === FIN chat_search:  productos. Tiempo: .2fs ===z] Error en chat_search:    Error procesando búsqueda: )6timerJ   questionstripr*   loggerinfor   get_sessionstater2   lenr   appendLCHumanMessageLCAIMessagesave_sessionr   r   r   HTTP_400_BAD_REQUESTr	   r   extendr   llminvokerI   upperMAX_TOTAL_HISTORYr8   r0   HTTPStatusErrorerrorr7   r:   HTTP_502_BAD_GATEWAYRequestErrorjoinr   formatr   r   splitwarningr'   parse_productsr`   	productIdrb   category	ExceptionstrHTTP_500_INTERNAL_SERVER_ERROR)r;   
start_timerJ   rt   r*   sessionhistory_messagesis_first_interactionrK   extract_messagesextract_responseextracted_query
api_resulteraw_productstotal_foundre   rf   prg   system_promptllm_messagesrecent_historyr7   rM   history_contentproduct_detailselapseds                               r$   chat_searchr   M   s     J11  &B--/HMME
KK&*++GHI
KK&*++@
)TYSZ[\Y
'334EFF"==,,Z<"#349f.//DSIYEZD[[r  tH  sI  IJ  K  	L #( ''x(HI ''F(CD,<j)%223DgNNN)&7aZ\   "77D  	f.//STU)2MNO##$4RS$9:X >?::&67*2288:f.//COCTTUVW   "l2#(f%6$77mnoze$5#66cde##N8$DE##K$?@#$'88#35F4F4G#H (8GMM*%!../@'JJJ%"3F!VX 
 	f.//MoM^^ghmgnop	3OUKKJ "~~j"5 nn\15f.//?L@Q?RRijuivwx   ^MLM}L#yy%* QUU6<01aeeK>P>iTUTYTYZachTi=jjtuvuzuz  |C  EJ  vK  uL  M*   3992+)%!!1M 5;;2+)%	M &m<=367G3H23M)#$/ScN+L:;::l+!!"f,\\"9:1=CCEFNNX&7%88z{|f.//J6RVSV<.X\]^  ..|< !^O @Rxvakk]-PQPWPWyXghihrhrh{v{g||~#@.Ox @AO DE #44/1B0B0CD$4j!**+<gFFF))+
*f.//Fs8}oUijqruivv{|}!/h-	
 	
S G OD K L$$ 	LL5!2 33QRSR\R\RhRhQijk"77DQZZE[E[D\]  !! 	LL5!2 33UVWUXYZ"77Q 	(*d 	G   
u.//GAxPQ==1#a&:
 	

s   B^\' YB>\' Y\' /^0F\' ;Y<\' ^\' .Y =Y>Y A'\' )A\>G0\' .\$/A\' 
^\' \' \' Y \*A![\!6\\	\' '^	9A^^		^z/searchLhiaflow_svcproduct_svcc           	      p  K   t        j                          }| j                  }| j                  xs dj                         }| j                  }d| }d| }t
        j                  d| d       t
        j                  d| d| d|        	 t        j                  j                  |       d	{   }	|	rht        j                  |	      }
|j                  ||
|       d	{   }|r6t        j                          |z
  }t
        j                  d
| d|dd       |S t        j                  j                  |       d	{   }|rht        j                  |      }|j                  |||       d	{   }|r6t        j                          |z
  }t
        j                  d
| d|dd       |S t        j                  |       d	{   }|j                  j                  dg       }t!        |      dk(  }t
        j                  d| dt!        |       d| d       |s|ryt"        }|j%                  t'        d             |j%                  t)        |             ||j                  d<   t        j*                  ||       d	{    t-        ||ddg       S t/        t0        j2                  d      t
        j                  d| d       |j5                  ||      }t
        j                  d| d|        |dk(  rjt
        j                  d | d!       |j7                  |||       d	{   }t        j                          |z
  }t
        j                  d
| d"|dd       |S |d#k(  rt
        j                  d$| d%       |j8                  j;                  t        j                  |       d	{   }|j=                  |||||       d	{   }t        j                          |z
  }t
        j                  d
| d&|dd       |S |d'k(  rt
        j                  d(| d)       |j8                  j;                  t        j                  |       d	{   }|j?                  |||||       d	{   }t        j                          |z
  }t
        j                  d
| d*|dd       |S |dk(  rt"        }t
        j                  d+| d,       |j%                  t'        |             |j%                  t)        |             t!        |      t@        kD  r
|t@         d	 }||j                  d<   t        j*                  ||       d	{    t        j                          |z
  }t
        j                  d
| d-|dd       t-        ||ddg       S |d.k(  rt
        j                  d| d/       |jC                  ||      \  }}|rt
        j                  d0| d1| d2| d       |jE                  ||       d	{   }|set
        jG                  d3| d4       |jI                  |d5       d	{   }|j                  d6g       }|r|d   }t
        j                  d| d7       |r	|jK                  |g      }|r|d   nd	}|jM                  |||      }|jO                  ||d89      }|j%                  t'        |             |j%                  t)        |             t!        |      t@        kD  r
|t@         d	 }||j                  d<   t        j*                  ||       d	{    t        j                          |z
  }t
        j                  d
| d:|dd       t-        ||d.|rd5nd|      S t
        jG                  d3| d;| d<       nt
        jG                  d3| d=       t
        j                  d>| d?       |jQ                  ||      } t
        j                  d@| dA|  dB       | jS                         dCk(  r|r t"        }t
        j                  d+| dD       n+t
        j                  dE| dF       |jU                  ||      }|j%                  t'        |             |j%                  t)        |             t!        |      t@        kD  r
|t@         d	 }||j                  d<   t        j*                  ||       d	{    t-        |||dg       S t
        j                  dG| dH|  d|        |jI                  | |       d	{   }!|!j                  d6g       }"|!j                  dId      }#t
        j                  d0| dJt!        |"       dK|#        |jW                  || |"|#||      }t
        j                  dL| dM|d	dN  dO       |jK                  |"      }|jO                  ||      }|j%                  t'        |             |j%                  t)        |             t!        |      t@        kD  r
|t@         d	 }||j                  d<   t        j*                  ||       d	{    t        j                          |z
  }t
        j                  d
| dPt!        |       dQ|dd       t-        ||dRt!        |      |      S 7 	7 	7 	`7 	17 7 #7 |7 7 7 \7 B7 l7 7 7 7 7 7 # t.        $ r  tX        $ rP}$t
        j[                  dS| dTt]        |$              t/        t0        j^                  dUt]        |$             d	}$~$ww xY ww)Vu  
    Búsqueda conversacional de productos via MCP Tool (search_products).

    Soporta clasificación de intención con tools integrados:
    - PRODUCT → Búsqueda de productos via MCP (search_products)
    - PAYMENT → Opciones de pago via MCP (get_payment_options)
    - BALANCE → Consulta de saldo multi-paso via MCP (consultar_deuda_actual)
    - AGENT → Redirección a agente humano multi-paso via MCP (redirect_to_agent)
    - GREETING → Saludo + pregunta qué busca
    - OTHER → Respuesta genérica
    r=   search_redirect_ctx:search_balance_ctx:r>   z'] === INICIO chat_search_lhia (MCP) ===r?   r@   rA   Nrn   !] === FIN redirect flow. Tiempo: rp   rq    ] === FIN balance flow. Tiempo: rB   r   rC   rD   rE   rF   rG   rH   GREETINGrJ   rK   intentrL   rM   rN   rO   	   🏷️ [(   ] Clasificando intención del usuario...   ✅ [   ] Intención clasificada: PAYMENT   💳 [] Redirigiendo a flujo de pago ] === FIN payment flow. Tiempo: BALANCE   💰 [&] Iniciando flujo de consulta de saldo ] === FIN balance init. Tiempo: AGENT   🚨 [*   ] Iniciando flujo de redirección a agente'] === FIN agent redirect init. Tiempo: rW   ] Saludo detectado] === FIN greeting. Tiempo: PRODUCT_DETAIL/] Solicitando detalle de producto del historialr]   ] Producto identificado: '' (ID: ri   B   ] MCP detail no retornó datos, intentando búsqueda por nombre...   rM   ,   ] Producto encontrado via búsqueda fallbackT	is_detail"] === FIN product detail. Tiempo: #] No se pudo obtener detalle para '   '. Continuando con búsqueda.I   ] No se pudo identificar producto del historial, redirigiendo a búsquedarQ   rR   rS   rT   rU   rV   rX   rY   9   ] No se detectó producto, generando respuesta contextualrZ   ] Buscando via MCP: q='r\      ] MCP retornó: r^   rj   rk   rl   rm   z] === FIN chat_search_lhia: ro   PRODUCTr[   z] Error en chat_search_lhia: rr   0rs   rJ   rt   ru   r*   rv   rw   r   r6   r2   json_modloadshandle_redirect_flowhandle_balance_flowrx   ry   rz   r   r{   r|   r}   r~   r   r   r   r   classify_intenthandle_paymentidentityload_identityinit_balance_flowinit_redirect_flowr   !extract_product_name_from_historyget_product_detail_mcpr   search_products_mcpr   generate_detail_responsebuild_history_contentextract_product_queryr   generate_no_product_responsegenerate_search_responser   r   r   r   %r;   r   r   r   rJ   rt   r*   REDIRECT_CTX_KEYBALANCE_CTX_KEYredirect_ctx_rawredirect_ctxredirect_responser   balance_ctx_rawbalance_ctxbalance_responser   r   r   rK   r   payment_responseexisting_identityagent_responseproduct_name
product_iddetail_datasearch_resultsearch_products_listrM   productr   r   r   r   r   r   s%                                        r$   chat_search_lhiar      s    " J11  &B--/HMME-.?-@A+,=+>?O
KK&*++RST
KK&*++@
)TYSZ[\V
!0!7!7!;!;<L!MM#>>*:;L&.&C&CDUWcem&n n ))+
2f%6$77XY`adXeejkl(( !0 6 6 : :? KK"..9K%-%A%ABSU`bj%kk))+
2f%6$77WX_`cWddijk'' (334EFF"==,,Z<"#349f.//DSIYEZD[[r  tH  sI  IJ  K  	L #( ''x(HI ''F(CD,<j)%223DgNNN)&7!%   "77D  	i 122Z[\,,X7GHe-..HQR YKK&!2 33QRS%-%<%<=NPXZj%kkiikJ.GKK&!2 33ST[\_S``efg##YKK&!2 33YZ[&.&7&7&E&EoF\F\^o&p p%-%?%?!8-=wHY&   iikJ.GKK&!2 33ST[\_S``efg##WKK&!2 33]^_&.&7&7&E&EoF\F\^o&p p#+#>#>!8-=wHY$ N iikJ.GKK&!2 33Z[bcfZgglmn!!Z$FKK&!2 33EFG##N8$DE##K$?@#$'88#35F4F4G#H (8GMM*%!../@'JJJiikJ.GKK&!2 33OPWX[}\abc%"3!  %%KK&!2 33bcd'2'T'TU]_o'p$L*f%6$77QR^Q__fgqfrrstu$/$F$F|U_$``"NNX.?-@  AC  $D  E*5*I*I,XY*Z$ZM+8+<+<Z+L(+&:1&=e,=+>>j$kl*99;-HH-5hqk4G(AA(GU`aF&1&G&GPXdh&G&iO$++N8,LM$++K,PQ+,/@@+;=N<N<O+P(0@GMM*-)667H'RRR"iikJ6GKK&):(;;]^efi]jjo pq-*;%/#*a!)  NNX.?-@@cdpcq  rO  $P  Q*;)<  =F   G  H 	f.//STU%;;HFVWf.//COCTTUVW   "l2#(f%6$77mnoe$5#66opq$AA(L\]##N8$DE##K$?@#$'88#35F4F4G#H (8GMM*%!../@'JJJ%"3  	f.//FFWW`af`ghi&::?ERR
!~~j"5 nn\15f.//?L@Q?RRijuivwx 55o|[BRTh
 	f.//J6RVSV<.X\]^ --l;%;;FHMx @AO DE #44/1B0B0CD$4j!**+<gFFF))+
*f.//KCPXM?Znovwzn{  |A  B  	C!/h-
 	
K N !o L  l G O,  l !q  !q K" a %[" SF K S( 	G   
u.//LSQRVHUV==1#a&:
 	

  Bl6"k 1j21k #j$;k l6 "k j"1k 4j%5;k 0l61k 	j(
B>k j+	k l6Bk 2j.39k ,l6-Ak 8j19k j49k l6Ak j7k 8j:99k 2l63Bk j=Ak l6A+k k 4k :k;C5k 0k1Ak <l6=Ek k	k (l6)3k kD!k >k?Ak l6k k "k %k (k +k .k 1k 4k 7k :k =k  k k k 	k k k l3#Al..l33l6z/searchProductsLhiac           	      p  K   t        j                          }| j                  }| j                  xs dj                         }| j                  }d| }d| }t
        j                  d| d       t
        j                  d| d| d|        	 t        j                  j                  |       d	{   }	|	rht        j                  |	      }
|j                  ||
|       d	{   }|r6t        j                          |z
  }t
        j                  d
| d|dd       |S t        j                  j                  |       d	{   }|rht        j                  |      }|j                  |||       d	{   }|r6t        j                          |z
  }t
        j                  d
| d|dd       |S t        j                  |       d	{   }|j                  j                  dg       }t!        |      dk(  }t
        j                  d| dt!        |       d| d       |s|ryt"        }|j%                  t'        d             |j%                  t)        |             ||j                  d<   t        j*                  ||       d	{    t-        ||ddg       S t/        t0        j2                  d      t
        j                  d| d       |j5                  ||      }t
        j                  d| d|        |dk(  rjt
        j                  d | d!       |j7                  |||       d	{   }t        j                          |z
  }t
        j                  d
| d"|dd       |S |d#k(  rt
        j                  d$| d%       |j8                  j;                  t        j                  |       d	{   }|j=                  |||||       d	{   }t        j                          |z
  }t
        j                  d
| d&|dd       |S |d'k(  rt
        j                  d(| d)       |j8                  j;                  t        j                  |       d	{   }|j?                  |||||       d	{   }t        j                          |z
  }t
        j                  d
| d*|dd       |S |dk(  rt"        }t
        j                  d+| d,       |j%                  t'        |             |j%                  t)        |             t!        |      t@        kD  r
|t@         d	 }||j                  d<   t        j*                  ||       d	{    t        j                          |z
  }t
        j                  d
| d-|dd       t-        ||ddg       S |d.k(  rt
        j                  d| d/       |jC                  ||      \  }}|rt
        j                  d0| d1| d2| d       |jE                  ||       d	{   }|set
        jG                  d3| d4       |jI                  |d5       d	{   }|j                  d6g       }|r|d   }t
        j                  d| d7       |r	|jK                  |g      }|r|d   nd	}|jM                  |||      }|jO                  ||d89      }|j%                  t'        |             |j%                  t)        |             t!        |      t@        kD  r
|t@         d	 }||j                  d<   t        j*                  ||       d	{    t        j                          |z
  }t
        j                  d
| d:|dd       t-        ||d.|rd5nd|      S t
        jG                  d3| d;| d<       nt
        jG                  d3| d=       t
        j                  d>| d?       |jQ                  ||      } t
        j                  d@| dA|  dB       | jS                         dCk(  r|r t"        }t
        j                  d+| dD       n+t
        j                  dE| dF       |jU                  ||      }|j%                  t'        |             |j%                  t)        |             t!        |      t@        kD  r
|t@         d	 }||j                  d<   t        j*                  ||       d	{    t-        |||dg       S t
        j                  dG| dH|  d|        |jI                  | |       d	{   }!|!j                  d6g       }"|!j                  dId      }#t
        j                  d0| dJt!        |"       dK|#        |jW                  || |"|#||      }t
        j                  dL| dM|d	dN  dO       |jK                  |"      }|jO                  ||      }|j%                  t'        |             |j%                  t)        |             t!        |      t@        kD  r
|t@         d	 }||j                  d<   t        j*                  ||       d	{    t        j                          |z
  }t
        j                  d
| dPt!        |       dQ|dd       t-        ||dRt!        |      |      S 7 	7 	7 	`7 	17 7 #7 |7 7 7 \7 B7 l7 7 7 7 7 7 # t.        $ r  tX        $ rP}$t
        j[                  dS| dTt]        |$              t/        t0        j^                  dUt]        |$             d	}$~$ww xY ww)Vu   
    Copia personalizable de searchLhia para experimentación.

    Misma lógica que /chat/searchProductsLhia — edita este endpoint sin afectar el original.
    r=   r   r   r>   z+] === INICIO chat_search_lhia_dev (MCP) ===r?   r@   rA   Nrn   r   rp   rq   r   rB   r   rC   rD   rE   rF   rG   rH   r   r   rN   rO   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rW   r   r   r   r   r]   r   r   ri   r   r   rM   r   Tr   r   r   r   r   rQ   rR   rS   rT   rU   rV   rX   rY   r   rZ   r   r\   r   r^   rj   rk   rl   rm   z ] === FIN chat_search_lhia_dev: ro   r   r[   z!] Error en chat_search_lhia_dev: rr   r   r   s%                                        r$   chat_search_products_lhiar     s     J11  &B--/HMME-.?-@A+,=+>?O
KK&*++VWX
KK&*++@
)TYSZ[\V
!0!7!7!;!;<L!MM#>>*:;L&.&C&CDUWcem&n n ))+
2f%6$77XY`adXeejkl(( !0 6 6 : :? KK"..9K%-%A%ABSU`bj%kk))+
2f%6$77WX_`cWddijk'' (334EFF"==,,Z<"#349f.//DSIYEZD[[r  tH  sI  IJ  K  	L #( ''x(HI ''F(CD,<j)%223DgNNN)&7!%   "77D  	i 122Z[\,,X7GHe-..HQR YKK&!2 33QRS%-%<%<=NPXZj%kkiikJ.GKK&!2 33ST[\_S``efg##YKK&!2 33YZ[&.&7&7&E&EoF\F\^o&p p%-%?%?!8-=wHY&   iikJ.GKK&!2 33ST[\_S``efg##WKK&!2 33]^_&.&7&7&E&EoF\F\^o&p p#+#>#>!8-=wHY$ N iikJ.GKK&!2 33Z[bcfZgglmn!!Z$FKK&!2 33EFG##N8$DE##K$?@#$'88#35F4F4G#H (8GMM*%!../@'JJJiikJ.GKK&!2 33OPWX[}\abc%"3!  %%KK&!2 33bcd'2'T'TU]_o'p$L*f%6$77QR^Q__fgqfrrstu$/$F$F|U_$``"NNX.?-@  AC  $D  E*5*I*I,XY*Z$ZM+8+<+<Z+L(+&:1&=e,=+>>j$kl*99;-HH-5hqk4G(AA(GU`aF&1&G&GPXdh&G&iO$++N8,LM$++K,PQ+,/@@+;=N<N<O+P(0@GMM*-)667H'RRR"iikJ6GKK&):(;;]^efi]jjo pq-*;%/#*a!)  NNX.?-@@cdpcq  rO  $P  Q*;)<  =F   G  H 	f.//STU%;;HFVWf.//COCTTUVW   "l2#(f%6$77mnoe$5#66opq$AA(L\]##N8$DE##K$?@#$'88#35F4F4G#H (8GMM*%!../@'JJJ%"3  	f.//FFWW`af`ghi&::?ERR
!~~j"5 nn\15f.//?L@Q?RRijuivwx 55o|[BRTh
 	f.//J6RVSV<.X\]^ --l;%;;FHMx @AO DE #44/1B0B0CD$4j!**+<gFFF))+
*f.//OPST\P]^rsz{~r  @E  F  	G!/h-
 	
K N !o L  l G O,  l !q  !q K" a %[" SF K S( 	G   
u.//PQTUVQWPXYZ==1#a&:
 	

r   ):__doc__r4   r   loggingrs   r0   fastapir   r   r   r   langchain_core.messagesr   r|   r   r}   r	   langchain_openair
   modelsr   r   r   services.identity_servicer   services.product_servicer   services.flow_servicer   agent.promptsr   r   r   r   r   config.settingsr   	getLogger__name__rv   routerr   
MODEL_NAMEr   _identity_svcr'   r!   r%   r(   r   intdictr8   postHTTP_200_OKr   r   r   r"   r#   r$   <module>r     s       = = \ ? ' : - 7 5 /  %			8	$	'	8 x**:  !7	+ ^ c # $  Y'9vGYGYZj
0 j
 [j
b ]+=6K]K]^ $$45")*=">q
q
q
  q
 _q
p "3ESYSeSef $$45")*=">k
k
k
  k
 gk
r#   