Ë
    µŒjï  ã                   óÐ   — 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y)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<   y)Ú	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   © ó    úo/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/tools/nuclia/tool.pyr   r      ss   … ññ ØØAô€FˆCó ñ ØØ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Ú_configÚ	enable_mlÚreturnNc                 ó  •— t         j                  j                  dd«      }d|› d�| j                  d<   t         j                  j                  d«      }|st	        d«      ‚|| j                  d<   || j                  d	<   t
        ‰| �  «        y )
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   sx   ø€ Ü�z‰z�~‰~˜m¨ZÓ8ˆØ$,¨T¨FÐ2FÐ"Gˆ�‰�YÑÜ�j‰j�n‰nÐ-Ó.ˆÙÜÐJÓKÐKà&)ˆD�L‰L˜Ñ#Ø$-ˆ�‰�[Ñ!Ü‰ÑÕr   r   r   r   r   Úrun_managerc                 ó°   — |dk(  r;| j                  ||«       |r| j                  ||«      S |r| j                  ||«      S y|dk(  r| j                  |«      S y)zUse the tool.ÚpushÚpullÚ )Ú_check_paramsÚ	_pushFileÚ	_pushTextÚ_pull)r1   r   r   r   r   r5   s         r   Ú_runzNucliaUnderstandingAPI._runP   sd   € ð �VÒØ×Ñ˜t TÔ*ÙØ—~‘~ b¨$Ó/Ð/ÙØ—~‘~ b¨$Ó/Ð/ð ð �vÒØ—:‘:˜b“>Ð!Ør   c              ƒ   óð   K  — | j                  ||«       |r| j                  ||«       |r| j                  ||«       d}	 | j                  |«      }|r	 |S t	        j
                  d«      ƒ d{  –—†  Œ47 Œ­w)zUse the tool asynchronously.Né   )r:   r;   r<   r=   ÚasyncioÚsleep)r1   r   r   r   r   r5   Údatas          r   Ú_arunzNucliaUnderstandingAPI._arunc   sx   è ø€ ð 	×Ñ˜4 Ô&ÙØ�N‰N˜2˜tÔ$ÙØ�N‰N˜2˜tÔ$ØˆØØ—:‘:˜b“>ˆDÙØàˆô —-‘- Ó#×#Ð#ð	 ð $ús   ‚A,A6Á.A4Á/A6c                 óX   — d|ddœid| j                   d   idœ}| j                  ||«      S )Nr   r   )ÚbodyÚformatÚml_textr$   )Ú	textfieldÚprocessing_options)r#   Ú
_pushField)r1   r   r   Úfields       r   r<   z NucliaUnderstandingAPI._pushTexty   s:   € à ¨4¸1Ñ"=Ð>Ø#,¨d¯l©l¸;Ñ.GÐ"Hñ
ˆð �‰˜r 5Ó)Ð)r   Úcontent_pathc           	      ó  — t        |d«      5 }t        j                  | j                  d   dz   t	        j
                  |«      d   xs dd| j                  d   z   dœ|j                  «       ¬	«      }|j                  d
k7  r<t        j                  d|› d|j                  › d|j                  › �«       	 d d d «       yd|j                  › id| j                  d   idœ}| j                  ||«      cd d d «       S # 1 sw Y   y xY w)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þ   € Ü�, Ô%¨Ü—}‘}Ø—‘˜YÑ'Ð*>Ñ>ä$-×$8Ñ$8¸Ó$FÀqÑ$Iò %2Ø1Ø$-°·±¸YÑ0GÑ$Gñð
 !×%Ñ%Ó'ôˆHð ×#Ñ# sÒ*Ü—‘Ø& | n°BØ×+Ñ+Ð,¨A¨h¯m©m¨_ð>ôð ÷ &Ð%ð$ #)¨X¯]©]¨OÐ!=Ø+4°d·l±lÀ;Ñ6OÐ*Pñ�ð —‘ r¨5Ó1÷+ &×%Ò%ús   �B&C8Â<2C8Ã8DrL   c                 óÆ  — t         j                  d|› d�«       t        j                  | j                  d   dz   dd| j                  d   z   dœ|¬	«      }|j
                  d
k7  r=t         j                  d|› d|j
                  › d|j                  › �«       t        d«      ‚|j                  «       d   }t         j                  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â   € Ü�‰�h˜r˜d )Ð,Ô-Ü—=‘=Ø�L‰L˜Ñ#Ð&8Ñ8à 2Ø )¨D¯L©L¸Ñ,CÑ Cñð ô
ˆð ×Ñ 3Ò&Ü�K‰KØ& r d¨!¨H×,@Ñ,@Ð+AÀÀ8Ç=Á=À/ÐRôô Ð2Ó3Ð3à—=‘=“? 6Ñ*ˆDÜ�K‰K˜&  Ð$<¸T¸FÐCÔDØ)-¸Ñ CˆD�M‰M˜"ÑØˆKr   c                 óä   — | j                  «        | j                  j                  |d «      }|st        j	                  |› d�«       y|d   dk(  rt        j	                  d|d   › d�«       y|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­   sr   € Ø×ÑÔØ—‘×"Ñ" 2 tÓ,ˆÙÜ�K‰K˜2˜$˜mÐ,Ô-ØØ�HÑ Ò*Ü�K‰K˜, v¨f¡~Ð&6Ð6FÐGÔHØà˜&‘>Ð!r   c                 óÐ  — 	 ddl m} 	 ddlm} t        j                  | j                  d   dz   dd	| j                  d
   z   i¬«      j                  «       }|d   dk(  rt        j                  d«       y |d   dk(  r±|d   } |«       }|j                  t        j                  |«      «       |j                  }t        j                  d|› d�«       | j                  |«      }|st        j                  d|› �«       y d| j                   |   d<    ||dd¬«      }	|	| j                   |   d<   y y # t        $ r}t        d«      |‚d }~ww xY w# t        $ r}t        d«      |‚d }~ww xY w)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ô �l‰lØ�L‰L˜Ñ#Ð&8Ñ8à 	¨D¯L©L¸Ñ,CÑ Cðô
÷
 ‰$‹&ð 	ð ˆx‰=˜GÒ#Ü�K‰K˜Õ&Ø�‰]˜dÒ"Ø˜)‘nˆGÙ“ˆBØ×Ñœv×/Ñ/°Ó8Ô9Ø—7‘7ˆDÜ�K‰K˜' $  {Ð3Ô4Ø×0Ñ0°Ó6ˆKÙÜ—‘Ð1°$°Ð8Õ9à7=�—‘˜kÑ*¨8Ñ4Ù$ØØ04Ø37ô�ð
 6:�—‘˜kÑ*¨6Ò2ð! #øô+ ò 	Üð@óð ðûð	ûô ò 	Üð*óð ðûð	ús.   ‚D. ‰E Ä.	EÄ7EÅEÅ	E%ÅE Å E%rf   c                 ó`   — | j                   j                  «       D ]  \  }}|d   |k(  sŒ|c S  y )Nrf   )r"   Úitems)r1   rf   r   rk   s       r   r{   z(NucliaUnderstandingAPI._find_matching_idã   s3   € ØŸ-™-×-Ñ-Ö/‰JˆB�Ø�f‰~ Ó%Ø’	ð 0ð r   c                 óB   — |s|st        d«      ‚|r|rt        d«      ‚y y )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é   s+   € Ù™DÜÐ<Ó=Ð=Ù‘DÜÐPÓQÐQð ˆ4r   )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à*€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ð0˜Sð ¨ð °ó ð*
"˜ð 
" ó 
"ó(:ðT cð ¨e°C¸°IÑ.>ó ðR (¨3¡-ð R°xÀ±}ð 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‹      s_   ðñó Û Û Û Û 	ß 3Õ 3ã ÷õ *ß %à	ˆ×	Ñ	˜8Ó	$€ô�	ô ô8tR˜Xõ tRr   