
    Ij=                    
   S r SSKJr  SSKrSSKJr  SSKJr  SSKJ	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SKJr  SSKJr  SSKJr  SSKJr  SSKJrJ r J!r!J"r"  SSK#J$r$J%r%J&r&J'r'  SSK(J)r)  SS jr* " S S5      r+g)uU   Chat Agent v2: prompt desde BD + OpenAI + generación Word/PDF + guardado en folders.    )annotationsN)Iterator)Any)Session)build_fields_promptgenerate_and_save_document)settings)AgentV2Model)AgentV2DocumentTemplateModel)StudentPersonalInfoModel)agent_v2_openai)openai_api_key_configured)agent_v2_storage)build_agent_files_context)CHAT_OUTPUT_OVERRIDEDOCUMENT_FIELD_EXTRACTION_GUIDE'extract_priority_directives_from_prompt#sanitize_role_instructions_for_chat)infer_document_idresolve_student_idstudent_identification_hintwants_document_generation)fields_from_jsonc                    U $ N )events    YC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\agent_v2_chat_class.py_sser   &   s    L    c                      \ rS rSrSS jrSS jrSS jrSS 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rg	)AgentV2ChatClass*   c                    Xl         g r   db)selfr&   s     r   __init__AgentV2ChatClass.__init__+   s    r    c                    U R                   R                  [        5      R                  [        R                  U:H  5      R                  5       $ r   )r&   queryr
   filteridfirst)r'   agent_ids     r   
_get_agentAgentV2ChatClass._get_agent.   s2    ww}}\*11,//X2MNTTVVr    c                    U R                   R                  [        5      R                  [        R                  U:H  [        R
                  U:H  5      R                  5       $ r   )r&   r+   r   r,   r/   document_idr.   )r'   r/   r3   s      r   _get_templateAgentV2ChatClass._get_template1   sG    GGMM67V,55A,88KG UW	
r    c                   U R                   R                  [        5      R                  [        R                  U:H  5      R                  [        R                  R                  5       5      R                  5       nU Vs/ s HD  nUR                  UR                  UR                  [        [        UR                  5      5      S.PMF     sn$ s  snf )N)
documentIddocumentName
formatType
fieldCount)r&   r+   r   r,   r/   order_bydocument_nameascallr3   format_typelenr   detected_fields)r'   r/   rowsrows       r   _list_templates_summary(AgentV2ChatClass._list_templates_summary;   s    GGMM67V099XEFX2@@DDFGSU	 	 
  "oo # 1 1!oo!"233F3F"GH	 
 	
 
s   =ACc                   U R                  UR                  5      nU(       a  [        R                  " USSS9OSnSn	Ubc  U R	                  UR                  U5      n
U
(       a:  SU
R
                   SU SU
R                  R                  5        S	[        U
5       3n	OS
U S3n	[        R                  " UR                  5      nSnU(       a  SU S3nOUS:X  a  US:  a  Sn[        UR                  5      n[        UR                  5      nSnU(       a  SU S3nO	U(       a  SnSnU(       a  SU S3nSUR                   SU S[         SU SU SU U SU U	 U S3$ )NF   )ensure_asciiindentz[] z

Documento activo: z (id z), formato z.
Campos de la plantilla:
z

Documento solicitado (id z-) sin plantilla configurada para este agente.


r   u   

Nota: hay archivos en Files pero no se pudo extraer texto (formatos no soportados o vacíos). Formatos soportados: .txt, .md, .docx, .pdf, .json, .csv, .xls, .xlsx.
u   

El estudiante aún no está identificado en PIE360. Debes pedir el RUT o IPE para ubicarlo en la plataforma antes de indicar que el documento Word fue generado.
u   Eres el agente «uo   » de PIE360.

## Instrucciones del agente (configuradas por el usuario — prioridad en fuentes y redacción)
z
Archivos en Files del agente: z (z incluidos en este contexto).
z'Plantillas de documentos configuradas:
u#  

Responde en español. Las instrucciones del agente sobre archivos, fuentes y redacción tienen prioridad sobre la brevedad del chat. Usa ARCHIVOS DE CONTEXTO, DATOS EXTRAÍDOS DE EXCEL y la ficha del estudiante. No inventes datos que no estén en esas fuentes ni en el mensaje del usuario.)rD   r-   jsondumpsr4   r<   r?   upperr   storagecount_filesnamer   role_instructionsr   r   )r'   agentr3   files_contextfiles_includedstudent_hintpending_rut	templatestemplates_textdoc_hinttemplate
file_countfiles_block	role_textpriority_directivesstudent_blockpriority_blocks                    r   _build_system_prompt%AgentV2ChatClass._build_system_promptL   s    00:	  JJyuQ? 	
 "))%((K@H,X-C-C,DE+ W'3399;< =00CH0M/NP  4K= A( ( 
 ((4
 r2Kq Z!^;  88O8OP	EeF]F]^"<.3M@  #$7#8;N  

| ,pk#$ %--7L 9>m6~6Fjo \\	
r    c	           	     ^   SU R                  UUUUUU5      S./n	U=(       d    /  Ha  n
U
R                  SS5      nU
R                  S5      =(       d    SR                  5       nUS;   d  ME  U(       d  MN  U	R                  XS.5        Mc     U	R                  SUR                  5       S.5        U	$ )Nsystemrolecontentrh   userri   rJ   >   rj   	assistant)rc   getstripappend)r'   rT   messagehistoryr3   rU   rV   rW   rX   messagesitemrh   ri   s                r   _build_messages AgentV2ChatClass._build_messages   s     !44!" 
*
 MrMD88FF+Dxx	*0b779G,, BC	 "
 	GMMODEr    c           	     r   [        UR                  5      nU(       d  0 $ U(       a  SU 3OSn[        UR                  5      n[	        UR                  5      n	S[        U5       SU S3n
U	(       a  X S3-  n
U
[         SU SU SU S	3-  n
[        R                  " S
SS.SU
S./5      n0 nU H  nUR                  U5      nUc\  UR                  5        HH  u  nnUR                  5       R                  5       UR                  5       R                  5       :X  d  MF  Un  O   Ub  [        U5      OSX'   M     U$ )Nz 

Archivos de contexto (Files):
rJ   zDevuelve SOLO un objeto JSON donde cada clave es exactamente el nombre del campo y el valor es el texto a insertar en la plantilla.
Campos requeridos:
uB   

## Instrucciones del agente (prioridad en fuentes y redacción)
rK   rL   z

Mensaje del usuario:
zH

Respuesta del asistente (puede ser breve; no limites el Word a esto):
u   

Obedece las directrices del agente sobre archivos y fuentes. Prioriza archivos de contexto, Excel extraído y ficha PIE360. Expande los campos narrativos con redacción completa. Si no hay información para un campo, usa cadena vacía.rf   zEres un redactor-extractor para formularios PIE360. Rellenas cada campo del JSON con el texto final del informe, desarrollado y listo para imprimir en Word.rg   rj   )r   rA   r   rS   r   r   r   r   json_chat_completionrl   itemsrm   lowerstr)r'   rT   r\   user_messageassistant_replyrU   fieldsfiles_sectionr_   r`   promptrawreplacementsfieldvaluekeyvals                    r   _extract_replacements&AgentV2ChatClass._extract_replacements   s{    "(":":;IQ^=m_Mdf78O8OP	EeF]F]^##6x#@"A BPPY{Z^` 	 -T22F./ro %%1N 3VVeUf gGG		
 22 %F  F3

 (*EGGENE} #		HCyy{((*ekkm.A.A.CC # !, 160A#e*rL  r    Nc              #  :  #    [        5       (       d  [        SSS.5      v   g U R                  U5      nU(       d  [        SSS.5      v   g [        R                  " UR
                  5      nUS:  a  [        SSS.5      v   [        U R                  UUUUS9u  pnU
nU(       d  U	(       a  U R                  R                  [        5      R                  [        R                  U	:H  5      R                  5       nU(       aK  UR                  =(       d    S	R                  5       (       a#  UR                  =(       d    S	R                  5       n[        UR
                  US
9u  pU=(       d    [!        U R                  XU5      n[#        U=(       a    [%        X&5      5      nS	nSnU	(       a  ['        U R                  U	U5      nOU(       a  US:X  a  Sn[        SS[(        R*                   S3S.5      v   U R-                  UUUUUUUU5      nS	n [.        R0                  " U5       H  nUU-  n[        SUS.5      v   M     / nS nU(       a  US:X  a  SU
 S3nGObU(       a
  US:X  a  S nGOQU(       a  U(       d  SnGO?U	(       Ga7  U(       Ga/  U(       Ga'  U R7                  UU5      nU(       d  SU S3nGO[        SSUR8                  R;                  5        S3S.5      v    U R=                  UUUUU5      n[?        U R                  UU	U5      nURA                  S5      S:X  a  URA                  SS5      nO[        SSS.5      v   URA                  S5      =(       d    SnURC                  URA                  SS	5      URA                  SS	5      URA                  S 5      US!URA                  SS	5       3S".5         [        S$UUUS%.S&.5      v   g ! [2         a#  n[        S[5        U5      S.5      v    S nAg S nAff = f! [2         a  nS#U 3n S nANYS nAff = f7f)'Nerroru2   OPENAI_API_KEY no está configurada en el backend.)typero   zAgente no encontrado.r   stepu   Leyendo archivos de Files…)
student_idstudent_rutro   rp   rJ   )r   F	needs_rutTzConsultando a u   …
text_delta)r   delta	not_foundu'   No encontré un estudiante con RUT/IPE u:    en la plataforma. Verifica el dato e inténtalo de nuevo.uu   No pude determinar qué documento generar. Configura plantillas en Documentos del agente o indica el tipo de informe.z/No hay plantilla configurada para el documento u(   . Configúrala en Documentos del agente.z
Generando statusro   zError al generar el documento.zDocumento listo para descargar.r8   zArchivo generadofilenamer7   z/files/system/students/)r-   rR   r7   r8   downloadUrlz!No se pudo generar el documento: done)replyresponseFileswarning)r   data)"r   r   r0   rP   rQ   rR   r   r&   r+   r   r,   r   r.   identification_numberrm   r   r   boolr   r   r	   agent_v2_modelrs   r   stream_chat_completion	Exceptionry   r4   r?   rO   r   r   rl   rn   )r'   r/   ro   r   r   r3   rp   rT   r]   resolved_student_idrut_usedstudent_issuerut_for_excelpersonalrU   rV   resolved_document_idshould_generaterW   rX   rq   
full_replyr   excresponse_filesr   r\   r   gen	doc_labels                                 r   stream_chatAgentV2ChatClass.stream_chat   s2     )**#S  )4KLMM((4
>3QRSS7IGG!#8
4} !!4670;;?RRS 
 X;;ArHHJJ!)!?!?!E2 L L N(AJJ%)
%
  +  
.?GGX/
  P%>w%P
 6#$L
 +!=KF@W@W?XX[/\]^^'' 	
 
	(??Ie#
L5ABB J 02"};9( D: :  +!=G%9E  !%9o))(4HIHEFZE[ \= = 
  &%/0D0D0J0J0L/MS#Q H#'#=#=x*m$L 5+>C wwx(G3"%'')5U"V"(.+L  %(GGN$;$Q?Q	&--&)ggj"&=(+
B(?.1ggl.C091HQ[]_I`Ha/b '%3&	
 		
}  	CH=>>	v ! H A#GGHsi   H
P2O ?B!P!AO? 5P6BO? 9P
O<O72P7O<<P?
P	PPPPr%   )r&   r   returnNone)r/   ry   r   zAgentV2Model | None)r/   ry   r3   intr   z#AgentV2DocumentTemplateModel | None)r/   ry   r   zlist[dict[str, Any]])rJ   r   rJ   F)rT   r
   r3   
int | NonerU   ry   rV   r   rW   ry   rX   r   r   ry   )rT   r
   ro   ry   rp   list[dict[str, str]] | Noner3   r   rU   ry   rV   r   rW   ry   rX   r   r   zlist[dict[str, str]])rJ   )rT   r
   r\   r   rz   ry   r{   ry   rU   ry   r   zdict[str, str])NNNN)r/   ry   ro   ry   r   r   r   z
str | Noner3   r   rp   r   r   zIterator[dict[str, Any]])__name__
__module____qualname____firstlineno__r(   r0   r4   rD   rc   rs   r   r   __static_attributes__r   r    r   r"   r"   *   s   W

*  !I
I
  I
 	I

 I
 I
 I
 
I
b  !  -	
       
L  77 /7 	7
 7 7 
7z "&"&"&/3[
[
 [
 	[

  [
  [
 -[
 
"[
 [
r    r"   )r   dict[str, Any]r   r   ),__doc__
__future__r   rM   collections.abcr   typingr   sqlalchemy.ormr   -app.backend.classes.agent_v2_document_servicer   r   app.backend.core.configr	   app.backend.db.models.agent_v2r
   (app.backend.db.models.agent_v2_documentsr   app.backend.db.models.pie_corer   app.backend.servicesr   $app.backend.services.agent_v2_openair   app.backend.utilsr   rP   'app.backend.utils.agent_v2_file_contextr   *app.backend.utils.agent_v2_prompt_sanitizer   r   r   r   'app.backend.utils.agent_v2_chat_contextr   r   r   r   -app.backend.utils.agent_v2_template_inspectorr   r   r"   r   r    r   <module>r      sa    [ "  $  " - 7 Q C 0 J 9 M   Ka
 a
r    