o
    h\6                     @  s  d dl m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mZ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
lmZ d dlmZ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l+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@mAZA ddlBm6ZC erddlDmEZE G dd  d e@ZFdS )!    )annotationsN)AsyncIterator)TYPE_CHECKINGAnyLiteraloverload)	NOT_GIVENAsyncOpenAIAsyncStream)	ChatModel)ChatCompletionChatCompletionChunkChatCompletionMessage)Choice)Response)ResponsePromptParam)InputTokensDetailsOutputTokensDetails   )_debug)AgentOutputSchemaBase)Handoff)ModelResponseTResponseInputItemTResponseStreamEvent)logger)Tool)generation_span)GenerationSpanData)Span)Usage)_to_dump_compatible   )	Converter)HEADERSHEADERS_OVERRIDEChatCmplHelpers)ChatCmplStreamHandler)FAKE_RESPONSES_ID)ModelModelTracing)ModelSettingsc                   @  s   e Zd Zd8ddZd9ddZ			d:d;d!d"Z			d:d<d$d%Ze	d=d>d+d,Ze	d=d?d/d,Z	0	d@dAd3d,ZdBd4d5Z	dCd6d7Z
dS )DOpenAIChatCompletionsModelmodelstr | ChatModelopenai_clientr	   returnNonec                 C  s   || _ || _d S N)r-   _client)selfr-   r/    r5   e/var/www/html/openai_agents/venv/lib/python3.10/site-packages/agents/models/openai_chatcompletions.py__init__'   s   
z#OpenAIChatCompletionsModel.__init__valuer   c                 C  s   |d ur|S t S r2   )r   )r4   r8   r5   r5   r6   _non_null_or_not_given/   s   z1OpenAIChatCompletionsModel._non_null_or_not_givenNsystem_instructions
str | Noneinputstr | list[TResponseInputItem]model_settingsr+   tools
list[Tool]output_schemaAgentOutputSchemaBase | Nonehandoffslist[Handoff]tracingr*   previous_response_idconversation_idpromptResponsePromptParam | Noner   c                   s  t t| j| dt| jjiB | d}| j||||||||d|
d
I d H }d }d }|jr@t	|jdkr@|jd }|j
}tjrItd n"|d ur\tdtj| ddd	 n|ra|jnd
}td|  |jrtd|jj|jj|jjtt|jjddpddtt|jjddpdddnt }| r|d ur| gng |j_|j |j!d|j_|d urt"#|ng }t$||d dW  d    S 1 sw   Y  d S )Nbase_urlr-   model_configdisabledFstreamrH   r   zReceived model responsezLLM resp:
%s
r   indentensure_ascii-z(LLM resp had no message. finish_reason: r"   cached_tokens)rT   reasoning_tokens)rU   )requestsinput_tokensoutput_tokenstotal_tokensinput_tokens_detailsoutput_tokens_detailsrW   rX   )outputusageresponse_id)%r   strr-   to_json_dictr3   rJ   is_disabled_fetch_responsechoiceslenmessager   DONT_LOG_MODEL_DATAr   debugjsondumps
model_dumpfinish_reasonr^   r    prompt_tokenscompletion_tokensrY   r   getattrprompt_tokens_detailsr   completion_tokens_detailsinclude_data	span_datar]   rW   rX   r#   message_to_output_itemsr   )r4   r:   r<   r>   r?   rA   rC   rE   rF   rG   rH   span_generationresponserf   first_choicerl   r^   itemsr5   r5   r6   get_response2   s   



$z'OpenAIChatCompletionsModel.get_response#AsyncIterator[TResponseStreamEvent]c                 C s  t t| j| dt| jjiB | de}| j||||||||d|
d
I dH \}}d}t	||2 z3 dH W }|V  |j
dkrE|j}q46 | rT|rT| g|j_|rl|jrt|jj|jjd|j_W d   dS W d   dS W d   dS 1 sw   Y  dS )z`
        Yields a partial message as it is generated, as well as the usage information.
        rJ   rK   TrN   Nzresponse.completedr\   )r   r`   r-   ra   r3   rJ   rb   rc   r'   handle_streamtyperv   rr   rk   rs   r]   r^   rW   rX   )r4   r:   r<   r>   r?   rA   rC   rE   rF   rG   rH   ru   rv   rO   final_responsechunkr5   r5   r6   stream_response   sJ   

"z*OpenAIChatCompletionsModel.stream_responsespanSpan[GenerationSpanData]rO   Literal[True]1tuple[Response, AsyncStream[ChatCompletionChunk]]c                      d S r2   r5   r4   r:   r<   r>   r?   rA   rC   r   rE   rO   rH   r5   r5   r6   rc         z*OpenAIChatCompletionsModel._fetch_responseLiteral[False]r   c                   r   r2   r5   r   r5   r5   r6   rc      r   FboolBChatCompletion | tuple[Response, AsyncStream[ChatCompletionChunk]]c                   s  t |}|r|d|dd t|}| r||j_|jr*|r*t|dkr*dn|jdu r1dnt	}t 
|j}t |}|rGdd |D ng }|D ]
}|t | qKt|}tjrctd n$tj|d	dd
}tj|d	dd
}t| d| d|	 d| d| d
 |jr|jjnd }t|  |}tj|  ||	d}|  jjjd)i d| jd|d|pt	d| |j d| |j!d| |j"d| |j#d| |j$d|d|d|d|	d| |d| |d| |d | |j%d!| |j&d"| '|d#|j(d$|j)d%| |j*|j+pi I d H }t,|t-r-|S t.
|j}|d u s=|t	kr?d&}t/t0t11 | jd'g ||j!|j g |pRd|jd(}||fS )*Nr   system)contentroleTFc                 S  s   g | ]}t |qS r5   )r#   tool_to_openai).0toolr5   r5   r6   
<listcomp>   s    z>OpenAIChatCompletionsModel._fetch_response.<locals>.<listcomp>zCalling LLMr   rP   z
Tools:
z	
Stream: z
Tool choice: z
Response format: 
)rO   r-   messagesr?   temperaturetop_pfrequency_penaltypresence_penalty
max_tokenstool_choiceresponse_formatparallel_tool_callsrO   stream_optionsstorereasoning_effort	verbositytop_logprobsextra_headersextra_query
extra_bodymetadataautorv   )id
created_atr-   objectr]   r   r   r   r?   r   	reasoningr5   )2r#   items_to_messagesinsertr!   rr   rs   r<   r   re   r   convert_tool_choicer   convert_response_formatappendconvert_handoff_toolr   rg   r   rh   ri   rj   r   effortr&   get_store_param_get_clientget_stream_options_paramchatcompletionscreater-   r9   r   r   r   r   r   r   r   _merge_headersr   r   r   
extra_args
isinstancer   OpenAIResponsesConverterr   r(   time)r4   r:   r<   r>   r?   rA   rC   r   rE   rO   rH   converted_messagesr   r   r   converted_toolshandoffmessages_json
tools_jsonr   r   r   retresponses_tool_choicerv   r5   r5   r6   rc      s   



	





	c                 C  s   | j d u r	t | _ | j S r2   )r3   r	   )r4   r5   r5   r6   r   \  s   
z&OpenAIChatCompletionsModel._get_clientc                 C  s   i t |jpi t pi S r2   )r$   r   r%   get)r4   r>   r5   r5   r6   r   a  s   
z)OpenAIChatCompletionsModel._merge_headers)r-   r.   r/   r	   r0   r1   )r8   r   r0   r   )NNN)r:   r;   r<   r=   r>   r+   r?   r@   rA   rB   rC   rD   rE   r*   rF   r;   rG   r;   rH   rI   r0   r   )r:   r;   r<   r=   r>   r+   r?   r@   rA   rB   rC   rD   rE   r*   rF   r;   rG   r;   rH   rI   r0   rz   r2   )r:   r;   r<   r=   r>   r+   r?   r@   rA   rB   rC   rD   r   r   rE   r*   rO   r   rH   rI   r0   r   )r:   r;   r<   r=   r>   r+   r?   r@   rA   rB   rC   rD   r   r   rE   r*   rO   r   rH   rI   r0   r   )FN)r:   r;   r<   r=   r>   r+   r?   r@   rA   rB   rC   rD   r   r   rE   r*   rO   r   rH   rI   r0   r   )r0   r	   )r>   r+   )__name__
__module____qualname__r7   r9   ry   r   r   rc   r   r   r5   r5   r5   r6   r,   &   s.    

a2 
r,   )G
__future__r   ri   r   collections.abcr   typingr   r   r   r   openair   r	   r
   openai.typesr   openai.types.chatr   r   r   !openai.types.chat.chat_completionr   openai.types.responsesr   ,openai.types.responses.response_prompt_paramr   %openai.types.responses.response_usager   r    r   agent_outputr   rC   r   rx   r   r   r   r   r   r   rE   r   tracing.span_datar   tracing.spansr   r^   r    
util._jsonr!   chatcmpl_converterr#   chatcmpl_helpersr$   r%   r&   chatcmpl_stream_handlerr'   fake_idr(   	interfacer)   r*   openai_responsesr   r>   r+   r,   r5   r5   r5   r6   <module>   s@    