
    Ij2,                        S SK r S SKJrJrJrJrJr   S SKrSrSr
SrSr\ R                  " SS	5      r\ R                  " S
\5      r\" \ R                  " SS5      =(       d    S5      r\" \ R                  " SS5      =(       d    S5      rS\\   4S jrS r\4S\S\S\4S jjrS\\\\4      S\4S jr " S S5      rg! \	 a    Sr Nf = f)    N)AnyDictListOptionalTupleTFu	  Eres Agente Pie, asistente para equipos del Programa de Integración Escolar (PIE) en Chile.

ÁMBITO DE TRABAJO — Todo lo relacionado con el PIE chileno está dentro de tu alcance. Eres un apoyo
profesional para el trabajo diario del equipo PIE del establecimiento. Ayuda con cualquier consulta
vinculada a inclusión escolar, NEE y procesos PIE, incluyendo (sin limitarte a esto):

• Normativa y marco PIE: Decreto 170, orientaciones MINEDUC, procedimientos del establecimiento
• Equipo PIE: coordinación, roles profesionales, reuniones, planificación y seguimiento
• Estudiantes con NEE: identificación, evaluación, apoyos, adecuaciones curriculares y accesibilidad
• Documentación e informes del PIE: evaluaciones (psicopedagógica, psicológica, fonoaudiológica,
  social, médica, etc.), anamnesis, PAI, informes de avance, interconsultas, certificados, actas,
  informes a familias, informes de egreso y cualquier otro documento del proceso PIE
• Redacción y orientación: estructura de informes, borradores, síntesis, conclusiones, recomendaciones
• Apoyos en el aula: estrategias pedagógicas, coordinación con docentes, material adaptado
• Familia y comunidad escolar: orientación, comunicación y acompañamiento en el marco PIE
• Dificultades específicas del aprendizaje, TEA, TDAH, discapacidad intelectual, DEA, TEL y otras NEE
  en contexto escolar chileno

Si el usuario ofrece datos para redactar o completar cualquier documento o consulta del ámbito PIE,
ayúdale: indica qué información necesitas, propón estructura o borrador, y recuerda que debe revisar
y validar el texto profesionalmente.

FUERA DE ALCANCE — rechaza ÚNICAMENTE lo que no tenga relación con el PIE escolar chileno:
entretenimiento, deportes, cocina, viajes, clima, actualidad general, tareas escolares ajenas a PIE/NEE,
consultas personales de salud/legal/finanzas sin vínculo con el establecimiento, o educación especial
de otros países como tema principal.

Regla clave: el PIE abarca muchas áreas y documentos. No rechaces una consulta solo porque no aparece
en una lista de ejemplos. Si tiene relación razonable con inclusión escolar, NEE, apoyos o documentación
PIE en Chile, debes ayudar. En caso de duda, responde; no rechaces por precaución.

Responde siempre en español, con claridad y tono profesional. Si usas contexto documental, priorízalo.
Si no tienes certeza o falta información del colegio, indícalo explícitamente. No inventes datos de
estudiantes ni normativa.u  
REGLAS PARA DOCUMENTOS ADJUNTOS (OBLIGATORIO):
- El usuario adjuntó documento(s) con contenido real incluido en este mensaje o en el historial.
- Responde ÚNICAMENTE con información que aparezca en esos documentos: nombres, fechas, diagnósticos,
  observaciones, resultados, recomendaciones, antecedentes, etc.
- PROHIBIDO responder con plantillas genéricas del tipo "1. Identificación 2. Motivo de consulta..."
  si no extraes datos concretos del texto del documento.
- Si el documento trae datos del estudiante, cítalos. Si pide resumen, resume hechos concretos del texto.
- Si el contenido del documento no está disponible o está vacío, dilo explícitamente y pide re-adjuntar el archivo.
- No inventes datos que no estén en el documento.u  
REGLAS PARA IMÁGENES ADJUNTAS (OBLIGATORIO — PRIORIDAD SOBRE OTRAS REGLAS):
- El usuario adjuntó imagen(es) en ESTE mensaje. DEBES mirarlas y analizarlas. Tienes capacidad de visión.
- PROHIBIDO responder "no puedo ayudarte con esa imagen", "no puedo ver imágenes" o rechazar sin describir lo que ves.
- Si pregunta "qué es esto", "qué dice", "resume" u similar: describe la imagen con detalle (texto visible,
  tipo de documento, formularios, tablas, logos, personas si aplica, contexto escolar, etc.).
- Asume que puede ser un informe escaneado, formulario PIE, anamnesis, captura de pantalla o material escolar.
- Si contiene texto legible, transcríbelo o resume su contenido concreto.
- Si la imagen NO está relacionada con PIE/escuela, dilo después de describirla (ej. "La imagen muestra X;
  no parece un documento PIE"), pero NUNCA rechaces sin analizarla primero.
- El nombre del archivo (ej. "ChatGPT Image...") no indica el contenido: mira la imagen real.AGENTS_CHAT_MODELzgpt-4o-miniAGENTS_VISION_MODELAGENTS_RAG_N_RESULTS3AGENTS_HISTORY_LIMIT20returnc                  h    [         R                  " S5      =(       d    [         R                  " S5      $ )NOPENAI_API_KEY2OPENAI_API_KEY)osgetenv     UC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\agents_ai_class.py_openai_api_keyr   L   s!    99&'F2995E+FFr   c                       SSK Jn   [        U SS5      (       a  [        U SS 5      (       a  U R                  $ g ! [         a     g f = f)Nr   )artificial_intelligenceCHROMADB_AVAILABLEFchroma_collection)app.backend.routesr   getattrr   	Exception)	ai_routess    r   _get_chroma_collectionr    P   sZ    K92E::w*D@
 @
 ...   s   59 
AAquestion	n_resultsc                    [        5       nU(       d  g UR                  U /US9nUR                  S5      =(       d    / nU(       a
  US   (       d  gSnUR                  S5      =(       d    / /n[        US   5       HZ  u  pxU[	        US   5      :  a  US   U   O0 n	U	=(       d    0 R                  S5      =(       d    SUS	-    3n
XWS	-    S
U
 SU S3-  nM\     UR                  5       $ ! [         a     gf = f)N )query_textsr"   	documentsr   z-Contexto de la base de conocimiento PIE360:

	metadatastitlez
Documento    z. z:


)r    queryget	enumeratelenstripr   )r!   r"   
collectionresultsdocsblockmetasidocmetar(   s              r   _rag_contextr8   ]   s    ')J""zY"O{{;'-247AK(0RDQ(FA"#c%(m"358A;DZR$$W-E:a!eW1EEAwbs3%t44E ) {{} s   <C* BC* *
C76C7historyc                    U (       d  gS/nU [         * S   Hc  nUR                  S5      S:X  a  SOSnUR                  S5      =(       d    SR                  5       nU(       d  MM  UR                  U SU 35        Me     S	R	                  U5      $ )
Nr$   u?   Historial reciente de esta conversación (máximo 20 mensajes):roleuserUsuarioz
Agente Piecontentz: 
)HISTORY_CONTEXT_LIMITr,   r/   appendjoin)r9   linesmsgr;   r>   s        r   _format_historyrE   s   s    NOE--./GGFOv5y<779%+2247LLD6G9-.	 0
 99Ur   c                       \ rS rSr   S
S\S\\\\\4         S\\   S\\\\\4         S\\\   \\   4   4
S jjr	S	r
g)AgentsAiClass   Nuser_messager9   attachments_contextimage_attachmentsr   c                 4   U=(       d    SR                  5       nU=(       d    / n[        U=(       d    SR                  5       5      n[        U5      S:  nU(       d  U(       d  U(       d  g[        (       d  g[	        5       n	U	(       d  g [
        R                  " U	S9n
[        nU(       a  U S[         S3n[        U=(       d    S	5      nU(       a  U(       d  U S
U 3nU=(       d    SR                  5       nU(       a  U S[         3nU(       a  U(       d   U(       + =(       a9    SU;   =(       d-    SUR                  5       ;   =(       d    SUR                  5       ;   nU(       a  U S3n[        U=(       d    / 5      nU(       a  U SU 3nU=(       d    SnU(       a  U SU 3nU(       at  U=(       d    SnU(       a  UU;  a  USU 3-  nSR                  S U 5       5      nUSU S3-  nSUS./nU H  nUR                  SUS   S.5        M     SUS./n[        nOUn[         nU
R"                  R%                  UUUS9n['        USS 5      =(       d    SR                  5       nU(       d  gUS 4$ ! [(         a  nS [+        U5      4s S nA$ S nAff = f) Nr$   r   )NzMessage or files are required)Nu5   La librería openai no está instalada en el backend.)Nz>OPENAI_API_KEY / OPENAI_API_KEY2 no configurada en el backend.)api_keyr*   uW   

NOTA: Analizar imágenes adjuntadas por el equipo PIE SÍ está dentro de tu alcance.zdocumento o imagen PIE adjuntozo

Usa como referencia principal la base de conocimiento cuando el contexto responda o enriquezca la pregunta:

u   📎zarchivos adjuntoszimagen adjuntau   

El usuario pregunta por una imagen mencionada en el chat pero NO adjuntó imagen en este mensaje. Indícale amablemente que vuelva a adjuntar la imagen para poder analizarla. No rechaces con un mensaje genérico de fuera de alcance.uJ   Analiza los documentos adjuntos y responde según el contexto PIE chileno.uN   

--- CONTENIDO DE LOS DOCUMENTOS ADJUNTOS (úsalo como fuente principal) ---
uo   Describe y analiza detalladamente la imagen adjunta. Si hay texto visible, transcríbelo o resume su contenido.z, c              3   D   #    U  H  oR                  S S5      v   M     g7f)filenameimagenN)r,   ).0imgs     r   	<genexpr>/AgentsAiClass.generate_reply.<locals>.<genexpr>   s     'XQW#
H(E(EQWs    z*

[Imagen(es) adjunta(s) en este mensaje: ]
input_text)typetextinput_image	image_url)rW   rZ   r<   )r;   r>   )modelinputinstructionsoutput_text)Nu&   OpenAI devolvió una respuesta vacía.)r/   boolr.   OPENAI_AVAILABLEr   openaiOpenAIAGENT_PIE_INSTRUCTIONSIMAGE_ANALYSIS_RULESr8   DOCUMENT_ANALYSIS_RULESlowerrE   rB   rA   VISION_MODELDEFAULT_MODEL	responsescreater   r   str)selfrI   r9   rJ   rK   rX   imageshas_docs
has_imagesrM   clientr]   	rag_blockattach_blockasks_about_past_imagehistory_block
user_inputimage_namescontent_partsrR   	api_inputr[   responsereplyes                            r   generate_replyAgentsAiClass.generate_reply   s    "))+"(b,299;<[1_
HZ8P!#YT	 ]]73F1L#nD)=(> ?l l 
 %T%M-MNI#n %PPY{\ 
 052<<>L".t4K3LM,  pt^n':djjl'JnN^bfblblbnNn " %#n %\ \  ,GMr:M".tM?Cm!mJ!l #d#n&  ! Q  J >D"77J"ii'XQW'XX L[MYZ[[
 *:>7 "C!(($1),[)9 " ,2m"L!M	$&	%''..) / H
 X}d;ArHHJEE$; 	 Q<	 s%   
G'I6 2I6 6
J JJJr   )NNN)__name__
__module____qualname____firstlineno__rk   r   r   r   r   r|   __static_attributes__r   r   r   rG   rG      s     37-1<@j j  $tCH~./j  &c]	j 
 $Dc3h$89j  
x}hsm+	,j  j r   rG   )r   typingr   r   r   r   r   ra   r`   ImportErrorrc   re   rd   r   rh   rg   intRAG_N_RESULTSr@   rk   r   r    r8   rE   rG   r   r   r   <module>r      s   	 3 3
! F	6 
a  		-}=yy.>BII4c:AcBBII&<dCKtL G# G
 2? 3 3 3 ,
T$sCx.1 
c 
k  k q  s   C CC