
    ܤj4                         S SK J r   S SKJrJrJrJrJr  S SKJrJ	r	  S SK
Jr  SrSrSrS\\    S	\\   4S
 jrSS\S\S	\4S jjrS\S	\4S jrS\\   S	\\   4S jr " S S5      rg)    )datetime)AnyDictListOptionalUnion)ChatDetailModel	ChatModel)AgentsAiClass         valuereturnc                 4    U (       d  g U R                  S5      $ )Nz%Y-%m-%d %H:%M:%S)strftime)r   s    RC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\agents_class.py
_format_dtr      s    >>-..    textmax_lenc                 N    U =(       d    SR                  5       nU(       d  gUS U $ )N z
Chat nuevostrip)r   r   ts      r   _title_from_textr      s&    	AXg;r   chat_type_idc                     U [         :X  a  S$ S$ )Nuser	assistant)CHAT_TYPE_USER)r   s    r   _detail_roler#      s    !^36DDr   
session_idc                 J    U =(       d    SR                  5       nU(       a  U$ S $ )Nr   r   )r$   ss     r   _normalize_session_idr'      s"    		r  "A1tr   c                   >   \ rS rSrS rS\S\\   4S jrS\S\S\\   4S jr	\
4S\S\S	\\\\4      4S
 jjr    SS\S\S\\   S\\   S\\   S\\\\\4         S	\\\\4   \\\4   4   4S jjr   SS\S\S\S\\   S	\\\\\4      \\\4   4   4
S jjr SS\S\S\\   S	\\\\4   \\\4   4   4S jjr  SS\S\\   S\S\\   S\\   4
S jjr      SS\S\\   S\S\\   S\\   S\\   S\\   S\\\      S\\\\\4         4S jjrSrg) AgentsClass"   c                     Xl         g Ndb)selfr.   s     r   __init__AgentsClass.__init__#   s    r   user_idr$   c                    [        U5      nU R                  R                  [        5      nU(       a:  [	        U5      S:  a+  UR                  [        R                  [	        U5      :H  5      $ U(       a4  UR                  [        R                  S:H  [        R                  U:H  5      $ UR                  [        R                  S:H  5      $ )Nr   )	r'   r.   queryr
   intfilterr2   r$   id)r/   r2   r$   sidr5   s        r   _ownership_queryAgentsClass._ownership_query&   s    #J/i(s7|a'<<	 1 1S\ ABB<<	 1 1Q 6	8L8LPS8STT||ILLB.//r   chat_idc                     U R                  X#5      R                  [        R                  U:H  5      R	                  5       $ r,   )r:   r7   r
   r8   first)r/   r<   r2   r$   s       r   
_find_chatAgentsClass._find_chat/   s1    $$W9@@QXAXY__aar   limitr   c                    U R                   R                  [        5      R                  [        R                  U:H  5      R                  [        R                  R                  5       5      R                  U5      R                  5       n[        [        U5      5      nU Vs/ s H0  n[        UR                  5      UR                  UR                  S.PM2     sn$ s  snf )u   
Últimos N registros de chat_details (preguntas y respuestas),
en orden cronológico, para mantener el hilo de la conversación.
)rolecontentr   )r.   r5   r	   r7   r<   order_byr8   descrA   alllistreversedr#   r   message)r/   r<   rA   rowschronologicalds         r   _get_recent_historyAgentsClass._get_recent_history2   s     GGMM/*VO++w67Xo((--/0U5\SU 	 Xd^, #
 #	 %Q^^499 !
 #
 	
 
s    7CNrJ   attachments_contextimage_attachmentsc                    U=(       d    SR                  5       n[        U=(       d    SR                  5       5      n[        U=(       a    [        U5      S:  5      n	U(       d  U(       d  U	(       d  SSS.$ / n
U(       a4  U R                  X1U5      nU(       d  SSS.$ U R	                  U[
        5      n
[        5       R                  UU
UUS9u  pU(       d  U(       d  SU=(       d    SS.$ U[        U
5      S	.$ )
z{
Lee el historial guardado en BD (hasta 20 mensajes: usuario + agente)
y genera la respuesta de la IA usando ese contexto.
r   r   errorMessage or files are requiredstatusrJ   Chat not found)rP   rQ   z+No se pudo generar la respuesta del agente.)replyhistory_used)r   boollenr?   rN   HISTORY_CONTEXT_LIMITr   generate_reply)r/   r2   rJ   r<   r$   rP   rQ   r   has_docs
has_imageshistorychatai_replyai_errors                 r   answersAgentsClass.answersL   s     2$$&,299;<+J4E0F0JK
HZ%2QRR(*??7Z@D")6FGG..w8MNG*_;; 3/	 < 
 8!#T'T  L
 	
r   pageitems_per_pagec           	      *    U R                  X5      R                  [        R                  [        R                  [        R
                  [        R                  5      R                  [        R                  R                  5       [        R                  R                  5       5      nUc  SO
[        U5      nUS:  a  U=(       d    SnUR                  5       nU(       a
  X-   S-
  U-  OSn	US:X  a  SSUU/ S.$ UR                  US-
  U-  5      R                  U5      R                  5       n
U
 Vs/ s HD  nUR                  UR                  [        UR
                  5      [        UR                  5      S.PMF     nnUU	UUUS.$ UR                  5       nU Vs/ s HD  nUR                  UR                  [        UR
                  5      [        UR                  5      S.PMF     sn$ s  snf s  snf ! [         a  nS[!        U5      S.s S nA$ S nAff = f)Nr   2   r   )total_itemstotal_pagescurrent_pagerg   datar8   title
added_dateupdated_daterS   rU   )r:   with_entitiesr
   r8   ro   rp   rq   rE   rF   r6   countoffsetrA   rG   r   	Exceptionstr)r/   r2   rf   rg   r$   r5   page_valipprj   rk   rm   row
serializedrK   es                  r   get_allAgentsClass.get_allw   s   2	:))'>LL$$&&	
 hy--224ill6G6G6IJ  !Lqc$iH!|$*#kkm@C{014<!#'('((0*- "  ||X\S$89??DHHJ  $  $ "ff!$&0&@(233C3C(D	  $   $/#.$,&)&  99;D    C && YY",S^^"<$.s/?/?$@	   %$  	:%#a&99	:sJ   C4G0 78G0 /AG&:	G0 G0 AG+#G0 &
G0 0
H:HHHc                     U R                  XU5      nU(       d  SSS.$ U R                  R                  [        5      R	                  [        R
                  U:H  5      R                  [        R                  R                  5       5      R                  5       nUR                  UR                  [        UR                  5      [        UR                  5      U Vs/ s HZ  nUR                  UR
                  UR                  [        UR                  5      UR                   [        UR                  5      S.PM\     snS.$ s  snf ! ["         a  nS[%        U5      S.s S nA$ S nAff = f)NrS   rW   rU   )r8   r<   r   rC   rJ   rp   )r8   ro   rp   rq   details)r?   r.   r5   r	   r7   r<   rE   r8   ascrG   ro   r   rp   rq   r   r#   rJ   ru   rv   )r/   r<   r2   r$   ra   r   rM   r{   s           r   getAgentsClass.get   s#   	:??7Z@D")6FGG o.//7:;/,,0023	  gg(9 *4+<+< = %
 %  dd#$99() ,Q^^ <#$99&0&> %
 

  	:%#a&99	:s6   E B:E A!E ;E  E 
E'E"E'"E'customer_idro   c           	          [        U5      n[        R                  " 5       n[        U5      nU(       a  [	        U5      S:  a  [	        U5      OSn	U(       a+  U R                  XAU5      n
U
(       d  SSS.$ Xjl        Xzl        O1[        U	UU	S:X  a  UOSUUUS9n
U R                  R                  U
5        U R                  R                  5         U R                  R                  U
5        U
R                  U
R                  [        U
R                  5      [        U
R                  5      S.$ ! [          a2  nU R                  R#                  5         S[%        U5      S.s SnA$ SnAff = f)uE   Guarda cabecera de chat (p. ej. borrador sin mensajes enviados aún).r   rS   rW   rU   Nr2   r   r$   ro   rp   rq   rn   )r   r   nowr'   r6   r?   ro   rq   r
   r.   addcommitrefreshr8   r   rp   ru   rollbackrv   )r/   r2   r   ro   r<   r$   	title_valr   r9   uidra   r{   s               r   	save_chatAgentsClass.save_chat   s"   !	:(/I,,.C'
3C")c'lQ.>#g,ACwD&-:JKK&
$'!  +&)QhsD#"!$ D!GGNNGGOOD!gg(9 *4+<+< =	   	:GG%#a&99	:s%   A2D) 5B3D) )
E%3'E E% E%assistant_replyattachment_namesc
           	         U=(       d    SR                  5       n
U=(       d    / n[        U	=(       a    [        U	5      S:  5      nU
(       d  U(       d  U(       d  SSS.$ SSKJnJn  U" X5      nU" X5      n[        U5      nU(       a  [        U5      S:  a  [        U5      OSnUS:X  a  U(       d  SSS.$ [        R                  " 5       n U(       a  U R                  XAU5      nU(       d  SSS.$ O][        UUUS:X  a  UOS [        U
=(       d    U5      UUS	9nU R                  R                  U5        U R                  R                  5         Ub  UR                  5       nONU R!                  UU
UR"                  UUU	S
9nUR%                  S5      S:X  a  SUR%                  SS5       3nOUS   nU R                  R'                  [(        R"                  5      R+                  [(        R,                  UR"                  :H  5      R/                  S5      R1                  5       nU(       d  [        U
=(       d    U5      Ul        [)        UR"                  [4        UUS9n[)        UR"                  [6        UUS9nU R                  R                  U5        U R                  R                  U5        UUl        U R                  R;                  5         U R                  R=                  U5        U R%                  UR"                  XS9n[?        U[@        5      (       a  UR%                  S5      S:X  a  U$ UR"                  UR2                  S.UE$ ! [B         a2  nU R                  RE                  5         S[G        U5      S.s S nA$ S nAff = f)Nr   r   rS   rT   rU   )#append_document_context_for_history$format_user_message_with_attachmentszsession_id is requiredrW   r   )r<   r$   rP   rQ   rV   z8No pude generar una respuesta en este momento. Detalle: rJ   zerror desconocidorX   r   )r<   r   rJ   rp   )r$   )r<   ro   )$r   rZ   r[   *app.backend.utils.agent_document_extractorr   r   r'   r6   r   r   r?   r
   r   r.   r   flushrd   r8   r   r5   r	   r7   r<   rA   r>   ro   r"   CHAT_TYPE_ASSISTANTrq   r   r   
isinstancedictru   r   rv   )r/   r2   r   rJ   r<   r   r$   rP   r   rQ   r   attach_namesr_   r   r   stored_user_messager9   r   r   ra   rX   answer_resulthas_detailsuser_detailassistant_detailresultr{   s                              r   send_messageAgentsClass.send_message  s    2$$&'-2+J4E0F0JK
L%2QRR	

 C4VA
 $J/%#g,*:c'l!8C%2JKKllnJ	:wD&-:JKK  ! +&)QhsD*4+F3FG"!$ D!*'--/ $ GG)(;&7 !- ! !$$X.'9$$1$5$5iAT$U#VX 
 *'2E o001//477:;q	  -d.I6IJ
)++	K  /0	  GGKK$GGKK() #DGGNNGGOOD!XXdggwXFF&$''FJJx,@G,K77  
  	:GG%#a&99	:s+   $M	 2H;M	 .M	 	
N'N :N Nr-   )NNNN)r   ri   Nr,   )NN)NNNNNN)__name__
__module____qualname____firstlineno__r0   r6   r   rv   r:   r?   r\   r   r   rN   r   r   rd   r|   r   r   r   __static_attributes__ r   r   r)   r)   "   s   0 0# 0b# b b# b +

 
 
d38n		
< "&$(-1<@)
)
 )
 #	)

 SM)
 &c])
 $Dc3h$89)
 
tCH~tCH~-	.)
\  $(9:9: 9: 	9:
 SM9: 
tDcN#T#s(^3	49:~ %)	$:$: $: SM	$:
 
tCH~tCH~-	.$:V "&$(*:*: c]*: 	*:
 #*: SM*:b "&)-$(-104<@m:m: c]m: 	m:
 #m: "#m: SMm: &c]m: #49-m: $Dc3h$89m: m:r   r)   N)i   )r   typingr   r   r   r   r   app.backend.db.modelsr	   r
   #app.backend.classes.agents_ai_classr   r"   r   r\   rv   r   r6   r   r#   r'   r)   r   r   r   <module>r      s     3 3 < =  /hx( /Xc] /3  s Es Es Ehsm  
O: O:r   