Ë
    õ¡ŸjŒ  ã                  óô   — d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZmZ  ej8                  e«      Z	 	 	 	 	 	 	 	 dd„Zdd„Z dd„Z!y)zM
author: Yagnik Poshiya
organization: Webbrains Technologies Private Limited
é    )ÚannotationsN)ÚFastAPIÚHeaderÚHTTPExceptionÚRequest)ÚCORSMiddleware)ÚStreamingResponse)Úrun_rag_agent_turn)ÚSettingsÚget_settings)Úget_supabase)ÚGeminiEmbedder)ÚChatRequestÚChatResponsec                ó  — | j                   xs dj                  «       }|st        dd¬«      ‚|xs dj                  «       }|s4|r2|j                  «       j	                  d«      r|dd  j                  «       }||k7  rt        dd¬«      ‚y )	NÚ iô  z+RAG_AGENT_INTERNAL_SECRET is not configured)Ústatus_codeÚdetailzbearer é   i‘  ÚUnauthorized)Úinternal_secretÚstripr   ÚlowerÚ
startswith)ÚsettingsÚx_rag_secretÚauthorizationÚexpectedÚtokens        ú?/var/www/html/agent-engine/apps/agents/rag-agent/src/api/app.pyÚ_verify_internal_secretr!      sŒ   € ð
 ×(Ñ(Ò.¨B×5Ñ5Ó7€HÙÜ¨Ð4aÔbÐbØÒ˜R×&Ñ&Ó(€EÙ‘]Ø×ÑÓ ×+Ñ+¨IÔ6Ø! ! "Ð%×+Ñ+Ó-ˆEØ�ÒÜ¨°NÔCÐCð ó    c                ó>   — d| › dt        j                  |d¬«      › d�S )Nzevent: z
data: F)Úensure_asciiz

)ÚjsonÚdumps)ÚeventÚpayloads     r    Ú
_sse_eventr)   *   s#   € Ø�U�G˜8¤D§J¡J¨wÀUÔ$KÐ#LÈDÐQÐQr"   c                 ó°  ‡‡‡— t        «       Št        dd¬«      } ‰j                  xs dj                  d«      D �cg c]#  }|j	                  «       sŒ|j	                  «       ‘Œ% }}|r| j                  t        |ddgdg¬«       t        ‰j                  ‰j                  ‰j                  ¬	«      Št        ‰«      Š| j                  d
«      dd„«       }| j                  dt        ¬«      t        d d¬«      t        d ¬«      f	 	 	 	 	 	 	 dˆˆˆfd„«       }| j                  d«      t        d d¬«      t        d ¬«      f	 	 	 	 	 	 	 	 	 dˆˆˆfd„«       }| S c c}w )NzAgent Engine RAG Agentz1.0.0)ÚtitleÚversionr   ú,TÚ*)Úallow_originsÚallow_credentialsÚallow_methodsÚallow_headers)Úapi_keyÚmodelÚoutput_dimensionalityz/healthc                 ó
   — ddiS )NÚstatusÚok© r9   r"   r    Úhealthzcreate_app.<locals>.healthC   s   € à˜$ÐÐr"   z/v1/chat)Úresponse_modelzX-RAG-Agent-Secret)ÚdefaultÚalias)r<   c                óZ  •— t        ‰||«       | j                  D �cg c]  }|j                  |j                  dœ‘Œ }}t        j                  d| j                  | j                  xs dd d t        |«      «       	 t        ‰‰‰| j                  | j                  | j                  | j                  || j                  | j                  ¬«
      }t!        |d
   |j#                  d«      xs g |j#                  d«      |j#                  d«      |j#                  d«      xs g |j#                  d«      xs g |j#                  d«      |j#                  d«      xs d|j#                  d«      xs d¬	«	      S c c}w # t        $ r, t        j                  d«       t!        dg d d g g d dd¬	«	      cY S w xY w)N©ÚroleÚcontentz?chat_request project_agent_id=%s user_message=%s history_len=%dr   éÈ   )
r   ÚsupabaseÚembedderÚorganization_idÚ
project_idÚproject_agent_idÚuser_messageÚhistoryÚsystem_instructionÚmodel_config_overridesz%Unhandled error in run_rag_agent_turnúMWe're experiencing a temporary technical issue. Please try again in a moment.r   )	ÚreplyÚsourcesÚrouteÚsqlÚsuggestionsÚcardsÚ
model_nameÚtokens_inputÚtokens_outputrM   rN   rO   rP   rQ   rR   rS   rT   rU   )r!   rI   r@   rA   ÚloggerÚinforG   rH   Úlenr
   rE   rF   rJ   Úgeneration_configÚ	ExceptionÚ	exceptionr   Úget)	Úbodyr   r   ÚmÚhistÚoutrD   r   rC   s	         €€€r    Úchatzcreate_app.<locals>.chatG   s™  ø€ ô 	  ¨,¸ÔFØ@DÇÁÖM¸1˜Ÿ™¨A¯I©IÓ6ÐMˆÐMÜ�‰ØMØ×!Ñ!Ø×ÑÒ$ " d sÐ+Ü�‹Iô		
ð	Ü$Ø!Ø!Ø!Ø $× 4Ñ 4ØŸ?™?Ø!%×!6Ñ!6Ø!×.Ñ.ØØ#'×#:Ñ#:Ø'+×'=Ñ'=ôˆCô8 Ø�g‘,Ø—G‘G˜IÓ&Ò,¨"Ø—'‘'˜'Ó"Ø—‘˜“ØŸ™ Ó.Ò4°"Ø—'‘'˜'Ó"Ò( bØ—w‘w˜|Ó,ØŸ™ Ó0Ò5°AØŸ'™' /Ó2Ò7°aô

ð 
	
ùòI Nøô( ò 	Ü×ÑÐDÔEÜð4ð ØØØØØØØôò ð	ús   � E0Á<AE5 Å52F*Æ)F*z/v1/chat/streamc              “  ó<  •‡ ‡‡‡‡	‡
‡K  — t        ‰||«       ‰ j                  D �cg c]  }|j                  |j                  dœ‘Œ c}Š	t        j                  d‰ j                  ‰ j                  xs dd d t        ‰	«      «       t        j                  «       Št        j                  «       Š
t        j                  «       Šdˆ
ˆfd„Šdˆ ˆˆˆˆ	ˆˆfd„}t        j                  |d¬«      j                  «        ˆˆˆfd	„}t!         |«       d
ddddœ¬«      S c c}w ­w)Nr?   zFchat_stream_request project_agent_id=%s user_message=%s history_len=%dr   rB   c                óB   •— ‰j                  ‰j                  | |f«       y )N)Úcall_soon_threadsafeÚ
put_nowait)r'   r(   ÚloopÚqueues     €€r    Úemitz-create_app.<locals>.chat_stream.<locals>.emit’   s   ø€ Ø×%Ñ% e×&6Ñ&6¸ÀÐ8HÕIr"   c                 óÔ  •— 	  ‰dd‰j                   i«       dˆˆfd„} dˆˆfd„}t        ‰	‰
‰‰j                  ‰j                  ‰j                   ‰j                  ‰‰j
                  ‰j                  | |¬«      } ‰d|«        ‰di «       y # t        $ rD}t        |«      dk(  r ‰dd	di«       n t        j                  d
«        ‰dd	di«       Y d }~ŒRd }~ww xY w#  ‰di «       w xY w)NÚstartrG   c                óR   •— ‰j                  «       rt        d«      ‚ ‰dd| i«       y )NÚclient_disconnectedÚdeltaÚtext©Úis_setÚRuntimeError)rm   Úcancel_eventrh   s    €€r    Úon_deltazAcreate_app.<locals>.chat_stream.<locals>.worker.<locals>.on_delta™   s)   ø€ Ø#×*Ñ*Ô,Ü*Ð+@ÓAÐAÙ˜ 6¨5 /Õ2r"   c                óR   •— ‰j                  «       rt        d«      ‚ ‰dd| i«       y )Nrl   ÚphaseÚnamero   )rv   rr   rh   s    €€r    Úon_phasezAcreate_app.<locals>.chat_stream.<locals>.worker.<locals>.on_phasež   s)   ø€ Ø#×*Ñ*Ô,Ü*Ð+@ÓAÐAÙ˜ 6¨4 .Õ1r"   )r   rC   rD   rE   rF   rG   rH   rI   rJ   rK   Úon_reply_deltarw   Údonerl   Ú	cancelledÚmessagez,Unhandled error in run_rag_agent_turn streamÚerrorrL   Úend)rm   ÚstrÚreturnÚNone)rv   r~   r   r€   )rG   r
   rE   rF   rH   rJ   rY   rZ   r~   rV   r[   )rs   rw   r`   Úer]   rr   rD   rh   r_   r   rC   s       €€€€€€€r    Úworkerz/create_app.<locals>.chat_stream.<locals>.worker•   sõ   ø€ ð+ Ù�WÐ1°4×3HÑ3HÐIÔJö3ö
2ô
 )Ø%Ø%Ø%Ø$(×$8Ñ$8Ø#Ÿ™Ø%)×%:Ñ%:Ø!%×!2Ñ!2Ø Ø'+×'>Ñ'>Ø+/×+AÑ+AØ#+Ø%ô�ñ �V˜SÔ!ñ  �U˜B•øô ò Ü�q“6Ð2Ò2Ù˜ yÐ2GÐ&HÕIä×$Ñ$Ð%SÔTÙØà%ð!@ðôÿøðûñ �U˜B•ús*   ƒA?B Â	CÂ:CÃC ÃCÃC ÃC'T)ÚtargetÚdaemonc                óÊ   •K  — 	 ‰j                  «       ƒ d {  –—† r‰j                  «        y ‰j                  «       ƒ d {  –—† \  } }| dk(  ry t        | |«      ­–— ŒZ7 ŒF7 Œ­w)Nr}   )Úis_disconnectedÚsetr\   r)   )r'   r(   rr   rg   Úrequests     €€€r    Ú	event_genz2create_app.<locals>.chat_stream.<locals>.event_genÅ   sb   øè ø€ ØØ ×0Ñ0Ó2×2Ð2Ø ×$Ñ$Ô&ØØ',§y¡y£{×!2‘��wØ˜E’>ØÜ  ¨Ó0Ó0ð Ø2øð "3ús!   ƒA#˜A™(A#ÁA!ÁA#Á!A#ztext/event-streamzno-cachez
keep-aliveÚno)zCache-ControlÚ
ConnectionzX-Accel-Buffering)Ú
media_typeÚheaders)r'   r~   r(   Údictr   r€   )r   r€   )r!   rI   r@   rA   rV   rW   rG   rH   rX   ÚasyncioÚQueueÚget_running_loopÚ	threadingÚEventÚThreadrj   r	   )r]   rˆ   r   r   r^   r‚   r‰   rr   rh   r_   rf   rg   rD   r   rC   s   ``     @@@@@€€€r    Úchat_streamzcreate_app.<locals>.chat_stream~   sî   ÿè ø€ ô 	  ¨,¸ÔFØ@DÇÁÖM¸1˜Ÿ™¨A¯I©IÓ6ÒMˆÜ�‰ØTØ×!Ñ!Ø×ÑÒ$ " d sÐ+Ü�‹Iô		
ô 29·±³ˆÜ×'Ñ'Ó)ˆÜ —‘Ó(ˆö	J÷,	 ó ,	 ô\ 	×Ñ ¨tÔ4×:Ñ:Ô<ö	1ô !Ù‹KØ*à!+Ø*Ø%)ñô
ð 	
ùòS Nùs   ŠD¦ DÁCD)r   zdict[str, str])r]   r   r   ú
str | Noner   r–   r   r   )
r]   r   rˆ   r   r   r–   r   r–   r   r	   )r   r   Úcors_originsÚsplitr   Úadd_middlewarer   r   Úgoogle_llm_api_keyÚgemini_embedding_modelÚembedding_output_dimensionalityr   r\   Úpostr   r   )	ÚappÚoÚoriginsr:   ra   r•   rD   r   rC   s	         @@@r    Ú
create_appr¡   .   s—  ú€ Ü‹~€HÜ
Ð0¸'Ô
B€Cà#+×#8Ñ#8Ò#>¸B×"EÑ"EÀcÓ"JÖX˜QÈaÏgÉgÍiˆq�w‰w�yÐX€GÐXÙØ×ÑÜØ!Ø"Ø˜%Ø˜%ð 	ô 	
ô Ø×+Ñ+Ø×-Ñ-Ø&×FÑFô€Hô
 ˜HÓ%€Hà‡W�WˆYÓò ó ð ð 	‡X�Xˆj¬€XÓ6ô $*°$Ð>RÔ#SÜ$*°4Ô$8ð4
Øð4
à ð4
ð "ð4
ð 
ö	4
ó 7ð4
ðl 	‡X�XÐÓ ô $*°$Ð>RÔ#SÜ$*°4Ô$8ð	X
ØðX
àðX
ð !ðX
ð "ð	X
ð
 
öX
ó !ðX
ðt €JùòO Ys   ¼EÁE)r   r   r   r–   r   r–   r   r€   )r'   r~   r(   rŽ   r   r~   )r   r   )"Ú__doc__Ú
__future__r   r�   r%   Úloggingr’   Úfastapir   r   r   r   Úfastapi.middleware.corsr   Úfastapi.responsesr	   Úagent.orchestratorr
   Úconfig.settingsr   r   Údb.supabase_clientr   Úembeddings.gemini_embedr   Úmodels.chatr   r   Ú	getLoggerÚ__name__rV   r!   r)   r¡   r9   r"   r    ú<module>r¯      s‚   ðñõ
 #ã Û Û Û ç ;Ó ;Ý 2Ý /å 1ß 2Ý +Ý 2ß 1à	ˆ×	Ñ	˜8Ó	$€ðDØðDàðDð ðDð 
ó	Dó Rôkr"   