
    J{j                    B   S r SSKJr  SSKrSSKrSSKJr  \R                  " S\R                  5      r	SS jr
SS jrSS jr\" 1 S	k5      rSS
 jrSS jrSS jr\R                  " S\R                  5      r\R                  " S\R                  5      rSS jrSS jrg)zIExtrae payload de campos desde la respuesta del LLM para create_document.    )annotationsN)Anyz#```(?:json)?\s*(\{[\s\S]*?\})\s*```c                T   U =(       d    SR                  5       nU(       d  g/ n[        R                  U5       H#  nUR                  UR	                  S5      5        M%     UR                  S5      nUS:  a  UR                  XS 5        U H  n[        U5      nU(       d  M  Us  $    g)u~   
Busca un objeto JSON con clave 'fields' (o el objeto plano de campos)
en bloques ```json``` o en el último {...} del texto.
 N   {r   )strip	_FENCE_REfinditerappendgrouprfind_try_parse_fields)replytext
candidatesmatchstartrawparseds          UC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agents_mcp_fields.pyextract_fields_from_replyr      s    
 KR DJ##D)%++a.) * JJsOEz$v,'"3'6M      c           	         [         R                  " U 5      n[        U[        5      (       d  g [        UR                  S5      [        5      (       aA  US   (       a7  US   R                  5        VVs0 s H  u  pE[        U5      Uc  SOU_M     snn$ 1 SknUR                  5        VVs0 s HD  u  pE[        U5      U;  d  M  [        U[        [        45      (       a  M3  [        U5      Uc  SOU_MF     nnnU=(       d    S $ ! [         R                   aL     [         R                  " 5       nUR	                  U R                  5       5      u  p GN9! [         a      g f = ff = fs  snnf s  snnf )Nfieldsr   >   okmetaagent_id
student_idcustomer_iddocument_id)jsonloadsJSONDecodeErrorJSONDecoder
raw_decoder	   	Exception
isinstancedictgetitemsstrlist)r   datadecoder_kvskipr   s           r   r   r   )   sB   zz# dD!!$((8$d++X=A(^=Q=Q=ST=STQAqya/=STTQD JJL DAq6 	(&0T4L&A 	(Aqya'   
 >T%  	&&(G((5GD! 		 UsA   D 2E&*E,E, E,E#6E
EE#EE#c                f   U =(       d    Sn[         R                  SU5      n[        R                  " SSU[        R                  S9nUR	                  5       nUR                  5       R                  S5      (       a<  UR                  S5      nUS:  a%  [        X#S 5      (       a  USU R                  5       n[        R                  " SSU5      R	                  5       n[        R                  " S	SU5      R	                  5       nUR	                  5       =(       d    U =(       d    SR	                  5       $ )
uK   Quita el bloque JSON de campos para dejar la redacción legible en el chat.r   z```(?:json)?\s*\{[\s\S]*$)flags}r   r   NuF   (?i)\n*(?:a continuación[,:]?\s*)?(?:el\s+)?bloque\s+json[^\n]*:?\s*$uB   (?i)\n*(?:aquí\s+el\s+json|json\s+con\s+los\s+campos)[^\n]*:?\s*$)	r
   subre
IGNORECASEr	   rstripendswithr   r   )r   r   cleanedr   s       r   strip_fields_json_from_replyr=   A   s    ;BDmmB%Gff$
mm	G mmoG~~  %%c"A:+GFO<<fuo,,.GffQ
 eg	 
 ffM
 eg	 
 ==?3u{1133r   >/   ageiperutcourseschool	born_date	full_name
birth_dateperson_namestudent_agestudent_rutperson_emailperson_phonestudent_namereceiver_emailreceiver_phonestudent_coursestudent_schoolevaluation_dateevaluation_typeperson_presenceperson_full_nameevaluation_date_1evaluation_date_2evaluation_date_3evaluation_date_4evaluation_date_5evaluation_date_6professional_nameprofessional_rolestudent_born_datestudent_full_nameprofessional_emailprofessional_phonereceiver_full_namestudent_birth_datereceiver_presence_ofidentification_numberreceiver_relationshipprofessional_full_nameperson_relation_studentprofessional_phone_emailprofessional_job_positionperson_identification_numberstudent_identification_number"professional_delivered_date_inform"professional_identification_numberc                  ^ U =(       d    SR                  5       R                  5       mT[        ;   a  gTR                  S5      (       a  g[	        U4S jS 5       5      (       a  [	        U4S jS 5       5      (       d  gg)	Nr   TrP   c              3  .   >#    U  H
  nUT;   v   M     g 7fN .0tokenr1   s     r   	<genexpr>+_is_identification_field.<locals>.<genexpr>   s       
E 	

   )rD   identification_rutrC   rE   phoneemailrA   rB   professional_person_	receiver_c              3  .   >#    U  H
  nUT;   v   M     g 7fro   rp   rq   s     r   rt   ru      s       
E 	

rv   )strengthsupportdiagnos
instrumentreason	agreementcollaborativehome_pedagogicalsocialhealthobservationprogress	synthesisF)r	   lower_IDENTIFICATION_FIELD_HINTS
startswithany)keyr1   s    @r   _is_identification_fieldr      s    	!!#A''||%&&
 
     
  & r   c                   ^  T (       d  gT R                  5        Vs/ s H   n[        [        U5      5      (       a  M  UPM"     nnU(       d  g[        U 4S jU 5       5      nU[	        U5      4$ s  snf )u}   
Cuenta (rellenos, totales) de campos que NO son solo identificación.
Si no hay campos narrativos en el payload, totales=0.
)r   r   c              3     >#    U  H?  n[        TR                  U5      =(       d    S 5      R                  5       (       d  M;  Sv   MA     g7f)r   r   N)r,   r*   r	   )rr   r1   r   s     r   rt   *narrative_fields_filled.<locals>.<genexpr>   s0     ONqc&**Q-2E2.F.L.L.NNs   :A
	A
)keysr   r,   sumlen)r   r1   narrative_keysfilleds   `   r   narrative_fields_filledr      s^    
 !'WA6NsSTv6VaNWONOOF3~&&&	 Xs
   A/A/c                   [        U 5      u  pUS:X  a  gUS:X  d  X-  S:  a  gU R                  5        Vs/ s H   n[        [        U5      5      (       a  M  UPM"     nnU Vs/ s Hl  n[        U R	                  U5      =(       d    S5      R                  5       (       d  M;  [        U R	                  U5      =(       d    S5      R                  5       PMn     nnU(       d  g[        S U 5       5      [        U5      -  nUS:  $ s  snf s  snf )uQ   True si solo hay datos personales / fechas o el narrativo quedó demasiado corto.r   Tg      ?r   c              3  8   #    U  H  n[        U5      v   M     g 7fro   )r   )rr   ts     r   rt   &is_content_too_thin.<locals>.<genexpr>   s     (%Q#a&&%s   x   )r   r   r   r,   r*   r	   r   r   )r   r   totalr1   r   textsavg_lens          r   is_content_too_thinr      s    +F3MFz{v~-!'WA6NsSTv6VaNW7Ej~!VZZXY]M`^`IaIgIgIi-SA$"%++-~Ej(%((3u:5GS= Xjs   DD#:D!5DzV\s*\(\s*(LOGRADO[AS]?|REQUIERE\s+APOYO|EN\s+PROCESO|NO\s+OBSERVADO|NO\s+EVALUADO)\s*\)uQ   [ \t]*[-–—:]?[ \t]*(LOGRADO[AS]?|REQUIERE\s+APOYO|EN\s+PROCESO)\s*(?=[.;,]|$)c                    U (       d  U $ [         R                  SU 5      n[        R                  SU5      n[        R                  " SSU5      n[        R                  " SSU5      nUR	                  5       $ )zOQuita etiquetas de pauta (LOGRADO / EN PROCESO / REQUIERE APOYO) del narrativo.r   z	[ \t]{2,} z\s+\..)_SCALE_PAREN_REr7   _SCALE_BARE_REr8   r	   )r   outs     r    strip_questionnaire_scale_labelsr      s^    


b$
'C


R
%C
&&sC
(C
&&3
$C99;r   c                n   U (       d  0 $ SSK JnJnJnJnJn  U Vs1 s H
  oc" U5      iM     nn0 nU R                  5        Hk  u  p[        U
[        5      (       aM  [        U
5      nU" [        U	5      5      (       a	  U" U5      nOU" [        U	5      5      U;   a  U" U5      nXU	'   Mg  XU	'   Mm     U$ s  snf )Nr   )_SUGGESTION_KEYS_is_date_field_key_normalize_keyformat_psychoped_dateformat_suggestions_as_dashes)
'app.backend.utils.agents_psychoped_fillr   r   r   r   r   r+   r(   r,   r   )r   r   r   r   r   r   r1   suggestion_normr   r   valr   s               r   sanitize_psychoped_fieldsr      s    	  3CC2BQ~a(2BOCCLLNc33C8D!#c(++,T2C)_<3D9HH # J Ds   B2)r   r,   returndict[str, Any] | None)r   r,   r   r   )r   r,   r   r,   )r   r,   r   bool)r   r   r   ztuple[int, int])r   r   r   r   )r   r,   r   r,   )r   r   r   zdict[str, Any])__doc__
__future__r   r"   r8   typingr   compiler9   r
   r   r   r=   	frozensetr   r   r   r   r   r   r   r   rp   r   r   <module>r      s    O "  	  JJ*MM	204B (02 j*Z'" **]MM XMMr   