+
    kHàjt  ã                  óÌ   € R t ^ RIHt ^ RIt^ RIHtHtHt ^ RI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Ht ]P4                  ! ]4      tRtR R lt ! R	 R
]4      tR# )uæ   Keenable (https://keenable.ai) web search + fetch â€” keyless-ring member.

Env: ``KEENABLE_API_KEY`` (optional; keyless free tier works without it).
Config: ``web.provider_tier.keenable: free|paid`` pins the tier (unset = auto).
)ÚannotationsN)ÚAnyÚDictÚList)Úrequests_verify)ÚSEARCH_LIMIT_CAPÚBaseWebSearchProviderÚdocumentÚhttp_status_detailÚkeyless_extractÚkeyless_searchÚkeyless_variant_schemaÚ
page_errorÚprovider_envÚrun_extractÚ
run_searchÚsearch_failÚ	search_okÚuse_keylessÚweb_hitzhttps://api.keenable.aic               ó    € V ^8„  d   QhRRRR/# )é   Úapi_keyÚstrÚreturnzdict[str, str]© )Úformats   "ÚB/home/ubuntu/.hermes/hermes-agent/plugins/web/keenable/provider.pyÚ__annotate__r      s   € ÷ ñ ˜sð  ~ñ ó    c                ó.   € R R/pV '       d	   RV  2VR&   V# )zX-Keenable-Titlezhermes-agentzBearer ÚAuthorizationr   )r   Úheaderss   & r   Ú_keenable_headersr#      s%   € à! >Ð2€GßØ%,¨W¨IÐ#6ˆ�Ñ Ø€Nr   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# )ÚKeenableWebSearchProviderz6Keenable search + extract provider (keyed or keyless).ÚkeenableÚKeenableÚKEENABLE_API_KEYTc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úqueryr   ÚlimitÚintr   údict[str, Any]r   )r   s   "r   r   Ú&KeenableWebSearchProvider.__annotate__)   s&   € ÷ Qñ Q˜Cð Q¨ð Q°Nñ Q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   r-   r   )r   s   "r   r   Ú6KeenableWebSearchProvider.search.<locals>.__annotate__*   s   € ÷ 	ñ 	�~ñ 	r   c                 ó(  <€ \        R 4      p \        RV 4      '       d   \        RRSS\        4      # ^ RIp\        P                  RSS4       VP                  \         R2RSR\        \        ^\        S4      4      \        4      /\        V 4      ^\        4       R7      pVP                  R	8¼  d   \        R
\!        V4       24      # \#        \%        VP'                  4       P)                  R4      ;'       g    . 4       UUu. uF~  w  r4\+        VP)                  R4      ;'       g    RVP)                  R4      ;'       g    RVP)                  R4      ;'       g    VP)                  R4      ;'       g    RV^,           4      NK€  	  upp4      # u uppi )r(   r&   r'   Nz Keenable search: '%s' (limit=%d)z
/v1/searchr*   Úmax_results)Újsonr"   ÚtimeoutÚverifyé�  zKeenable search failed: ÚresultsÚurlÚ ÚtitleÚsnippetÚdescription)r   r   r   ÚloggerÚrequestsÚinfoÚpostÚ_KEENABLE_API_URLÚminÚmaxr,   r   r#   r   Ústatus_coder   r
   r   Ú	enumerater5   Úgetr   )r   r@   ÚresponseÚiÚrr+   r*   s        €€r   Ú_bodyÚ/KeenableWebSearchProvider.search.<locals>._body*   sa  ø€ Ü"Ð#5Ó6ˆGÜ˜: w×/Ò/Ü% j°*¸eÀUÌFÓSÐSÛä�K‰KÐ:¸EÀ5ÔIð  —}‘}Ü$Ð% ZÐ0Ø˜u m´S¼¸QÄÀEÃ
Ó9KÔM]Ó5^Ð_Ü)¨'Ó2¸BÄÓGXð %ó ˆHð
 ×#Ñ# sÔ*Ü"Ð%=Ô>PÐQYÓ>ZÐ=[Ð#\Ó]Ð]Üä% h§m¡m£o×&9Ñ&9¸)Ó&D×&JÐ&JÈÔKôáK‘D�Aô ˜Ÿ™˜e›×*Ð*¨¨A¯E©E°'«N×,@Ð,@¸bÀ!Ç%Á%È	ÓBR×BpÐBpÐVW×V[ÑV[Ð\iÓVj×BpÐBpÐnpÐrsÐvwÕrwÖxÙKòó ð ùó s   Ä#F
Ä&F
Å F
ÅF
Å3F
r'   F©Úverbatim_value_error)r   r?   )Úselfr*   r+   rL   s   &ff r   ÚsearchÚ KeenableWebSearchProvider.search)   s    ù€ ÷	ñ 	ô* ˜*¤f¨eÈ%ÔPÐPr   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   r.   A   s'   € ÷ Xñ X˜Ið X°ð XÐ9Mñ Xr   c                	ó>   a€ R  V3R llp\        R\        SVRR7      # )c               ó   € V ^8„  d   QhRR/# )r   r   rV   r   )r   s   "r   r   Ú7KeenableWebSearchProvider.extract.<locals>.__annotate__B   s   € ÷ 	ñ 	Ð+ñ 	r   c            
     óÐ  <€ \        R 4      p \        RV 4      '       d   \        RRS\        4      # ^ RIp\        P                  R\        S4      4       . pS FÒ  p VP                  \         R2RV/\        V 4      ^\        4       R7      pVP                  R8¼  d   \        \        V4      4      hVP                  4       pTP                  \!        VP                  R4      ;'       g    TVP                  R	4      ;'       g    R
VP                  R4      ;'       g    R
VR7      4       KÔ  	  V#   \"         d+   pTP                  \%        TRT 24      4        Rp?EK  Rp?ii ; i)r(   r&   r'   NzKeenable extract: %d URL(s)z	/v1/fetchr:   )Úparamsr"   r6   r7   r8   r<   r;   Úcontent)Ú
source_urlzKeenable extract failed: )r   r   r   r?   r@   rA   ÚlenrH   rC   r#   r   rF   Ú
ValueErrorr
   r5   Úappendr	   Ú	Exceptionr   )r   r@   r9   r:   rI   ÚdataÚexcrT   s          €r   rL   Ú0KeenableWebSearchProvider.extract.<locals>._bodyB   s_  ø€ Ü"Ð#5Ó6ˆGÜ˜: w×/Ò/Ü& z°:¸tÄVÓLÐLÛÜ�K‰KÐ5´s¸4³yÔAØ,.ˆGÛ�ðWØ'Ÿ|™|Ô/@Ð.AÀÐ,KÐUZÐ\_ÐT`Ôj{ð  }Dó  kEð  OQô  Zió  Zk˜|ó   l�HØ×+Ñ+¨sÔ2Ü(Ô);¸HÓ)EÓFÐFØ#Ÿ=™=›?�DØ—N‘N¤8¨D¯H©H°U«O×,BÐ,B¸sÀDÇHÁHÈWÓDU×D[ÐD[ÐY[Ð]a×]eÑ]eÐfoÓ]p×]vÐ]vÐtvð  DGô  $Hö  Iñ ð ˆNøô !ô WØ—N‘N¤:¨cÐ5NÈsÈeÐ3TÓ#U×VÓVûðWús+   ÁBD0Ã)D0ÄD0ÄD0Ä0E%Ä;E Å E%r'   FrN   )r   r?   )rP   rT   rU   rL   s   &f, r   ÚextractÚ!KeenableWebSearchProvider.extractA   s#   ø€ ÷	ð 	ô$ ˜:¤v¨t°UÐQVÔWÐWr   c               ó   € V ^8„  d   QhRR/# r1   r   )r   s   "r   r   r.   V   s   € ÷ 
ñ 
 .ñ 
r   c                	ó"   € \        R RRRRR7      # )r'   r(   zhttps://keenable.aiua   Independent web index for AI apps â€” fast search + page fetch on Keenable's anonymous free tier.zZIndependent web index for AI apps. Keyed access with higher limits and guaranteed service.)Úfree_tagÚpaid_tag)r   )rP   s   &r   Úget_setup_schemaÚ*KeenableWebSearchProvider.get_setup_schemaV   s   € Ü%ØÐ*Ð,AØxØqô
ð 	
r   r   N)é   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚNAMEÚDISPLAY_NAMEÚKEY_ENVÚEXTRACTÚKEYLESSrQ   re   rk   Ú__static_attributes__r   r   r   r%   r%       s4   † Ù@à€DØ€LØ €GØ€GØ€G÷Qõ0X÷*
ñ 
r   r%   ) rr   Ú
__future__r   ÚloggingÚtypingr   r   r   Úagent.ssl_verifyr   Úplugins.web._commonr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Ú	getLoggerrn   r?   rC   r#   r%   r   r   r   Ú<module>r      s^   ðñõ #ã ß "Ñ "å ,÷÷ ÷ ÷ ñ ð
 
×	Ò	˜8Ó	$€à-Ð õô;
Ð 5ö ;
r   