
    iS                         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           d	S )
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dS )BedrockTransportz*Transport for api_mode='bedrock_converse'.returnc                     dS )Nbedrock_converse )selfs    =/home/ubuntu/.hermes/hermes-agent/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FFFFF++H5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CCCCC((///r   Nmodelc           	          ddl m} |                    dd          }|                    d          } |||||                    dd          |                    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    s    " 	@?????Hk22JJ122	&&zz,55

=11&
 
 
 *.%&'-#$r   responsec           	         ddl m} t          |d          r
|j        r|}n ||          }|j        d         }|j        }|j        pd}d}|j        rd |j        D             }d}	t          |d          rS|j        rL|j        }
t          t          |
dd          pdt          |
d	d          pdt          |
d
d          pd          }	t          |dd          pt          |dd          }t          |j        ||||	          S )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stopNc                 d    g | ]-}t          |j        |j        j        |j        j                   .S ))idname	arguments)r	   r2   functionr3   r4   ).0tcs     r   
<listcomp>z7BedrockTransport.normalize_response.<locals>.<listcomp>Z   sN         u) k3    r   usageprompt_tokenscompletion_tokenstotal_tokens)r:   r;   r<   	reasoningreasoning_content)content
tool_callsfinish_reasonr=   r9   )r   r.   hasattrr/   messagerA   r@   r9   r
   getattrr   r?   )r   r,   r   r.   nschoicemsgrA   r@   r9   ur=   s               r   normalize_responsez#BedrockTransport.normalize_responseC   sf    	FEEEEE 8Y'' 	7H,< 	7BB -,X66BAn,6
> 	  .  J 2w 	BH 	A%a!<<A")!-@!"D"D"I$Q::?a  E Cd33^wsDWY]7^7^	!K!'
 
 
 	
r   c                     |dS t          |t                    rd|v S t          |d          rt          |j                  S dS )u   Check Bedrock response structure.

        After normalize_converse_response, the response has OpenAI-compatible
        .choices — same check as chat_completions.
        NFoutputr/   )
isinstancedictrB   boolr/   )r   r,   s     r   validate_responsez"BedrockTransport.validate_responsev   sT     5h%% 	(x''8Y'' 	*()))ur   
raw_reasonc                 @    ddddddd}|                     |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   rP   _MAPs      r   map_finish_reasonz"BedrockTransport.map_finish_reason   s8     $"#$4 0
 
 xx
F+++r   )N)__name__
__module____qualname____doc__propertystrr   r   r   r   r   r   r   r+   r   rI   rN   rO   rZ   r   r   r   r   r      sq       44"# " " " X"6d38n)= 6C 6 6 6 6
04S#X#7 0C 0 0 0 0 15	! !! tCH~&! T#s(^,-	! 
c3h! ! ! !F1
3 1
=O 1
 1
 1
 1
f# $     ,C ,C , , , , , ,r   r   )register_transportr   N)r^   typingr   r   r   r   agent.transports.baser   agent.transports.typesr   r	   r
   r   agent.transportsra   r   r   r   <module>rf      s     - , , , , , , , , , , , 3 3 3 3 3 3 F F F F F F F F F FE, E, E, E, E,( E, E, E,R 0 / / / / /  %'7 8 8 8 8 8r   