o
    h`                     @  sz  d dl mZ d dlZd dlmZ d dlmZmZmZ d dl	m
Z
mZ d dlmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZ d dlmZ d d	lmZ d d
l m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2 d dl3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: ddl;m<Z< ddl=m>Z>m?Z? ddl@mAZA ddlBmCZCmDZD ddlEmFZF G dd dZGdS )    )annotationsN)Iterable)AnyLiteralcast)	NOT_GIVENNotGiven)#ChatCompletionAssistantMessageParam#ChatCompletionContentPartImageParamChatCompletionContentPartParam"ChatCompletionContentPartTextParam#ChatCompletionDeveloperMessageParamChatCompletionMessage*ChatCompletionMessageFunctionToolCallParamChatCompletionMessageParam ChatCompletionSystemMessageParam#ChatCompletionToolChoiceOptionParamChatCompletionToolMessageParamChatCompletionUserMessageParam)FileFileFile)ChatCompletionToolParam)ResponseFormat)EasyInputMessageParamResponseFileSearchToolCallParamResponseFunctionToolCallResponseFunctionToolCallParamResponseInputContentParamResponseInputFileParamResponseInputImageParamResponseInputTextParamResponseOutputMessageResponseOutputMessageParamResponseOutputRefusalResponseOutputTextResponseReasoningItemResponseReasoningItemParam)FunctionCallOutputItemReferenceMessage)ContentSummary   )AgentOutputSchemaBase)AgentsException	UserError)Handoff)TResponseInputItemTResponseOutputItem)MCPToolChoice)FunctionToolTool   )FAKE_RESPONSES_IDc                   @  s   e Zd ZedEddZedFd
dZedGddZedHddZedIddZedJddZ	edKddZ
edLd d!ZedMd#d$ZedNd&d'ZedOd)d*ZedPd.d/ZedQd1d2Ze	3dRdSd9d:ZedTd>d?ZedUdBdCZdDS )V	Convertertool_choice@Literal['auto', 'required', 'none'] | str | MCPToolChoice | Nonereturn.ChatCompletionToolChoiceOptionParam | NotGivenc                 C  sP   |d u rt S t|trtd|dkrdS |dkrdS |dkr!dS dd|idS )Nz:MCPToolChoice is not supported for Chat Completions modelsautorequirednonefunctionnametyper@   )r   
isinstancer3   r/   )clsr9    rF   a/var/www/html/openai_agents/venv/lib/python3.10/site-packages/agents/models/chatcmpl_converter.pyconvert_tool_choice6   s   
zConverter.convert_tool_choicefinal_output_schemaAgentOutputSchemaBase | NoneResponseFormat | NotGivenc                 C  s*   |r|  rtS dd| | ddS )Njson_schemafinal_output)rA   strictschema)rC   rL   )is_plain_textr   is_strict_json_schemarL   )rE   rI   rF   rF   rG   convert_response_formatL   s   z!Converter.convert_response_formatmessager   list[TResponseOutputItem]c           
   
   C  sn  g }t |drZ|jrZttt|jddgdd}t |drU|jrUg |_g }|jD ]%}t|trL|	dd}|r@|j
t|d	d |	d
 }rL|
| q'|rUd||_|
| ttg dddd}|jrr|j
t|jdg d |jr|j
t|jdd |jrtd|jr|
| |jr|jD ]}	|	jdkr|
tt|	j|	jj|	jjdd q|	jdkr	 q|S )Nreasoning_contentsummary_texttextrC   	reasoning)idsummaryrC   thinking_blocksthinking reasoning_text	signature
	assistantrS   	completed)rZ   contentrolerC   statusoutput_text)rX   rC   r   refusal)rh   rC   z Audio is not currently supportedr@   function_call)rZ   call_id	argumentsrA   rC   custom)hasattrrU   r%   r7   r+   r\   rd   rD   dictgetappendr*   joinencrypted_contentr!   r$   rh   r#   audior.   
tool_callsrC   r   rZ   r@   rk   rA   )
rE   rS   itemsreasoning_item
signaturesblockthinking_textr`   message_item	tool_callrF   rF   rG   message_to_output_items\   st   








	z!Converter.message_to_output_itemsitemr   EasyInputMessageParam | Nonec                 C  sT   t |tsd S | }|ddhkrd S |dd }|dvrd S d|vr%d S tt|S )Nrd   re   )userrb   system	developer)rD   rn   keysro   r   r   )rE   r}   r   re   rF   rF   rG   maybe_easy_input_message   s   

z"Converter.maybe_easy_input_messageMessage | Nonec                 C  s4   t |tr|ddkr|ddv rtt|S d S )NrC   rS   re   )r   r   r   )rD   rn   ro   r   r)   rE   r}   rF   rF   rG   maybe_input_message   s   
zConverter.maybe_input_message&ResponseFileSearchToolCallParam | Nonec                 C  &   t |tr|ddkrtt|S d S )NrC   file_search_call)rD   rn   ro   r   r   r   rF   rF   rG   maybe_file_search_call      
z Converter.maybe_file_search_call$ResponseFunctionToolCallParam | Nonec                 C  r   )NrC   ri   )rD   rn   ro   r   r   r   rF   rF   rG   maybe_function_tool_call   r   z"Converter.maybe_function_tool_callFunctionCallOutput | Nonec                 C  r   )NrC   function_call_output)rD   rn   ro   r   r'   r   rF   rF   rG   maybe_function_tool_call_output   s   
z)Converter.maybe_function_tool_call_outputItemReference | Nonec                 C  r   )NrC   item_reference)rD   rn   ro   r   r(   r   rF   rF   rG   maybe_item_reference   r   zConverter.maybe_item_reference!ResponseOutputMessageParam | Nonec                 C  s4   t |tr|ddkr|ddkrtt|S d S )NrC   rS   re   rb   )rD   rn   ro   r   r"   r   rF   rF   rG   maybe_response_output_message   s   
z'Converter.maybe_response_output_message!ResponseReasoningItemParam | Nonec                 C  r   )NrC   rY   )rD   rn   ro   r   r&   r   rF   rF   rG   maybe_reasoning_message   r   z!Converter.maybe_reasoning_messagerd   )str | Iterable[ResponseInputContentParam].str | list[ChatCompletionContentPartTextParam]c                 C  sH   |  |}t|tr|S g }|D ]}|ddkr!|tt| q|S )NrC   rX   )extract_all_contentrD   strro   rp   r   r   )rE   rd   all_contentoutcrF   rF   rG   extract_text_content   s   

zConverter.extract_text_content*str | list[ChatCompletionContentPartParam]c              
   C  sN  t |tr|S g }|D ]}t |tr*|ddkr*tt|}|td|d d qt |tr]|ddkr]tt|}d|vsC|d sJt	d| |t
d|d |dd	d
d qt |tr|ddkrtt|}d|vsv|d s}t	d| d|vs|d st	d| |tdt|d |d dd qt	d| |S )NrC   
input_textrX   )rC   rX   input_image	image_urlz.Only image URLs are supported for input_image detailr=   )urlr   )rC   r   
input_file	file_dataz+Only file_data is supported for input_file filenamez)filename must be provided for input_file file)r   r   )rC   r   zUnknown content: )rD   r   rn   ro   r   r    rp   r   r   r/   r
   r   r   r   )rE   rd   r   r   casted_text_paramcasted_image_paramcasted_file_paramrF   rF   rG   r     sZ   



	

zConverter.extract_all_contentFru   "str | Iterable[TResponseInputItem]preserve_thinking_blocksbool list[ChatCompletionMessageParam]c           %        s  t |trtd|dgS g d dd5 fdd}d6 fd	d
}|D ]A}| | }r|d }|d }|dkrK|  d| |d}	|	 q$|dkr`|  d| |d}
|
 q$|dkru|  d| |d}| q$|dkr|  d| |d}| q$td| | | }r|d }|d }|  |dkrd| |d}	|	 q$|dkrd| |d}
|
 q$|dkrd| |d}| q$td| | 	| }r?|  t
dd}|d }g }|D ]3}|d dkr	||d  q|d dkr|d |d< q|d dkr%td| td| |r8d|}||d< g |d< | q$| | }ru| }t|dg }t|d ddt|dg |d d!d"d#}|| ||d< q$| | }r| }rd|v rt |d trt|d dd$}|g|d< d|vs|d du rg |d< |d  |d< dt|dg }|d% r|d% nd&}t|d' d|d( |d"d#}|| ||d< q$| | }r|  d)|d' |d* d+}| q$| | }rtd,| | | }r`|dg }|d-} | r'| dng }!|r_|r_g }"|D ])}#t |#tr[|#dd.kr[d/|#dd0d1}$|!rV|!d2|$d3< |"|$ q3|"q$td4| |  S )7aw  
        Convert a sequence of 'Item' objects into a list of ChatCompletionMessageParam.

        Args:
            items: A string or iterable of response input items to convert
            preserve_thinking_blocks: Whether to preserve thinking blocks in tool calls
                for reasoning models like Claude 4 Sonnet/Opus which support interleaved
                thinking. When True, thinking blocks are reconstructed and included in
                assistant messages with tool calls.

        Rules:
        - EasyInputMessage or InputMessage (role=user) => ChatCompletionUserMessageParam
        - EasyInputMessage or InputMessage (role=system) => ChatCompletionSystemMessageParam
        - EasyInputMessage or InputMessage (role=developer) => ChatCompletionDeveloperMessageParam
        - InputMessage (role=assistant) => Start or flush a ChatCompletionAssistantMessageParam
        - response_output_message => Also produces/flushes a ChatCompletionAssistantMessageParam
        - tool calls get attached to the *current* assistant message, or create one if none.
        - tool outputs => ChatCompletionToolMessageParam
        r   )re   rd   Nr;   Nonec                     s.    d ur  ds d=   d  d S d S )Nrt   )ro   rp   rF   )current_assistant_msgresultrF   rG   flush_assistant_message]  s   

z<Converter.items_to_messages.<locals>.flush_assistant_messager	   c                     s    d u rt dd g  d<  S )Nrb   re   rt   )r	   rF   )r   pending_thinking_blocksrF   rG   ensure_assistant_messagef  s   
z=Converter.items_to_messages.<locals>.ensure_assistant_messagere   rd   r   r   rb   z'Unexpected role in easy_input_message: z"Unexpected role in input_message: r   rC   rg   rX   rh   output_audioz<Only audio IDs are supported for chat completions, but got: z/Unknown content type in ResponseOutputMessage: ra   rt   rZ   r@   r   queriesrf   )r   rf   )rA   rk   )rZ   rC   r@   rW   rk   z{}rj   rA   tooloutput)re   tool_call_idrd   z7Encountered an item_reference, which is not supported: rr   r_   r]   r^   )rC   r]   r   r`   z"Unhandled item type or structure: )r;   r   )r;   r	   )rD   r   r   r   r   rp   r   r/   r   r   r	   rq   r   listro   r   jsondumpsr   r   r   r   r   splitrn   pop)%rE   ru   r   r   r   r}   easy_msgre   rd   msg_user
msg_systemmsg_developermsg_assistantin_msgresp_msgnew_asstcontentstext_segmentsr   combinedfile_searchasstrt   new_tool_call	func_calltext_contentrk   func_outputmsgitem_refrv   content_itemsrr   rw   reconstructed_thinking_blockscontent_itemthinking_blockrF   )r   r   r   rG   items_to_messages7  s0  
	











zConverter.items_to_messagesr   r5   r   c                 C  s>   t |trd|j|jpd|jddS tdt| d| )Nr@   r^   rA   description
parametersrB   zLHosted tools are not supported with the ChatCompletions API. Got tool type: z, tool: )rD   r4   rA   r   params_json_schemar/   rC   )rE   r   rF   rF   rG   tool_to_openai2  s   
	zConverter.tool_to_openaihandoffHandoff[Any, Any]c                 C  s   d|j |j|jddS )Nr@   r   rB   )	tool_nametool_descriptioninput_json_schema)rE   r   rF   rF   rG   convert_handoff_toolC  s   zConverter.convert_handoff_toolN)r9   r:   r;   r<   )rI   rJ   r;   rK   )rS   r   r;   rT   )r}   r   r;   r~   )r}   r   r;   r   )r}   r   r;   r   )r}   r   r;   r   )r}   r   r;   r   )r}   r   r;   r   )r}   r   r;   r   )r}   r   r;   r   )rd   r   r;   r   )rd   r   r;   r   )F)ru   r   r   r   r;   r   )r   r5   r;   r   )r   r   r;   r   )__name__
__module____qualname__classmethodrH   rR   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   rF   rF   rF   rG   r8   5   sF    I
4 {r8   )H
__future__r   r   collections.abcr   typingr   r   r   openair   r   openai.types.chatr	   r
   r   r   r   r   r   r   r   r   r   r   4openai.types.chat.chat_completion_content_part_paramr   r   ,openai.types.chat.chat_completion_tool_paramr   *openai.types.chat.completion_create_paramsr   openai.types.responsesr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   +openai.types.responses.response_input_paramr'   r(   r)   .openai.types.responses.response_reasoning_itemr*   r+   agent_outputr-   
exceptionsr.   r/   handoffsr0   ru   r1   r2   model_settingsr3   r   r4   r5   fake_idr7   r8   rF   rF   rF   rG   <module>   s(    8@