
    I{j4                       S r SSKJr  SSKrSSKrSSKrSSKJrJr  SSKJ	r	  SSK
Jr  SSKJr  SSKJr  S	rS
rSrSrSrSrSr1 Skr\1 Sk-  rSS S jjr S       S!S jjr S       S"S jjr S       S#S jjr S     S$S jjrS%S jrS&S jr SSSS\S.             S'S jjr!SSSSS.           S(S jjr" S     S)S jjr#g)*zUDerivados de archivos del agente: texto plano + meta para retrieval barato en tokens.    )annotationsN)datetimetimezone)Path)Any)agents_file_context)agents_storage_derivedi  i6  P   i  d      >   aoyaldeeleninlalooforsetounandcondelforlaslosporquetheunapara>   r   hazpdfr#   damedocxwordfavorhacerhazmetodosalumnaalumnocamposgenerapuedesquierofamiliagenerarinformerellenacompletainformesnecesitorellenar	completar	documento
documentos
estudiante
narrativosc                <    [         R                  " X5      [        -  $ N)storageagent_folderDERIVED_DIR_NAME)
agent_namecustomer_ids     ZC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agents_derived_storage.pyderived_rootrL   X   s    
8;KKK    c                   [         R                  " U5      nU(       d  [        S5      e[        X5      nXC S3-  R	                  5       nXC S3-  R	                  5       n[        U5      R                  [        UR	                  5       5      5      (       a6  [        U5      R                  [        UR	                  5       5      5      (       d  [        S5      eXV4$ )Nzrelative_path is required..txt
.meta.jsonzDerived path not allowed.)rF   _safe_relative_path
ValueErrorrL   resolvestr
startswith)rI   relative_pathrJ   relroottxtmetas          rK   _derived_pathsr[   \   s     
%
%m
4C566
0DE,
'
'
)CU*%%..0Ds8s4<<>2333t9;O;ODLLN< < 4559rM   c                ^   [         R                  " U5      n[         R                  " XU5      n[        XU5      u  pVUR                  R                  SSS9  [        R                  " [        R                  5      R                  5       nU[        U5      R                  SSSUSS.nUR                  5       (       d+  SUS	'   UR                  [        R                   " USS
S9SS9  U$  ["        R$                  " U5      =(       d    SR'                  5       n	U	(       dP  SUS	'   UR                  [        R                   " USS
S9SS9  UR)                  5       (       a  UR+                  5         U$ UR                  U	SS9  SUS'   [-        U	5      US'   U	S[.         R1                  SS5      R'                  5       US'   SUS	'   UR                  [        R                   " USS
S9SS9  U$ ! [2         a@  n
[5        U
5      SS US	'   UR)                  5       (       a  UR+                  5          Sn
A
NkSn
A
ff = f)zEExtrae texto del original y escribe .txt + .meta.json bajo _derived/.T)parentsexist_okFr    N)pathnameokcharspreviewextracted_aterrorzOriginal not found.rf      )ensure_asciiindentutf-8encodingzNo extractable text.rb   rc   
 rd   i  )rF   rQ   resolve_targetr[   parentmkdirr   nowr   utc	isoformatr   ra   is_file
write_textjsondumpsfile_ctxextract_file_textstripexistsunlinklenPREVIEW_CHARSreplace	ExceptionrT   )rI   rV   rJ   rW   originaltxt_path	meta_pathrr   rZ   textexcs              rK   write_derived_for_filer   l   s    
%
%m
4C%%j{CH(+FHOO$6
,,x||
$
.
.
0CS	D -WTZZ5KV]^**84:AAC2DM  

4eA> !    !KD73T
D	W~.66tSAGGIYW DuQGRYZK  C#W??OOs    &BG" *AG" "
H,,6H''H,c                ,   [         R                  " U5      nU(       d  g[        X5      nUR                  5       (       d  g[	        XU5      u  pVUR                  5       (       a  UR                  5         UR                  5       (       a  UR                  5         XC-  R                  5       n[        U5      R                  [        UR                  5       5      5      (       a*  UR                  5       (       a  [        R                  " USS9  U S3n[        UR                  S5      5       H  n	 U	R                  U5      R!                  5       n
U
R#                  S5      (       d  M;  U
S[%        S5      *  nX:X  d  UR                  U5      (       ar  ['        [        U	5      S[%        S5      *  S-   5      nUR                  5       (       a  UR                  5         U	R                  5       (       a  U	R                  5         M  M  M     g! [(         a     M  f = f)zDBorra sidecars de un archivo o de una carpeta entera bajo _derived/.NT)ignore_errors/*.meta.jsonrP   rO   )rF   rQ   rL   r|   r[   ru   r}   rS   rT   rU   is_dirshutilrmtreelistrglobrelative_toas_posixendswithr~   r   r   )rI   rV   rJ   rW   rX   r   r   folderprefixrZ   key
source_reltxt_candidates                rK   delete_derivedr      s    
%
%m
4C
0D;;==(+FHj!!#F
6{c$,,.122v}}fD1uAYFTZZ./	""4(113C<<--1L 112J J$9$9&$A$A $SY/C#l2C1C%Dv%M N ((**!((*<<>>KKM "	 %B 0  		s   -5H$BH
HHc                z   [        X5      nUR                  5       (       d  / $ / n[        UR                  S5      5       Hg  n [        R
                  " UR                  SS95      n[        U[        5      (       a+  UR                  S5      (       a  UR                  U5        Me  Mg  Mi     U$ ! [         a     Mz  f = f)Nr   rj   rk   r`   )rL   r|   sortedr   rw   loads	read_text
isinstancedictgetappendr   )rI   rJ   rX   itemsr   datas         rK   list_derived_metasr      s     
0D;;==	"$EDJJ}56		::i1171CDD$%%$((6*:*:T" +;% 7 L  		s   AB,,
B:9B:c                    [         R                  " SU =(       d    SR                  5       5      nU Vs1 s H  o"[        ;  d  M  UiM     sn$ s  snf )Nu+   [0-9A-Za-zÁÉÍÓÚÜÑáéíóúüñ]{3,}r_   )refindalllower
_STOPWORDS)r   rawts      rK   	_tokenizer      s=    
**CdjbEWEWEY
ZC2s!z1As222s   AAc                @   U =(       d    SR                  5       n U (       d  / $ [        R                  " SU 5       Vs/ s H)  oR                  5       (       d  M  UR                  5       PM+     nn/ nU H  n[        U5      [        ::  a  UR                  U5        M)  SnU[        U5      :  d  M<  [        [        U5      U[        -   5      nUR                  XEU 5        U[        U5      :  a  M|  [        U[        -
  US-   5      nU[        U5      :  a  Mg  M     U$ s  snf )Nr_   z\n{2,}r      )	r{   r   splitr~   
CHUNK_SIZEr   minmaxCHUNK_OVERLAP)r   p
paragraphschunksr'   startends          rK   _chunk_textr      s    JBD	%'XXi%>L%>''))!'')%>JLFt9
"MM$c$ic$i!34CMM$S/*c$im+UQY7E c$i  M Ms   DDr_   querystudent_rutstudent_namerJ   budget_charsc          	     	  ^(^) [        X5      nU Vs/ s H  owR                  S5      (       d  M  UPM     nnUS[          Vs/ s H&  n[        UR                  S5      =(       d    S5      PM(     n	n[	        U5      n
[	        U=(       d    S5      nX-  n
X-   Vs1 s H!  o[
        ;  d  M  [        U5      S:  d  M  UiM#     nn[        R                  " U=(       d    S5      n[        U5      S:  aP  U
R                  UR                  5       5        [        U5      S:  a"  U
R                  USS R                  5       5        / n[        X5      nS	nU GHO  n[        UR                  S5      =(       d    S5      nUR                  5       m(UU S
3-  R                  5       nUR                  5       (       d  Md   UR                  SSS9nSn[	        UR!                  SS5      R!                  SS5      R!                  SS5      5      nU(       a  UU-  (       a  US-  nU(       a7  UR                  5       m)[#        U)4S jU 5       5      nU(       a  USSU-  -   -  nU(       a   U[        R                  " U5      ;   a  US-  nO-[%        U(4S j[        R&                   5       5      (       a  US-  n[%        U(4S jU 5       5      (       a  U(       d  U(       a  GM  US-  n[)        U5       H  n[	        U5      nU
(       a  [        U
U-  5      OSnU
(       d  UU(       a  SOS-   nOJ[+        U5      U-   nU(       a  U[        R                  " U5      ;   a  US-  nU(       a  UU-  (       a  US -  nUS::  a  U
(       a  US!:  a  M  US::  a  M  UR-                  UUU45        M     GMR     UR/                  S" S#9  / nSnSn[1        5       n U H  u  n!nnU S$USS%  3n"U"U ;   a  M  U R                  U"5        S&U S'UR3                  5        3n#U[        U#5      -   U:  a&  UU-
  n$U$S(:  a  UR-                  U#SU$ S)-   5        Un  O4UR-                  U#5        U[        U#5      -  nUS-  nU[4        :  d  M    O   U	(       a  S*R7                  U	5      OS+n%S,[        U5       S-U% S.U S/U S03	n&U(       a  S1R7                  U5      OS2n'U&S3-   U'-   [        U5      UUU	S4.$ s  snf s  snf s  snf ! [         a     GM  f = f)5uS   Índice corto + top chunks por overlap de keywords / RUT / nombre (sin embeddings).rb   Nr`   r_         r   )
ejemplo_zejemplo-formato_zformato-glosariodecretoorientacionescartilla	normativabase_institucionalrO   rj   r   )rl   errorsg        r   rn   _-g      ^@c              3  6   >#    U  H  oT;   d  M
  S v   M     g7f)r   N ).0r   text_ls     rK   	<genexpr>+retrieve_relevant_chunks.<locals>.<genexpr>-  s     ?-Q;qq-s   		g      D@g      $@g      T@c              3  ,   >#    U  H	  oT;   v   M     g 7frE   r   r   markerrel_ls     rK   r   r   2  s     T/SV5/S   g      @c              3  ,   >#    U  H	  oT;   v   M     g 7frE   r   r   s     rK   r   r   5  s     C-B6-Br   g      9@r   g      @g      ?g      >@g      4@2   c                    U S   * U S   4$ )Nr   r   r   )xs    rK   <lambda>*retrieve_relevant_chunks.<locals>.<lambda>N  s    !uadmrM   )r   :r   z### Archivo: 

   u   
… [truncado]z, z(sin textos derivados)uX   ARCHIVOS DEL AGENTE (índice + trozos relevantes; presupuesto bajo de tokens).
Índice (z con texto): z
Trozos incluidos: z (~z caracteres).
Usa SOLO estos datos como fuente documental; no inventes contenido de archivos no listados.
Si hay un archivo del estudiante (nombre/RUT en el nombre o en el texto), prioridad absoluta para los campos narrativos del informe.
z

---

z*(Sin trozos relevantes para este mensaje.)rm   )r   
file_countchunk_countrc   index)r   r   CHAT_INDEX_MAX_FILESrT   r   _QUERY_NOISEr~   ry   _normalize_rutaddr   rL   rS   ru   r   r   r   sumany_INTERACTIVE_REPORT_MARKERSr   floatr   sortsetr{   MAX_CHUNKS_RETURNEDjoin)*rI   r   r   r   rJ   r   metasmok_metasindex_pathsquery_tokensname_tokensr   person_tokensrut_normscoredrX   _GENERIC_PATH_MARKERSrZ   rW   r   r   
file_bonuspath_tokenshitschunkchunk_tokensoverlapscoresectionsusedused_chunksseen_scorer   block	remaining
index_lineheaderbodyr   r   s*                                           @@rK   retrieve_relevant_chunksr     s    z7E 05aEE$K5H05=>S?S5TU5T3quuV}*+5TKUU#LL.B/KL..aL3HSQRVWX[.   &&{'8b9H
8})*x=1Xcr]0023+-F
0D $((6"(b)		cU$<'002!!	%%wy%ID 
C 5 = =c3 G O OPSUX YZmk9%JZZ\F?-??DddTk22
H$;$;D$AA$JTx/S/STTT#JC-BCCC$J &E$U+L:Fc,56AG"ZcSAg3H,C,CE,J JTME ml&BTME zlzBzMM5#u-.# 'A f KK+K,HDKUD$UQuSbzl#$;uD8#e*|+$t+I3jy 14F FG#E
q--! %$ ,7;'<TJ	M?-
| <(MTF 3G	G   
		H	%9 	 $(m" u 1UD  		s4   SS-SS"+S"<S"8S''
S65S6)r   r   r   rJ   c          	        / n[         R                  " U UUUS9u  pgU(       a(  [        U5      S:  a  USS S-   nUR                  U5        [	        S[
        [        S U 5       5      -
  5      n[        U UUUUUS9n	UR                  U	S   5        S	R                  U5      R                  5       [        U	R                  S
5      =(       d    S5      4$ )z*(texto para prompt, n archivos indexados).)r   r   rJ   i@  Nu$   
… [Excel del estudiante truncado]i  c              3  8   #    U  H  n[        U5      v   M     g 7frE   )r~   )r   r   s     rK   r   0build_selective_files_context.<locals>.<genexpr>  s     2I5a3q665s   r   r   r   r   r   )ry   $extract_spreadsheet_hint_for_studentr~   r   r   CHAT_BUDGET_CHARSr   r  r   r{   intr   )
rI   r   r   r   rJ   partsexcel_block_matchedr  	retrieveds
             rK   build_selective_files_contextr  }  s     E$II!	K {e#%fu-0WWK[!E,s2I52I/IIJI(!I 
LL6"#;;u##%s9==+F+K!'LLLrM   c                   [         R                  " X5      n[        R                  " X5      nSn/ nU Hy  nUR	                  U5      R                  5       n[        XU5      nUR                  S5      (       a  US-  nMK  UR                  U SUR                  S5      =(       d    S 35        M{     S[        U5      UUS.$ )	zARegenera _derived para todos los archivos de contexto del agente.r   rb   r   z: rf   failedT)rb   	processed	derivedOkderivedErrors)
ry   list_all_context_file_pathsrF   rG   r   r   r   r   r   r~   )	rI   rJ   pathsrX   rb   r   r`   rW   rZ   s	            rK   rebuild_all_derivedr    s     00IE
8D	
BFt$--/%j{C88D>>!GBMMSEDHHW$5$A#BCD  Z	 rM   rE   )rI   rT   rJ   
int | Nonereturnr   )rI   rT   rV   rT   rJ   r   r!  ztuple[Path, Path])rI   rT   rV   rT   rJ   r   r!  dict[str, Any])rI   rT   rV   rT   rJ   r   r!  None)rI   rT   rJ   r   r!  zlist[dict[str, Any]])r   rT   r!  zset[str])r   rT   r!  z	list[str])rI   rT   r   rT   r   
str | Noner   r$  rJ   r   r   r  r!  r"  )rI   rT   r   rT   r   r$  r   r$  rJ   r   r!  ztuple[str, int])rI   rT   rJ   r   r!  r"  )$__doc__
__future__r   rw   r   r   r   r   pathlibr   typingr   app.backend.utilsr   ry   r	   rF   rH   r   r  r   r   r   r   r   r   rL   r[   r   r   r   r   r   r  r  r  r   rM   rK   <module>r*     s   [ "  	  '   = 7   
 
<   DL
 DH$'6@& #000 0 	0h DH##$'#6@#	#N 04","3
. "#")KK K 	K
 K K K Kb "#"MM M 	M
 M M MF 04",rM   