§
    šŠtjï  ã                   óÚ   — d Z ddl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
mZ ddlZddlmZmZ ddlmZ ddlmZmZ  ej        e¦  «        Z G d„ de¦  «        Z G d	„ d
e¦  «        ZdS )z†Tool for the Nuclia Understanding API.

Installation:

```bash
    pip install --upgrade protobuf
    pip install nucliadb-protos
```
é    N)ÚAnyÚDictÚOptionalÚTypeÚUnion)ÚAsyncCallbackManagerForToolRunÚCallbackManagerForToolRun)ÚBaseTool)Ú	BaseModelÚFieldc                   ó¼   — e Zd ZU dZ edd¬¦  «        Zeed<    edd¬¦  «        Zeed<    edd¬¦  «        Z	e
e         ed	<    edd
¬¦  «        Ze
e         ed<   dS )Ú	NUASchemaa0  Input for Nuclia Understanding API.

    Attributes:
        action: Action to perform. Either `push` or `pull`.
        id: ID of the file to push or pull.
        path: Path to the file to push (needed only for `push` action).
        text: Text content to process (needed only for `push` action).
    .z+Action to perform. Either `push` or `pull`.)ÚdescriptionÚactionzID of the file to push or pull.Úidz9Path to the file to push (needed only for `push` action).Úpathz8Text content to process (needed only for `push` action).ÚtextN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚstrÚ__annotations__r   r   r   r   © ó    úc/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/tools/nuclia/tool.pyr   r      sä   € € € € € € ðð ð �%ØØAðñ ô €FˆCð ð ñ ð ˆeØØ5ðñ ô €Bˆð ð ñ ð  ˜%ØØOðñ ô €Dˆ(�3Œ-ð ð ñ ð  ˜%ØØNðñ ô €Dˆ(�3Œ-ð ð ñ ð ð r   r   c                   óÖ  ‡ — e Zd ZU dZdZeed<   dZeed<   eZ	e
e         ed<   i Zeeef         ed<   i Zeeef         ed<   dd
eddfˆ fd„Z	 d dededee         dee         dee         defd„Z	 	 	 d!dededee         dee         dee         defd„Zdededefd„Zdededefd„Zdededefd„Zdedefd„Zd"d„Zdedeedf         fd„Zdee         dee         ddfd„Zˆ xZS )#ÚNucliaUnderstandingAPIz8Tool to process files with the Nuclia Understanding API.Únuclia_understanding_apiÚnamezvA wrapper around Nuclia Understanding API endpoints. Useful for when you need to extract text from any kind of files. r   Úargs_schemaÚ_resultsÚ_configFÚ	enable_mlÚreturnNc                 ó,  •— t           j                             dd¦  «        }d|› d�| j        d<   t           j                             d¦  «        }|st	          d¦  «        ‚|| j        d<   || j        d	<   t          ¦   «                              ¦   «          d S )
NÚNUCLIA_ZONEzeurope-1zhttps://z.nuclia.cloud/api/v1ÚBACKENDÚNUCLIA_NUA_KEYz+NUCLIA_NUA_KEY environment variable not setÚNUA_KEYr$   )ÚosÚenvironÚgetr#   Ú
ValueErrorÚsuperÚ__init__)Úselfr$   ÚzoneÚkeyÚ	__class__s       €r   r0   zNucliaUnderstandingAPI.__init__E   sŽ   ø€ ÝŒz�~Š~˜m¨ZÑ8Ô8ˆØ"G¨TÐ"GÐ"GÐ"GˆŒ�YÑÝŒj�nŠnÐ-Ñ.Ô.ˆØð 	*ÝÐJÑKÔKÐKà&)ˆDŒL˜Ñ#Ø$-ˆŒ�[Ñ!Ý‰Œ×ÒÑÔÐÐÐr   r   r   r   r   Úrun_managerc                 óÖ   — |dk    rG|                       ||¦  «         |r|                      ||¦  «        S |r|                      ||¦  «        S n|dk    r|                      |¦  «        S dS )zUse the tool.ÚpushÚpullÚ )Ú_check_paramsÚ	_pushFileÚ	_pushTextÚ_pull)r1   r   r   r   r   r5   s         r   Ú_runzNucliaUnderstandingAPI._runP   s‚   € ð �VÒÐØ×Ò˜t TÑ*Ô*Ð*Øð 0Ø—~’~ b¨$Ñ/Ô/Ð/Øð 0Ø—~’~ b¨$Ñ/Ô/Ð/ð0à�vÒÐØ—:’:˜b‘>”>Ð!Øˆrr   c              ƒ   ó  K  — |                       ||¦  «         |r|                      ||¦  «         |r|                      ||¦  «         d}	 |                      |¦  «        }|rnt	          j        d¦  «        ƒ d{V —† Œ3|S )zUse the tool asynchronously.NTé   )r:   r;   r<   r=   ÚasyncioÚsleep)r1   r   r   r   r   r5   Údatas          r   Ú_arunzNucliaUnderstandingAPI._arunc   s¨   è è € ð 	×Ò˜4 Ñ&Ô&Ð&Øð 	%Ø�NŠN˜2˜tÑ$Ô$Ð$Øð 	%Ø�NŠN˜2˜tÑ$Ô$Ð$Øˆð	$Ø—:’:˜b‘>”>ˆDØð ØÝ”- Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#ð		$ð
 ˆr   c                 ó\   — d|ddœid| j         d         idœ}|                      ||¦  «        S )Nr   r   )ÚbodyÚformatÚml_textr$   )Ú	textfieldÚprocessing_options)r#   Ú
_pushField)r1   r   r   Úfields       r   r<   z NucliaUnderstandingAPI._pushTexty   sC   € à ¨4¸1Ð"=Ð"=Ð>Ø#,¨d¬l¸;Ô.GÐ"Hð
ð 
ˆð �Š˜r 5Ñ)Ô)Ð)r   Úcontent_pathc           	      ó  — t          |d¦  «        5 }t          j        | j        d         dz   t	          j        |¦  «        d         pdd| j        d         z   dœ|                     ¦   «         ¬	¦  «        }|j        d
k    r;t           	                    d|› d|j        › d|j
        › �¦  «         	 d d d ¦  «         dS d|j
        › id| j        d         idœ}|                      ||¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )NÚrbr(   z/processing/uploadr   zapplication/octet-streamúBearer r*   ©zcontent-typeúx-stf-nuakey)ÚheadersrC   éÈ   zError uploading z: ú r9   ÚfilerH   r$   )Ú	filefieldrJ   )ÚopenÚrequestsÚpostr#   Ú	mimetypesÚ
guess_typeÚreadÚstatus_codeÚloggerÚinfor   rK   )r1   r   rM   Úsource_fileÚresponserL   s         r   r;   z NucliaUnderstandingAPI._pushFile€   sž  € Ý�, Ñ%Ô%ð 	2¨Ý”}Ø”˜YÔ'Ð*>Ñ>å$-Ô$8¸Ñ$FÔ$FÀqÔ$Ið %2Ø1Ø$-°´¸YÔ0GÑ$Gðð ð
 !×%Ò%Ñ'Ô'ðñ ô ˆHð Ô# sÒ*Ð*Ý—’ð> |ð >ð >ØÔ+ð>ð >Ø.6¬mð>ð >ñô ð ð ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð$ #)¨X¬]Ð*<Ð!=Ø+4°d´lÀ;Ô6OÐ*Pðð �ð —’ r¨5Ñ1Ô1ð+	2ð 	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð 	2ð 	2s   ‘BC6Â:/C6Ã6C:Ã=C:rL   c                 óÊ  — t                                d|› d�¦  «         t          j        | j        d         dz   dd| j        d         z   dœ|¬	¦  «        }|j        d
k    r<t                                d|› d|j        › d|j        › �¦  «         t          d¦  «        ‚|                     ¦   «         d         }t                                d|› d|› �¦  «         |ddœ| j	        |<   |S )NzPushing z	 in queuer(   z/processing/pushzapplication/jsonrP   r*   rQ   )rS   ÚjsonrT   zError pushing field ú:rU   zError pushing fieldÚuuidzField z pushed in queue, uuid: Úpending)rf   Ústatus)
r_   r`   rY   rZ   r#   r^   r   r.   rd   r"   )r1   r   rL   rb   rf   s        r   rK   z!NucliaUnderstandingAPI._pushField˜   s  € Ý�ŠÐ,˜rÐ,Ð,Ð,Ñ-Ô-Ð-Ý”=ØŒL˜Ô#Ð&8Ñ8à 2Ø )¨D¬L¸Ô,CÑ Cðð ð ð
ñ 
ô 
ˆð Ô 3Ò&Ð&Ý�KŠKØR rÐRÐR¨HÔ,@ÐRÐRÀ8Ä=ÐRÐRñô ð õ Ð2Ñ3Ô3Ð3à—=’=‘?”? 6Ô*ˆDÝ�KŠKÐC ÐCÐC¸TÐCÐCÑDÔDÐDØ)-¸Ð CÐ CˆDŒM˜"ÑØˆKr   c                 ó  — |                       ¦   «          | j                             |d ¦  «        }|st                               |› d�¦  «         dS |d         dk    r&t                               d|d         › d�¦  «         dS |d         S )	Nz not in queuer9   rh   rg   zWaiting for rf   z to be processedrC   )Ú_pull_queuer"   r-   r_   r`   )r1   r   Úresults      r   r=   zNucliaUnderstandingAPI._pull­   s”   € Ø×ÒÑÔÐØ”×"Ò" 2 tÑ,Ô,ˆØð 	"Ý�KŠK˜2Ð,Ð,Ð,Ñ-Ô-Ð-Ø�2Ø�HÔ Ò*Ð*Ý�KŠKÐG v¨f¤~ÐGÐGÐGÑHÔHÐHØ�2à˜&”>Ð!r   c                 ó*  — 	 ddl m} n"# t          $ r}t          d¦  «        |‚d }~ww xY w	 ddlm} n"# t          $ r}t          d¦  «        |‚d }~ww xY wt          j        | j        d         dz   dd	| j        d
         z   i¬¦  «                             ¦   «         }|d         dk    rt           
                    d¦  «         d S |d         dk    rÄ|d         } |¦   «         }|                     t          j        |¦  «        ¦  «         |j        }t           
                    d|› d�¦  «         |                      |¦  «        }|st           
                    d|› �¦  «         d S d| j        |         d<    ||dd¬¦  «        }	|	| j        |         d<   d S d S )Nr   )ÚBrokerMessagezOnucliadb-protos is not installed. Run `pip install nucliadb-protos` to install.)ÚMessageToJsonzMUnable to import google.protobuf, please install with `pip install protobuf`.r(   z/processing/pullrR   rP   r*   )rS   rh   ÚemptyzQueue emptyÚokÚpayloadzPulled z from queuezNo matching id for ÚdoneT)Úpreserving_proto_field_nameÚincluding_default_value_fieldsrC   )Únucliadb_protos.writer_pb2rm   ÚImportErrorÚgoogle.protobuf.json_formatrn   rY   r-   r#   rd   r_   r`   ÚParseFromStringÚbase64Ú	b64decoderf   Ú_find_matching_idr"   )
r1   rm   Úern   Úresrq   Úpbrf   Úmatching_idrC   s
             r   rj   z"NucliaUnderstandingAPI._pull_queue¹   s  € ð	Ø@Ð@Ð@Ð@Ð@Ð@Ð@øÝð 	ð 	ð 	Ýð@ñô ð ðøøøøð	øøøð
	ØAÐAÐAÐAÐAÐAÐAøÝð 	ð 	ð 	Ýð*ñô ð ðøøøøð	øøøõ ŒlØŒL˜Ô#Ð&8Ñ8à 	¨D¬L¸Ô,CÑ Cðð
ñ 
ô 
÷
 Š$‰&Œ&ð 	ð ˆxŒ=˜GÒ#Ð#Ý�KŠK˜Ñ&Ô&Ð&Ð&Ð&Ø�Œ]˜dÒ"Ð"Ø˜)”nˆGØ�‘”ˆBØ×Ò�vÔ/°Ñ8Ô8Ñ9Ô9Ð9Ø”7ˆDÝ�KŠKÐ3 $Ð3Ð3Ð3Ñ4Ô4Ð4Ø×0Ò0°Ñ6Ô6ˆKØð 	:Ý—’Ð8°$Ð8Ð8Ñ9Ô9Ð9Ð9Ð9à7=�”˜kÔ*¨8Ñ4Ø$�}ØØ04Ø37ðñ ô �ð
 6:�”˜kÔ*¨6Ñ2Ð2Ð2ð! #Ð"s$   ‚	 ‰
(“#£(¬3 ³
A½AÁArf   c                 ód   — | j                              ¦   «         D ]\  }}|d         |k    r|c S Œd S )Nrf   )r"   Úitems)r1   rf   r   rk   s       r   r{   z(NucliaUnderstandingAPI._find_matching_idã   sE   € Øœ-×-Ò-Ñ/Ô/ð 	ð 	‰JˆB�Ø�fŒ~ Ò%Ð%Ø�	�	�	ð &àˆtr   c                 óV   — |s|st          d¦  «        ‚|r|rt          d¦  «        ‚d S d S )NzFile path or text is requiredz1Cannot process both file and text on a single run)r.   )r1   r   r   s      r   r:   z$NucliaUnderstandingAPI._check_paramsé   sX   € Øð 	>˜Dð 	>ÝÐ<Ñ=Ô=Ð=Øð 	R�Dð 	RÝÐPÑQÔQÐQð	Rð 	Rð 	Rð 	Rr   )F)N)NNN)r%   N) r   r   r   r   r    r   r   r   r   r!   r   r   r"   r   r   r#   Úboolr0   r   r	   r>   r   rD   r<   r;   rK   r=   rj   r   r{   r:   Ú__classcell__)r4   s   @r   r   r   9   s¶  ø€ € € € € € ØBÐBà*€Dˆ#Ð*Ð*Ñ*ð	Lð �ð ð ñ ð $-€K��i”Ð,Ð,Ñ,Ø!€Hˆd�3˜�8ŒnÐ!Ð!Ñ!Ø €GˆT�#�s�(Œ^Ð Ð Ñ ð	ð 	 $ð 	°4ð 	ð 	ð 	ð 	ð 	ð 	ð" <@ðð àðð ðð �sŒmð	ð
 �sŒmðð Ð7Ô8ðð 
ðð ð ð ð. #Ø"Ø@Dðð àðð ðð �sŒmð	ð
 �sŒmðð Ð<Ô=ðð 
ðð ð ð ð,*˜Cð * sð *¨sð *ð *ð *ð *ð2˜Cð 2¨sð 2°sð 2ð 2ð 2ð 2ð0˜Sð ¨ð °ð ð ð ð ð*
"˜ð 
" ð 
"ð 
"ð 
"ð 
"ð(:ð (:ð (:ð (:ðT cð ¨e°C¸°IÔ.>ð ð ð ð ðR (¨3¤-ð R°xÀ´}ð RÈð Rð Rð Rð Rð Rð Rð Rð Rr   r   )r   rA   ry   Úloggingr[   r+   Útypingr   r   r   r   r   rY   Úlangchain_core.callbacksr   r	   Úlangchain_core.toolsr
   Úpydanticr   r   Ú	getLoggerr   r_   r   r   r   r   r   ú<module>r‹      sL  ððð ð €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø 	€	€	€	Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à €€€ðð ð ð ð ð ð ð ð *Ð )Ð )Ð )Ð )Ð )Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à	ˆÔ	˜8Ñ	$Ô	$€ðð ð ð ð �	ñ ô ð ð8tRð tRð tRð tRð tR˜Xñ tRô tRð tRð tRð tRr   