1111import secrets
1212import uuid
1313from contextlib import contextmanager
14- from typing import Dict , Generator , Optional , Tuple
14+ from typing import Any , Dict , Generator , List , Optional , Tuple
1515from urllib .parse import urlparse
1616
1717import boto3
@@ -289,6 +289,9 @@ def start(
289289 name : Optional [str ] = None ,
290290 session_timeout_seconds : Optional [int ] = DEFAULT_SESSION_TIMEOUT ,
291291 viewport : Optional [Dict [str , int ]] = None ,
292+ proxy_configuration : Optional [Dict [str , Any ]] = None ,
293+ extensions : Optional [List [Dict [str , Any ]]] = None ,
294+ profile_configuration : Optional [Dict [str , Any ]] = None ,
292295 ) -> str :
293296 """Start a browser sandbox session.
294297
@@ -302,6 +305,15 @@ def start(
302305 Range: 1-28800 (8 hours). Default: 3600 (1 hour).
303306 viewport (Optional[Dict[str, int]]): The viewport dimensions:
304307 {'width': 1920, 'height': 1080}
308+ proxy_configuration (Optional[Dict[str, Any]]): Proxy configuration for
309+ routing browser traffic through external proxy servers. See
310+ https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/browser-proxies.html
311+ extensions (Optional[List[Dict[str, Any]]]): List of browser extensions to
312+ load into the session. Each extension specifies an S3 location:
313+ [{"location": {"s3": {"bucket": "...", "prefix": "..."}}}]
314+ profile_configuration (Optional[Dict[str, Any]]): Profile configuration for
315+ persisting browser state across sessions:
316+ {"profileIdentifier": "my-profile-id"}
305317
306318 Returns:
307319 str: The session ID of the newly created session.
@@ -316,6 +328,20 @@ def start(
316328 ... viewport={'width': 1920, 'height': 1080},
317329 ... session_timeout_seconds=7200 # 2 hours
318330 ... )
331+ >>>
332+ >>> # Use proxy configuration
333+ >>> session_id = client.start(
334+ ... proxy_configuration={
335+ ... "proxies": [{
336+ ... "externalProxy": {
337+ ... "server": "proxy.example.com",
338+ ... "port": 8080,
339+ ... "domainPatterns": [".example.com"],
340+ ... }
341+ ... }],
342+ ... "bypass": {"domainPatterns": [".amazonaws.com"]}
343+ ... }
344+ ... )
319345 """
320346 self .logger .info ("Starting browser session..." )
321347
@@ -328,6 +354,15 @@ def start(
328354 if viewport is not None :
329355 request_params ["viewPort" ] = viewport
330356
357+ if proxy_configuration is not None :
358+ request_params ["proxyConfiguration" ] = proxy_configuration
359+
360+ if extensions is not None :
361+ request_params ["extensions" ] = extensions
362+
363+ if profile_configuration is not None :
364+ request_params ["profileConfiguration" ] = profile_configuration
365+
331366 response = self .data_plane_client .start_browser_session (** request_params )
332367
333368 self .identifier = response ["browserIdentifier" ]
@@ -581,14 +616,25 @@ def release_control(self):
581616
582617@contextmanager
583618def browser_session (
584- region : str , viewport : Optional [Dict [str , int ]] = None , identifier : Optional [str ] = None
619+ region : str ,
620+ viewport : Optional [Dict [str , int ]] = None ,
621+ identifier : Optional [str ] = None ,
622+ proxy_configuration : Optional [Dict [str , Any ]] = None ,
623+ extensions : Optional [List [Dict [str , Any ]]] = None ,
624+ profile_configuration : Optional [Dict [str , Any ]] = None ,
585625) -> Generator [BrowserClient , None , None ]:
586626 """Context manager for creating and managing a browser sandbox session.
587627
588628 Args:
589629 region (str): AWS region.
590630 viewport (Optional[Dict[str, int]]): Viewport dimensions.
591631 identifier (Optional[str]): Browser identifier (system or custom).
632+ proxy_configuration (Optional[Dict[str, Any]]): Proxy configuration for
633+ routing browser traffic through external proxy servers.
634+ extensions (Optional[List[Dict[str, Any]]]): List of browser extensions
635+ to load into the session.
636+ profile_configuration (Optional[Dict[str, Any]]): Profile configuration
637+ for persisting browser state across sessions.
592638
593639 Yields:
594640 BrowserClient: An initialized and started browser client.
@@ -602,13 +648,26 @@ def browser_session(
602648 >>> with browser_session('us-west-2', identifier='my-signed-browser') as client:
603649 ... # Automation with reduced CAPTCHA friction
604650 ... pass
651+ ...
652+ >>> # Use proxy configuration
653+ >>> with browser_session('us-west-2', proxy_configuration={
654+ ... "proxies": [{"externalProxy": {"server": "proxy.corp.com", "port": 8080}}],
655+ ... "bypass": {"domainPatterns": [".amazonaws.com"]}
656+ ... }) as client:
657+ ... ws_url, headers = client.generate_ws_headers()
605658 """
606659 client = BrowserClient (region )
607660 start_kwargs = {}
608661 if viewport is not None :
609662 start_kwargs ["viewport" ] = viewport
610663 if identifier is not None :
611664 start_kwargs ["identifier" ] = identifier
665+ if proxy_configuration is not None :
666+ start_kwargs ["proxy_configuration" ] = proxy_configuration
667+ if extensions is not None :
668+ start_kwargs ["extensions" ] = extensions
669+ if profile_configuration is not None :
670+ start_kwargs ["profile_configuration" ] = profile_configuration
612671
613672 client .start (** start_kwargs )
614673
0 commit comments