Ë
    áß²jH  ã                  ón   — d Z ddlmZ ddlZddlZddlmZmZmZ ddl	m
Z
 d
d„Z G d„ de
«      Zdd	lmZ y)ay  Web Search Provider ABC.

The single plugin-facing surface every web provider (brave-free, ddgs, searxng,
exa, parallel, tavily, keenable, firecrawl) implements; registered via
``PluginContext.register_web_search_provider()`` and selected by
``web.search_backend`` / ``web.extract_backend`` / ``web.backend``.

Response shapes (legacy contract, the tool wrapper does not translate)::

    search:  {"success": True, "data": {"web": [{"title", "url", "description", "position"}, ...]}}
    extract: {"success": True, "data": [{"url", "title", "content", "raw_content", "metadata"}, ...]}
    failure: {"success": False, "error": str}
é    )ÚannotationsN)ÚAnyÚDictÚList)ÚProviderBasec                óš   — 	 ddl m}  || «      }|€t        j                  | d«      }|xs dj                  «       S # t        $ r d}Y Œ9w xY w)aw  Config-aware env lookup (``os.environ`` first, then ``~/.hermes/.env``) so
    credentials set through the config layer are visible in gateway sessions /
    delegate children / subprocess runs. Stripped value, or ``""`` when unset.

    Falls back to a bare ``os.getenv`` when the config module is unavailable (stripped installs, early
    import contexts). See #40190.
    r   )Úget_env_valueNÚ )Úhermes_cli.configr	   Ú	ExceptionÚosÚgetenvÚstrip)Únamer	   Úvals      ú>/home/ubuntu/.hermes/hermes-agent/agent/web_search_provider.pyÚget_provider_envr      sT   € ðÝ3á˜DÓ!ˆð €{Ü�i‰i˜˜bÓ!ˆØŠI�2×ÑÓÐøô	 ò ØŠðús   ‚< ¼A
Á	A
c                  ó`   — e Zd ZdZej
                  d	d„«       Zd	d„Zd	d„Zd	d„Z	d
dd„Z
dd„Zy)ÚWebSearchProviderz¾Abstract base class for a web search/extract backend: implement :meth:`is_available`
    and at least one of :meth:`search` / :meth:`extract`; the ``supports_*`` flags route each capability.c                 ó   — y)uº   True when this provider can service calls. Cheap check only (env var, importable
        dep, instance URL) â€” NO network; runs at tool registration and on every ``hermes tools`` paint.N© ©Úselfs    r   Úis_availablezWebSearchProvider.is_available/   s   � ó    c                 ó   — y)z0True if this provider implements :meth:`search`.Tr   r   s    r   Úsupports_searchz!WebSearchProvider.supports_search4   s   € àr   c                 ó   — y)a`  True when this provider can serve calls WITHOUT credentials (public anonymous
        free tiers such as Exa / Parallel MCP); used only when NO provider is configured or
        keyed. Must never make :meth:`is_available` True, or the legacy preference walk would
        route keyed users onto a higher-priority backend's free tier. Cheap, no network.Fr   r   s    r   Úis_keyless_availablez&WebSearchProvider.is_keyless_available8   s   € ð
 r   c                 ó   — y)u   True if this provider implements :meth:`extract` (sync or ``async def`` â€”
        the dispatcher awaits coroutine functions).Fr   r   s    r   Úsupports_extractz"WebSearchProvider.supports_extract?   s   € ð r   c                ó2   — t        | j                  › d�«      ‚)z>Execute a web search. Callers gate on :meth:`supports_search`.z3 does not support search (override supports_search)©ÚNotImplementedErrorr   )r   ÚqueryÚlimits      r   ÚsearchzWebSearchProvider.searchD   s   € ä!Ø�y‰yˆkÐLÐMó
ð 	
r   c                ó2   — t        | j                  › d�«      ‚)a-  Extract content from URLs (callers gate on :meth:`supports_extract`); may be ``async def``.
        Returns ``[{"url", "title", "content", "raw_content", "metadata"?, "error"?}, ...]`` (``error``
        only on per-URL failure). Ignore unknown ``kwargs`` (``format``, ``include_raw``, ``max_chars``).z5 does not support extract (override supports_extract)r#   )r   ÚurlsÚkwargss      r   ÚextractzWebSearchProvider.extractJ   s    € ô "Ø�y‰yˆkÐNÐOó
ð 	
r   N)ÚreturnÚbool)é   )r%   Ústrr&   Úintr,   zDict[str, Any])r)   z	List[str]r*   r   r,   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚabcÚabstractmethodr   r   r   r!   r'   r+   r   r   r   r   r   +   s=   „ ñmð 	×Ñòmó ðmóóóô

ô
r   r   )ÚOptional)r   r/   r,   r/   )r4   Ú
__future__r   r5   r   Útypingr   r   r   Úagent.provider_baser   r   r   r7   r   r   r   ú<module>r;      s5   ðñõ #ã 
Û 	ß "Ñ "å ,óô&%
˜ô %
öX r   