§
    ‰eîi(  ã                   ó‚   — 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 )
uý   OpenAI Responses API (Codex) transport.

Delegates to the existing adapter functions in agent/codex_responses_adapter.py.
This transport owns format conversion and normalization â€” NOT client lifecycle,
streaming, or the _run_codex_stream() call path.
é    )Ú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dœde	dedefd„Zdedefd„ZdS )ÚResponsesApiTransportzyTransport for api_mode='codex_responses'.

    Wraps the functions extracted into codex_responses_adapter.py (PR 1).
    Úreturnc                 ó   — dS )NÚcodex_responses© )Úselfs    ú8/home/div/.hermes/hermes-agent/agent/transports/codex.pyÚapi_modezResponsesApiTransport.api_mode   s   € à Ð ó    Úmessagesc                 ó$   — ddl m}  ||¦  «        S )z:Convert OpenAI chat messages to Responses API input items.r   )Ú!_chat_messages_to_responses_input)Úagent.codex_responses_adapterr   )r   r   Úkwargsr   s       r   Úconvert_messagesz&ResponsesApiTransport.convert_messages   s%   € àSÐSÐSÐSÐSÐSØ0Ð0°Ñ:Ô:Ð:r   Útoolsc                 ó$   — ddl m}  ||¦  «        S )zBConvert OpenAI tool schemas to Responses API function definitions.r   )Ú_responses_tools)r   r   )r   r   r   s      r   Úconvert_toolsz#ResponsesApiTransport.convert_tools   s%   € àBÐBÐBÐBÐBÐBØÐ Ñ&Ô&Ð&r   NÚmodelc                 ó¬  — ddl m}m} ddlm} |                     dd¦  «        }|}	|sg|re|d                              d¦  «        dk    rFt          |d                              d¦  «        pd¦  «                             ¦   «         }|d	d
…         }	|s|}|                     dd¦  «        }
|                     dd¦  «        }|                     dd¦  «        }d}d}|                     d¦  «        }|rLt          |t          ¦  «        r7|                     d¦  «        du rd}n|                     d¦  «        r|d         }ddi}|                     ||¦  «        }|| ||	¦  «         ||¦  «        ddddœ}|                     d¦  «        }|
s|r||d<   |r	|rdg|d<   n9|r.|
r|                     d¦  «        }|�||d<   n|ddœ|d<   dg|d<   n	|
s|sg |d<   |                     d¦  «        }|r| 
                    |¦  «         |r¨|                     d¦  «        }t          |p|pd¦  «                             ¦   «         }|rl|                     d ¦  «        }i }t          |t          ¦  «        r1| 
                    d!„ |                     ¦   «         D ¦   «         ¦  «         ||d<   ||d"<   ||d <   |                     d#¦  «        }|�|s||d$<   |r	|rd%|i|d <   |S )&u¾  Build Responses API kwargs.

        Calls convert_messages and convert_tools internally.

        params:
            instructions: str â€” system prompt (extracted from messages[0] if not given)
            reasoning_config: dict | None â€” {effort, enabled}
            session_id: str | None â€” used for prompt_cache_key + xAI conv header
            max_tokens: int | None â€” max_output_tokens
            request_overrides: dict | None â€” extra kwargs merged in
            provider: str | None â€” provider name for backend-specific logic
            base_url: str | None â€” endpoint URL
            base_url_hostname: str | None â€” hostname for backend detection
            is_github_responses: bool â€” Copilot/GitHub models backend
            is_codex_backend: bool â€” chatgpt.com/backend-api/codex
            is_xai_responses: bool â€” xAI/Grok backend
            github_reasoning_extra: dict | None â€” Copilot reasoning params
        r   )r   r   )ÚDEFAULT_AGENT_IDENTITYÚinstructionsÚ ÚroleÚsystemÚcontenté   NÚis_github_responsesFÚis_codex_backendÚis_xai_responsesÚmediumTÚreasoning_configÚenabledÚeffortÚminimalÚlowÚauto)r   r"   Úinputr   Útool_choiceÚparallel_tool_callsÚstoreÚ
session_idÚprompt_cache_keyzreasoning.encrypted_contentÚincludeÚgithub_reasoning_extraÚ	reasoning)r.   ÚsummaryÚrequest_overridesÚextra_headersc                 óV   — i | ]&\  }}|r|®	t          |¦  «        t          |¦  «        “Œ'S ©N)Ústr)Ú.0ÚkeyÚvalues      r   ú
<dictcomp>z6ResponsesApiTransport.build_kwargs.<locals>.<dictcomp>ƒ   sD   € ð ð ð á *  UØ"ðð (-Ð'8õ   ™HœH¥c¨%¡j¤jà'8Ð'8Ð'8r   zx-client-request-idÚ
max_tokensÚmax_output_tokenszx-grok-conv-id)r   r   r   Ú	run_agentr!   Úgetr@   ÚstripÚ
isinstanceÚdictÚupdateÚitems)r   r   r   r   Úparamsr   r   r!   r"   Úpayload_messagesr(   r)   r*   Úreasoning_effortÚreasoning_enabledr,   Ú_effort_clampr   r6   Úgithub_reasoningr<   r7   Úcache_scope_idÚexisting_extra_headersÚmerged_extra_headersrE   s                             r   Úbuild_kwargsz"ResponsesApiTransport.build_kwargs"   sò  € ð2	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð
 	5Ð4Ð4Ð4Ð4Ð4à—z’z .°"Ñ5Ô5ˆØ#ÐØð 	0Øð 0˜H QœKŸOšO¨FÑ3Ô3°xÒ?Ð?Ý" 8¨A¤;§?¢?°9Ñ#=Ô#=Ð#CÀÑDÔD×JÒJÑLÔL�Ø#+¨A¨B¨B¤<Ð Øð 	2Ø1ˆLà$ŸjšjÐ)>ÀÑFÔFÐØ!Ÿ:š:Ð&8¸%Ñ@Ô@ÐØ!Ÿ:š:Ð&8¸%Ñ@Ô@Ðð $ÐØ ÐØ!Ÿ:š:Ð&8Ñ9Ô9ÐØð 	>¥
Ð+;½TÑ BÔ Bð 	>Ø×#Ò# IÑ.Ô.°%Ð7Ð7Ø$)Ð!Ð!Ø!×%Ò% hÑ/Ô/ð >Ø#3°HÔ#=Ð à" EÐ*ˆØ(×,Ò,Ð-=Ð?OÑPÔPÐð Ø(Ø6Ð6Ð7GÑHÔHØ%Ð% eÑ,Ô,Ø!Ø#'Øð
ð 
ˆð —Z’Z Ñ-Ô-ˆ
Ø"ð 	4 zð 	4Ø)3ˆFÐ%Ñ&àð 	#Ð!1ð 	#Ø!>Ð ?ˆF�9ÑÐØð 		#Ø"ð DØ#)§:¢:Ð.FÑ#GÔ#GÐ Ø#Ð/Ø*:�F˜;Ñ'øà1AÈfÐ&UÐ&U��{Ñ#Ø%BÐ$C��yÑ!Ð!Ø$ð 	#Ð-=ð 	#Ø "ˆF�9Ñà"ŸJšJÐ':Ñ;Ô;ÐØð 	-Ø�MŠMÐ+Ñ,Ô,Ð,àð 	?Ø%ŸzšzÐ*<Ñ=Ô=ÐÝ Ð!1Ð!E°ZÐ!EÀ2ÑFÔF×LÒLÑNÔNˆNØð ?Ø)/¯ª°OÑ)DÔ)DÐ&Ø79Ð$ÝÐ4µdÑ;Ô;ð Ø(×/Ò/ðð à.D×.JÒ.JÑ.LÔ.Lðñ ô ñô ð ð 6DÐ$ \Ñ2Ø>LÐ$Ð%:Ñ;Ø*>��Ñ'à—Z’Z Ñ-Ô-ˆ
ØÐ!Ð*:Ð!Ø*4ˆFÐ&Ñ'àð 	E 
ð 	EØ'7¸Ð&DˆF�?Ñ#àˆr   Úresponsec                 óš  — ddl m}m}m}  ||¦  «        \  }}d}|�r	|j        �rg }|j        D ]÷}	i }
t          |	d¦  «        r|	j        r
|	j        |
d<   t          |	d¦  «        r|	j        r
|	j        |
d<   |                     t          t          |	d¦  «        r|	j
        nt          |	d¦  «        r|	j        j        ndt          |	d¦  «        r|	j        j        nt          |	dd	¦  «        t          |	d¦  «        r|	j        j        nt          |	d
d¦  «        |
pd¬¦  «        ¦  «         Œøi }
|r!t          |d¦  «        r|j        r
|j        |
d<   |r!t          |d¦  «        r|j        r
|j        |
d<   |r!t          |d¦  «        r|j        r
|j        |
d<   t%          |r|j        nd||pd|rt          |d¦  «        r|j        ndd|
pd¬¦  «        S )z=Normalize Codex Responses API response to NormalizedResponse.r   )Ú_normalize_codex_responseÚ_extract_responses_message_textÚ!_extract_responses_reasoning_textNÚcall_idÚresponse_item_idÚidÚfunctionÚnamer#   Ú	argumentsz{})r_   ra   rb   Úprovider_dataÚcodex_reasoning_itemsÚcodex_message_itemsÚreasoning_detailsÚstopr:   )r&   Ú
tool_callsÚfinish_reasonr:   Úusagerc   )r   rZ   r[   r\   rh   Úhasattrr]   r^   Úappendr	   r_   r`   ra   Úgetattrrb   rd   re   rf   r   r&   r:   )r   rX   r   rZ   r[   r\   Úmsgri   rh   Útcrc   s              r   Únormalize_responsez(ResponsesApiTransport.normalize_response–   s�  € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 7Ð6°xÑ@Ô@Ñˆˆ]àˆ
Øñ 	�3”>ñ 	ØˆJØ”nð ð �Ø "�Ý˜2˜yÑ)Ô)ð :¨b¬jð :Ø/1¬z�M )Ñ,Ý˜2Ð1Ñ2Ô2ð L°rÔ7Jð LØ8:Ô8K�MÐ"4Ñ5Ø×!Ò!¥(Ý '¨¨DÑ 1Ô 1Ðn�r”u�uÍGÐTVÐXbÑLcÔLcÐ8m¸¼Ô8HÐ8HÐimÝ-4°R¸Ñ-DÔ-DÐa˜œÔ)Ð)Í'ÐRTÐV\Ð^`ÑJaÔJaÝ7>¸rÀ:Ñ7NÔ7NÐr˜bœkÔ3Ð3ÕT[Ð\^Ð`kÐmqÑTrÔTrØ"/Ð"7°4ð	#ñ #ô #ñ ô ð ð ð ˆØð 	O•7˜3Ð 7Ñ8Ô8ð 	O¸SÔ=Vð 	OØ58Ô5NˆMÐ1Ñ2Øð 	K•7˜3Ð 5Ñ6Ô6ð 	K¸3Ô;Rð 	KØ36Ô3JˆMÐ/Ñ0Øð 	G•7˜3Ð 3Ñ4Ô4ð 	G¸Ô9Nð 	GØ14Ô1FˆMÐ-Ñ.å!Ø#&Ð0�C”K�K¨DØ!Ø'Ð1¨6Ø'*ÐR­w°s¸KÑ/HÔ/HÐR�c”m�mÈdØØ'Ð/¨4ð
ñ 
ô 
ð 	
r   c                 ób   — |€dS t          |dd¦  «        }t          |t          ¦  «        r|sdS dS )u  Check Codex Responses API response has valid output structure.

        Returns True only if response.output is a non-empty list.
        Does NOT check output_text fallback â€” the caller handles that
        with diagnostic logging for stream backfill recovery.
        NFÚoutputT)rm   rJ   Úlist)r   rX   rr   s      r   Úvalidate_responsez'ResponsesApiTransport.validate_responseÃ   sC   € ð ÐØ�5Ý˜ 8¨TÑ2Ô2ˆÝ˜&¥$Ñ'Ô'ð 	¨vð 	Ø�5Øˆtr   F©Úallow_streamÚ
api_kwargsrv   c                ó(   — ddl m}  |||¬¦  «        S )z‘Validate and sanitize Codex API kwargs before the call.

        Normalizes input items, strips unsupported fields, validates structure.
        r   )Ú_preflight_codex_api_kwargsru   )r   ry   )r   rw   rv   ry   s       r   Úpreflight_kwargsz&ResponsesApiTransport.preflight_kwargsÑ   s-   € ð
 	NÐMÐMÐMÐMÐMØ*Ð*¨:ÀLÐQÑQÔQÐQr   Ú
raw_reasonc                 ó<   — dddddœ}|                      |d¦  «        S )aK  Map Codex response.status to OpenAI finish_reason.

        Codex uses response.status ('completed', 'incomplete') +
        response.incomplete_details.reason for granular mapping.
        This method handles the simple status string; the caller
        should check incomplete_details separately for 'max_output_tokens'.
        rg   Úlength)Ú	completedÚ
incompleteÚfailedÚ	cancelled)rH   )r   r{   Ú_MAPs      r   Úmap_finish_reasonz'ResponsesApiTransport.map_finish_reasonÙ   s2   € ð  Ø"ØØð	
ð 
ˆð �xŠx˜
 FÑ+Ô+Ð+r   r?   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr@   r   r   r   r   r   r   r   rW   r   rp   Úboolrt   rK   rz   rƒ   r   r   r   r   r      sÄ  € € € € € ðð ð
 ð!˜#ð !ð !ð !ñ „Xð!ð;¨¨d°3¸°8¬nÔ)=ð ;ÈCð ;ð ;ð ;ð ;ð
' 4¨¨S°#¨X¬Ô#7ð '¸Cð 'ð 'ð 'ð 'ð 15ð	rð ràðrð �t˜C ˜H”~Ô&ðrð ˜˜T # s (œ^Ô,Ô-ð	rð 
ˆc�3ˆhŒðrð rð rð rðh+
¨3ð +
Ð=Oð +
ð +
ð +
ð +
ðZ¨#ð °$ð ð ð ð ð INð Rð Rð R¨3ð RÀð RÐRVð Rð Rð Rð Rð,¨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>r�      sÈ   ððð ð -Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FðY,ð Y,ð Y,ð Y,ð Y,Ð-ñ Y,ô Y,ð Y,ðz 0Ð /Ð /Ð /Ð /Ð /à Ð Ð$Ð&;Ñ <Ô <Ð <Ð <Ð <r   