Ë
    âß²jÛ  ã                  óÈ   — d Z ddlm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mZ  ej0                  e«      ZdZdd„Z G d„ d	e
«      Zd
diZd„ Zy)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)Ú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                ó"   — ddi}| rd| › �|d<   |S )NzX-Keenable-Titlezhermes-agentzBearer ÚAuthorization© )Úapi_keyÚheaderss     úB/home/ubuntu/.hermes/hermes-agent/plugins/web/keenable/provider.pyÚ_keenable_headersr      s%   € à! >Ð2€GÙØ%,¨W¨IÐ#6ˆ�Ñ Ø€Nó    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	)ÚKeenableWebSearchProviderz6Keenable search + extract provider (keyed or keyless).ÚkeenableÚKeenableÚKEENABLE_API_KEYTc                ó:   ‡‡— dˆˆfd„}t        dt        |d¬«      S )Nc                 ó¾  •— t        d«      } t        d| «      rt        dd‰‰t        «      S dd l}t        j                  d‰‰«       |j                  t        › d�‰t        t        dt        ‰«      «      t        «      dœt        | «      d	¬
«      }|j                  dk\  rt        dt        |«      › �«      S t!        t#        |j%                  «       j'                  d«      xs g «      D ��cg c]b  \  }}t)        |j'                  d«      xs d|j'                  d«      xs d|j'                  d«      xs |j'                  d«      xs d|dz   «      ‘Œd c}}«      S c c}}w )Nr"   r    r!   r   z Keenable search: '%s' (limit=%d)z
/v1/searché   )ÚqueryÚmax_resultsé   )Újsonr   Útimeouté�  zKeenable search failed: ÚresultsÚurlÚ ÚtitleÚsnippetÚdescription)r   r   r   ÚloggerÚrequestsÚinfoÚpostÚ_KEENABLE_API_URLÚminÚmaxÚintr   r   Ústatus_coder   r
   r   Ú	enumerater)   Úgetr   )r   r3   ÚresponseÚiÚrÚlimitr&   s        €€r   Ú_bodyz/KeenableWebSearchProvider.search.<locals>._body(   sA  ø€ Ü"Ð#5Ó6ˆGÜ˜: wÔ/Ü% j°*¸eÀUÌFÓSÐSÛÜ�K‰KÐ:¸EÀ5ÔIØ—}‘}Ü$Ð% ZÐ0Ø$´S¼¸QÄÀEÃ
Ó9KÔM]Ó5^Ñ_Ü)¨'Ó2¸Bð %ó ˆHð
 ×#Ñ# sÒ*Ü"Ð%=Ô>PÐQYÓ>ZÐ=[Ð#\Ó]Ð]Üä% h§m¡m£o×&9Ñ&9¸)Ó&DÒ&JÈÓK÷á�A�qô ˜Ÿ™˜e›Ò*¨¨A¯E©E°'«NÒ,@¸bÀ!Ç%Á%È	ÓBRÒBpÐVW×V[ÑV[Ð\iÓVjÒBpÐnpÐrsÐvwÑrwÕxóó ð ùó s   Ã*A'E
r!   F©Úverbatim_value_error©ÚreturnúDict[str, Any])r   r2   )Úselfr&   r@   rA   s    `` r   Úsearchz KeenableWebSearchProvider.search'   s   ù€ ö	ô$ ˜*¤f¨eÈ%ÔPÐPr   c                ó8   ‡— dˆfd„}t        dt        ‰|d¬«      S )Nc            
     ó~  •— t        d«      } t        d| «      rt        dd‰t        «      S dd l}t        j                  dt        ‰«      «       g }‰D ]´  }	 |j                  t        › d�d|it        | «      d¬	«      }|j                  d
k\  rt        t        |«      «      ‚|j                  «       }|j                  t        |j                  d«      xs ||j                  d«      xs d|j                  d«      xs d|¬«      «       Œ¶ |S # t         $ r(}|j                  t#        |d|› �«      «       Y d }~Œåd }~ww xY w)Nr"   r    r!   r   zKeenable extract: %d URL(s)z	/v1/fetchr-   r(   )Úparamsr   r*   r+   r/   r.   Úcontent)Ú
source_urlzKeenable extract failed: )r   r   r   r2   r3   r4   Úlenr<   r6   r   r:   Ú
ValueErrorr
   r)   Úappendr	   Ú	Exceptionr   )r   r3   r,   r-   r=   ÚdataÚexcÚurlss          €r   rA   z0KeenableWebSearchProvider.extract.<locals>._body=   sL  ø€ Ü"Ð#5Ó6ˆGÜ˜: wÔ/Ü& z°:¸tÄVÓLÐLÛÜ�K‰KÐ5´s¸4³yÔAØ,.ˆGØò W�ðWØ'Ÿ|™|Ô/@Ð.AÀÐ,KÐUZÐ\_ÐT`Ôj{ð  }Dó  kEð  OQ˜|ó   R�HØ×+Ñ+¨sÒ2Ü(Ô);¸HÓ)EÓFÐFØ#Ÿ=™=›?�DØ—N‘N¤8¨D¯H©H°U«OÒ,B¸sÀDÇHÁHÈWÓDUÒD[ÐY[Ð]a×]eÑ]eÐfoÓ]pÒ]vÐtvð  DGô  $Hõ  IðWð ˆNøô !ò WØ—N‘N¤:¨cÐ5NÈsÈeÐ3TÓ#U×VÑVûðWús   ÁB1DÄ	D<ÄD7Ä7D<r!   FrB   )rE   úList[Dict[str, Any]])r   r2   )rG   rT   ÚkwargsrA   s    `  r   Úextractz!KeenableWebSearchProvider.extract<   s   ø€ õ	ô$ ˜:¤v¨t°UÐQVÔWÐWr   c                ó"   — t        ddddd¬«      S )Nr!   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   )rG   s    r   Úget_setup_schemaz*KeenableWebSearchProvider.get_setup_schemaQ   s   € Ü%ØÐ*Ð,AØxØqô
ð 	
r   N)é   )r&   Ústrr@   r9   rE   rF   )rT   z	List[str]rV   r   rE   rU   rD   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚNAMEÚDISPLAY_NAMEÚKEY_ENVÚEXTRACTÚKEYLESSrH   rW   r[   r   r   r   r   r      s/   „ Ù@à€DØ€LØ €GØ€GØ€GôQó*Xô*
r   r   ÚWebSearchProvider)zagent.web_search_providerrg   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_oncer%   )	Ú_PLUGIN_COMPAT_LAZYr<   ÚAttributeErrorr^   Ú	importlibÚhermes_cli.plugin_compatri   ÚgetattrÚimport_module)ÚnameÚtargetrl   ri   s       r   Ú__getattr__rr   d   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]   rE   zDict[str, str]) ra   Ú
__future__r   ÚloggingÚtypingr   r   r   Úplugins.web._commonr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Ú	getLoggerr^   r2   r6   r   r   rj   rr   r   r   r   ú<module>rx      st   ðñõ #ã ß "Ñ "÷÷ ÷ ÷ ñ ð
 
ˆ×	Ñ	˜8Ó	$€à-Ð óô8
Ð 5ô 8
ðD ÐKðÐ ó
Br   