
    `gjq(                        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
Z
ddlmZ  ej                  e      Z G d de      Zy)u!  Browserbase cloud browser provider — plugin form.

Subclasses :class:`agent.browser_provider.BrowserProvider` (the plugin-facing
ABC introduced in PR #25214). The legacy in-tree module
``tools.browser_providers.browserbase`` was removed in the same PR; this file
is now the canonical implementation.

Browserbase requires direct ``BROWSERBASE_API_KEY`` and ``BROWSERBASE_PROJECT_ID``
credentials. Managed Nous gateway support has been removed — the Nous
subscription now routes through Browser Use instead (see
``plugins/browser/browser_use/``).

Config keys this provider responds to::

    browser:
      cloud_provider: "browserbase"

Auth env vars::

    BROWSERBASE_API_KEY=...       # https://browserbase.com
    BROWSERBASE_PROJECT_ID=...

Optional feature knobs::

    BROWSERBASE_BASE_URL=...      # default https://api.browserbase.com
    BROWSERBASE_PROXIES=true      # default true
    BROWSERBASE_ADVANCED_STEALTH=false
    BROWSERBASE_KEEP_ALIVE=true   # default true
    BROWSERBASE_SESSION_TIMEOUT=... (seconds, integer, max 21600 = 6h)
    )annotationsN)AnyDictOptional)BrowserProviderc                  l    e Zd ZdZedd       Zedd       ZddZddZddZ	ddZ
ddZdd	Zdd
Zy)BrowserbaseBrowserProvideru   Browserbase (https://browserbase.com) cloud browser backend.

    Direct credentials only — managed-Nous-gateway support lives on the
    Browser Use provider now.
    c                     y)Nbrowserbase selfs    W/root/.hermes/venv/lib/python3.12/site-packages/plugins/browser/browserbase/provider.pynamezBrowserbaseBrowserProvider.name5           c                     y)NBrowserbaser   r   s    r   display_namez'BrowserbaseBrowserProvider.display_name9   r   r   c                &    | j                         d uS N)_get_config_or_noner   s    r   is_availablez'BrowserbaseBrowserProvider.is_available=   s    '')55r   c                    t         j                  j                  d      }t         j                  j                  d      }|r5|r3||t         j                  j                  dd      j                  d      dS y )NBROWSERBASE_API_KEYBROWSERBASE_PROJECT_IDBROWSERBASE_BASE_URLzhttps://api.browserbase.com/)api_key
project_idbase_url)osenvirongetrstrip)r   r   r    s      r   r   z.BrowserbaseBrowserProvider._get_config_or_noneD   sa    **..!67ZZ^^$<=
z"(JJNN*,I&+  r   c                @    | j                         }|t        d      |S )NzZBrowserbase requires BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID environment variables.)r   
ValueError)r   configs     r   _get_configz&BrowserbaseBrowserProvider._get_configQ   s.    ))+>)  r   c                
   | j                         }t        j                  j                  dd      j	                         dk7  }t        j                  j                  dd      j	                         dk(  }t        j                  j                  dd      j	                         dk7  }t        j                  j                  d      }dddddd	}d
|d   i}|rd|d<   |r	 t        |      }	|	dkD  r|	|d<   |rd|d<   |rddi|d<   d|d   d}
	 t        j                  |d    d|
|d      }d}d}|j                  dk(  r|rHd}t        j                  d       |j                  dd        t        j                  |d    d|
|d      }|j                  dk(  rJ|rHd}t        j                  d       |j                  dd        t        j                  |d    d|
|d      }|j                  s%t        d|j                   d|j                          |j#                         }d | d!t%        j&                         j(                  d d"  }|r|sd|d<   |rd|d#<   |r|sd|d$<   |r	d|v rd|d%<   d&j+                  d' |j-                         D              }t        j/                  d(||       ||d)   |d*   |d+S # t        $ r t        j                  d|       Y w xY w# t        j                  $ r}t        d|       |d }~ww xY w),NBROWSERBASE_PROXIEStruefalseBROWSERBASE_ADVANCED_STEALTHBROWSERBASE_KEEP_ALIVEBROWSERBASE_SESSION_TIMEOUTTF)basic_stealthproxiesadvanced_stealth
keep_alivecustom_timeout	projectIdr    	keepAliver   timeoutz-Invalid BROWSERBASE_SESSION_TIMEOUT value: %sr2   advancedStealthbrowserSettingsapplication/jsonr   )Content-TypeX-BB-API-Keyr!   z/v1/sessions   headersjsonr8   i  zhkeepAlive may require paid plan (402), retrying without it. Sessions may timeout during long operations.zYProxies unavailable (402), retrying without proxies. Bot detection may be less effective.z#Browserbase API connection failed: z&Failed to create Browserbase session:  hermes__   r3   r4   r5   z, c              3  ,   K   | ]  \  }}|s	|  y wr   r   ).0kvs      r   	<genexpr>z<BrowserbaseBrowserProvider.create_session.<locals>.<genexpr>   s     Lda!Ls   
z0Created Browserbase session %s with features: %sid
connectUrl)session_namebb_session_idcdp_urlfeatures)r)   r"   r#   r$   lowerintr'   loggerwarningrequestspoststatus_codepopRequestExceptionRuntimeErroroktextrA   uuiduuid4hexjoinitemsinfo)r   task_idr(   enable_proxiesenable_advanced_stealthenable_keep_alivecustom_timeout_msfeatures_enabledsession_configtimeout_valr@   responseproxies_fallbackkeepalive_fallbackexcsession_datarM   feature_strs                     r   create_sessionz)BrowserbaseBrowserProvider.create_session^   s   !!# (=vFLLNRYYJJNN97CIIKvU 	  JJNN3V<BBDO 	 JJNN+HI " %#
 .9&:N,O*.N;'!"34?0;N9- (,N9%"1BD0IN,- /"9-

+	}}*%&l3#	H  %!& ##s*$)-&NNG #&&{D9'}}!*-.l; '+ "	 H ''3.>'+$NN? #&&y$7'}}!*-.l; '+ "	 H {{8''((--: 
  }} 	4::<+;+;BQ+?*@A"2*.Y'"37/0%7-1\*n!<15-.iiL.>.D.D.FLL>k	

 ))$/#L1(	
 	
k  CEVr (( 	5cU;	s+   J5 
CK 5KKL.K==Lc                   	 | j                         }	 t	        j
                  |d    d| |d   dd|d   d	d
d      }|j                  dv rt        j                  d|       yt        j                  d||j                  |j                  d d        y# t        $ r t        j                  d|       Y yw xY w# t        $ r!}t        j                  d||       Y d }~yd }~ww xY w)Nu;   Cannot close Browserbase session %s — missing credentialsFr!   /v1/sessions/r   r;   r=   r<   r    REQUEST_RELEASEr6   status
   r?   >            z*Successfully closed Browserbase session %sTz(Failed to close session %s: HTTP %s - %sry   z,Exception closing Browserbase session %s: %s)r)   r'   rS   rT   rU   rV   rW   debugr\   	Exceptionerror)r   
session_idr(   rk   es        r   close_sessionz(BrowserbaseBrowserProvider.close_session   s    	%%'F	}}*%&mJ<@$*9$5$6
 "(!5/ H ##6I:V>((MM$3'	 ;  	NNMz 		<  	LLGUVW	s/   B AB: %/B: B76B7:	C$CC$c                   | j                         }|t        j                  d|       y 	 t        j                  |d    d| |d   dd|d   dd	d
       y # t
        $ r!}t        j                  d||       Y d }~y d }~ww xY w)NuG   Cannot emergency-cleanup Browserbase session %s — missing credentialsr!   rs   r   r;   rt   r    ru   rv      r?   z7Emergency cleanup failed for Browserbase session %s: %s)r   rS   rT   rU   rV   r}   r|   )r   r   r(   r   s       r   emergency_cleanupz,BrowserbaseBrowserProvider.emergency_cleanup   s    ))+>NNY 	MM*%&mJ<@$*9$5$6
 "(!5/   	LLI:WX 	s   -A 	B"A>>Bc                $    ddddddddd	d
gddS )Nr   paidz&Cloud browser with stealth and proxiesr   zBrowserbase API keyzhttps://browserbase.com)keyprompturlr   zBrowserbase project ID)r   r   agent_browser)r   badgetagenv_vars
post_setupr   r   s    r   get_setup_schemaz+BrowserbaseBrowserProvider.get_setup_schema  s<    !; 134 46
 *
 	
r   N)returnstr)r   bool)r   zOptional[Dict[str, Any]])r   zDict[str, Any])rc   r   r   zDict[str, object])r   r   r   r   )r   r   r   None)__name__
__module____qualname____doc__propertyr   r   r   r   r)   rq   r   r   r   r   r   r   r	   r	   .   sU        6y
v#J4
r   r	   )r   
__future__r   loggingr"   r]   typingr   r   r   rU   agent.browser_providerr   	getLoggerr   rS   r	   r   r   r   <module>r      sD   > #  	  & &  2			8	${
 {
r   