Ë
    uPêj‹N  ã                   ó^  — U d 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l	Z	ddl
mZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZ dZeed<   dZeed<   dZeed<   dZeed<   dZeed<    ej>                  d«      Z eed<    ej>                  d«      Z!eed<   dZ"eed<   de#dejH                  e#   dz  fd„Z% e&h d£«      Z'eed<   de#de(fd „Z)d!ee#e*f   d"e#de#dz  fd#„Z+d!ee#e*f   defd$„Z,d%e*de-ee#e*f   d&f   fd'„Z.d(e*de-ee#e*f   d&f   fd)„Z/d*e#deee#e*f      fd+„Z0 G d,„ d-ee«      Z1y).a¿  
Calls an Amazon Bedrock AgentCore Gateway web-search target (MCP protocol) to search the web.

Web Search on Amazon Bedrock AgentCore exposes Amazon's managed web index through
an AgentCore Gateway MCP endpoint.

AWS docs: https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-connector-web-search-tool.html

Authentication (matches the gateway's inbound authorizer type):
- AWS_IAM gateway: the request is SigV4-signed. Credentials come from explicit
  params (aws_access_key_id / aws_secret_access_key / aws_session_token /
  aws_region_name, also settable in a proxy search_tools entry) or the
  standard AWS credential chain (env / profile / IRSA / assumed role)
- CUSTOM_JWT gateway: pass the OAuth2 bearer token (e.g. Cognito
  client_credentials) as api_key, or set AGENTCORE_GATEWAY_TOKEN

Setup:
    1. Create an AgentCore Gateway with a web-search connector target
    2. Set AGENTCORE_GATEWAY_URL (or pass api_base) to the gateway MCP endpoint, e.g.
       https://<gateway-id>.gateway.bedrock-agentcore.<region>.amazonaws.com/mcp
    3. AWS_IAM: ensure the credentials allow bedrock-agentcore:InvokeGateway
       CUSTOM_JWT: set AGENTCORE_GATEWAY_TOKEN (or pass api_key)

Usage:
    response = litellm.search(
        query="latest AI developments",
        search_provider="agentcore",
        max_results=5,
        aws_access_key_id="...",       # optional, omit to use the default chain
        aws_secret_access_key="...",
    )
é    N)ÚIteratorÚMappingÚSequence)ÚFinal)ÚLogging©ÚBaseLLMException)ÚBaseSearchConfigÚSearchResponseÚSearchResult)Ú
BaseAWSLLM)ÚBedrockError)Úget_secret_stréÈ   ÚAGENTCORE_MAX_QUERY_LENGTHé
   ÚAGENTCORE_DEFAULT_MAX_RESULTSzweb-search-tool___WebSearchÚAGENTCORE_DEFAULT_TOOL_NAMEÚ___WebSearchÚAGENTCORE_TOOL_NAME_SUFFIXz
2025-03-26Ú&AGENTCORE_DEFAULT_MCP_PROTOCOL_VERSIONzD[a-z0-9-]+\.gateway\.bedrock-agentcore\.([a-z0-9-]+)\.amazonaws\.comÚ_GATEWAY_HOST_PATTERNz\r?\n[ \t]*\r?\nÚ_SSE_EVENT_SEPARATOR)zevent:údata:ú:zid:zretry:Ú_SSE_LINE_PREFIXESÚapi_baseÚreturnc                 óf   — t         j                  t        j                  | «      j                  «      S ©N)r   Ú	fullmatchÚhttpxÚURLÚhost)r   s    úo/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/bedrock/search/transformation.pyÚ_gateway_host_matchr&   V   s"   € Ü ×*Ñ*¬5¯9©9°XÓ+>×+CÑ+CÓDÐDó    >   ú::1ú	127.0.0.1Ú	localhostÚ_LOOPBACK_HOSTSc                 ór   — t        j                  | «      }|j                  dk(  xs |j                  t        v S )NÚhttps)r"   r#   Úschemer$   r+   )r   Úurls     r%   Ú_credential_safe_transportr0   ]   s-   € Ü—‘˜8Ó$€CØ�:‰:˜Ñ Ò? C§H¡H´Ð$?Ð?r'   ÚitemÚkeysc                 ó2   ‡ ‡— t        ˆ ˆfd„|D «       d «      S )Nc              3   ól   •K  — | ]+  }t        ‰j                  |«      xŠt        «      sŒ%‰sŒ(‰–— Œ- y ­wr    ©Ú
isinstanceÚgetÚstr)Ú.0Úkeyr1   Úvalues     €€r%   ú	<genexpr>z _string_field.<locals>.<genexpr>d   s)   øè ø€ ÒT�3¤*°d·h±h¸s³mÐ-C¨UÄSÕ"IÊeŒÑTùs   ƒ&4ª4­4)Únext)r1   r2   r;   s   ` @r%   Ú_string_fieldr>   b   s   ù€ ÜÜT˜$ÔTØóð r'   c           
      óŽ   — t        t        | d«      xs dt        | d«      xs dt        | dd«      xs dt        | dd«      d ¬«      S )	NÚtitleÚ r/   ÚtextÚsnippetÚpublishedDateÚdate)r@   r/   rC   rE   Úlast_updated)r   r>   )r1   s    r%   Ú_to_search_resultrG   i   sM   € ÜÜ˜D 'Ó*Ò0¨bÜ˜$ Ó&Ò,¨"Ü˜d F¨IÓ6Ò<¸"Ü˜4 °&Ó9Øôð r'   Úparsed.c                 ó¼   — t        | t        «      r| j                  dd«      n| }t        |t        «      rt        |t        t
        f«      ryt        d„ |D «       «      S )NÚresults© c              3   óB   K  — | ]  }t        |t        «      sŒ|–— Œ y ­wr    )r6   r   )r9   r1   s     r%   r<   z _result_items.<locals>.<genexpr>w   s   è ø€ ÒE˜$¬:°d¼GÕ+D”ÑEùs   ‚˜)r6   r   r7   r   r8   ÚbytesÚtuple)rH   Úitemss     r%   Ú_result_itemsrP   s   sI   € Ü0:¸6Ä7Ô0K�6—:‘:˜i¨Ô,ÐQW€EÜ�eœXÔ&¬*°U¼SÄ%¸LÔ*IØÜÑE %ÔEÓEÐEr'   Úraw_textc                 ó˜   — t        | t        «      sy	 t        j                  | «      }t        |«      S # t        j                  $ r Y yw xY w)zê
    Parse one MCP text block into the search result objects it carries.

    A block holds either a JSON list of results or a {"results": [...]} object;
    anything unparseable is skipped rather than failing the whole response.
    rK   )r6   r8   ÚjsonÚloadsÚJSONDecodeErrorrP   )rQ   rH   s     r%   Ú_parse_result_itemsrV   z   sK   € ô �h¤Ô$ØðÜŸ
™
 8Ó,ˆô ˜Ó Ð øô ×Ñò Ùðús   “3 ³A	ÁA	rB   c              #   ó  K  — t         j                  | «      D ]V  }dj                  d„ |j                  «       D «       «      }|sŒ,	 t	        j
                  |«      }t        |t        «      sŒS|–— ŒX y# t        j                  $ r Y Œow xY w­w)a,  
    Yield the JSON payload of each SSE event in a Streamable HTTP MCP response.

    Per the SSE spec an event's data is the concatenation of all its ``data:``
    lines (joined with newlines), and a stream may carry several events, e.g.
    progress notifications before the JSON-RPC response.
    ú
c              3   óx   K  — | ]2  }|j                  d «      sŒ|t        d «      d j                  «       –— Œ4 y­w)r   N)Ú
startswithÚlenÚlstrip)r9   Úlines     r%   r<   z#_iter_sse_events.<locals>.<genexpr>“   s3   è ø€ Òu¸dÐ\`×\kÑ\kÐlsÕ\t˜D¤ W£ Ð0×7Ñ7×9Ñuùs   ‚:™!:N)	r   ÚsplitÚjoinÚ
splitlinesrS   rT   rU   r6   Údict)rB   ÚchunkÚpayloadrH   s       r%   Ú_iter_sse_eventsrd   Š   s‚   è ø€ ô &×+Ñ+¨DÓ1ò 	ˆØ—)‘)ÑuÀe×FVÑFVÓFXÔuÓuˆÙØð	Ü—Z‘Z Ó(ˆFô �fœdÕ#Ø‹Lñ	øô ×#Ñ#ò 	Ùð	üs0   ‚ABÁA2ÁBÁ+BÁ2BÂBÂBÂBc                   ó.  — e Zd Zdd„Zedefd„«       Z	 	 ddededz  dedz  dedef
d	„Z		 d dedz  d
edee
e   z  dz  dedef
d„Zdee
e   z  d
ededefd„Z	 d deeef   d
eeef   deeef   e
eeef      z  dededz  deeeef   edz  f   fd„Zededefd„«       Zededefd„«       Zdej(                  dededefd„Zdeeef   defd„Zedeeef   deeeef   df   fd„«       Zedej(                  deeef   fd„«       Zdedededefd„Zy)!ÚAgentCoreSearchConfigr   Nc                 óX   — t        j                  | «       t        j                  | «       y r    )r
   Ú__init__r   )Úselfs    r%   rh   zAgentCoreSearchConfig.__init__Ÿ   s   € Ü×!Ñ! $Ô'Ü×Ñ˜DÕ!r'   c                   ó   — y)NzWeb Search on Amazon BedrockrK   rK   r'   r%   Úui_friendly_namez&AgentCoreSearchConfig.ui_friendly_name£   s   € à-r'   ÚheadersÚapi_keyr   Úkwargsc                 ó8   — i |¥ddt        d«      xs t        dœ¥S )aq  
        Set MCP transport headers. Per the MCP Streamable HTTP transport spec,
        the client MUST accept both application/json and text/event-stream, and
        declare its protocol revision with MCP-Protocol-Version.

        Authentication itself happens in sign_request(): bearer token for
        CUSTOM_JWT gateways, AWS SigV4 for AWS_IAM gateways.
        zapplication/jsonz#application/json, text/event-streamÚAGENTCORE_MCP_PROTOCOL_VERSION)zContent-TypeÚAcceptzMCP-Protocol-Version)r   r   )ri   rl   rm   r   rn   s        r%   Úvalidate_environmentz*AgentCoreSearchConfig.validate_environment§   s0   € ð
Øð
à.Ø;Ü$2Ð3SÓ$Tò %6Ü5ò
ð 	
r'   Úoptional_paramsÚdatac                 ó>   — |xs t        d«      }|st        d«      ‚|S )NÚAGENTCORE_GATEWAY_URLz­AGENTCORE_GATEWAY_URL is not set. Set it to your AgentCore Gateway MCP endpoint (https://<gateway-id>.gateway.bedrock-agentcore.<region>.amazonaws.com/mcp) or pass api_base.)r   Ú
ValueError)ri   r   rs   rt   rn   Úgateway_urls         r%   Úget_complete_urlz&AgentCoreSearchConfig.get_complete_url¾   s1   € ð &ÒP¬Ð8OÓ)PˆÙÜð8óð ð
 Ðr'   Úqueryc           	      ó:  — t        |t        «      rdj                  |«      n|}|j                  d«      xs t	        d«      xs t
        }|j                  t        «      st        d|› dt        › d�«      ‚ddd	||d
t         |j                  dt        «      dœdœdœS )a  
        Transform Search request to an MCP tools/call request.

        Args:
            query: Search query (string or list of strings). AgentCore only
                supports single string queries; lists are joined with spaces.
            optional_params: Optional parameters for the request
                - max_results: Maximum number of results (1-25), default 10
                - tool_name: Override the MCP tool name of the gateway target

        Returns:
            Dict with the JSON-RPC 2.0 request body
        ú Ú	tool_nameÚAGENTCORE_SEARCH_TOOL_NAMEz$Invalid AgentCore search tool_name 'z': must end with 'z]' (a web-search connector tool). Other gateway tools cannot be invoked through this provider.z2.0é   z
tools/callNÚmax_results)rz   Ú
maxResults)ÚnameÚ	arguments)ÚjsonrpcÚidÚmethodÚparams)r6   Úlistr_   r7   r   r   Úendswithr   rw   r   r   )ri   rz   rs   rn   Újoined_queryr}   s         r%   Útransform_search_requestz.AgentCoreSearchConfig.transform_search_requestÎ   sÁ   € ô& 2<¸EÄ4Ô1H˜cŸh™h uœoÈeˆà×Ñ Ó,ò +ÜÐ:Ó;ò+ä*ð 	ð
 ×!Ñ!Ô"<Ô=ÜØ6°y°kð BÜ.Ð/ð 0OðOóð ð ØØ"à!à)Ð*EÔ+EÐFØ"1×"5Ñ"5°mÔEbÓ"cñññ	
ð 	
r'   Úrequest_datac                 óà  — t        |t        «      st        d«      ‚t        |«      st	        d|› d�«      ‚t        |«      }| j                  ||dd|r|nd¬«      }|r0i |¥dd	|› �i¥}|t        j                  |«      j                  «       fS |€ | j                  |«      st	        d
|› d�«      ‚|j                  d«      �|ni |¥d| j                  |«      i¥}	| j                  d||	||d¬«      S )a  
        Authenticate the MCP request.

        CUSTOM_JWT gateways: attach the caller's OAuth2 bearer token (api_key
        or AGENTCORE_GATEWAY_TOKEN), no AWS credentials involved.

        AWS_IAM gateways: SigV4-sign with the bedrock-agentcore service name.
        z3AgentCore search expects a single dict request bodyz?Refusing to send AgentCore credentials over plaintext HTTP to 'z‡': a bearer token or SigV4 signature would be readable in transit. Use an https gateway URL (plain http is allowed only for localhost).)ÚAGENTCORE_GATEWAY_TOKENrv   N)Úcaller_api_keyÚcaller_api_baseÚkey_env_varsÚbase_env_varÚdefault_api_baseÚAuthorizationzBearer z5Refusing to send SigV4-signed AgentCore requests to 'z—': it is neither an AgentCore gateway hostname nor the host in AGENTCORE_GATEWAY_URL. Set AGENTCORE_GATEWAY_URL to authorize a custom gateway hostname.Úaws_region_namezbedrock-agentcorerA   )Úservice_namerl   rs   rŒ   r   rm   )r6   ra   Ú	TypeErrorr0   rw   r&   Úresolve_server_api_keyrS   ÚdumpsÚencodeÚ_is_configured_gatewayr7   Ú_signing_regionÚ_sign_request)
ri   rl   rs   rŒ   r   rm   Úgateway_host_matchÚbearer_tokenÚbearer_headersÚsigning_paramss
             r%   Úsign_requestz"AgentCoreSearchConfig.sign_requestû   s\  € ô  ˜,¬Ô-ÜÐQÓRÐRä)¨(Ô3ÜØQÐRZÐQ[ð \>ð >óð ô %8¸Ó$AÐØ"×9Ñ9Ø"Ø$Ø5Ø0Ù);™XÀð :ó 
ˆñ ð%Øð%à 7¨<¨.Ð!9ñ%ˆNð "¤4§:¡:¨lÓ#;×#BÑ#BÓ#DÐDÐDàÐ%¨d×.IÑ.IÈ(Ô.SÜØGÈÀzð RPð Póð ð ×"Ñ"Ð#4Ó5ÐAñ ðØ!ðà! 4×#7Ñ#7¸Ó#Añð 	ð ×!Ñ!Ø,ØØ*Ø%ØØð "ó 
ð 	
r'   c                 óœ   — t        d«      }|syt        j                  |«      j                  t        j                  | «      j                  k(  S )Nrv   F)r   r"   r#   r$   )r   Ú
configureds     r%   r›   z,AgentCoreSearchConfig._is_configured_gatewayD  s<   € ä*Ð+BÓCˆ
ÙØÜ�y‰y˜Ó$×)Ñ)¬U¯Y©Y°xÓ-@×-EÑ-EÑEÐEr'   c                 ó    — t        | «      }|r|j                  d«      S ddl}|j                  «       j                  }|r|S t        d| › d�«      ‚)a  
        Resolve the SigV4 signing region, which must match the gateway's region.

        Standard gateway hostnames carry it, so callers don't have to set
        aws_region_name to a region different from their default. For custom or
        private hostnames, defer to the AWS configuration chain (env vars and
        the shared config / profile region), and error out when that yields
        nothing rather than silently signing for a guessed region the gateway
        would reject with a confusing auth error.
        r   r   Nz6Cannot derive the SigV4 signing region from api_base 'z–' or the AWS configuration chain. Set aws_region_name (or AWS_DEFAULT_REGION / a profile region) to the gateway's region when using a custom hostname.)r&   ÚgroupÚboto3ÚSessionÚregion_namerw   )r   Úmatchr§   Úconfigured_regions       r%   rœ   z%AgentCoreSearchConfig._signing_regionK  s`   € ô +¨8Ó4ˆÙØ—;‘;˜q“>Ð!ó
 	à#(§=¡=£?×#>Ñ#>ÐÙØ$Ð$ÜØDÀXÀJð OVð Vó
ð 	
r'   Úraw_responseÚlogging_objc                 ór  — | j                  |«      }|j                  d«      }|�+t        |j                  dk\  r|j                  ndd|› �¬«      ‚|j                  d«      }t	        |t
        «      rK|j                  d«      r:t        |j                  dk\  r|j                  ndd	| j                  |«      › �¬«      ‚t        d
„ | j                  |«      D «       «      }t	        |t        «      r|j                  d«      nd}|xs t        |«      }	|	D �
cg c]  }
t        |
«      ‘Œ }}
t        |d¬«      S c c}
w )aÜ  
        Transform an MCP tools/call response to LiteLLM unified SearchResponse.

        The gateway returns JSON-RPC (as plain JSON or a single-message SSE
        stream) whose result.content[] text blocks contain a JSON list of
        {title, url, date/publishedDate, text} entries. Web-search connector
        1.1.0 and later repeat that list in result.structuredContent, which is
        the only machine-readable copy when the text block holds prose instead.
        ÚerrorNi�  éö  zAgentCore gateway MCP error: ©Ústatus_codeÚmessageÚresultÚisErrorz!AgentCore web search tool error: c              3   ó^   K  — | ]%  }t        |j                  d «      «      D ]  }|–— Œ Œ' y­w©rB   N)rV   r7   )r9   Úblockr1   s      r%   r<   zBAgentCoreSearchConfig.transform_search_response.<locals>.<genexpr>Š  s:   è ø€ ò "
ØÔK^Ð_d×_hÑ_hÐioÓ_pÓKqò"
ØCGŒDð"
Øñ"
ùs   ‚+-ÚstructuredContentÚsearch)rJ   Úobject)Ú_parse_mcp_bodyr7   r   r²   r6   ra   Ú_tool_error_messagerN   Ú_text_blocksr   rP   rG   r   )ri   r¬   r­   rn   Úresponse_jsonr¯   r´   Ú
text_itemsÚ
structuredrO   r1   rJ   s               r%   Útransform_search_responsez/AgentCoreSearchConfig.transform_search_responsei  s?  € ð  $×3Ñ3°LÓAˆà$×(Ñ(¨Ó1ˆØÐÜØ8D×8PÑ8PÐTWÒ8W˜L×4Ò4Ð]`Ø7¸°wÐ?ôð ð &×)Ñ)¨(Ó3ˆÜ�fœdÔ#¨¯
©
°9Ô(=ÜØ8D×8PÑ8PÐTWÒ8W˜L×4Ò4Ð]`Ø;¸D×<TÑ<TÐUbÓ<cÐ;dÐeôð ô
 "ñ "
Ø"×/Ñ/°Ó>ô"
ó 
ˆ
ô @JÈ&ÔRYÔ?Z˜FŸJ™JÐ':Ô;Ð`dˆ
Ø!Ò>¤]°:Ó%>ˆà>CÖD°dÔ+¨DÕ1ÐDˆÐDä g°hÔ?Ð?ùò Es   ÄD4r¿   c                 ó¾   ‡— t        ˆfd„| j                  |«      D «       «      }|rdj                  |«      S t        j                  |j                  d«      «      d d S )Nc              3   óf   •K  — | ](  }t        |j                  d «      xŠt        «      sŒ%‰–— Œ* y­wr·   r5   )r9   r¸   rB   s     €r%   r<   z<AgentCoreSearchConfig._tool_error_message.<locals>.<genexpr>•  s2   øè ø€ ò 
ØÄ*ÐUZ×U^ÑU^Ð_eÓUfÐMfÈTÔhkÕBlŒDñ
ùs   ƒ&1ª1r|   r´   iô  )rN   r¾   r_   rS   r™   r7   )ri   r¿   ÚtextsrB   s      @r%   r½   z)AgentCoreSearchConfig._tool_error_message”  sY   ø€ Üó 
Ø"×/Ñ/°Ó>ô
ó 
ˆñ #(ˆs�x‰x˜‹ÐZ¬T¯Z©Z¸×8IÑ8IÈ(Ó8SÓ-TÐUYÐVYÐ-ZÐZr'   .c                 óÜ   — | j                  d«      }t        |t        «      r|j                  d«      nd }t        |t        «      rt        |t        t
        f«      ryt        d„ |D «       «      S )Nr´   ÚcontentrK   c              3   ól   K  — | ],  }t        |t        «      sŒ|j                  d «      dk(  sŒ)|–— Œ. y­w)ÚtyperB   N)r6   ra   r7   )r9   r¸   s     r%   r<   z5AgentCoreSearchConfig._text_blocks.<locals>.<genexpr>   s+   è ø€ Òk˜u´:¸eÄTÕ3JÈuÏyÉyÐY_ÓO`ÐdjÓOj”UÑkùs   ‚4˜4­4)r7   r6   ra   r   r8   rM   rN   )r¿   r´   rÇ   s      r%   r¾   z"AgentCoreSearchConfig._text_blocksš  sW   € à%×)Ñ)¨(Ó3ˆÜ2<¸VÄTÔ2J˜Ÿ™ IÔ.ÐPTˆÜ˜'¤8Ô,´
¸7ÄSÌ%ÀLÔ0QØÜÑk¨ÔkÓkÐkr'   c                 ó
  — | j                   }|j                  «       j                  t        «      s| j	                  «       S t        t        |«      «      }t        d„ |D «       d«      }|�|S |r|d   S t        dd|dd › �¬«      ‚)a%  
        Parse a JSON or SSE-framed (Streamable HTTP transport) MCP response.

        Return the event whose payload carries the JSON-RPC response, i.e. one
        containing ``result`` or ``error``, falling back to the last event when
        the stream carries only notifications.
        c              3   ó2   K  — | ]  }d |v sd|v sŒ|–— Œ y­w)r´   r¯   NrK   )r9   Úevents     r%   r<   z8AgentCoreSearchConfig._parse_mcp_body.<locals>.<genexpr>±  s   è ø€ ÒP�u¨(°eÑ*;¸wÈ%Ò?OŒUÑPùs   ‚�Néÿÿÿÿr°   z:AgentCore gateway returned SSE without a JSON data frame: r   r±   )	rB   r\   rZ   r   rS   rN   rd   r=   r   )r¬   rB   ÚeventsÚresponse_events       r%   r¼   z%AgentCoreSearchConfig._parse_mcp_body¢  s˜   € ð #×'Ñ'ˆØ�{‰{‹}×'Ñ'Ô(:Ô;Ø×$Ñ$Ó&Ð&äÔ.¨tÓ4Ó5ˆÜ $ÙP ÔPØó!
ˆð Ð%Ø!Ð!ÙØ˜"‘:ÐÜØØPÐQUÐVZÐWZÐQ[ÐP\Ð]ô
ð 	
r'   Úerror_messager²   c                 ó   — t        |||¬«      S )N)r²   r³   rl   r   )ri   rÐ   r²   rl   s       r%   Úget_error_classz%AgentCoreSearchConfig.get_error_class½  s   € ô  Ø#Ø!Øô
ð 	
r'   )r   N)NNr    )Ú__name__Ú
__module__Ú__qualname__rh   Ústaticmethodr8   rk   ra   r»   rr   rˆ   ry   r‹   rN   rM   r¢   Úboolr›   rœ   r"   ÚResponseÚLiteLLMLoggingObjr   rÂ   r   r½   r¾   r¼   ÚintÚ	ExceptionrÒ   rK   r'   r%   rf   rf   ž   s´  „ ó"ð ð.˜cò .ó ð.ð #Ø#ñ	
àð
ð �t‘ð
ð ˜‘*ð	
ð
 ð
ð 
ó
ð6 *.ñ	à˜‘*ðð ðð �T˜$‘ZÑ $Ñ&ð	ð
 ðð 
óð +
à�T˜#‘Y‰ð+
ð ð+
ð ð	+
ð
 
ó+
ðf #ñG
à�c˜3�h‘ðG
ð ˜c 6˜kÑ*ðG
ð ˜3 ˜;Ñ'¨$¨t°C¸°KÑ/@Ñ*AÑAð	G
ð
 ðG
ð �t‘ðG
ð 
ˆt�C˜�H‰~˜u t™|Ð+Ñ	,óG
ðR ðF¨ð F°ò Fó ðFð ð
 #ð 
¨#ò 
ó ð
ð:)@à—n‘nð)@ð 'ð)@ð ð	)@ð
 
ó)@ðV[°¸¸f¸Ñ1Eð [È#ó [ð ðl G¨C°¨KÑ$8ð l¸UÀ7È3ÐPVÈ;ÑCWÐY\ÐC\Ñ=]ò ló ðlð ð
 e§n¡nð 
¸ÀÀfÀÑ9Mò 
ó ð
ð4

àð

ð ð

ð ð	

ð
 
ô

r'   rf   )2Ú__doc__rS   ÚreÚcollections.abcr   r   r   Útypingr   r"   Ú*litellm.litellm_core_utils.litellm_loggingr   rÙ   Ú)litellm.llms.base_llm.chat.transformationr	   Ú+litellm.llms.base_llm.search.transformationr
   r   r   Ú!litellm.llms.bedrock.base_aws_llmr   Ú!litellm.llms.bedrock.common_utilsr   Úlitellm.secret_managers.mainr   r   Ú__annotations__r   r   r   r   Úcompiler   r   r   r8   ÚMatchr&   Ú	frozensetr+   r×   r0   r»   r>   rG   rN   rP   rV   rd   rf   rK   r'   r%   ú<module>rê      sÆ  ðòóB Û 	ß 7Ñ 7Ý ã å SÝ F÷ñ õ
 9Ý :Ý 7ð %(Ð ˜EÓ 'ð (*Ð ˜uÓ )ð
 &CÐ ˜UÓ Bð
 %3Ð ˜EÓ 2ð 1=Ð &¨Ó <ð  *˜rŸz™zÐ*qÓrÐ �uÓ rà(˜bŸj™jÐ)<Ó=Ð �eÓ =àEÐ �EÓ EðE #ð E¨"¯(©(°3©-¸$Ñ*>ó Eñ #Ò#DÓE€�Ó Eð@¨ð @°ó @ð
˜  V Ñ,ð °Sð ¸SÀ4¹Zó ð˜G C¨ KÑ0ð °\ó ðF˜&ð F U¨7°3¸°;Ñ+?ÀÐ+DÑ%Eó Fð! &ð !¨U°7¸3À¸;Ñ3GÈÐ3LÑ-Mó !ð ˜3ð  8¨G°C¸°KÑ,@Ñ#Aó ô(i
Ð,¨jõ i
r'   