Ë
    âß²jW  ã                  óì   — d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 ddl
mZmZmZmZmZmZmZmZmZmZmZmZmZmZ  ej2                  e«      ZdZdd„Zdd„Zdd	„Zdd
„Z  G d„ de«      Z!ddiZ"d„ Z#y)zÏParallel.ai web search (sync ``Parallel`` SDK) + async extract (``AsyncParallel``).

Env: ``PARALLEL_API_KEY`` (https://parallel.ai), optional
``PARALLEL_SEARCH_MODE`` = agentic (default) | fast | one-shot.
é    )ÚannotationsN)ÚAnyÚDictÚList)ÚSEARCH_LIMIT_CAPÚBaseWebSearchProviderÚcached_sdk_clientÚdocumentÚkeyless_extractÚkeyless_searchÚkeyless_variant_schemaÚ
page_errorÚprovider_envÚrun_extract_asyncÚ
run_searchÚ	search_okÚuse_keylessÚweb_hitzVPARALLEL_API_KEY environment variable not set. Get your API key at https://parallel.aic                ó6   ‡— dˆfd„}t        | dt        d|«      S )Nc                ó2   •— dd l } t        |‰«      | ¬«      S )Nr   )Úapi_key)ÚparallelÚgetattr)r   r   Úcls_names     €úB/home/ubuntu/.hermes/hermes-agent/plugins/web/parallel/provider.pyÚ_factoryz_client.<locals>._factory   s   ø€ ÛØ*Œw�x Ó*°7Ô;Ð;ó    ÚPARALLEL_API_KEYzsearch.parallel)r   ÚstrÚreturnr   )r	   Ú_MISSING_KEY)Úslotr   r   s    ` r   Ú_clientr#      s    ø€ õ<ô ˜TÐ#5´|ÐEVÐX`ÓaÐar   c                 ó   — t        dd«      S )NÚ_parallel_clientÚParallel©r#   © r   r   Ú_get_sync_clientr)       s   € ÜÐ% zÓ2Ð2r   c                 ó   — t        dd«      S )NÚ_async_parallel_clientÚAsyncParallelr'   r(   r   r   Ú_get_async_clientr-   $   s   € ÜÐ+¨_Ó=Ð=r   c                 óv   — t        j                  dd«      j                  «       j                  «       } | dv r| S dS )NÚPARALLEL_SEARCH_MODEÚagentic>   úone-shotÚfastr0   )ÚosÚgetenvÚlowerÚstrip)Úmodes    r   Ú_resolve_search_moder8   (   s8   € Ü�9‰9Ð+¨YÓ7×=Ñ=Ó?×EÑEÓG€DØÐ:Ñ:ˆ4ÐIÀ	ÐIr   c                  ó>   — e Zd ZdZdZdZdZdZdZd
dd„Z	dd„Z
dd„Zy	)ÚParallelWebSearchProviderz,Parallel.ai search + async extract provider.r   r&   r   Tc                ó:   ‡‡— dˆˆfd„}t        dt        |d¬«      S )Nc                 ó
  •— t        dt        d«      «      rt        dd‰‰t        «      S t	        «       } t        j                  d‰| ‰«       t        «       j                  j                  ‰g‰| t        ‰t        «      ¬«      }t        t        |j                  xs g «      D ��cg c]O  \  }}t        |j                  xs d|j                   xs ddj#                  |j$                  xs g «      |dz   «      ‘ŒQ c}}«      S c c}}w )	Nr   r   r&   z)Parallel search: '%s' (mode=%s, limit=%d))Úsearch_queriesÚ	objectiver7   Úmax_resultsÚ Ú é   )r   r   r   Úloggerr8   Úinfor)   ÚbetaÚsearchÚminr   r   Ú	enumerateÚresultsr   ÚurlÚtitleÚjoinÚexcerpts)r7   ÚresponseÚiÚrÚlimitÚquerys       €€r   Ú_bodyz/ParallelWebSearchProvider.search.<locals>._body7   sí   ø€ Ü˜:¤|Ð4FÓ'GÔHÜ% j°*¸eÀUÌFÓSÐSÜ'Ó)ˆDÜ�K‰KÐCÀUÈDÐRWÔXÜ'Ó)×.Ñ.×5Ñ5ÀeÀWÐX]ÐdhÔvyÐzô  BRó  wSÐ5ó  TˆHÜä% h×&6Ñ&6Ò&<¸"Ó=÷á�A�qô ˜Ÿ™š  Q§W¡W¢]°°C·H±H¸Q¿Z¹ZÒ=MÈ2Ó4NÐPQÐTUÑPUÕVóó ð ùó s   Â#AC?
r&   T©Úsdk©r    úDict[str, Any])r   rC   )ÚselfrR   rQ   rS   s    `` r   rF   z ParallelWebSearchProvider.search6   s   ù€ ö		ô ˜*¤f¨e¸Ô>Ð>r   c              ‹  óT   ‡K  — dˆfd„}t        dt        ‰|d¬«      ƒ d {  –—† S 7 Œ­w)Nc               “  óò  •K  — t        dt        d«      «      r)t        j                  t        dd‰t
        «      ƒ d {  –—† S t
        j                  dt        ‰«      «       t        «       j                  j                  ‰d¬«      ƒ d {  –—† } | j                  xs g D �cg c]V  }t        |j                  xs d|j                  xs d|j                  xs dj!                  |j"                  xs g «      «      ‘ŒX }}|| j$                  xs g D �cg c]N  }i t'        |j                  xs d|j(                  xs |j*                  xs d	«      ¥d
d|j                  xs dii¥‘ŒP c}z   S 7 �Œ+7 Œác c}w c c}w ­w)Nr   r   r&   zParallel extract: %d URL(s)T)ÚurlsÚfull_contentr@   z

zextraction failedÚmetadataÚ	sourceURL)r   r   ÚasyncioÚ	to_threadr   rC   rD   Úlenr-   rE   ÚextractrI   r
   rJ   rK   r\   rL   rM   Úerrorsr   ÚcontentÚ
error_type)rN   rP   rI   Úer[   s       €r   rS   z0ParallelWebSearchProvider.extract.<locals>._bodyE   sq  øè ø€ Ü˜:¤|Ð4FÓ'GÔHä$×.Ñ.¬À
ÈJÐX\Ô^dÓe×eÐeÜ�K‰KÐ5´s¸4³yÔAÜ.Ó0×5Ñ5×=Ñ=À4ÐVZÐ=Ó[×[ˆHØv~÷  wGñ  wGò  wMð  KMö  NÐqr”x §¡¢¨¨Q¯W©Wª]¸¸A¿N¹NÒ<kÈfÏkÉkÐZ[×ZdÑZdÒZjÐhjÓNkÕlð  NˆGð  NØà!Ÿ™Ò.¨Böàð F”:˜aŸe™ešk r¨1¯9©9Ò+[¸¿¹Ò+[ÐH[Ó\ð  FÐ^hÐkvÐxy×x}Ñx}ò  yDð  BDð  kEó  Fòñ ð ð	 fùà[úò NùòùsB   ƒ:E7½E(¾AE7Â	E+Â
E7Â AE-Ã;E7ÄAE2Å#E7Å+E7Å-
E7r&   TrT   )r    úList[Dict[str, Any]])r   rC   )rX   r[   ÚkwargsrS   s    `  r   rb   z!ParallelWebSearchProvider.extractD   s'   øè ø€ õ
	ô ' z´6¸4ÀÈDÔQ×QÐQÐQús   ƒ(¡&¢(c                ó"   — t        ddddd¬«      S )Nr&   r   zhttps://parallel.aizjObjective-tuned search + page extraction on Parallel's anonymous free tier. Rate-limited under burst load.zhObjective-tuned search + parallel page extraction via the Parallel SDK. Unthrottled, guaranteed service.)Úfree_tagÚpaid_tag)r   )rX   s    r   Úget_setup_schemaz*ParallelWebSearchProvider.get_setup_schemaS   s!   € Ü%ØÐ*Ð,Að BØô
ð 	
r   N)é   )rR   r   rQ   Úintr    rW   )r[   z	List[str]rh   r   r    rg   rV   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚNAMEÚDISPLAY_NAMEÚKEY_ENVÚEXTRACTÚKEYLESSrF   rb   rl   r(   r   r   r:   r:   -   s.   „ Ù6à€DØ€LØ €GØ€GØ€Gô?óRô
r   r:   ÚWebSearchProvider)zagent.web_search_providerrx   c                óÌ   — t         j                  | «      }|€t        dt        ›d| ›�«      ‚dd l}ddlm}  |t        | g|¢­Ž  t        |j                  |d   «      |d   «      S )Nzmodule z has no attribute r   )Ú	warn_oncerB   )	Ú_PLUGIN_COMPAT_LAZYÚgetÚAttributeErrorro   Ú	importlibÚhermes_cli.plugin_compatrz   r   Úimport_module)ÚnameÚtargetr~   rz   s       r   Ú__getattr__rƒ   f   se   € Ü ×$Ñ$ TÓ*€FØ€~Ü˜w¤x lÐ2DÀTÀHÐMÓNÐNÛÝ2ÙŒh˜Ð&˜vÓ&Ü�9×*Ñ*¨6°!©9Ó5°v¸a±yÓAÐAr   )r"   r   r   r   r    r   )r    r   )r    r   )$rr   Ú
__future__r   r_   Úloggingr3   Útypingr   r   r   Úplugins.web._commonr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Ú	getLoggerro   rC   r!   r#   r)   r-   r8   r:   r{   rƒ   r(   r   r   ú<module>r‰      s…   ðñõ #ã Û Û 	ß "Ñ "÷÷ ÷ ÷ ð
 
ˆ×	Ñ	˜8Ó	$€àg€óbó3ó>óJô
+
Ð 5ô +
ðj ÐKðÐ ó
Br   