+
    kHàj°  ã                  óð   € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHtH	t	 ^ RI
HtHtHtHtHtHtHtHtHtHtHtHtHtHt ]P2                  ! ]4      tRtR R ltR R	 ltR
 R ltR R lt  ! R R]4      t!R# )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               ó$   € V ^8„  d   QhRRRRRR/# )é   ÚslotÚstrÚcls_nameÚreturnr   © )Úformats   "ÚB/home/ubuntu/.hermes/hermes-agent/plugins/web/parallel/provider.pyÚ__annotate__r      s&   € ÷ _ñ _�#ð _ ð _¨ñ _ó    c                ó<   a€ R  V3R llp\        V R\        RV4      # )c               ó    € V ^8„  d   QhRRRR/# )r   Úapi_keyr   r   r   r   )r   s   "r   r   Ú_client.<locals>.__annotate__   s   € ÷ <ñ <˜#ð < #ñ <r   c                ó2   <€ ^ RI p\        VS4      ! V R7      # )é    N)r!   )ÚparallelÚgetattr)r!   r%   r   s   & €r   Ú_factoryÚ_client.<locals>._factory   s   ø€ ÛÜ�x Ô*°7Ô;Ð;r   ÚPARALLEL_API_KEYzparallel-web)r   Ú_MISSING_KEY)r   r   r'   s   &f r   Ú_clientr+      s$   ø€ ÷<ð <ô ˜TÐ#5´|À^ÐU]Ó^Ð^r   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   r   "   s   € ÷ 3ñ 3˜#ñ 3r   c                 ó   € \        R R4      # )Ú_parallel_clientÚParallel©r+   r   r   r   Ú_get_sync_clientr2   "   s   € ÜÐ% zÓ2Ð2r   c               ó   € V ^8„  d   QhRR/# r-   r   )r   s   "r   r   r   &   s   € ÷ >ñ >˜3ñ >r   c                 ó   € \        R R4      # )Ú_async_parallel_clientÚAsyncParallelr1   r   r   r   Ú_get_async_clientr7   &   s   € ÜÐ+¨_Ó=Ð=r   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   *   s   € ÷ Jñ J˜cñ Jr   c                 ó~   € \         P                  ! R R4      P                  4       P                  4       p V R9   d   V # R# )ÚPARALLEL_SEARCH_MODEÚagentic>   Úfastr;   úone-shot)ÚosÚgetenvÚlowerÚstrip)Úmodes    r   Ú_resolve_search_moderC   *   s8   € Ü�9Š9Ð+¨YÓ7×=Ñ=Ó?×EÑEÓG€DØÐ:Ô:ˆ4ÐIÀ	ÐIr   c                  óV   € ] tR t^/tRtRtRtRtRtRt	RR R llt
R R	 ltR
 R ltRtR# )ÚParallelWebSearchProviderz,Parallel.ai search + async extract provider.r%   r0   r)   Tc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úqueryr   ÚlimitÚintr   údict[str, Any]r   )r   s   "r   r   Ú&ParallelWebSearchProvider.__annotate__8   s!   € ÷ ?ñ ?˜Cð ?¨ð ?°Nñ ?r   c                	ó@   aa€ R  VV3R llp\        R\        VRR7      # )c               ó   € V ^8„  d   QhRR/# ©r   r   rJ   r   )r   s   "r   r   Ú6ParallelWebSearchProvider.search.<locals>.__annotate__9   s   € ÷ 		ñ 		�~ñ 		r   c                 óP  <€ \        R \        R4      4      '       d   \        RR SS\        4      # \	        4       p \        P                  RSV S4       \        4       P                  P                  S.SV \        S\        4      R7      p\        \        VP                  ;'       g    . 4       UUu. uFe  w  r#\        VP                  ;'       g    RVP                   ;'       g    RRP#                  VP$                  ;'       g    . 4      V^,           4      NKg  	  upp4      # u uppi )r%   r)   r0   z)Parallel search: '%s' (mode=%s, limit=%d))Úsearch_queriesÚ	objectiverB   Úmax_resultsÚ Ú )r   r   r   ÚloggerrC   Úinfor2   ÚbetaÚsearchÚminr   r   Ú	enumerateÚresultsr   ÚurlÚtitleÚjoinÚexcerpts)rB   ÚresponseÚiÚrrH   rG   s       €€r   Ú_bodyÚ/ParallelWebSearchProvider.search.<locals>._body9   sý   ø€ Ü˜:¤|Ð4FÓ'G×HÒ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×&<Ð&<¸"Ô=ôá=‘D�Aô ˜Ÿ™Ÿ˜  Q§W¡W§] ]°°C·H±H¸Q¿Z¹Z×=MÐ=MÈ2Ó4NÐPQÐTUÕPUÖVÙ=òó ð ùó s   Â/D"
ÃD"
Ã#D"
ÄD"
r0   T©Úsdk)r   rV   )ÚselfrG   rH   rd   s   &ff r   rY   Ú ParallelWebSearchProvider.search8   s    ù€ ÷		ñ 		ô ˜*¤f¨e¸Ô>Ð>r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úurlsz	list[str]Úkwargsr   r   úlist[dict[str, Any]]r   )r   s   "r   r   rK   F   s'   € ÷ Rñ R )ð R°sð RÐ?Sñ Rr   c              ‹  	óZ   a"  € R  V3R llp\        R\        SVRR7      G Rj  x€L
 #  L5i)c               ó   € V ^8„  d   QhRR/# )r   r   rm   r   )r   s   "r   r   Ú7ParallelWebSearchProvider.extract.<locals>.__annotate__G   s   € ÷ 
	ñ 
	Ð1ñ 
	r   c               “  óŠ  <"  € \        R \        R4      4      '       d+   \        P                  ! \        RR S\
        4      G Rj  x€L
 # \
        P                  R\        S4      4       \        4       P                  P                  SRR7      G Rj  x€L
 p V P                  ;'       g    .  Uu. uFo  p\        VP                  ;'       g    RVP                  ;'       g    RVP                  ;'       g&    RP!                  VP"                  ;'       g    . 4      4      NKq  	  ppTV P$                  ;'       g    .  Uu. uFg  p/ \'        VP                  ;'       g    RVP(                  ;'       g    VP*                  ;'       g    R	4      CR
RVP                  ;'       g    R//CNKi  	  up,           #  ELo EL&u upi u upi 5i)r%   r)   r0   NzParallel extract: %d URL(s)T)rk   Úfull_contentrT   z

zextraction failedÚmetadataÚ	sourceURL)r   r   ÚasyncioÚ	to_threadr
   rV   rW   Úlenr7   rX   Úextractr\   r	   r]   r^   rr   r_   r`   Úerrorsr   ÚcontentÚ
error_type)ra   rc   r\   Úerk   s       €r   rd   Ú0ParallelWebSearchProvider.extract.<locals>._bodyG   s¬  øé € Ü˜:¤|Ð4FÓ'G×HÒ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ð  wMð  KMð  wMó  Nñ  wMÐqr”x §¡§ ¨¨Q¯W©W¯]¨]¸¸A¿N¹N×<kÐ<kÈfÏkÉkÐZ[×ZdÑZd×ZjÐZjÐhjÓNkÖlñ  wMˆGð  NØà!Ÿ™×.Ð.¨BÐ.óá.�Að F”:˜aŸe™eŸk˜k r¨1¯9©9×+[Ð+[¸¿¹×+[Ð+[ÐH[Ó\ð  FÐ^hÐkvÐxy×x}Ñx}÷  yDð  yDð  BDð  kEô  FÙ.ñõ ð ò	 fâ[ùò Nùòùs   ƒAGÁF3ÁAGÂF6ÂGÂ(GÂ-F9Ã
F9ÃF9Ã4F9ÄF9Ä"GÄ8GÄ=F>ÅF>Å0F>ÆF>Æ 
F>Æ*
GÆ6GÆ9
Gr0   Trf   N)r   rV   )rh   rk   rl   rd   s   &f, r   rx   Ú!ParallelWebSearchProvider.extractF   s+   øé € ÷
	ð 
	ô ' z´6¸4ÀÈDÔQ×QÐQÑQùs   ƒ!+¤)¥+c               ó   € V ^8„  d   QhRR/# rN   r   )r   s   "r   r   rK   U   s   € ÷ 
ñ 
 .ñ 
r   c                	ó"   € \        R RRRRR7      # )r0   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   )rh   s   &r   Úget_setup_schemaÚ*ParallelWebSearchProvider.get_setup_schemaU   s!   € Ü%ØÐ*Ð,Að BØô
ð 	
r   r   N)é   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚNAMEÚDISPLAY_NAMEÚKEY_ENVÚEXTRACTÚKEYLESSrY   rx   rƒ   Ú__static_attributes__r   r   r   rE   rE   /   s3   † Ù6à€DØ€LØ €GØ€GØ€G÷?õR÷
ñ 
r   rE   )"rŠ   Ú
__future__r   ru   Úloggingr>   Útypingr   r   r   Úplugins.web._commonr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Ú	getLoggerr†   rV   r*   r+   r2   r7   rC   rE   r   r   r   Ú<module>r–      sl   ðñõ #ã Û Û 	ß "Ñ "÷÷ ÷ ÷ ð
 
×	Ò	˜8Ó	$€àg€õ_õ3õ>õJô
+
Ð 5ö +
r   