
    PL
j 2                     ~    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
  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ToolCallc                   @   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    :/home/kuhnn/.hermes/hermes-agent/agent/transports/codex.pyapi_modezResponsesApiTransport.api_mode   s          messagesc                 h    ddl m}  ||t          |                    d                              S )z:Convert OpenAI chat messages to Responses API input items.r   )!_chat_messages_to_responses_inputis_xai_responsesr   )agent.codex_responses_adapterr   boolget)r   r   kwargsr   s       r   convert_messagesz&ResponsesApiTransport.convert_messages   sI    SSSSSS00!&**-?"@"@AA
 
 
 	
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                 r   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}|r
d|d<   d|d<   |                    d          }|
s	|s|r||d<   |r |rddl
m} g |d<    ||          rd|i|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 }t          |t                    r1|                    d) |                                D                        ||d*<   ||d$<   |                    d+          }i }t          |t                    r|                    |           |                    d|           ||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_backendr   mediumTreasoning_configenabledeffortminimallowr   )r"   r%   inputr   storeautotool_choiceparallel_tool_calls
session_idprompt_cache_key)grok_supports_reasoning_effortinclude	reasoninggithub_reasoning_extra)r0   summaryzreasoning.encrypted_content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  HHc%jj'8'8'8r   zx-client-request-id
max_tokensmax_output_tokensc                 V    i | ]&\  }}|r|	t          |          t          |          'S rB   rC   rE   s      r   rI   z6ResponsesApiTransport.build_kwargs.<locals>.<dictcomp>   sD       &C $)#4 C#e**#4#4#4r   zx-grok-conv-id
extra_body)r   r   r    	run_agentr$   r   rD   strip
isinstancedictagent.model_metadatar:   updateitems
setdefault)r   r"   r   r   paramsr   r    r$   r%   payload_messagesr+   r,   r   reasoning_effortreasoning_enabledr.   _effort_clampresponse_toolsr   r8   r:   github_reasoningr?   r9   cache_scope_idexisting_extra_headersmerged_extra_headersrJ   existing_extra_bodymerged_extra_bodys                                 r   build_kwargsz"ResponsesApiTransport.build_kwargs%   s/   2	
 	
 	
 	
 	
 	
 	
 	

 	544444zz."55# 	0 0HQKOOF33x??"8A;??9#=#=#CDDJJLL#+ABB<  	21L$jj)>FF!::&8%@@!::&8%@@ $ !::&899 	>
+;T B B 	>##I..%77$)!!!%%h// >#3H#= "E*(,,-=?OPP))%00(66 !1   $	
 	
  	1$*F=!,0F()ZZ--
 # 	4+; 	4
 	4)3F%& 	#!1 	#KKKKKK !#F9 .-e44 C'/1A&B{# 		#" D#)::.F#G#G #/*:F;'1Af&U&U{#%B$Cy!!$ 	#-= 	# "F9"JJ':;; 	-MM+,,, 	?%zz*<== !1!EZ!E2FFLLNNN ?)/O)D)D&79$4d;; (// .D.J.J.L.L     6D$\2>L$%:;*>'ZZ--
!*:!*4F&' 	5
 	5%+ZZ%@%@"35 0$77 $++ *@*F*F*H*H     6@ !12&:F?# #)**\":":02-t44 >!(()<===(();ZHHH#4F< r   responsec                    ddl 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_responseNcall_idresponse_item_ididfunctionnamer&   	argumentsz{})rh   rj   rk   provider_datacodex_reasoning_itemscodex_message_itemsreasoning_detailsstopr<   )r)   
tool_callsfinish_reasonr<   usagerl   )r   re   rq   hasattrrf   rg   appendr	   rh   ri   rj   getattrrk   rm   rn   ro   r   r)   r<   )	r   rc   r   re   msgrr   rq   tcrl   s	            r   normalize_responsez(ResponsesApiTransport.normalize_response   s{   	
 	
 	
 	
 	
 	

 76x@@]
 	3> 	Jn   "2y)) :bj :/1zM),2122 Lr7J L8:8KM"45!!( 'D 1 1nruuGTVXbLcLc8m8H8Him-4R-D-Da))'RTV\^`JaJa7>r:7N7Nrbk33T[\^`kmqTrTr"/"74	# # #      	O73 788 	OS=V 	O585NM12 	K73 566 	K3;R 	K363JM/0 	G73 344 	G9N 	G141FM-.!#&0CKKD!'16'*RwsK/H/HRcmmd'/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)rv   rP   list)r   rc   r{   s      r   validate_responsez'ResponsesApiTransport.validate_response   sC     58T22&$'' 	v 	5tr   Fallow_stream
api_kwargsr   c                (    ddl m}  |||          S )zValidate and sanitize Codex API kwargs before the call.

        Normalizes input items, strips unsupported fields, validates structure.
        r   )_preflight_codex_api_kwargsr~   )r   r   )r   r   r   r   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'.
        rp   length)	completed
incompletefailed	cancelled)r   )r   r   _MAPs      r   map_finish_reasonz'ResponsesApiTransport.map_finish_reason  s2      "	
 
 xx
F+++r   rB   )__name__
__module____qualname____doc__propertyrD   r   r   r   r   r   r!   r   rb   r   ry   r   r}   rQ   r   r   r   r   r   r   r      s        
 !# ! ! ! X!
d38n)= 
C 
 
 
 
'4S#X#7 'C ' ' ' ' 15	_ __ tCH~&_ T#s(^,-	_ 
c3h_ _ _ _B)
3 )
=O )
 )
 )
 )
V# $     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   agent.transportsr   r   r   r   <module>r      s     - , , , , , , , , , , , 3 3 3 3 3 3 ? ? ? ? ? ? ? ?G, G, G, G, G,- G, G, G,V 0 / / / / /  $&; < < < < <r   