
    i2                    D   d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZmZmZ ddlmZ  ej        e          Z ej        dej                  Zdd	d8dZd9dZd:d;dZd<dZ	 d=d>dZd=d?d Zh d!Zd"d#d@d&ZdAd(ZdBd*Z d+d,dCd1Z!dDd3Z"dDd4Z#dEd7Z$dS )Fu  Codex Responses API adapter.

Pure format-conversion and normalization logic for the OpenAI Responses API
(used by OpenAI Codex, xAI, GitHub Models, and other Responses-compatible endpoints).

Extracted from run_agent.py to isolate Responses API-specific logic from the
core agent loop. All functions are stateless — they operate on the data passed
in and return transformed results.
    )annotationsN)SimpleNamespace)AnyDictListOptional)DEFAULT_AGENT_IDENTITYz)(?:^|[\s>|])to=functions\.[A-Za-z_][\w.]*userrolecontentr   r   strreturnList[Dict[str, Any]]c                  |dk    rdnd}t          | t                    sg S g }| D ]}t          |t                    r|r|                    ||d           3t          |t                    sIt          |                    d          pd                                                                          }|dv rE|                    d          }t          |t                    r|r|                    ||d           |d	v r|                    d
          }|                    d          }t          |t                    r,|                    d          }	|                    d|          }n|}	t          |	t                    r|	sdd|	d}
t          |t                    r+|                                r|                                |
d<   |                    |
           |S )u  Convert chat-style multimodal content to Responses API input parts.

    Input:  ``[{"type":"text"|"image_url", ...}]`` (native OpenAI Chat format)
    Output: ``[{"type":"input_text"|"output_text"|"input_image", ...}]`` (Responses format)

    The ``role`` parameter controls the text content type:
    - ``"user"`` (default) → ``"input_text"``
    - ``"assistant"`` → ``"output_text"``

    The Responses API rejects ``input_text`` inside assistant messages and
    ``output_text`` inside user messages, so callers MUST pass the correct
    role for the message being converted.

    Returns an empty list when ``content`` is not a list or contains no
    recognized parts — callers fall back to the string path.
    	assistantoutput_text
input_texttypetextr    >   r   r   r   r   >   	image_urlinput_imager   detailurlr   r   r   )
isinstancelistr   appenddictgetstriplower)r   r   	text_type	convertedpartptyper   	image_refr   r   
image_parts              B/home/ubuntu/.hermes/hermes-agent/agent/codex_responses_adapter.py _chat_content_to_responses_partsr,   /   s    " "&!4!4,Igt$$ 	&(I ) )dC   	 D  )T!B!BCCC$%% 	DHHV$$*++113399;;99988F##D$$$ D D  )T!B!BCCC000--IXXh''F)T**  mmE**"x88c3'' s 2?c)R)RJ&#&& 66<<>> 6'-||~~
8$Z(((    c                   | dS t          | t                    r| S t          | t                    r*g }d}| D ]}t          |t                    r|r|                    |           /t          |t                    sEt          |                    d          pd                                                                          }|dv rB|                    d          }t          |t                    r|r|                    |           |dv r|dz  }d	                    |                                          }|rd
| d|dk    rdnd d}|r| d	| n|}|S 	 t          |           S # t          $ r Y dS w xY w)u  Return a short text summary of a user message for logging/trajectory.

    Multimodal messages arrive as a list of ``{type:"text"|"image_url", ...}``
    parts from the API server.  Logging, spinner previews, and trajectory
    files all want a plain string — this helper extracts the first chunk of
    text and notes any attached images.  Returns an empty string for empty
    lists and ``str(content)`` for unexpected scalar types.
    Nr   r   r   >   r   r   r   r   >   r   r       [z images])
r   r   r   r    r!   r"   r#   r$   join	Exception)r   	text_bitsimage_countr'   r(   r   summarynotes           r+   _summarize_user_message_for_logr:   b   s    r'3 '4   !	 	! 	!D$$$  +$$T***dD)) ((.B//5577==??E===xx''dC(( +T +$$T***666q ((9%%++-- 	?L{LL1A1A##rLLLD-4>)))))$G7||   rrs   E, ,
E:9E:fn_name	argumentsindexintc                    |  d| d| }t          j        |                    dd                                                    dd         }d| S )u  Generate a deterministic call_id from tool call content.

    Used as a fallback when the API doesn't provide a call_id.
    Deterministic IDs prevent cache invalidation — random UUIDs would
    make every API call's prefix unique, breaking OpenAI's prompt cache.
    :utf-8replace)errorsN   call_)hashlibsha256encode	hexdigest)r;   r<   r=   seeddigests        r+   _deterministic_call_idrL      sd     ++	++E++D^DKK	KBBCCMMOOPSQSPSTF6r-   raw_id#tuple[Optional[str], Optional[str]]c                4   t          | t                    sdS |                                 }|sdS d|v rI|                    dd          \  }}|                                pd}|                                pd}||fS |                    d          rd|fS |dfS )z8Split a stored tool id into (call_id, response_item_id).)NN|r/   Nfc_)r   r   r#   split
startswith)rM   valuecall_idresponse_item_ids       r+   _split_responses_tool_idrW      s    fc"" zLLNNE z
e||$)KKQ$7$7!!--//)T+1133;t((( U{$;r-   rU   rV   Optional[str]c                r   t          |t                    r+|                                }|                    d          r|S | pd                                }|                    d          r|S |                    d          r:t	          |          t	          d          k    rd|t	          d          d          S t          j        dd|          }|                    d          r|S |                    d          r:t	          |          t	          d          k    rd|t	          d          d          S |rd|dd          S |p(t          |pd          pt          j                    j	        }t          j        |                    d                                                    dd         }d| S )	zCBuild a valid Responses `function_call.id` (must start with `fc_`).rQ   r   rE   Nz[^A-Za-z0-9_-]0   rA      )r   r   r#   rS   lenresubuuiduuid4hexrF   sha1rH   rI   )rU   rV   	candidatesource	sanitizedrJ   rK   s          r+   "_derive_responses_function_call_idrf      s   
 "C(( $**,,	&& 	m""$$F !! -c&kkCLL&@&@,VCLLMM*,,,("f55IE"" G$$ 0Y#g,,)F)F/Ys7||}}-/// &%Yss^%%%DS)/R00DDJLL4DD\$++g..//99;;CRC@F>>r-   toolsOptional[List[Dict[str, Any]]]c                   | sdS g }| D ]}t          |t                    r|                    di           ni }|                    d          }t          |t                    r|                                sn|                    d||                    dd          d|                    ddi d	          d
           |pdS )zIConvert chat-completions tool schemas to Responses function-tool schemas.Nfunctionnamedescriptionr   F
parametersobject)r   
propertiesr   rk   rl   strictrm   )r   r!   r"   r   r#   r    )rg   r&   itemfnrk   s        r+   _responses_toolsrt      s     t&(I  )3D$)?)?GTXXj"%%%Rvvf~~$$$ 	DJJLL 	66-44&&PR/S/STT
 
 	 	 	 	 r-   >   	completed
incompletein_progressru   )defaultrT   rx   c                   t          | t                    rY|                                                                                     dd                              dd          }|t
          v r|S |S )a%  Normalize a Responses assistant message status for replay.

    The API accepts completed/incomplete/in_progress on replayed assistant
    output messages.  Preserve those exactly (modulo case/hyphen spelling) so
    incomplete Codex continuation turns don't get falsely marked completed.
    -_r0   )r   r   r#   r$   rB   _RESPONSE_MESSAGE_STATUSES)rT   rx   statuss      r+   #_normalize_responses_message_statusr~      se     % $$&&..sC88@@cJJ///MNr-   messagesc                  ! g }t                      }| D ]}t          |t                    s|                    d          }|dk    r5|dv r|                    dd          }t          |t                    r=t          ||          }|dk    rdnd	!d                    !fd
|D                       }ng }|t          |          nd}|dk    r|                    d          }d}	t          |t                    r|D ]}
t          |
t                    r}|
                    d          rh|
                    d          }|r||v rHd |
                                D             }|	                    |           |r|
                    |           d}	|                    d          }d}t          |t                    r|D ]}t          |t                    s|                    d          dk    s|                    d          dk    rL|                    d          }t          |t                    swg }|D ]}t          |t                    st          |                    d          pd                                          }|dvrS|                    dd          }|d}t          |t                    st          |          }|	                    d|d           |s)ddt          |                    d                    |d}|                    d          }t          |t                    r+|                                r|                                |d<   |                    d          }t          |t                    r+|                                r|                                |d<   |	                    |           |dz  }|dk    rnb|r|	                    d|d           nG|                                r|	                    d|d           n|	r|	                    ddd           |                    d          }t          |t                    rP|D ]L}t          |t                    s|                    di           }|                    d           }t          |t                    r|                                snt          |                    d                    \  }}|                    d!          }t          |t                    r|                                s|}t          |t                    r|                                st          |t                    rP|                    d"          r;t          |          t          d"          k    rd#|t          d"          d          }nAt          |                    d$d%                    }t!          ||t          |                    }|                                }|                    d$d%          }t          |t                    rt#          j        |d&          }n$t          |t                    st          |          }|                                pd%}|	                    d'|||d(           N|r|	                    ||d           n|	                    ||d           |d)k    r|                    d*          }t          |          \  }} t          |t                    r|                                s=t          |t                    r(|                                r|                                }t          |t                    r|                                s|	                    d+|t          |                    dd          pd          d,           |S )-z>Convert internal chat-style messages to Responses input items.r   system>   r
   r   r   r   r   r   r   r   c              3  v   K   | ]3}|                     d           k    |                     dd          V  4dS )r   r   r   N)r"   ).0pr%   s     r+   	<genexpr>z4_chat_messages_to_responses_input.<locals>.<genexpr>  sO       ' '*+fQZ@Z@ZAEE&"%%@Z@Z@Z@Z' 'r-   Ncodex_reasoning_itemsFencrypted_contentidc                &    i | ]\  }}|d k    ||S )r    )r   kvs      r+   
<dictcomp>z5_chat_messages_to_responses_input.<locals>.<dictcomp>  s#    *T*T*TDAq!t))1a)))r-   Tcodex_message_itemsr   r   message>   r   r   r   r   r}   r   r   r}   r   phaser/   r   r   
tool_callsrj   rk   rU   rQ   rE   r<   {}ensure_asciifunction_callr   rU   rk   r<   tooltool_call_idfunction_call_outputr   rU   output)setr   r!   r"   r   r,   r4   r   itemsr    addr#   r~   rW   rS   r\   rL   jsondumps)"r   r   seen_item_idsmsgr   r   content_partscontent_textcodex_reasoninghas_codex_reasoningriitem_idreplay_itemr   replayed_message_itemsraw_itemraw_content_partsnormalized_content_partsr'   	part_typer   r   r   tcrs   r;   embedded_call_idembedded_response_item_idrU   	_raw_argsr<   raw_tool_call_idr{   r%   s"                                    @r+   !_chat_messages_to_responses_inputr      sV   "$EM e e#t$$ 	wwv8(((ggi,,G'4(( K @t T T T-1[-@-@MMl	!ww ' ' ' '/<' ' '     !#/6/Bs7|||{"" #&''*A"B"B&+#ot44 7- 7 7%b$// 7BFF;N4O4O 7&(ffTllG& )7m+C+C (
 +U*TBHHJJ*T*T*TK!LL555& ; - 1 1' : : :26/ '*gg.C&D&D#)*&1488 (4$7 '4 '4)(D99 %$#<<//9<<V@T@TXc@c@c$,4LL,C,C))*;TBB %$350$5 c cD#-dD#9#9 ) ((+DHHV,<,<,B(C(C(I(I(K(KI(0GGG (#'88FB#7#7D#|')#-dC#8#8 1'*4yy4;;]\`<a<abbbb7 %$ %.$/&I(,,W_J`J`&a&a'?	' ' #+,,t"4"4%gs33 @ @07K- (W 5 5%eS11 Aekkmm A38;;==K0[111.!3..)A--" 
GLL+-!P!PQQQQ!'')) GLL+,!O!OPPPP( G LL+"!E!EFFF WW\22
j$// '( & &)"d33 %$VVJ33"$&&..)'377 %w}} %$F^FF4LLG GC(*C #%&&"3"3)'377 7w}} 7&6G)'377 	aw}} 	a *+Dc J Ja$=$H$H$O$Oa %((A$B$BSZZ$O$O*Z2KCPUJJKK2X*Z*Z,/{D0I0I,J,J	*@)UXY^U_U_*`*`")--//$&FF;$=$=	%i66 7(,
95(Q(Q(QII!+Is!;!; 7(+II$-OO$5$5$=	$3'.$+)2	& &       Fd}EEFFFFd|DDEEE6>>"ww~6612BCCJGQgs++ 77==?? 7.44 79I9O9O9Q9Q 7.4466Ggs++ 7==?? LL."cggi44:;;     Lr-   	raw_itemsc                Z   t          | t                    st          d          g }t                      }t	          |           D ]e\  }}t          |t
                    st          d| d          |                    d          }|dk    r^|                    d          }|                    d          }t          |t                    r|                                st          d| d          t          |t                    r|                                st          d| d	          |                    d
d          }t          |t
                    rt          j
        |d          }n$t          |t                    st          |          }|                                pd}|                    d|                                |                                |d           |dk    r|                    d          }t          |t                    r|                                st          d| d          |                    dd          }	|	d}	t          |	t                    st          |	          }	|                    d|                                |	d           j|dk    r|                    d          }
t          |
t                    r|
r|                    d          }t          |t                    r|r||v r|                    |           d|
d}|                    d          }t          |t                    r||d<   ng |d<   |                    |           4|dk    r2|                    d          }|dk    rt          d| d          |                    d          }t          |t                    st          d| d          g }t	          |          D ]\  }}t          |t
                    st          d| d| d          |                    d          }|d vrt          d| d| d!|d"          |                    d#d          }|d}t          |t                    st          |          }|                    d$|d%           |st          d| d&          ddt          |                    d'                    |d(}|                    d          }t          |t                    r+|                                r|                                |d<   |                    d)          }t          |t                    r+|                                r|                                |d)<   |                    |           m|                    d          }|d*v r|                    dd          }|d}t          |t                    rY|dk    rd$nd+}g }t	          |          D ]"\  }}t          |t                    r|r|                    ||d%           6t          |t
                    st          d| d,| d-          t          |                    d          pd                                                                          }|d.v rV|                    d#d          }t          |t                    st          |pd          }|                    ||d%           |d/v r|                    d0d          }|                    d1          }t          |t
                    r-|                    d2d          }|                    d1|          }n|}t          |t                    st          |pd          }d3|d4}t          |t                    r+|                                r|                                |d1<   |                    |           t          d| d,| d!|                    d          d"          |                    ||d5           t          |t                    st          |          }|                    ||d5           Nt          d| d6|d7|d8          |S )9Nz4Codex Responses input must be a list of input items.zCodex Responses input[] must be an object.r   r   rU   rk   z#] function_call is missing call_id.z ] function_call is missing name.r<   r   Fr   r   r   z*] function_call_output is missing call_id.r   r   r   	reasoningr   r   r   r   r8   r   r   r   z+] message items must have role='assistant'.r   z&] message item must have content list.z] message content[>   r   r   ] has unsupported type .r   r   r   z3] message item must contain at least one text part.r}   r   r   >   r
   r   r   z
].content[z] must be an object or string.>   r   r   r   >   r   r   r   r   r   r   r   r   z#] has unsupported item shape (type=z, role=z).)r   r   
ValueErrorr   	enumerater!   r"   r   r#   r   r   r    r   r~   r$   )r   
normalizedseen_idsidxrr   	item_typerU   rk   r<   r   	encryptedr   reasoning_itemr8   r   r   normalized_contentpart_idxr'   r   r   normalized_itemr   r%   	validatedr(   r)   r   r   r*   s                                 r+   _preflight_codex_input_itemsr     sN	   i&& QOPPP')JEEHy)) g
 g
	T$%% 	QOcOOOPPPHHV$$	''hhy))G88F##Dgs++ d7==?? d !b#!b!b!bcccdC(( a

 a !_#!_!_!_```d33I)T** + JyuEEE			3// +	NN	!))1TI+&}} JJLL!*	    ...hhy))Ggs++ k7==?? k !i#!i!i!ijjjXXh++F~fc** %V2&}}$    ##!455I)S)) 2i 2((4..gs++ * *(** LL)))*5I!V!V
 ((9--gt,, 307N9--02N9-!!.111	!!88F##D{"" !j#!j!j!jkkkhhy))Ggt,, g !e#!e!e!efff!#"+G"4"4 Q Q$!$-- $ffffff   !HHV,,	$;;;$wwwwwirwww   xx++<D!$,, %t99D"))=$*O*OPPPP% t !r#!r!r!rsss!#=dhhx>P>PQQ-	/ /O hhtnnG'3'' 8GMMOO 8(/%HHW%%E%%% 9%++-- 9+0;;==(o...xx(((hhy"--G'4(( * .2[-@-@MMl	24	&/&8&8    NHd!$,, ! P%,,i-N-NOOO %dD11 (lSllHlll     0 0 6B77==??EEGGE EEE#xx33)$44 3#&tzr??D!(()T)J)JKKKK">>>$(HH["$=$=	!%(!3!3%i66 ,"+--r":":C%.]]8V%D%DFF"+C)#s33 1"%ciR..C>KZ]5^5^
%fc22 Bv||~~ B39<<>>Jx0!((4444(zSzzHzzeiememnteueuzzz   !!4I"F"FGGGgs++ 'g,,t@@AAAkSkkYkkaekkk
 
 	
 r-   F)allow_stream
api_kwargsr   boolDict[str, Any]c          	     p    t           t                    st          d          h d} fd|D             }|r3t          dd                    t	          |                     d                               d          }t          |t                    r|                                st          d          |                                }                     d	          }|d
}t          |t                    st          |          }|                                pt          }t                               d                    }                     d          }d }|t          |t                    st          d          g }t          |          D ]\  }	}
t          |
t                    st          d|	 d          |
                    d          dk    r)t          d|	 d|
                    d          d          |
                    d          }|
                    d          }t          |t                    r|                                st          d|	 d          t          |t                    st          d|	 d          |
                    dd
          }|d
}t          |t                    st          |          }|
                    dd          }t          |t                    st          |          }|                    d|                                |||d                                dd          }|durt          d          h d|||dd}|||d<                        d          }t          |t                    r||d<                        d           }t          |t                    r||d <                        d!          }t          |t                    r+|                                r|                                |d!<                        d"          }t          |t          t          f          r|d#k    rt          |          |d"<                        d$          }t          |t          t          f          rt          |          |d$<   d%D ]}                     |          }||||<                        d&          }|t          |t                    st          d'          i }|                                D ]d\  }}t          |t                    r|                                st          d(          |@t          |          ||                                <   e|r||d&<   |rI                     d)          }||d*urt          d+          |d*u rd*|d)<                       d)           nd) v rt          d,          t	          fd- D                       }|r&t          d.d                    |           d          |S )/Nz'Codex Responses request must be a dict.>   inputmodelinstructionsc                    g | ]}|v|	S r   r   )r   keyr   s     r+   
<listcomp>z/_preflight_codex_api_kwargs.<locals>.<listcomp>e  s#    @@@s#Z*?*?s*?*?*?r-   z3Codex Responses request missing required field(s): z, r   r   z;Codex Responses request 'model' must be a non-empty string.r   r   r   rg   z=Codex Responses request 'tools' must be a list when provided.zCodex Responses tools[r   r   rj   r   rk   rm   z] is missing a valid name.z] is missing valid parameters.rl   rq   Frp   storez6Codex Responses contract requires 'store' to be false.>   r   r   r   rg   includer   temperaturetool_choicer   service_tierextra_headersprompt_cache_keymax_output_tokensparallel_tool_calls)r   r   r   r   r   r   r   r   r   r   )r   r   r   r   z:Codex Responses request 'extra_headers' must be an object.zGCodex Responses request 'extra_headers' keys must be non-empty strings.streamTz/Codex Responses 'stream' must be true when set.zKCodex Responses stream flag is only allowed in fallback streaming requests.c              3  $   K   | ]
}|v|V  d S Nr   )r   r   allowed_keyss     r+   r   z._preflight_codex_api_kwargs.<locals>.<genexpr>  s-      MMS5L5L5L5L5L5LMMr-   z2Codex Responses request has unsupported field(s): )r   r!   r   r4   sortedr"   r   r#   r	   r   r   r   r   r    r>   floatr   r   )r   r   requiredmissingr   r   normalized_inputrg   normalized_toolsr   r   rk   rm   rl   rq   r   r   r   r   r   r   r   passthrough_keyvalr   normalized_headersr   rT   r   
unexpectedr   s   `                             @r+   _preflight_codex_api_kwargsr   \  s   
 j$'' DBCCC111H@@@@h@@@G nltyyY_`gYhYhOiOilllmmmNN7##EeS!! X XVWWWKKMME>>.11LlC(( )<((%%''A+AL3JNN74K4KLLNN7##E%&& 	^\]]]"5)) 	 	ICdD)) U !S#!S!S!STTTxx:-- !k#!k!kVZV^V^_eVfVf!k!k!klll88F##D,//JdC(( [

 [ !Y#!Y!Y!YZZZj$// _ !]#!]!]!]^^^((="55K" k3// /!+..XXh..Ffd++ &f##& JJLL#.$",     NN7E**EEQRRR  L $!	" "J #.
7 {++I)T"" ,"+
;nnY''G'4   ( '
9>>.11L,$$ :););)=)= :%1%7%7%9%9
>" #':;;#c5\22 A7H17L7L*-.?*@*@
&'..//K+U|,, 7$)+$6$6
=! V . .nn_--?*-J'NN?33M -.. 	[YZZZ-/'--// 	9 	9JCc3'' lsyy{{ l !jkkk}.1%jjsyy{{++ 	=*<J' h))&"4"4NOOOT>>#'Jx """"	Z		fgggMMMMzMMMMMJ 
Y:AVAVYYY
 
 	
 r-   rr   c                T   t          | dd          }t          |t                    sdS g }|D ]U}t          |dd          }|dvrt          |dd          }t          |t                    r|r|                    |           Vd                    |                                          S )z<Extract assistant text from a Responses message output item.r   Nr   r   >   r   r   r   getattrr   r   r   r    r4   r#   )rr   r   chunksr'   r(   r   s         r+   _extract_responses_message_textr     s    dIt,,Ggt$$ rF    fd++///tVT**dC   	 T 	 MM$776??  """r-   c                   t          | dd          }t          |t                    rmg }|D ]?}t          |dd          }t          |t                    r|r|                    |           @|r'd                    |                                          S t          | dd          }t          |t                    r|r|                                S dS )zAExtract a compact reasoning text from a Responses reasoning item.r8   Nr   
r   r   )rr   r8   r   r'   r   s        r+   !_extract_responses_reasoning_textr      s    dIt,,G'4   - 	$ 	$D4..D$$$ $ $d### 	-99V$$**,,,4&&D$  zz||2r-   responsetuple[Any, str]c                l   t          | dd          }t          |t                    r|st          | dd          }t          |t                    r|                                rxt
                              dt          |                                                     t          dddt          d|                                          g	          g}|| _	        nt          d
          t          | dd          }t          |t                    r'|                                                                }nd}|dv rqt          | dd          }t          |t                    r%|                    d          pt          |          }n|rt          |          nd| d}t          |          g }g }g }g }	g }
|dv }d}d}|D ]K}t          |dd          }t          |dd          }t          |t                    r'|                                                                }nd}|dv rd}|dk    rt          |dd          }d}t          |t                    r3|                                                                }|dv rd}n|dv rd}t          |          }|rv|                    |           ddt!          |          d|dgd	}t          |dd          }t          |t                    r|r||d<   |r||d<   |	                    |           S|dk    rt#          |          }|r|                    |           t          |dd          }t          |t                    r|rd|d}t          |dd          }t          |t                    r|r||d<   t          |dd          }t          |t                    rJg }|D ]@}t          |dd          }t          |t                    r|                    d|d           A||d<   |                    |           a|dk    rr|dv rnt          |dd           pd }t          |d!d"          }t          |t                    st%          j        |d#          }t          |d$d          }t          |dd          } t)          |           \  }!}"t          |t                    r|                                r|n|!}#t          |#t                    r|#                                st+          ||t          |
                    }#|#                                }#t          | t                    r| nd}$t-          |#|$          }$|
                    t          |#|#|$d%t          ||&          '                     |d(k    rjt          |dd           pd }t          |d)d"          }t          |t                    st%          j        |d#          }t          |d$d          }t          |dd          } t)          |           \  }!}"t          |t                    r|                                r|n|!}#t          |#t                    r|#                                st+          ||t          |
                    }#|#                                }#t          | t                    r| nd}$t-          |#|$          }$|
                    t          |#|#|$d%t          ||&          '                     Md*                    d+ |D                                                       }%|%sJt1          | d          r:t          | dd           }t          |t                    r|                                }%d}&|%rC|
sAt2                              |%          r'd}&t
                              d,|%dd-                    d }%t          |%|
|r'd.                    |                                          nddd|pd|	pd/          }'|
rd0}(n|&rd1}(n|s|r|sd1}(n	|r|%sd1}(nd2}(|'|(fS )3zENormalize a Responses API object to an assistant_message-like object.r   Nr   z`Codex response has empty output but output_text is present (%d chars); synthesizing output item.r   r   ru   r   r   z&Responses API returned no output itemsr}   >   failed	cancellederrorzResponses API returned status ''>   queuedrv   rw   Fr   Tr   >   analysis
commentary>   finalfinal_answerr   r   r   r   r8   r   summary_textr   rk   r   r<   r   r   rU   rj   )rk   r<   )r   rU   rV   r   rj   custom_tool_callr   r   c                    g | ]}||S r   r   )r   r   s     r+   r   z-_normalize_codex_response.<locals>.<listcomp>  s    :::!:A:::r-   zCodex response contains leaked tool-call text in assistant content (no structured function_call items). Treating as incomplete so the continuation path can re-elicit a proper tool call. Leaked snippet: %ri,  z

)r   r   r   reasoning_contentreasoning_detailsr   r   r   rv   stop)r   r   r   r   r#   loggerdebugr\   r   r   RuntimeErrorr$   r!   r"   r   r    r~   r   r   r   rW   rL   rf   r4   hasattr_TOOL_CALL_LEAK_PATTERNsearchwarning))r   r   out_textresponse_status	error_obj	error_msgr   reasoning_partsreasoning_items_rawmessage_items_rawr   has_incomplete_itemssaw_commentary_phasesaw_final_answer_phaserr   r   item_status
item_phasenormalized_phasemessage_textraw_message_itemr   reasoning_textr   r   r8   raw_summaryr'   r   r;   r<   raw_call_idraw_item_idr   r{   rU   rV   
final_textleaked_tool_call_textassistant_messagefinish_reasons)                                            r+   _normalize_codex_responser&    s[	   Xx..Ffd## I6 I 8]D99h$$ 	I)9)9 	ILL,-01A1A-B-B   &[(m(..BRBRSSST   F %HOOGHHHh$77O/3'' )//117799111Hgt44	i&& 	n!i00BC	NNII*3mI9m[j9m9m9mI9%%%!M!#O02.0J*.UU " e eD&$//	dHd33k3'' 	%++--3355KKKAAA#' 	!! w55J#*c** 2#-#3#3#5#5#;#;#=#= #'AAA+/((%)BBB-1*:4@@L ;$$\222%'A+NN)6 M MN	4 4  "$d33gs++ 5 5-4$T*# A0@$W-!(()9:::+%%>tDDN 7&&~666  &94@@I)S)) 5i 5$/iPP!$d33gs++ - -%,HTN!$	488gt,, 6"$K ' W W&tVT::%dC00 W'..PT/U/UVVV*5HY'#**8444/))EEEdFB//52Gk488Ii-- F JyuEEE	!$	488K!$d33K":;"G"Ga%/S%A%AokFWFWFYFYokk_oGgs++ V7==?? V0)S__UUmmooG.8c.J.JT{{PTA'K[\\o!1(gKKK       ,,,dFB//52Ggt44Ii-- F JyuEEE	!$	488K!$d33K":;"G"Ga%/S%A%AokFWFWFYFYokk_oGgs++ V7==?? V0)S__UUmmooG.8c.J.JT{{PTA'K[\\o!1(gKKK      ::}:::;;AACCJ *'(M:: *8]B77h$$ 	*!))J& " * )@)G)G
)S)S  $U tt		
 	
 	
 
':IS&++o..44666t19T-5    $	 $	 "6 ?U $	 	Z 	 %m++r-   )r   r   r   r   r   r   )r   r   r   r   )r   )r;   r   r<   r   r=   r>   r   r   )rM   r   r   rN   r   )rU   r   rV   rX   r   r   )rg   rh   r   rh   )rT   r   rx   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   r   )rr   r   r   r   )r   r   r   r   )%__doc__
__future__r   rF   r   loggingr]   r_   typesr   typingr   r   r   r   agent.prompt_builderr	   	getLogger__name__r  compile
IGNORECASEr  r,   r:   rL   rW   rf   rt   r|   r~   r   r   r   r   r   r&  r   r-   r+   <module>r1     sD    # " " " " "    				  ! ! ! ! ! ! , , , , , , , , , , , , 7 7 7 7 7 7		8	$	$ %"*0M   CI 0 0 0 0 0 0f& & & &Z	 	 	 	 	   & '+    B    2 HGG  GR      l l l lfo o o oj L L L L L Lf# # # #"   *R, R, R, R, R, R,r-   