o
    h7J                     @  s  U d dl mZ d dlZd dl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 d dlmZmZmZmZmZ d dlmZ d d	lmZmZmZmZmZmZmZ d d
lm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z*m+Z+m,Z, ddl-m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZDmEZE e
rddl.mFZF deB ZGdeGiZHedddZIdeJd < G d!d" d"eDZKeG d#d$ d$ZLG d%d& d&ZMdS )'    )annotationsN)AsyncIterator)
ContextVar)	dataclass)TYPE_CHECKINGAnyLiteralcastoverload)	NOT_GIVENAPIStatusErrorAsyncOpenAIAsyncStreamNotGiven)	ChatModel)ResponseResponseCompletedEventResponseIncludableResponseStreamEventResponseTextConfigParam	ToolParamresponse_create_params)ResponsePromptParam   )_debug)AgentOutputSchemaBase)	UserError)Handoff)ItemHelpersModelResponseTResponseInputItem)logger)MCPToolChoice)	CodeInterpreterToolComputerToolFileSearchToolFunctionToolHostedMCPToolImageGenerationToolLocalShellToolToolWebSearchTool)	SpanErrorresponse_span)Usage)_to_dump_compatible)__version__   )ModelModelTracing)ModelSettingszAgents/Python z
User-Agent!openai_responses_headers_override)defaultz!ContextVar[dict[str, str] | None]_HEADERS_OVERRIDEc                   @  s   e Zd ZdZd7dd	Zd8ddZ			d9d:d"d#Z			d9d;d%d&Ze	d<d=d*d+Z	e	d<d>d.d+Z				/	d?d@d2d+Z	dAd3d4Z
dBd5d6ZdS )COpenAIResponsesModelzG
    Implementation of `Model` that uses the OpenAI Responses API.
    modelstr | ChatModelopenai_clientr   returnNonec                 C  s   || _ || _d S N)r9   _client)selfr9   r;    rA   _/var/www/html/openai_agents/venv/lib/python3.10/site-packages/agents/models/openai_responses.py__init__@   s   
zOpenAIResponsesModel.__init__valuer   c                 C  s   |d ur|S t S r>   )r   )r@   rD   rA   rA   rB   _non_null_or_not_givenH   s   z+OpenAIResponsesModel._non_null_or_not_givenNsystem_instructions
str | Noneinputstr | list[TResponseInputItem]model_settingsr4   tools
list[Tool]output_schemaAgentOutputSchemaBase | Nonehandoffslist[Handoff]tracingr3   previous_response_idconversation_idpromptResponsePromptParam | Noner   c                   sd  t | d}zX| j||||||||	d|
d
I d H }tjr%td ntdtjdd |j	D ddd	 d
 |j
rQtd|j
j|j
j|j
j|j
j|j
jdnt }| r`||j_||j_W n8 ty } z,|tdd| rvt|n|jjid t|tr|jnd }td| d| d  d }~ww W d    n1 sw   Y  t|j	||j dS )NdisabledFrR   rS   streamrT   zLLM respondedz
LLM resp:
c                 S  s   g | ]}|  qS rA   )
model_dump).0xrA   rA   rB   
<listcomp>n   s    z5OpenAIResponsesModel.get_response.<locals>.<listcomp>r   indentensure_ascii
r1   )requestsinput_tokensoutput_tokenstotal_tokensinput_tokens_detailsoutput_tokens_detailszError getting responseerrormessagedatazError getting response: z. (request_id: ))outputusageresponse_id)!r-   is_disabled_fetch_responser   DONT_LOG_MODEL_DATAr!   debugjsondumpsrm   rn   r.   rc   rd   re   rf   rg   include_data	span_dataresponserH   	Exception	set_errorr,   str	__class____name__
isinstancer   
request_idrh   r   id)r@   rF   rH   rJ   rK   rM   rO   rQ   rR   rS   rT   span_responserx   rn   er   rA   rA   rB   get_responseK   sz   	:z!OpenAIResponsesModel.get_response"AsyncIterator[ResponseStreamEvent]c                 C s   t | dm}z9| j||||||||	d|
d
I dH }d}|2 z3 dH W }t|tr.|j}|V  q 6 |rA| rA||j_||j_W n* t	yl } z|
tdd| rWt|n|jjid td|   d}~ww W d   dS 1 sxw   Y  dS )	z`
        Yields a partial message as it is generated, as well as the usage information.
        rV   TrX   NzError streaming responserh   ri   zError streaming response: )r-   rp   rq   r~   r   rx   rv   rw   rH   ry   rz   r,   r{   r|   r}   r!   rh   )r@   rF   rH   rJ   rK   rM   rO   rQ   rR   rS   rT   r   rY   final_responsechunkr   rA   rA   rB   stream_response   sN   
"z$OpenAIResponsesModel.stream_responserY   Literal[True] AsyncStream[ResponseStreamEvent]c                      d S r>   rA   r@   rF   rH   rJ   rK   rM   rO   rR   rS   rY   rT   rA   rA   rB   rq         z$OpenAIResponsesModel._fetch_responseLiteral[False]r   c                   r   r>   rA   r   rA   rA   rB   rq      r   FLiteral[True] | Literal[False]+Response | AsyncStream[ResponseStreamEvent]c                   sf  t |}t|}|jr|rt|dkrdn|jdu rdnt}t|j}t	||}t|j
}t|}t|j}|jd urF||j |jd urP|d ttt t|}tjrbtd n/tj|ddd}tj|ddd}td| j d	| d
| d|	 d| d| d| d| d t|jpi }|jd ur|j|d< |jd ur|tkr|j|d< nd|ji}| jj j!d)i d| "|d| "|d| "|d| jd|d|d|d| "|
d| "|j#d| "|j$d| "|j%d| "|j&d|d |d!|	d"| '|d#|j(d$|j)d%|d&| "|j*d'| "|j+d(| "|j,|I d H S )*Nr   TFzmessage.output_text.logprobszCalling LLMr   r^   zCalling LLM z with input:
z
Tools:
z	
Stream: z
Tool choice: z
Response format: z
Previous response id: z
Conversation id: ra   top_logprobs	verbosityrR   conversationinstructionsr9   rH   includerK   rT   temperaturetop_p
truncationmax_output_tokenstool_choiceparallel_tool_callsrY   extra_headersextra_query
extra_bodytextstore	reasoningmetadatarA   )-r   input_to_new_input_listr/   r   lenr   	Converterconvert_tool_choicer   convert_toolsrK   get_response_formatsetincludesresponse_includeupdater   addr	   listr   r   rr   r!   rs   rt   ru   r9   dict
extra_argsr   r?   	responsescreaterE   r   r   r   
max_tokens_merge_headersr   r   r   r   r   )r@   rF   rH   rJ   rK   rM   rO   rR   rS   rY   rT   
list_inputr   r   converted_toolsconverted_tools_payloadresponse_formatinclude_setr   
input_json
tools_jsonr   rA   rA   rB   rq      s   
















	

c                 C  s   | j d u r	t | _ | j S r>   )r?   r   )r@   rA   rA   rB   _get_clientK  s   
z OpenAIResponsesModel._get_clientc                 C  s   i t |jpi t pi S r>   )_HEADERSr   r7   get)r@   rJ   rA   rA   rB   r   P  s   
z#OpenAIResponsesModel._merge_headers)r9   r:   r;   r   r<   r=   )rD   r   r<   r   )NNN)rF   rG   rH   rI   rJ   r4   rK   rL   rM   rN   rO   rP   rQ   r3   rR   rG   rS   rG   rT   rU   r<   r   )rF   rG   rH   rI   rJ   r4   rK   rL   rM   rN   rO   rP   rQ   r3   rR   rG   rS   rG   rT   rU   r<   r   r>   )rF   rG   rH   rI   rJ   r4   rK   rL   rM   rN   rO   rP   rR   rG   rS   rG   rY   r   rT   rU   r<   r   )rF   rG   rH   rI   rJ   r4   rK   rL   rM   rN   rO   rP   rR   rG   rS   rG   rY   r   rT   rU   r<   r   )NNFN)rF   rG   rH   rI   rJ   r4   rK   rL   rM   rN   rO   rP   rR   rG   rS   rG   rY   r   rT   rU   r<   r   )r<   r   )rJ   r4   )r}   
__module____qualname____doc__rC   rE   r   r   r
   rq   r   r   rA   rA   rA   rB   r8   ;   s2    

V6
_r8   c                   @  s   e Zd ZU ded< ded< dS )ConvertedToolszlist[ToolParam]rK   zlist[ResponseIncludable]r   N)r}   r   r   __annotations__rA   rA   rA   rB   r   X  s   
 r   c                   @  sR   e Zd ZedddZedd
dZed ddZed!ddZed"ddZdS )#r   r   @Literal['auto', 'required', 'none'] | str | MCPToolChoice | Noner<   ,response_create_params.ToolChoice | NotGivenc                 C  s   |d u rt S t|tr|jd|jdS |dkrdS |dkrdS |dkr%dS |dkr-ddiS |dkr5ddiS |d	kr=dd	iS |d
krEdd
iS |dkrMddiS |dkrUddiS |dkr]ddiS d|dS )Nmcp)server_labeltypenamerequiredautononefile_searchr   
web_searchweb_search_previewcomputer_use_previewimage_generationcode_interpreterfunction)r   r   )r   r~   r"   r   r   )clsr   rA   rA   rB   r   _  sH   
zConverter.convert_tool_choicerM   rN   "ResponseTextConfigParam | NotGivenc                 C  s.   |d u s|  r
tS ddd| | diS )Nformatjson_schemafinal_output)r   r   schemastrict)is_plain_textr   r   is_strict_json_schema)r   rM   rA   rA   rB   r     s   zConverter.get_response_formatrK   rL   rO   list[Handoff[Any, Any]]r   c           
      C  s   g }g }dd |D }t |dkrtdt | |D ]}| |\}}|| |r1|| q|D ]
}	|| |	 q4t||dS )Nc                 S  s   g | ]	}t |tr|qS rA   )r~   r$   )r[   toolrA   rA   rB   r]     s    z+Converter.convert_tools.<locals>.<listcomp>r1   z,You can only provide one computer tool. Got )rK   r   )r   r   _convert_toolappend_convert_handoff_toolr   )
r   rK   rO   r   r   computer_toolsr   converted_toolr   handoffrA   rA   rB   r     s   

zConverter.convert_toolsr   r*   +tuple[ToolParam, ResponseIncludable | None]c                 C  s  t |tr|j|j|jd|jd}d}||fS t |tr5d|jdur'|j nd|j	|j
d}d}||fS t |trcd|jd}|jrH|j|d< |jrP|j|d	< |jrX|j|d
< |jr]dnd}||fS t |trd|jj|jjd |jjd d}d}||fS t |tr|j}d}||fS t |tr|j}d}||fS t |tr|j}d}||fS t |trddi}d}||fS tdt| d)z#Returns converted tool and includesr   r   
parametersr   r   descriptionNr   )r   filtersuser_locationsearch_context_sizer   )r   vector_store_idsmax_num_resultsranking_optionsr   zfile_search_call.resultsr   r   r1   )r   environmentdisplay_widthdisplay_heightr   local_shellzUnknown tool type: z, tool)r~   r&   r   params_json_schemastrict_json_schemar   r+   r   rZ   r   r   r%   r   r   r   include_search_resultsr$   computerr   
dimensionsr'   tool_configr(   r#   r)   r   r   )r   r   r   r   rA   rA   rB   r     sn   
0
'









	
zConverter._convert_toolr   r   r   c                 C  s   |j |j|jd|jdS )Nr   r   )	tool_nameinput_json_schemar   tool_description)r   r   rA   rA   rB   r     s   zConverter._convert_handoff_toolN)r   r   r<   r   )rM   rN   r<   r   )rK   rL   rO   r   r<   r   )r   r*   r<   r   )r   r   r<   r   )	r}   r   r   classmethodr   r   r   r   r   rA   rA   rA   rB   r   ^  s    4=r   )N
__future__r   rt   collections.abcr   contextvarsr   dataclassesr   typingr   r   r   r	   r
   openair   r   r   r   r   openai.typesr   openai.types.responsesr   r   r   r   r   r   r   ,openai.types.responses.response_prompt_paramr    r   agent_outputr   
exceptionsr   rO   r   itemsr   r   r    r!   rJ   r"   r   r#   r$   r%   r&   r'   r(   r)   r*   r+   rQ   r,   r-   rn   r.   
util._jsonr/   versionr0   	interfacer2   r3   r4   _USER_AGENTr   r7   r   r8   r   r   rA   rA   rA   rB   <module>   sH    $	,
  