§
    ‰eî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/div/.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œ   € ð" 	@Ð?Ð?Ð?Ð?Ð?à—’˜H kÑ2Ô2ˆØ—J’JÐ1Ñ2Ô2ˆ	à&Ð&ØØØØ—z’z ,°Ñ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 )záNormalize 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õ �8˜YÑ'Ô'ð 	7¨HÔ,<ð 	7àˆBˆBð -Ð,¨XÑ6Ô6ˆBà”˜A”ˆØŒnˆØÔ,Ð6°ˆàˆ
ØŒ>ð 	ðð ð œ.ðñ ô ˆJð ˆÝ�2�wÑÔð 	 B¤Hð 	Ø”ˆAÝÝ% a¨¸!Ñ<Ô<ÐAÀÝ")¨!Ð-@À!Ñ"DÔ"DÐ"IÈÝ$ Q¨¸Ñ:Ô:Ð?¸aðñ ô ˆEõ ˜C ¨dÑ3Ô3Ð^µw¸sÐDWÐY]Ñ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Ð'Ð'å�8˜YÑ'Ô'ð 	*Ý˜Ô(Ñ)Ô)Ð)Øˆur   Ú
raw_reasonc                 ó@   — dddddddœ}|                      |d¦  «        S )zÍMap 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ð
ð 
ˆð �xŠx˜
 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¨¨d°3¸°8¬nÔ)=ð 6ÈCð 6ð 6ð 6ð 6ð
0 4¨¨S°#¨X¬Ô#7ð 0¸Cð 0ð 0ð 0ð 0ð 15ð	!ð !àð!ð �t˜C ˜H”~Ô&ð!ð ˜˜T # s (œ^Ô,Ô-ð	!ð 
ˆc�3ˆhŒð!ð !ð !ð !ð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   