
    `gjS                     t    d Z ddlmZmZmZmZ ddlmZ ddlm	Z	m
Z
mZ  G d de      ZddlmZ  ede       y	)
a  AWS Bedrock Converse API transport.

Delegates to the existing adapter functions in agent/bedrock_adapter.py.
Bedrock uses its own boto3 client (not the OpenAI SDK), so the transport
owns format conversion and normalization, while client construction and
boto3 calls stay on AIAgent.
    )AnyDictListOptional)ProviderTransport)NormalizedResponseToolCallUsagec                       e Zd ZdZedefd       Zdeeee	f      de	fdZ
deeee	f      de	fdZ	 dd	edeeee	f      deeeee	f         deee	f   fd
Zde	defdZde	defdZdedefdZy)BedrockTransportz*Transport for api_mode='bedrock_converse'.returnc                      y)Nbedrock_converse )selfs    K/root/.hermes/venv/lib/python3.12/site-packages/agent/transports/bedrock.pyapi_modezBedrockTransport.api_mode   s    !    messagesc                     ddl m}  ||      S )z3Convert OpenAI messages to Bedrock Converse format.r   )convert_messages_to_converse)agent.bedrock_adapterr   )r   r   kwargsr   s       r   convert_messagesz!BedrockTransport.convert_messages   s    F+H55r   toolsc                     ddl m}  ||      S )z;Convert OpenAI tool schemas to Bedrock Converse toolConfig.r   )convert_tools_to_converse)r   r   )r   r   r   s      r   convert_toolszBedrockTransport.convert_tools   s    C(//r   Nmodelc           	          ddl m} |j                  dd      }|j                  d      } |||||j                  dd      |j                  d      |	      }d
|d<   ||d<   |S )u^  Build Bedrock converse() kwargs.

        Calls convert_messages and convert_tools internally.

        params:
            max_tokens: int — output token limit (default 4096)
            temperature: float | None
            guardrail_config: dict | None — Bedrock guardrails
            region: str — AWS region (default 'us-east-1')
        r   )build_converse_kwargsregionz	us-east-1guardrail_config
max_tokensi   temperature)r   r   r   r$   r%   r#   T__bedrock_converse____bedrock_region__)r   r!   get)	r   r   r   r   paramsr!   r"   	guardrailr   s	            r   build_kwargszBedrockTransport.build_kwargs    st    " 	@Hk2JJ12	&zz,5

=1&
 *.%&'-#$r   responsec           	         ddl m} t        |d      r|j                  r|}n ||      }|j                  d   }|j                  }|j
                  xs d}d}|j                  rW|j                  D 	cg c]B  }	t        |	j                  |	j                  j                  |	j                  j                        D }}	d}
t        |d      rS|j                  rG|j                  }t        t        |dd      xs dt        |d	d      xs dt        |d
d      xs d      }
t        |dd      xs t        |dd      }t        |j                   ||||
      S c c}	w )zNormalize Bedrock response to NormalizedResponse.

        Handles two shapes:
        1. Raw boto3 dict (from direct converse() calls)
        2. Already-normalized SimpleNamespace with .choices (from dispatch site)
        r   )normalize_converse_responsechoicesstopN)idname	argumentsusageprompt_tokenscompletion_tokenstotal_tokens)r5   r6   r7   	reasoningreasoning_content)content
tool_callsfinish_reasonr8   r4   )r   r.   hasattrr/   messager<   r;   r	   r1   functionr2   r3   r4   r
   getattrr   r:   )r   r,   r   r.   nschoicemsgr<   r;   tcr4   ur8   s                r   normalize_responsez#BedrockTransport.normalize_responseC   sM    	F 8Y'H,<,<B -X6BAnn,,6
>> ..  uu)) kk33J  2wBHHA%a!<A")!-@!"D"I$Q:?aE Cd3^wsDWY]7^	!KK!'
 	
)s   1AEc                 t    |yt        |t              rd|v S t        |d      rt        |j                        S y)u   Check Bedrock response structure.

        After normalize_converse_response, the response has OpenAI-compatible
        .choices — same check as chat_completions.
        Foutputr/   )
isinstancedictr=   boolr/   )r   r,   s     r   validate_responsez"BedrockTransport.validate_responsev   s@     h%x''8Y'(())r   
raw_reasonc                 8    ddddddd}|j                  |d      S )zMap Bedrock stop reason to OpenAI finish_reason.

        The adapter already does this mapping inside normalize_converse_response,
        so this is only used for direct access to raw responses.
        r0   r;   lengthcontent_filter)end_turntool_user$   stop_sequenceguardrail_intervenedcontent_filtered)r(   )r   rM   _MAPs      r   map_finish_reasonz"BedrockTransport.map_finish_reason   s0     $"#$4 0
 xx
F++r   )N)__name__
__module____qualname____doc__propertystrr   r   r   r   r   r   r   r+   r   rF   rK   rL   rW   r   r   r   r   r      s    4"# " "6d38n)= 6C 6
04S#X#7 0C 0 15	!! tCH~&! T#s(^,-	! 
c3h!F1
3 1
=O 1
f# $  ,C ,C ,r   r   )register_transportr   N)r[   typingr   r   r   r   agent.transports.baser   agent.transports.typesr   r	   r
   r   agent.transportsr^   r   r   r   <module>rc      s<    - , 3 F FE,( E,R 0 %'7 8r   