
    _ji                     \   S SK JrJrJrJrJrJr  S SKJ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rSrS S
KJr  S SKJrJr  S SKJr  S SKJrJr   S SKrSr \RB                  " SS9r"\"RG                  SSS0S9r$\" SS/S9r%\%RM                  S5      SSS\" \5      4S\'S\
\'   S\
\(   S\
\)   S\4
S jj5       r*\%RW                  S5      \" S 5      \" S5      \" S5      \" S5      \" S5      \" \5      4S!\S"\
\'   S#\
\'   S$\
\'   S%\
\'   S\4S& jj5       r,\%RW                  S'5      \" S 5      \" S5      \" S5      \" S5      \" S5      \" \5      \" \5      4S(\'S"\
\'   S#\
\'   S$\
\'   S%\
\'   S)\S\4S* jj5       r-\%RM                  S+5      SSS\" \5      \" \5      4S,\'S\
\)   S\
\'   S-\
\'   S)\S\4S. jj5       r.\%RW                  S/5      \" \5      \" \5      4S0\S)\S\4S1 jj5       r/g! \ a     GNf = f! \ a    S	r GNf = f! \ a
    S	r Sr"Sr$ GNf = f)2    )	APIRouterDependsstatusFile
UploadFileForm)JSONResponse)OptionalN)datetime)Session)load_dotenvTF)get_current_active_user)	UserLoginKnowledgeDocumentList)get_db)AIConversationModelKnowledgeDocumentModelz./chroma_db)pathdocumentos_piedescriptionzBase de conocimiento PIE360)namemetadataz/artificial_intelligencezArtificial Intelligence)prefixtagsz/analyze/{escrito}   escritoinstructionuse_rag	n_resultsdbc                 	  #     [         (       d  [        [        R                  SSSS.S9$ [        R
                  " S5      nU(       d  [        [        R                  SSSS.S9$ [        R                  " US9nU=(       d    S	n/ nU(       a  [        (       a   [        R                  U /U=(       d    S
S9n	U	S   (       a  [        U	S   S   5      S:  a  Sn
[        U	S   S   5       H  u  pU	R                  S5      (       a  U	R                  S/ /5      S   U   O0 nUR                  SSUS-    35      nXS-    SU SU S3-  n
UR                  U[        U5      S:  a  USS S-   OUS.5        M     U SU
 S3nSU US.nUR"                  R$                  " S-0 UD6nUR&                  nSn[)        US5      (       a  UR*                  nSn[-        [.        R0                  " 5       5      n [3        UUSU UUS[)        US5      (       a'  UR4                  (       a  UR4                  R6                  OS[8        R:                  " 5       [8        R:                  " 5       S9
nUR=                  U5        UR?                  5         URA                  U5        [        [        RD                  SS!U UUS[)        US5      (       a'  UR4                  (       a  UR4                  R6                  OS[        U5      S:  U(       a  UOSS"[G        5       ;   a  WR*                  OSS#.S.S9$ ! [         a  n[!        SU 35         SnAGNSnAff = f! [         a(  nURC                  5         [!        S U 35         SnANSnAff = f! [         GaG  nSSK$n[K        U5      RL                  n[-        U5      nURO                  5       n[!        S$U S%U 35        [!        S&U 35        [         (       a  [)        [        S'5      (       aC  [Q        U[        RR                  5      (       a$  [        [        R                  SS(U 3SS.S9s SnA$ [)        [        S)5      (       aM  [Q        U[        RT                  RV                  5      (       a$  [        [        R                  SS(U 3SS.S9s SnA$ [        [        R                  SS*U S+U 3UUS,.S.S9s SnA$ SnAff = f7f).u  
Analiza un texto usando inteligencia artificial y devuelve una respuesta.
Usa RAG (base de conocimiento) cuando está disponible para respuestas más precisas.

Parámetros:
- escrito: Texto a analizar (en la URL, codificado)
- instruction: Instrucción opcional para el análisis (query parameter)
- use_rag: Si usar RAG para buscar en la base de conocimiento (default: true)
- n_results: Número de documentos a buscar en la base de conocimiento (default: 3)

Nota: La nueva Responses API no acepta max_tokens como parámetro.
  uG   La librería openai no está instalada. Instala con: pip install openaiNr   messagedatastatus_codecontentOPENAI_API_KEYzWAPI key de OpenAI no configurada. Configura OPENAI_API_KEY en las variables de entorno.api_keyuA   Analiza el texto proporcionado y proporciona una respuesta útil.r   query_textsr   	documentsr   u6   

📚 Base de conocimiento (documentos relevantes):

	metadatastitle
Documento    . :


   ...r0   r(   u   

Instrucción: Usa la base de conocimiento proporcionada arriba como referencia principal. Si la información en la base de conocimiento responde la pregunta, úsala. Si no, proporciona una respuesta útil basada en tu conocimiento general.u   Error en búsqueda RAG: gpt-4o-minimodelinputinstructionsidusage)
user_id
session_idprevious_response_id
input_textr   response_textr;   tokens_used
added_dateupdated_dateu%   Error guardando conversación en BD: u!   Análisis completado exitosamentenew_conversation)original_textr   responser;   rE   rag_useddocumentos_usadosconversation_idzError en analyze_text: : zTraceback: APIErrorzError en la API de OpenAI: errorzError procesando la solicitud (): )
error_typeerror_details ),OPENAI_AVAILABLEr	   r   HTTP_500_INTERNAL_SERVER_ERRORosgetenvopenaiOpenAICHROMADB_AVAILABLEchroma_collectionquerylen	enumerategetappend	Exceptionprint	responsescreateoutput_texthasattrr>   struuiduuid4r   r?   total_tokensr   nowaddcommitrefreshrollbackHTTP_200_OKlocals	tracebacktype__name__
format_exc
isinstancerO   rP   OpenAIError)r   r   r   r   r    r+   clientcontext_instructionrL   resultscontexto_ragidocr   titulo	rag_error
api_paramsrJ   ai_responseresponse_idr@   rA   rH   db_errorers   rR   error_messageerror_tracebacks                                ]C:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\routers\artificial_intelligence.pyanalyze_textr   .   s    (h
"AA!h   )),-"AA!x   w/ *p-p ))>+11!(	'n1 2  ;'C0DQ0G,H1,L#_L"+GK,@,C"DKR;;WbKcKc7;;{RD#A!#DQ#Gik!)gAaC57I!J$Q3%r&SE(FF)00%+<?HsNs4Cy5'8PS2 	 #E 0C.C D p+s' #/

 ##**8Z8 ** 8T"""++K  &
	F2%%)"')#;B8W;U;UZbZhZhHNN77nr#<<>%\\^  FF#$IIKJJ'( **>%,#. +*BI(T[B\B\aiaoao8>>#>#>uy #$5 6 :>O):UY>PTZT\>\'7':':bf	
 	
c  >0<==>X  	FKKM9(DEE	F.  +
!W%%
A#..0 	'
|2m_EFO,-. vz**z!V__/M/M# & E E"%%@#P $  ))jFLL<T<T.U.U# & E E"%%@#P $  ==<ZLM?[",%2

 
	
C+
s   S	&M4 S	8M4 #S	$3M4 C%L =A-M4 +B"L? BM4 S	
L<#L71M4 7L<<M4 ?
M1	M,'M4 ,M11M4 4S?B0S/S0S	5ASSS	$S;S<S	SS	z/upload.filer0   document_typecategorysourcec                   #     [         (       d  [        [        R                  SSSS.S9$ U R                  R                  5       R                  S5      (       d  [        [        R                  SSSS.S9$ U R                  5       I Sh  vN n S	SK	nS	SK
nUR                  US
S9n	/ n
[        U	5       H&  u  pUR                  5       nU
R                  U5        M(     U	R                  5         SR!                  U
5      nUR#                  5       (       d  [        [        R                  SSSS.S9$  U(       a  U(       a  U(       Gd   SUSS  S3n[*        R,                  " S5      nU(       Gat  [.        (       Gah  [0        R2                  " US9nUR4                  R7                  SUSS9nS	SKn UR:                  R#                  5       nUR=                  S5      (       a  USS nUR=                  S5      (       a  USS nUR                  S5      (       a  USS nUR#                  5       nUR?                  U5      nU(       dJ  URA                  SU R                  RC                  SS5      RC                  SS 5      RE                  5       5      nU(       d  URA                  S!S"5      nU(       d  URA                  S#S$5      nU(       d  URA                  S%U R                  5      nGOU(       d:  U R                  RC                  SS5      RC                  SS 5      RE                  5       nU(       d  S"nU(       d  S$nU(       d  U R                  nGO@U(       Gd%   S(USS  S)3n[*        R,                  " S5      nU(       a  [.        (       a  [0        R2                  " US9nUR4                  R7                  SUS*S9nUR:                  R#                  5       R#                  S+5      R#                  S,5      nU(       a  [M        U5      S	:X  a:  U R                  RC                  SS5      RC                  SS 5      RE                  5       nO;U R                  RC                  SS5      RC                  SS 5      RE                  5       n U(       d  U R                  n[)        [N        RP                  " 5       5      nU(       d:  U R                  RC                  SS5      RC                  SS 5      RE                  5       n[R        RU                  U/U/UU=(       d    SU=(       d    SU=(       d    SS../S/9  [W        UUUUU=(       d    U R                  US0[X        RZ                  " 5       [X        RZ                  " 5       S19	nURU                  U5        UR]                  5         UR_                  U5        [        [        R`                  S2S3URb                  UUU R                  [M        U
5      [M        U5      UUU=(       d    U R                  S4.	S.S9$  GNt! [$         a    [        [        R                  SSSS.S9s $ [&         a2  n[        [        R                  SS[)        U5       3SS.S9s SnA$ SnAff = f! URF                  [H        4 a  n[K        S&U 35        U(       d:  U R                  RC                  SS5      RC                  SS 5      RE                  5       nU(       d  S"nU(       d  S$nU(       d  U R                  n SnAGNkSnAff = f! [&         a  n[K        S'U 35        U(       d:  U R                  RC                  SS5      RC                  SS 5      RE                  5       nU(       d  S"nU(       d  S$nU(       d  U R                  n SnAGNSnAff = f! [&         aS  n[K        S-U 35        U R                  RC                  SS5      RC                  SS 5      RE                  5       n SnAGNjSnAff = f! [&         ad  nURe                  5         S	SK3nURi                  5       n[K        S5U 35        [        [        R                  SS6[)        U5       3SS.S9s SnA$ SnAff = f7f)7u  
Sube un documento PDF y lo agrega automáticamente a la base de conocimiento RAG.
Extrae el texto del PDF y lo guarda en ChromaDB y MySQL.

Parámetros:
- file: Archivo PDF a subir
- title: Título del documento (opcional, si no se proporciona se usa el nombre del archivo)
- document_type: Tipo de documento (opcional, ej: "normativa", "manual", "procedimiento")
- category: Categoría (opcional, ej: "PIE", "NEE", "evaluación")
- source: Fuente del documento (opcional)
r"   >   ChromaDB no está instalado. Instala con: pip install chromadbNr#   r&   z.pdfi  zSolo se aceptan archivos PDFr   pdf)streamfiletype
uX   El PDF no contiene texto extraíble. Asegúrate de que el PDF tenga texto seleccionable.uC   PyMuPDF (fitz) no está instalado. Instala con: pip install pymupdfzError al leer el PDF: u  Analiza el siguiente documento y extrae información relevante. Responde SOLO en formato JSON con las siguientes claves:
{
    "title": "Título descriptivo del documento extraído del contenido (máximo 100 caracteres)",
    "document_type": "Tipo de documento (ej: normativa, manual, procedimiento, guía, ley, decreto)",
    "category": "Categoría temática (ej: PIE, NEE, evaluación, inclusión, educación)",
    "source": "Fuente u origen del documento (ej: LeyChile, Ministerio de Educación)"
}

Contenido del documento:
  1

Responde SOLO con el JSON, sin texto adicional.r)   r*   r9   u   Extrae los metadatos del documento analizando su contenido. El título debe ser extraído del texto del documento, no del nombre del archivo. Responde SOLO con JSON válido, sin texto adicional.r:   ```json   ```r   r0    _ r   	documentor   generalr   &   Error parseando metadatos extraídos: $Error extrayendo metadatos con RAG: u(  Analiza el siguiente documento y extrae SOLO el título descriptivo del documento. 
El título debe ser extraído del contenido del documento, no del nombre del archivo.
Responde SOLO con el título (máximo 100 caracteres), sin JSON, sin comillas, sin texto adicional.

Contenido del documento:
u
   

Título:u   Extrae SOLO el título del documento del contenido. Responde únicamente con el título, sin formato JSON, sin comillas, sin texto adicional."'u   Error extrayendo título: r0   r   r   r   r.   idsr/   T	r0   r(   r   r   r   	chroma_id	is_activerF   rG      zBDocumento subido y agregado exitosamente a la base de conocimiento)	r>   r   r0   filenamepages
charactersr   r   r   z$Error en upload_knowledge_document: zError procesando el documento: )5r[   r	   r   rV   r   lowerendswithHTTP_400_BAD_REQUESTreadfitzioopenr_   get_textra   closejoinstripImportErrorrb   rh   rW   rX   rU   rY   rZ   rd   re   jsonrf   
startswithloadsr`   replacer0   JSONDecodeErrorKeyErrorrc   r^   ri   rj   r\   rm   r   r   rl   rn   ro   HTTP_201_CREATEDr>   rp   rs   rv   )r   r0   r   r   r   r    file_contentr   r   pdf_documenttext_contentpage_numpagetext	full_text	pdf_errorextraction_promptr+   ry   rJ   r   rD   extracted_metadatar   extraction_errortitle_extraction_prompttitle_errordoc_idnew_documentrs   r   s                                  r   upload_knowledge_documentr      s    (
!!"AA!_   }}""$--f55"77!=   "YY[(+	  99L59IL L"+L"9}}##D) #:  		,/I??$$# & ; ;"%#} $  %< MP+	) 5D  0%3! ))$45//#]]7;F%//66+/ &j  7  H   3(0(<(<(B(B(D(33I>>,9!",=M(33E::,9!",=M(11%88,9#2,>M(5(;(;(=-1ZZ-F*  %$6$:$:7DMMDYDYZ`bdDeDmDmnqsvDwD}D}D  %AE,,>,B,B?T_,`M''9'='=j)'TH%%7%;%;Hdmm%TF ! $ 5 5fb A I I#s S Y Y [((3##,!!% X3
 5D  	/+ !ii(89G#3#3!'w!?#)#3#3#:#:"/"9 *y $; $
 !) 4 4 : : < B B3 G M Mc R$E
a$(MM$9$9&"$E$M$McSV$W$]$]$_E $ 5 5fb A I I#s S Y Y [
  TZZ\" MM))&"5==c3GMMOE 	 k!.!4"$N ,B	  	 		
 .'*T]]||~!

 	|
		


< //_&//!'" $ ."%i.%2 ($5

 	
Q ):  	"AA!d    	"77!!7I7GH  	z !00(; 
3 FqcJK$$(MM$9$9&"$E$M$McSV$W$]$]$_E,,7M''0H%%)]]F
3*  
+<=M<NOP MM11&"=EEc3OUUWE$$/M(H!]]F
+L ! X6{mDE MM11&"=EEc3OUUWEXz  

#..04_4EFG==<SVHE
 	

sK  a&_) aA	_) 4a5_) W<	_) B W? .a/_) A&[= .D2Y%  _) "A&[= 
_) C(^	 ;_) <:^	 6F_) ;a<_) ?&Y"%_) &a'	Y"0'YY"_) aY""_) %[:;A4[5/[= 3_) 5[::[= =
^A4^;_) ^_) 	
_&A_!_) !_&&_) )
a3Aaaaaaz/addr(   session_userc                   #     [         (       d  [        [        R                  SSSS.S9$ UnUnUn	Un
U(       a  U(       a  U(       Gd~   SU SS  S3n[        R
                  " S	5      nU(       Ga1  [        (       Ga%  [        R                  " US
9nUR                  R                  SUSS9nSSKn UR                  R                  5       nUR                  S5      (       a  USS nUR                  S5      (       a  USS nUR                  S5      (       a  USS nUR                  5       nUR!                  U5      nU(       d  UR#                  SS5      nU(       d  UR#                  SS5      nU	(       d  UR#                  SS5      n	U
(       d  UR#                  SS5      n
O7U(       d  SnU(       d  SnU	(       d  Sn	U
(       d  Sn
OU(       d  SnU
(       d  Sn
[-        [.        R0                  " 5       5      n[2        R5                  U /U/UU=(       d    SU	=(       d    SU
=(       d    SS./S 9  [7        UU UU	U
US![8        R:                  " 5       [8        R:                  " 5       S"9	nUR5                  U5        UR=                  5         UR?                  U5        [        [        R@                  S#S$URB                  UUUU	U
U=(       a    U=(       a    U(       + S%.S.S9$ ! UR$                  [&        4 a=  n[)        SU 35        U(       d  SnU(       d  SnU	(       d  Sn	U
(       d  Sn
 SnAGNRSnAff = f! [*         a=  n[)        SU 35        U(       d  SnU(       d  SnU	(       d  Sn	U
(       d  Sn
 SnAGNSnAff = f! [*         ad  nURE                  5         SSK#nURI                  5       n[)        S&U 35        [        [        R                  SS'[-        U5       3SS.S9s SnA$ SnAff = f7f)(u2  
Agrega un documento de texto a la base de conocimiento para RAG.
Si no se proporcionan metadatos, se extraen automáticamente usando IA.

Parámetros:
- content: Contenido del documento (texto grande)
- title: Título del documento (opcional, se extrae automáticamente si no se proporciona)
- document_type: Tipo de documento (opcional, se extrae automáticamente si no se proporciona)
- category: Categoría (opcional, se extrae automáticamente si no se proporciona)
- source: Fuente del documento (opcional, se extrae automáticamente si no se proporciona)
r"   r   Nr#   r&   u  Analiza el siguiente documento y extrae información relevante. Responde SOLO en formato JSON con las siguientes claves:
{
    "title": "Título descriptivo del documento (máximo 100 caracteres)",
    "document_type": "Tipo de documento (ej: normativa, manual, procedimiento, guía, ley, decreto)",
    "category": "Categoría temática (ej: PIE, NEE, evaluación, inclusión, educación)",
    "source": "Fuente u origen del documento (ej: LeyChile, Ministerio de Educación)"
}

Contenido del documento:
r   r   r)   r*   r9   uY   Extrae los metadatos del documento y responde SOLO con JSON válido, sin texto adicional.r:   r   r   r   r   r   r   r0   u   Documento sin títulor   r   r   r   r   Desconocidor   r   r   r   r   Tr   r   z9Documento agregado exitosamente a la base de conocimiento)r>   r   r0   r   r   r   metadata_extractedz!Error en add_knowledge_document: zError agregando documento: )%r[   r	   r   rV   rW   rX   rU   rY   rZ   rd   re   r   rf   r   r   r   r   r`   r   r   rc   rb   rh   ri   rj   r\   rm   r   r   rl   rn   ro   r   r>   rp   rs   rv   )r(   r0   r   r   r   r   r    final_titlefinal_document_typefinal_categoryfinal_sourcer   r+   ry   rJ   r   rD   r   r   r   r   r   rs   r   s                           r   add_knowledge_documentr     s    *f
!!"AA!_   +!MP1	) 	$  0%3! ))$45//#]]7;F%//66+/ &A  7  H   9(0(<(<(B(B(D(33I>>,9!",=M(33E::,9!",=M(11%88,9#2,>M(5(;(;(=-1ZZ-F*  +*<*@*@Ja*bK22D2H2HZe2f/--?-C-CJPY-ZN++=+A+A(M+ZL '&=..9+))2''4 5, TZZ\" 	i$!4!:*0b&,"	  	 		
 .-#||~!

 	|
		


< //V&//!'(%8 .*/4/S/S8*T
 	
M !00(; 
9 FqcJK**AK22=/--6N++8L
9*  
1<=M<NOP""9K**5'%%.N##0L
1D  

#..01/1BCD==8QA
 	

s   O.&M= O.M= 
A&L3 1C0K !M= "$L3 DM= O.L032L+%L3 )M= +L00L3 3
M:=2M5/M= 5M::M= =
O+AO& O+!O.&O++O.z/rag/{pregunta}preguntarA   c                   #     [         (       d  [        [        R                  SSSS.S9$ [        (       d  [        [        R                  SSSS.S9$ [
        R                  " S5      nU(       d  [        [        R                  SSSS.S9$ [        R                  " US	9n[        R                  U /U=(       d    S
S9nSn	/ n
US   (       a  [        US   S   5      S:  a  Sn	[        US   S   5       H  u  pUR                  S5      (       a  UR                  S/ /5      S   U   O0 nUR                  SSUS-    35      nXS-    SU SU S3-  n	U
R                  U[        U5      S:  a  USS S-   OUS.5        M     U	(       a  U=(       d    S SU	 S3nOU=(       d    SnSU US.nUR                  R                   " S,0 UD6nUR"                  nU(       d  [%        [&        R(                  " 5       5      nU(       a  [+        USS5      OSnU(       d  [-        US 5      (       a  UR.                  n [1        UUU S!U=(       d    S" 3US[-        US#5      (       a'  UR2                  (       a  UR2                  R4                  OS[6        R8                  " 5       [6        R8                  " 5       S$9	nUR;                  U5        UR=                  5         [        [        RD                  SS&U UU
[        U
5      S[-        US#5      (       a'  UR2                  (       a  UR2                  R4                  OSUS'.S.S9$ ! [>         a(  nURA                  5         [C        S%U 35         SnANSnAff = f! [>         az  nSSK#n[I        U5      RJ                  n[%        U5      n[C        S(U S)U 35        [C        URM                  5       5        [        [        R                  SS*U S+U 3SS.S9s SnA$ SnAff = f7f)-z
Consulta usando RAG (Retrieval Augmented Generation).
Busca documentos relevantes en la base de conocimiento y los usa como contexto.
r"   u&   La librería openai no está instaladaNr#   r&   u   ChromaDB no está instalador)   z API key de OpenAI no configuradar*   r   r,   r   r.   r   z&Contexto de la base de conocimiento:

r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   u   Responde la pregunta usando el contexto proporcionado. Si el contexto no contiene información relevante, indica que no tienes esa información en la base de conocimiento.z

Pregunta del usuario:uG   Responde la pregunta. Si no tienes información específica, indícalo.r9   r:   r>   customer_idzRAG - z!Consulta con base de conocimientor?   )	r@   rA   rC   r   rD   r;   rE   rF   rG   u   Error guardando conversación: z$Consulta RAG completada exitosamente)r   	respuestarL   num_documentosr;   rE   rA   zError en consultar_con_rag: rN   zError procesando consulta RAG (rQ   rT   )'rU   r	   r   rV   r[   rW   rX   rY   rZ   r\   r]   r^   r_   r`   ra   rd   re   rf   rh   ri   rj   getattrrg   r   r   r?   rk   r   rl   rm   rn   rb   rp   rc   rq   rs   rt   ru   rv   )r   r   r   rA   r   r    r+   ry   r{   contextorL   r}   r~   r   r   instruccion_finalr   rJ   r   r@   rH   r   r   rs   rR   r   s                             r   consultar_con_ragr     s     E
"AA!G   "!"AA!<   )),-"AA!A   w/ $))!
n1 * 
 ;C(<Q(?$@1$DAH#GK$8$;<CJ;;{C[C[7;;{RD9!<Q?ac!gAaC5/ABse2fXST::!((#47HsNs4Cy50* 	 = %0  &b  5b  %c c	
 ! !, x/x #-

 ##**8Z8** TZZ\*J7C',d37<??"..G	@2%#$[%W4W$XY)#;B8W;U;UZbZhZhHNN77nr#<<>%\\^
  FF#$IIK
 **A (!,):&)*;&<*BI(T[B\B\aiaoao8>>#>#>uy",
 	
	  	@KKM3H:>??	@*  
!W%%
A,ZL=/JKi""$%==<ZLM?[
 	

s   O/&M( O/&M( O/8M( 
O/F&M( 2BL3 A$M( 2O/3
M%=M M(  M%%M( (
O,2A/O'!O,"O/'O,,O//document_listc                   #     U R                   b  U R                   S:  a  U R                   OSnU R                  (       a  U R                  OSnUS:X  Ga  UR                  [        5      R	                  [        R
                  S:H  5      R                  [        R                  R                  5       5      R                  5       nU Vs/ s H  nUR                  UR                  UR                  UR                  UR                  UR                  UR
                  UR                  (       a  UR                  R!                  5       OSUR"                  (       a  UR"                  R!                  5       OSUR$                  (       a+  ['        UR$                  5      S:  a  UR$                  SS S-   OUR$                  S.
PM     nn[)        [*        R,                  SSUS	.S
9$ US-
  U-  nUR                  [        5      R	                  [        R
                  S:H  5      R/                  5       n	U	S:  a
  X-   S-
  U-  OSn
UR                  [        5      R	                  [        R
                  S:H  5      R                  [        R                  R                  5       5      R1                  U5      R3                  U5      R                  5       nU Vs/ s H  nUR                  UR                  UR                  UR                  UR                  UR                  UR
                  UR                  (       a  UR                  R!                  5       OSUR"                  (       a  UR"                  R!                  5       OSUR$                  (       a+  ['        UR$                  5      S:  a  UR$                  SS S-   OUR$                  S.
PM     nn[)        [*        R,                  SSUU	U
UUS.S	.S
9$ s  snf s  snf ! [4         aT  nSSKnUR9                  5       n[;        SU 35        [)        [*        R<                  SS[?        U5       3SS	.S
9s SnA$ SnAff = f7f)u   
Lista los documentos de conocimiento con paginación (10 por defecto).

Parámetros:
- page: Número de página (opcional, si es None o 0 devuelve todos)
- per_page: Elementos por página (default: 10)
Nr   
   Tr6   r7   )
r>   r0   r   r   r   r   r   rF   rG   content_previewz*Knowledge documents retrieved successfullyr#   r&   r2   )r%   total_itemstotal_pagescurrent_pageitems_per_pagez#Error en list_knowledge_documents: r"   z&Error retrieving knowledge documents: ) r   per_pager]   r   filterr   order_byrF   descallr>   r0   r   r   r   r   	isoformatrG   r(   r^   r	   r   rq   countoffsetlimitrb   rs   rv   rc   rV   rh   )r   r   r    r   r   r.   r~   serialized_documentsr   r   r   r   rs   r   s                 r   list_knowledge_documentsr   R  s    ^
%2%7%7%CHZHZ]^H^}!!de-:-C-C=)) 19!78??&00D8h&11668ce	 " #$$ ## ff!$!2!2LL** ]] ]]<?NNcnn668PT@C@P@P 0 0 : : <VZ@CPSTWT_T_P`cfPf3;;t#4u#<lolwlw% # ! $$  "..!K0  (h& hh56==",,4

%' 	
 CNPQ/{-1h>WX HH34;;",,4

("--224

&.x	 	$    c &&YY ..jj8;#..224D<?<L<LC,,668RV<?KKCPSP[P[L\_bLbs{{4C058hkhshs!
  	    **G0#.#.$(&.

 	
m$$R  8  
#..03O3DEF==CCF8L
 	

sc   QCO2 C9O( O2 QC-O2 C9O-#O2 'Q(
O2 2
Q<A	QQQQQ)0fastapir   r   r   r   r   r   fastapi.responsesr	   typingr
   rW   ri   r   sqlalchemy.ormr   dotenvr   r   rY   rU   app.backend.auth.auth_userr   app.backend.schemasr   r   app.backend.db.databaser   app.backend.db.modelsr   r   chromadbr[   PersistentClientchroma_clientget_or_create_collectionr\   artificial_intelligencer`   rh   boolintr   postr   r   r   r   rT       r   <module>r     s|   F F *  	   "	"M ? @ * M--=AM%>>!>? ?  $%
#	$ 
 12 "&" &/{
{
#{
 d^{
 }	{

 	{
 3{
z i(Cy:#':"4j J&/R

R
C=R
 C=R
 sm	R

 SMR
 	R
 )R
h f%9:#':"4j J%&=>&/z
z
C=z
 C=z
 sm	z

 SMz
 z
 	z
 &z
x ./  !!% $%&=>&/Q
Q
}Q
 #Q
 	Q

 Q
 	Q
 0Q
f c" &&=>&/j
(j
j
 	j
 #j
O  		  $  Ms5   G?  H #(H ?H	H	HHH+*H+