§
    ‰eîiº  ã                   óz   — d Z ddlmZmZmZmZ ddlmZ ddlm	Z	  G d„ de¦  «        Z
ddlmZ  ede
¦  «         d	S )
uÀ   Anthropic Messages API transport.

Delegates to the existing adapter functions in agent/anthropic_adapter.py.
This transport owns format conversion and normalization â€” NOT client lifecycle.
é    )ÚAnyÚDictÚListÚOptional)ÚProviderTransport)ÚNormalizedResponsec                   ód  — 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eeef                  fd„ZdddddddœZdedefd„ZdS )ÚAnthropicTransportuÄ   Transport for api_mode='anthropic_messages'.

    Wraps the existing functions in anthropic_adapter.py behind the
    ProviderTransport ABC.  Each method delegates â€” no logic is duplicated.
    Úreturnc                 ó   — dS )NÚanthropic_messages© )Úselfs    ú</home/div/.hermes/hermes-agent/agent/transports/anthropic.pyÚapi_modezAnthropicTransport.api_mode   s   € à#Ð#ó    Úmessagesc                 óR   — ddl m} |                     d¦  «        } |||¬¦  «        S )u¥   Convert OpenAI messages to Anthropic (system, messages) tuple.

        kwargs:
            base_url: Optional[str] â€” affects thinking signature handling.
        r   )Úconvert_messages_to_anthropicÚbase_url)r   )Úagent.anthropic_adapterr   Úget)r   r   Úkwargsr   r   s        r   Úconvert_messagesz#AnthropicTransport.convert_messages   s>   € ð 	JÐIÐIÐIÐIÐIà—:’:˜jÑ)Ô)ˆØ,Ð,¨XÀÐIÑIÔIÐIr   Útoolsc                 ó$   — ddl m}  ||¦  «        S )z=Convert OpenAI tool schemas to Anthropic input_schema format.r   )Úconvert_tools_to_anthropic)r   r   )r   r   r   s      r   Úconvert_toolsz AnthropicTransport.convert_tools#   s%   € àFÐFÐFÐFÐFÐFà)Ð)¨%Ñ0Ô0Ð0r   NÚmodelc                 ór  — ddl m}  |||||                     dd¦  «        |                     d¦  «        |                     d¦  «        |                     dd¦  «        |                     d	d¦  «        |                     d
¦  «        |                     d¦  «        |                     dd¦  «        ¬¦  «        S )a™  Build Anthropic messages.create() kwargs.

        Calls convert_messages and convert_tools internally.

        params (all optional):
            max_tokens: int
            reasoning_config: dict | None
            tool_choice: str | None
            is_oauth: bool
            preserve_dots: bool
            context_length: int | None
            base_url: str | None
            fast_mode: bool
        r   )Úbuild_anthropic_kwargsÚ
max_tokensi @  Úreasoning_configÚtool_choiceÚis_oauthFÚpreserve_dotsÚcontext_lengthr   Ú	fast_mode)r   r   r   r"   r#   r$   r%   r&   r'   r   r(   )r   r!   r   )r   r   r   r   Úparamsr!   s         r   Úbuild_kwargszAnthropicTransport.build_kwargs)   s¼   € ð* 	CÐBÐBÐBÐBÐBà%Ð%ØØØØ—z’z ,°Ñ6Ô6Ø#ŸZšZÐ(:Ñ;Ô;ØŸ
š
 =Ñ1Ô1Ø—Z’Z 
¨EÑ2Ô2Ø Ÿ*š* _°eÑ<Ô<Ø!Ÿ:š:Ð&6Ñ7Ô7Ø—Z’Z 
Ñ+Ô+Ø—j’j ¨eÑ4Ô4ð
ñ 
ô 
ð 	
r   Úresponsec           
      óX  — ddl }ddlm} ddlm} |                     dd¦  «        }d}g }g }	g }
g }|j        D �]}|j        dk    r|                     |j	        ¦  «         Œ)|j        d	k    rP|	                     |j
        ¦  «          ||¦  «        }t          |t          ¦  «        r|
                     |¦  «         Œ„|j        d
k    rs|j        }|r,|                     |¦  «        r|t          |¦  «        d…         }|                      ||j        ||                     |j        ¦  «        ¬¦  «        ¦  «         �Œ| j                             |j        d¦  «        }i }|
r|
|d<   t+          |rd                     |¦  «        nd|pd||	rd                     |	¦  «        ndd|pd¬¦  «        S )zÚNormalize Anthropic response to NormalizedResponse.

        Parses content blocks (text, thinking, tool_use), maps stop_reason
        to OpenAI finish_reason, and collects reasoning_details in provider_data.
        r   N)Ú_to_plain_data)ÚToolCallÚstrip_tool_prefixFÚmcp_ÚtextÚthinkingÚtool_use)ÚidÚnameÚ	argumentsÚstopÚreasoning_detailsÚ
z

)ÚcontentÚ
tool_callsÚfinish_reasonÚ	reasoningÚusageÚprovider_data)Újsonr   r-   Úagent.transports.typesr.   r   r:   ÚtypeÚappendr1   r2   Ú
isinstanceÚdictr5   Ú
startswithÚlenr4   ÚdumpsÚinputÚ_STOP_REASON_MAPÚstop_reasonr   Újoin)r   r+   r   r@   r-   r.   r/   Ú_MCP_PREFIXÚ
text_partsÚreasoning_partsr8   r;   ÚblockÚ
block_dictr5   r<   r?   s                    r   Únormalize_responsez%AnthropicTransport.normalize_responseN   s  € ð 	ˆˆˆØ:Ð:Ð:Ð:Ð:Ð:Ø3Ð3Ð3Ð3Ð3Ð3à"ŸJšJÐ':¸EÑBÔBÐØˆàˆ
ØˆØÐØˆ
àÔ%ð 	ñ 	ˆEØŒz˜VÒ#Ð#Ø×!Ò! %¤*Ñ-Ô-Ð-Ð-Ø”˜zÒ)Ð)Ø×&Ò& u¤~Ñ6Ô6Ð6Ø+˜^¨EÑ2Ô2�
Ý˜j­$Ñ/Ô/ð 9Ø%×,Ò,¨ZÑ8Ô8Ð8øØ”˜zÒ)Ð)Ø”z�Ø$ð 3¨¯ª¸Ñ)EÔ)Eð 3Ø¥ KÑ 0Ô 0Ð 1Ð 1Ô2�DØ×!Ò!Ø�HØ œ8Ø!Ø"&§*¢*¨U¬[Ñ"9Ô"9ðñ ô ñô ð ùð Ô-×1Ò1°(Ô2FÈÑOÔOˆàˆØð 	CØ1BˆMÐ-Ñ.å!Ø-7ÐA�D—I’I˜jÑ)Ô)Ð)¸TØ!Ð) TØ'Ø6EÐO�f—k’k /Ñ2Ô2Ð2È4ØØ'Ð/¨4ð
ñ 
ô 
ð 	
r   c                 óŒ   — |€dS t          |dd¦  «        }t          |t          ¦  «        sdS |st          |dd¦  «        dk    S dS )u[  Check Anthropic response structure is valid.

        An empty content list is legitimate when ``stop_reason == "end_turn"``
        â€” the model's canonical way of signalling "nothing more to add" after
        a tool turn that already delivered the user-facing text. Treating it
        as invalid falsely retries a completed response.
        NFr:   rK   Úend_turnT)ÚgetattrrD   Úlist)r   r+   Úcontent_blockss      r   Úvalidate_responsez$AnthropicTransport.validate_responseƒ   s\   € ð ÐØ�5Ý  ¨9°dÑ;Ô;ˆÝ˜.­$Ñ/Ô/ð 	Ø�5Øð 	HÝ˜8 ]°DÑ9Ô9¸ZÒGÐGØˆtr   c                 óŽ   — t          |dd¦  «        }|€dS t          |dd¦  «        pd}t          |dd¦  «        pd}|s|r||dœS dS )z=Extract Anthropic cache_read and cache_creation token counts.r>   NÚcache_read_input_tokensr   Úcache_creation_input_tokens)Úcached_tokensÚcreation_tokens)rU   )r   r+   r>   ÚcachedÚwrittens        r   Úextract_cache_statsz&AnthropicTransport.extract_cache_stats”   so   € å˜ '¨4Ñ0Ô0ˆØˆ=Ø�4Ý˜Ð 9¸1Ñ=Ô=ÐBÀˆÝ˜%Ð!>ÀÑBÔBÐGÀaˆØð 	I�Wð 	IØ%+ÀÐHÐHÐHØˆtr   r7   r;   ÚlengthÚcontent_filter)rT   r3   r"   Ústop_sequenceÚrefusalÚmodel_context_window_exceededÚ
raw_reasonc                 ó8   — | j                              |d¦  «        S )z2Map Anthropic stop_reason to OpenAI finish_reason.r7   )rJ   r   )r   rf   s     r   Úmap_finish_reasonz$AnthropicTransport.map_finish_reason©   s   € àÔ$×(Ò(¨°VÑ<Ô<Ð<r   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚpropertyÚstrr   r   r   r   r   r   r   r*   r   rR   ÚboolrX   Úintr`   rJ   rh   r   r   r   r
   r
      sÍ  € € € € € ðð ð ð$˜#ð $ð $ð $ñ „Xð$ð	J¨¨d°3¸°8¬nÔ)=ð 	JÈCð 	Jð 	Jð 	Jð 	Jð1 4¨¨S°#¨X¬Ô#7ð 1¸Cð 1ð 1ð 1ð 1ð 15ð	#
ð #
àð#
ð �t˜C ˜H”~Ô&ð#
ð ˜˜T # s (œ^Ô,Ô-ð	#
ð 
ˆc�3ˆhŒð#
ð #
ð #
ð #
ðJ3
¨3ð 3
Ð=Oð 3
ð 3
ð 3
ð 3
ðj¨#ð °$ð ð ð ð ð"	¨Cð 	°H¸TÀ#ÀsÀ(¼^Ô4Lð 	ð 	ð 	ð 	ð Ø ØØØ#Ø)1ðð Ðð=¨Cð =°Cð =ð =ð =ð =ð =ð =r   r
   )Úregister_transportr   N)rl   Útypingr   r   r   r   Úagent.transports.baser   rA   r   r
   Úagent.transportsrq   r   r   r   ú<module>ru      s¼   ððð ð -Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ð^=ð ^=ð ^=ð ^=ð ^=Ð*ñ ^=ô ^=ð ^=ðD 0Ð /Ð /Ð /Ð /Ð /à Ð Ð'Ð);Ñ <Ô <Ð <Ð <Ð <r   