
    mi.                       S r SSKJr  SSKrSSKrSSKJr  SSKJr   SSKJ	r	  \	" 5         SSKJrJrJr  SSKJr  SS	KJrJr  SS
KJr   SSKrSrSSKJr  SSKJr  SSKJrJr  SSKJ r   Sr!Sr"\" SS/S9r# " S S\5      r$SS jr%SS jr&\#RO                  S5      \" \5      \" \5      4     SS jj5       r(g! \
 a     Nf = f! \
 a    Sr Nf = f)zd
Chat: evaluadora senior NEE (Chile) usando la tabla knowledge_documents como base de conocimiento.
    )annotationsN)datetime)List)load_dotenv)	APIRouterDependsstatus)JSONResponse)	BaseModelField)SessionTF)get_current_active_user)get_db)AIConversationModelKnowledgeDocumentModel)	UserLogini  i z/chatzNEE Evaluator Chat)prefixtagsc                  B    \ rS rSr% \" SSSS9rS\S'   SS	SS
0/00rSrg)NeeEvaluatorChatRequest-   .   z3User question about NEE / evaluation / PIE in Chile)
min_lengthdescriptionstrquestionjson_schema_extraexamplesu6   ¿Cómo registro una adaptación curricular en el PIE? N)	__name__
__module____qualname____firstlineno__r   r   __annotations__model_config__static_attributes__r       WC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\routes\nee_evaluator_chat.pyr   r   -   s1    #!9noHco'*
D|7}6~)  ALr'   r   c                Z   U R                  [        5      R                  [        R                  S:H  5      R	                  [        R
                  R                  5       5      R                  5       n/ nU GH  nUR                  =(       d    SR                  5       =(       d    SUR
                   3nUR                  =(       d    SR                  5       nU(       d  Mi  / nUR                  (       a  UR                  SUR                   35        UR                  (       a  UR                  SUR                   35        SU 3nU(       a  USSR                  U5       S	3-  nUR                  U S
U 35        GM     SR                  U5      n[        U5      [         :  a  US [          S-   nU$ )NT z
Documento ztype: z
category: z## z (z, )
z

---

z

[... context truncated ...])queryr   filter	is_activeorder_byidascalltitlestripcontentdocument_typeappendcategoryjoinlenMAX_KNOWLEDGE_CONTEXT_CHARS)	dbrowspartsrr4   bodymetaheadjoineds	            r(   _load_knowledge_contextrE   3   sY   
'(	&00D8	9	(++//1	2		 	 EB%%'>Zv+>		R&&(??KK& 123::KK*QZZL12UG}b4)++DvRv&'  &F
6{005569ZZMr'   c                N    U R                  5       =(       d    SnSU S[         S3$ )Nu   (No hay documentos activos en knowledge_documents; responde con criterio profesional general sobre NEE/PIE en Chile, sin inventar normas específicas.)u  You are a senior educational evaluator in Chile. Your expertise is special educational needs (NEE), inclusive education, PIE (Plan Individual de Apoyo), curricular adjustments, and evaluation aligned with Chilean school reality.

Respond in clear Spanish. Be precise, supportive, and professional—like an experienced evaluator who supports teams working with NEE students.

Ground your answer in the KNOWLEDGE BASE below when it is relevant. If the knowledge base does not cover the question, answer with sound professional judgment and explicitly avoid fabricating laws, decrees, or institutional details.

KNOWLEDGE BASE (from knowledge_documents):
z/

Hard rules:
- Maximum length of your answer: z characters (including spaces). Do not exceed this limit.
- Do not cite internal system labels; write for teachers and coordinators.
)r5   MAX_RESPONSE_CHARS)knowledge_blockkbs     r(   _build_system_instructionrJ   O   sD    				   
~  %~B  " #5!5 6 r'   z/nee-evaluatorc                $   [         (       d  [        [        R                  SSSS.S9$ [        R
                  " S5      nU(       d  [        [        R                  SSSS.S9$ U R                  =(       d    SR                  5       nU(       d  [        [        R                  S	S
SS.S9$ [        U5      n[        U5      n[        R                  " US9n[        R
                  " SS5      n UR                  R                  UUUS9n	U	R                  =(       d    SR                  5       n
['        U
5      [(        :  a  U
S[(        S-
   R+                  5       S-   n
[-        USS5      =(       d    [-        USS5      =(       d    Sn[%        [.        R0                  " 5       5      nSn[3        U	S5      (       a(  U	R4                  (       a  [-        U	R4                  SS5      n [7        Ub  [9        U5      OSU[-        U	SS5      USU
UU[:        R<                  " 5       [:        R<                  " 5       S9
nUR?                  U5        URA                  5         URC                  U5        URD                  n[        [        RH                  SSU
['        U
5      [(        [K        UR                  5       5      UUS.S.S9$ ! [          a2  n[        [        R"                  SS[%        U5       3SS.S9s SnA$ SnAff = f! [          a    URG                  5         Sn Nf = f)z
Chat with a senior NEE-focused evaluator persona. Uses active rows from `knowledge_documents` as context.
Response text is capped at 1260 characters.
i  zopenai package not installedN)r	   messagedata)status_coder6   OPENAI_API_KEYzOPENAI_API_KEY not configuredr*   i  zquestion is required)api_keyNEE_EVALUATOR_MODELzgpt-4o-mini)modelinputinstructionsi  zOpenAI error: r   u   …r1   user_idusagetotal_tokensnee_evaluator_chat)
rU   
session_idprevious_response_id
input_textinstructionresponse_textrR   tokens_used
added_dateupdated_date   OK)responseresponse_length
max_lengthknowledge_documents_usedconversation_idrR   )&OPENAI_AVAILABLEr
   r	   HTTP_500_INTERNAL_SERVER_ERRORosgetenvr   r5   HTTP_422_UNPROCESSABLE_ENTITYrE   rJ   openaiOpenAI	responsescreateoutput_text	ExceptionHTTP_502_BAD_GATEWAYr   r;   rG   rstripgetattruuiduuid4hasattrrV   r   intr   nowaddcommitrefreshr1   rollbackHTTP_200_OKbool)rA   session_userr=   rP   r   rH   rT   client
model_namerc   raweuidsidr^   rowconv_ids                    r(   nee_evaluator_chat_messager   `   s    ==9
 	
 ii()G==:
 	
 #**,H<<"/EtT
 	

 .b1O,_=L]]7+F0-@J
##**% + 

 ##)r002 3x$$*&*+224u<
,d
+
Zw|YPT/U
ZYZC
djjl
CKx!!hnnhnnndC! #CHQ!(4!>,#||~!
 	s
		


3&&
 &&#&s80,01F1F1H,I#*#
 Q  
33+CF84
 	

H  
s1   )>J1 BK0 1
K-;'K("K-(K-0LL)r=   r   returnr   )rH   r   r   r   )rA   r   r   r   r=   r   ))__doc__
__future__r   rj   rv   r   typingr   dotenvr   ImportErrorfastapir   r   r	   fastapi.responsesr
   pydanticr   r   sqlalchemy.ormr   rm   rh   app.backend.auth.auth_userr   app.backend.db.databaser   app.backend.db.modelsr   r   app.backend.schemasr   rG   r<   rX   r   rE   rJ   postr   r   r'   r(   <module>r      s	   # 	   	"M / . * % " ? * M ) % 
	 Ai A8" )* &&=>&/h
!hh 	h +hc  		  s#   B: 
C :CCCC