
    *"hj9                    |    d Z ddlmZ ddlZddlZddlZddlmZmZ ddZ	ddZ
ddZddZdd	Zdd
ZddZddZy)z7OpenAI Responses compatibility for Codex style clients.    )annotationsN)AnyAsyncIteratorc                R   t        | t              r| S t        | t              rwg }| D ]_  }t        |t              s|j	                  d      }|dv s*|j	                  d      }t        |t              sL|sO|j                  |       a dj                  |      S | t        |       S dS )z5Flatten Responses-style content blocks to plain text.type>   text
input_textoutput_textr     )
isinstancestrlistdictgetappendjoin)contentpartsitem	item_typer   s        ?/root/.hermes/SkillClaw/skillclaw/protocols/openai_responses.pynormalize_content_to_textr      s    '3'4  	'DdD)(IAAxx'dC(TLL&	' xx".3w<6B6    c                   t        | t              r| S t        | t              s| t        |       S dS g }| D ]  }t        |t              s|j	                  d      }|dv r:|j	                  d      }t        |t              sK|sN|j                  d|d       c|dv sh|j	                  d      xs |j	                  d      }t        |t              r|j	                  d      }t        |t              s|s|j                  dd|id	        |syt        d
 |D              r&dj                  d |D              j                         S |S )z@Convert Responses message content into chat-completions content.r   r   >   r   r	   r
   r   )r   r   >   	image_urlinput_imager   url)r   r   c              3  D   K   | ]  }|j                  d       dk(    yw)r   r   N)r   .0parts     r   	<genexpr>z1content_to_openai_chat_content.<locals>.<genexpr>5   s     
8$488Fv%
8s    r   c              3  X   K   | ]"  }t        |j                  d       xs d       $ yw)r   r   N)r   r   r    s     r   r#   z1content_to_openai_chat_content.<locals>.<genexpr>6   s#     FDHHV,23Fs   (*)	r   r   r   r   r   r   allr   strip)r   r   r   r   r   r   s         r   content_to_openai_chat_contentr'      s+   '3gt$&2s7|::"$E U$%HHV$	==88F#D$$fd;<66-@%I)T*%MM%0	)S)ik	@RSTU 

8%
88xxFFFLLNNLr   c                   t        | t              r| dv r| S t        d| d      t        | t              s| S t        | j	                  d      xs d      j                         }|dk(  rVt        | j	                  d      t              r| S t        | j	                  d      xs d      j                         }|rdd|idS |dv r|S t        d	|d      )
z>Convert Responses tool_choice to chat-completions tool_choice.>   autononerequiredzResponses tool_choice z% is not supported in chat bridge moder   r   functionnamer   r,   zResponses tool_choice type )r   r   
ValueErrorr   r   r&   )tool_choicechoice_typer-   s      r   tool_choice_to_openai_chatr2   :   s    +s#661+@efggk4(koof-34::<Kj kooj148;??6*0b1779&VTNCC22
2;/Afg
hhr   c           
        g }t        | t              s|S | D ]  }t        |t              s|j                  d      }|dk(  rzt	        |j                  d      xs d      j                         }|sY|j                  d|t	        |j                  d      xs d      |j                  d      xs di dd	d
       |j                  d      s|dv s|j                  |        |S )zIConvert Responses function-tool schemas to chat-completions tool schemas.r   r,   r-   r   description
parametersobject)r   
properties)r-   r4   r5   r.   >   Nr,   )r   r   r   r   r   r&   r   )tools	convertedr   r   r-   s        r   tools_to_openai_toolsr:   O   s    &(IeT" #$%HHV$	
"txx'-2.446D& $'*488M+B+Hb'I&*hh|&<&dac@d!	 88JI1C$CT")#* r   c           
     2   | j                  d      }|t        d      g | j                  d      }|j                  dt        |      d       dfd}dfd}t	        |t
              rj                  d|d       nt	        |t              r|D ]  }t	        |t
              rj                  d|d       (t	        |t              st        d	      |j                  d
      }|dk(  r	 ||       b|dk(  r	 ||       p|dk(  rvt        |j                  d      xs d      j                         xs d}|dk(  rd}|dk(  r	 ||       j                  |t        |j                  dd            d        nt        d      st        d      | j                  d      xs |d}	t        | j                  d            }
|
r|
|	d<   d| v r| d   |	d<   d| v r| d   |	d<   d| v rt        | d         |	d<   d| v r| d   |	d<   d| v r| d   |	d<   |	S )zDConvert an OpenAI Responses request body to chat-completions format.inputzinput is requiredinstructionssystem)roler   c           	        t        | j                  d      xs | j                  d      xs d      j                         }t        | j                  d      xs d      j                         }| j                  dd      }t        |t              rt        j                  |d      }nt        |t               st        |      }|j                         xs d}|r|st        d	      j                  d
d|d||ddgd       y )Ncall_ididr   r-   	arguments{}Fensure_asciiz,function_call items require call_id and name	assistantr,   )r-   rC   )rB   r   r,   )r?   r   
tool_calls)	r   r   r&   r   r   jsondumpsr/   r   )r   rA   r-   rC   messagess       r   append_tool_callz(to_openai_body.<locals>.append_tool_callx   s    dhhy)ATXXd^ArBHHJ488F#)r*002HH[$/	i&

95AIIs+IIOO%-	dKLL# & *-1	$J
	
r   c                *   t        | j                  d      xs | j                  d      xs d      j                         }|st        d      | j                  dd      }|d}t	        |t               st        |      }j                  d||d       y )NrA   tool_call_idr   z*function_call_output items require call_idoutputtool)r?   rN   r   )r   r   r&   r/   r   r   )r   rA   rO   rK   s      r   append_tool_outputz*to_openai_body.<locals>.append_tool_output   s    dhhy)KTXXn-EKLRRTIJJ(B'>F&#&[FVTUr   userz&input items must be strings or objectsr   function_callfunction_call_output	reasoningr?   	developerrP   r   r   z"input must be a string or an arrayz'input must produce at least one messagemodel)rW   rK   r8   temperaturetop_pr0   parallel_tool_callsmax_output_tokens
max_tokens)r   dict[str, Any]returnNone)r   r/   r   r   r   r   r   r   r&   r'   r:   r2   )bodydefault_model	raw_inputr=   rL   rQ   r   r   r?   openai_bodyr8   rK   s              @r   to_openai_bodyrd   m   sR   !I,--%'H88N+L6OP\6]^_
2	V )S!I>?	It	$ 	pD$$D ABdD) !IJJ(IO+ &22"4(K'txx'16288:DfD{"v~"4(OOT6TUYU]U]^gikUl6mno/	p2 =>>BCC '"3m#K "$((7"34E$G%)-%8M"$#G}G%?]@S%TM"$-12G-H)*d"$()<$=L!r   c                    t        | xs d      j                         }|j                  d      r|S |j                  d      r(t        |      t        d      kD  rd|t        d      d   S t	        j
                  dd|      }|rd|d d  S d| S )Nr   fc_call_z[^A-Za-z0-9_-]0   )r   r&   
startswithlenresub)rA   indexrawcleaneds       r   function_item_idrp      s    
gm

"
"
$C
~~e

~~g3s8c'l#:SW()**ff&C0GWSb\N##=r   c                   | j                  di g      d   }t        |j                  d      t              r|j                  di       ni }t        |j                  dd            }t        |j                  d      t              rt	        |j                  d      xs g       ng }g }t        |      D ]*  \  }}t        |t              st        |j                  d      t              r|j                  di       ni }	t        |j                  d      xs |j                  d	      xs d
|       j                         xs d
| }
|	j                  dd      }t        |t              rt        j                  |d      }nt        |t              st        |      }|j                  dt        |
|      |
t        |	j                  d      xs d      |xs ddd       - |s|s>|j                  d| j                  d      xs d dt        |       dddd|g dgd       | j                  di       }| j                  d      xs# dt        t        j                         dz         d| j                  dt        t        j                                     d||dd g t        |j                  d!d      xs d      t        |j                  d"d      xs d      t        |j                  d#d      xs d      d$d%
}|r||d<   |S )&z>Convert a chat-completions payload to a Responses API payload.choicesr   messager   r   rH   r,   rB   rA   rg   rC   rD   FrE   rS   r-   	completed)r   rB   rA   r-   rC   statusmsg_	skillclaw_rG   r
   r   r   r   )rB   r   r?   ru   r   usageresp_skillclaw_i  responsecreatedTr)   prompt_tokenscompletion_tokenstotal_tokens)input_tokensoutput_tokensr   )
rB   r6   
created_atru   rW   rO   rZ   r0   r8   rz   )r   r   r   r   r   	enumerater   r&   rI   rJ   r   rp   rj   inttime)payloadrW   choicers   content_textrH   output_itemsidx	tool_callr,   rA   rC   rz   response_payloads                 r   from_openai_chat_payloadr      s   [[RD)!,F+5fjj6KT+RfjjB'XZG,W[[B-GHL:DW[[Q]E^`d:egkk,/526kmJ)+L#J/ 
Y)T*4>y}}Z?XZ^4_9==R0egimmD)VY]]9-EV5QTPUW]]_pejknjocpLLd3	i&

95AIIs+II'&w4"HLL06B7&.$%		

* <W[[.=+>aL@Q?RS!#%%2LY[\]	
 KK$Ekk$N_St9K5L4M#Nkk)S-=>#		/1 = BC +>!B!GaH		.! < AB
  *6'r   c                 K   dd%fd}t        |       }d|d<   g |d<   d|d<    |d|d	        |d
|d	       t        | j                  dg             D ]r  \  }} |d||d       |j                  d      dk(  r`t        |j                  d      xs d      }|r  |d|j                  dd      ||d        |d|j                  dd      ||d       |j                  d      dk(  rt        |j                  dg             D ]  \  }}|j                  d      dk7  rt        |j                  d      xs d      }ddg d}	 |d||||	d       t        |j                  d      xs d      }
|
r |d||||
g d        |d||||
g d         |d!|||d|
g dd         |d"||d       u  |d#| d	       d$ yw)&z1Yield OpenAI Responses API-compatible SSE events.r   c                R    | d<   dz  dt        j                  | d      z   dz   S )Nsequence_number   zdata: FrE   z

)rI   rJ   )r   r   s    r   eventzstream_response.<locals>.event  s3    %4!"1$**W5AAFJJr   in_progressru   rO   Nrz   zresponse.created)r   r|   zresponse.in_progresszresponse.output_item.added)r   output_indexr   r   rS   rC   r   z&response.function_call_arguments.deltarB   )r   item_idr   deltaz%response.function_call_arguments.done)r   r   r   rC   rs   r   r
   ry   zresponse.content_part.added)r   r   content_indexr   r"   r   zresponse.output_text.delta)r   r   r   r   r   logprobszresponse.output_text.done)r   r   r   r   r   r   zresponse.content_part.donezresponse.output_item.donezresponse.completedzdata: [DONE]

)r   r]   r^   r   )r   r   r   r   )r   r   initial_responserm   r   rC   r   r"   r   	base_partr   r   s              @r   stream_responser     sx    OK ,-!.X!#X $W
+9IJ
KK
/=MN
OO !1!5!5h!CD E`t95Z^_``88F.DHH[17R8I H#'88D"#5(-!*	  C#xxb1$)!*	  88Fy('0)R1H'I ,#t88F#}4dhhtn23%2BrR	 =(-)6#* )  488F+1r2$@,1-:'.%)(*	 	  ;(-)6#* $$&	 	  <(-)6#*)6UW X I,Z 8%Y]^__KE`N -;KL
MM
s   G$G')r   r   r^   r   )r   r   r^   zstr | list[dict[str, Any]])r0   r   r^   r   )r8   r   r^   zlist[dict[str, Any]])r`   r]   ra   r   r^   r]   )rA   r   rm   r   r^   r   )r   r]   rW   r   r^   r]   )r   r]   r^   zAsyncIterator[str])__doc__
__future__r   rI   rk   r   typingr   r   r   r'   r2   r:   rd   rp   r   r    r   r   <module>r      sD    = "  	  %7$:i*<aH	;|Yr   