
    g@                    4   d dl mZ d dlmZmZ d dlmZ d dlm	Z	m
Z
 d dl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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%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/m0Z0m1Z1m2Z2m3Z3m4Z4 	 d dl5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z; d dl<m=Z= d dl>m?Z? ee:eBf   ZC	  e	d       G d de0             ZDe	 G d de.             ZEe	 G d d e2             ZFe	 G d! d"e1             ZGd%d#ZHd&d$ZIy# e@$ rZA e@d      eAdZA[Aww xY w)'    )annotations)AsyncIteratorIterable)asynccontextmanager)	dataclassfield)datetimetimezone)chain)LiteralUnionoverload)AsyncClient)assert_never   )UnexpectedModelBehavior_utilsresult)guard_tool_call_id)
ModelMessageModelRequestModelResponseModelResponsePartRetryPromptPartSystemPromptPartTextPartToolCallPartToolReturnPartUserPromptPart)Usage)ModelSettings)ToolDefinition   )
AgentModelEitherStreamedResponseModelStreamStructuredResponseStreamTextResponsecached_async_http_clientcheck_allow_model_requests)	NOT_GIVENAsyncOpenAIAsyncStream)	ChatModelchat)ChatCompletionChunk)ChoiceDeltaToolCallu   Please install `openai` to use the OpenAI model, you can use the `openai` optional group — `pip install 'pydantic-ai-slim[openai]'`NF)initc                      e Zd ZU dZded<    ed      Zded<   ddddd		 	 	 	 	 	 	 	 	 dd
Z	 	 	 	 	 	 	 	 ddZddZ	e
dd       Zy)OpenAIModelzA model that uses the OpenAI API.

    Internally, this uses the [OpenAI Python client](https://github.com/openai/openai-python) to interact with the API.

    Apart from `__init__`, all methods are private or match those of the base class.
    OpenAIModelName
model_nameF)reprr,   clientN)base_urlapi_keyopenai_clienthttp_clientc                   || _         |#|J d       |J d       |J d       || _        y|t        |||      | _        yt        ||t                     | _        y)a)  Initialize an OpenAI model.

        Args:
            model_name: The name of the OpenAI model to use. List of model names available
                [here](https://github.com/openai/openai-python/blob/v1.54.3/src/openai/types/chat_model.py#L7)
                (Unfortunately, despite being ask to do so, OpenAI do not provide `.inv` files for their API).
            base_url: The base url for the OpenAI requests. If not provided, the `OPENAI_BASE_URL` environment variable
                will be used if available. Otherwise, defaults to OpenAI's base url.
            api_key: The API key to use for authentication, if not provided, the `OPENAI_API_KEY` environment variable
                will be used if available.
            openai_client: An existing
                [`AsyncOpenAI`](https://github.com/openai/openai-python?tab=readme-ov-file#async-usage)
                client to use. If provided, `base_url`, `api_key`, and `http_client` must be `None`.
            http_client: An existing `httpx.AsyncClient` to use for making HTTP requests.
        Nz5Cannot provide both `openai_client` and `http_client`z2Cannot provide both `openai_client` and `base_url`z1Cannot provide both `openai_client` and `api_key`)r9   r:   r<   )r6   r8   r,   r)   )selfr6   r9   r:   r;   r<   s         N/var/www/openai/venv/lib/python3.12/site-packages/pydantic_ai/models/openai.py__init__zOpenAIModel.__init__F   sw    0 ,6$&_(__&#Y%YY#?W$WW?'DK$%xVabDK%xVnVpqDK    c                  K   t                |D cg c]  }| j                  |       }}|r"||D cg c]  }| j                  |       c}z  }t        | j                  | j                  ||      S c c}w c c}w wN)r*   _map_tool_definitionOpenAIAgentModelr8   r6   )r>   function_toolsallow_text_resultresult_toolsrtoolss         r?   agent_modelzOpenAIModel.agent_modeli   s~      	#$7EF~!**1-~FLILqd//2LIIEKKOO	
 	
 GIs   A;A1	A;A6
1A;c                     d| j                    S )Nzopenai:)r6   r>   s    r?   namezOpenAIModel.name{   s    )**rA   c                P    d| j                   | j                  | j                  ddS )Nfunction)rN   description
parameters)typerP   )rN   rQ   parameters_json_schema)fs    r?   rD   z OpenAIModel._map_tool_definition~   s-      }}66
 	
rA   )
r6   r5   r9   
str | Noner:   rV   r;   zAsyncOpenAI | Noner<   zAsyncHTTPClient | None)rF   list[ToolDefinition]rG   boolrH   rW   returnr$   )rY   str)rU   r"   rY   zchat.ChatCompletionToolParam)__name__
__module____qualname____doc____annotations__r   r8   r@   rK   rN   staticmethodrD    rA   r?   r4   r4   :   s      U+FK+  $",0.2!r#!r 	!r
 !r *!r ,!rF
 -
  	

 +
 

$+ 
 
rA   r4   c                     e Zd ZU dZded<   ded<   ded<   ded	<   	 	 	 	 	 	 dd
Ze	 	 	 	 	 	 dd       Ze	 	 	 	 	 	 	 	 dd       Z	e	 	 	 	 	 	 	 	 dd       Z		 	 	 	 	 	 	 	 ddZ	e
dd       Ze
dd       Zedd       Zedd       Zy)rE   z1Implementation of `AgentModel` for OpenAI models.r,   r8   r5   r6   rX   rG   z"list[chat.ChatCompletionToolParam]rJ   c                |   K   | j                  |d|       d {   }| j                  |      t        |      fS 7  w)NF)_completions_create_process_response
_map_usager>   messagesmodel_settingsresponses       r?   requestzOpenAIAgentModel.request   s@      11(E>RR%%h/H1EEE Ss   <:!<c                  K   | j                  |d|       d {   }|4 d {    | j                  |       d {    d d d       d {    y 7 <7 37 7 # 1 d {  7  sw Y   y xY ww)NT)rd   _process_streamed_responserg   s       r?   request_streamzOpenAIAgentModel.request_stream   s\      11(D.QQ877AAA 88 RA 888sd   A3A
A3AA3AAAA3AA3A3AA3A0$A'%A0,A3c                   K   y wrC   ra   r>   rh   streamri   s       r?   rd   z$OpenAIAgentModel._completions_create         	   c                   K   y wrC   ra   rp   s       r?   rd   z$OpenAIAgentModel._completions_create   rr   rs   c                6   K    j                   sd }n j                  sd}nd}t        t         fd|D               }|xs i } j                  j
                  j                  j                   j                  |d j                   rdnt         j                   xs t        |xs t        ||rddint        |j                  dt              |j                  dt              |j                  d	t              |j                  d
t                     d {   S 7 w)Nrequiredautoc              3  @   K   | ]  }j                  |        y wrC   )_map_message).0mr>   s     r?   	<genexpr>z7OpenAIAgentModel._completions_create.<locals>.<genexpr>   s     &NXt'8'8';Xs   r#   Tinclude_usage
max_tokenstemperaturetop_ptimeout)modelrh   nparallel_tool_callsrJ   tool_choicerq   stream_optionsr~   r   r   r   )rJ   rG   listr   r8   r/   completionscreater6   r+   get)r>   rh   rq   ri   r   openai_messagess   `     r?   rd   z$OpenAIAgentModel._completions_create   s      zzFJK''$K Ku&NX&NOP'-2[[%%1188//$(,

	**)	#0y6<OT2)%)),	B&**=)D $$Wi8"&&y)< 9 
 
 	
 
s   DDDDc                6   t        j                  | j                  t        j                        }| j
                  d   }g }|j                  j                  .|j                  t        |j                  j                               |j                  j                  s|j                  j                  D ]Z  }|j                  t        j                  |j                  j                  |j                  j                  |j                                \ t#        ||      S )zAProcess a non-streamed response, and prepare a message to return.tzr   	timestamp)r	   fromtimestampcreatedr
   utcchoicesmessagecontentappendr   
tool_callsr   from_raw_argsrP   rN   	argumentsidr   )rj   r   choiceitemscs        r?   re   z"OpenAIAgentModel._process_response   s     **8+;+;M	!!!$)+>>!!-LL&.."8"89:>>$$0^^..\77

I]I]_`_c_cde /Ui88rA   c                .  K   d}t               }	 	 | j                          d{   }|xs/ t	        j
                  |j                  t        j                        }|t        |      z  }|j                  rz|j                  d   j                  }|j                  t        |j                  | ||      S |j                  1t        | |j                  D ci c]  }|j                   | c}||      S 7 # t        $ r}t        d      |d}~ww xY wc c}w w)zHProcess a streamed response, and prepare a streaming response to return.Nz5Streamed response ended without content or tool callsr   r   )r    	__anext__StopAsyncIterationr   r	   r   r   r
   r   rf   r   deltar   OpenAIStreamTextResponser   OpenAIStreamStructuredResponseindex)rj   r   start_usagechunker   r   s          r?   rm   z+OpenAIAgentModel._process_streamed_response   s
     &*	gn&0022 "[X%;%;EMMhll%[I:e,,K}}a(..==,3EMM8YXcdd%%19 -2-=-=>-=!-=>!#	  2% n-.eflmmn ?sD   DC3 C1C3 B*DD
'
D1C3 3	D<DDDc              #    K   t        |t              r| j                  |      E d{    yt        |t              rg }g }|j                  D ]d  }t        |t
              r|j                  |j                         /t        |t              r|j                  t        |             Zt        |       f t        j                  d      }|rdj                  |      |d<   |r||d<   | yt        |       y7 Эw)zQJust maps a `pydantic_ai.Message` to a `openai.types.ChatCompletionMessageParam`.N	assistant)rolez

r   r   )
isinstancer   _map_user_messager   partsr   r   r   r   _map_tool_callr   r/   #ChatCompletionAssistantMessageParamjoin)clsr   textsr   itemmessage_params         r?   ry   zOpenAIAgentModel._map_message   s      g|,,,W555/!EHJJdH-LL.l3%%nT&:; & & !DD+VM ,2;;u+=i(.8l+!) 6s   %C:C8CC:c              #    K   |j                   D ]3  }t        |t              r$t        j                  d|j
                         8t        |t              r$t        j                  d|j
                         lt        |t              r4t        j                  dt        |d      |j                                t        |t              ri|j                  (t        j                  d|j                                t        j                  dt        |d      |j                                )t        |       6 y w)Nsystem)r   r   usertoolOpenAItmodel_source)r   tool_call_idr   )r   r   r   r/    ChatCompletionSystemMessageParamr   r   ChatCompletionUserMessageParamr   ChatCompletionToolMessageParam_guard_tool_call_idmodel_response_strr   	tool_namemodel_responser   )r   r   parts      r?   r   z"OpenAIAgentModel._map_user_message  s     MMD$ 01;;SWS_S_``D.199vt||\\D.199!4t(!S 335 
 D/2>>)==6SWSfSfShii==#%84h%W $ 3 3 5  T"+ "s   EEN)rh   list[ModelMessage]ri   ModelSettings | NonerY   z"tuple[ModelResponse, result.Usage])rh   r   ri   r   rY   z%AsyncIterator[EitherStreamedResponse])rh   r   rq   zLiteral[True]ri   r   rY    AsyncStream[ChatCompletionChunk])rh   r   rq   zLiteral[False]ri   r   rY   chat.ChatCompletion)rh   r   rq   rX   ri   r   rY   z6chat.ChatCompletion | AsyncStream[ChatCompletionChunk])rj   r   rY   r   )rj   r   rY   r%   )r   r   rY   )Iterable[chat.ChatCompletionMessageParam])r   r   rY   r   )r[   r\   r]   r^   r_   rk   r   rn   r   rd   r`   re   rm   classmethodry   r   ra   rA   r?   rE   rE      sL   ;--F*F<PF	+F B*B<PB	.B B *4ASg	) 
 *4BTh	 

*
48
J^
	?
< 
9 
9  8 " "2 # #rA   rE   c                  ~    e Zd ZU dZded<   ded<   ded<   ded	<    eed
      Zded<   ddZd
dddZ	ddZ
ddZy)r   z9Implementation of `StreamTextResponse` for OpenAI models.rV   _firstr   	_responser	   
_timestampresult.Usage_usageF)default_factoryr2   z	list[str]_bufferc                4  K   | j                   -| j                  j                  | j                          d | _         y | j                  j	                          d {   }| xj
                  t        |      z  c_        	 |j                  d   }|j                   |j                  j                  
J d|       |j                  j                  0| j                  j                  |j                  j                         y y 7 # t        $ r t               w xY ww)Nr   z,Expected delta with content, invalid chunk: )r   r   r   r   r   r   rf   r   
IndexErrorr   finish_reasonr   r   )r>   r   r   s      r?   r   z"OpenAIStreamTextResponse.__anext__3  s     ;;"LL,DKnn..00z%((	']]1%F
 '<<''3m7cdicl5mm3<<+LL 4 45 , 1  	'$&&	's+   ADC?"D=D A4DDDfinalc             #  l   K   | j                   E d {    | j                   j                          y 7 wrC   )r   clear)r>   r   s     r?   r   zOpenAIStreamTextResponse.getF  s(     << 	 s   42 4c                    | j                   S rC   r   rM   s    r?   usagezOpenAIStreamTextResponse.usageJ      {{rA   c                    | j                   S rC   r   rM   s    r?   r   z"OpenAIStreamTextResponse.timestampM      rA   NrY   None)r   rX   rY   zIterable[str]rY   r    rY   r	   )r[   r\   r]   r^   r_   r   r   r   r   r   r   r   ra   rA   r?   r   r   )  sG    C//t%@GY@6& $) rA   r   c                  `    e Zd ZU dZded<   ded<   ded<   ded	<   dd
ZddddZddZddZy)r   z?Implementation of `StreamStructuredResponse` for OpenAI models.r   r   zdict[int, ChoiceDeltaToolCall]_delta_tool_callsr	   r   r   r   c                  K   | j                   j                          d {   }| xj                  t        |      z  c_        	 |j                  d   }|j                  
t               |j                  j                  
J d|       |j                  j                  xs g D ]	  }| j                  j                  |j                        x}r|j                  |j                  |_        I|j                  Vt        j                   |j                  j"                  |j                  j"                        |j                  _        t        j                   |j                  j$                  |j                  j$                        |j                  _        || j                  |j                  <    y 7 # t
        $ r t               w xY ww)Nr   z9Expected tool calls, got content instead, invalid chunk: )r   r   r   rf   r   r   r   r   r   r   r   r   r   r   rP   r   add_optionalrN   r   )r>   r   r   newcurrents        r?   r   z(OpenAIStreamStructuredResponse.__anext__Z  su    nn..00z%((	']]1%F +$&&||##+r/hinhq-rr+<<**0b0C0044SYY??w?##+'*||G$\\-,2,?,?@P@P@U@UWZWcWcWhWh,iG$$)171D1DWEUEUE_E_adamamawaw1xG$$.47&&syy1 1 1  	'$&&	's/   GF1"GF4 B%G9B9G4GGFr   c               L   g }| j                   j                         D ]o  }|j                  x}s|j                  |j                  ,|j                  t        j                  |j                  |j                  |j                               q t        || j                        S )Nr   )r   valuesrP   rN   r   r   r   r   r   r   r   )r>   r   r   r   rU   s        r?   r   z"OpenAIStreamStructuredResponse.getq  s}    )+''..0AJJq66%!++*ALL!;!;AFFAKKQRQUQU!VW 1
 Udoo>>rA   c                    | j                   S rC   r   rM   s    r?   r   z$OpenAIStreamStructuredResponse.usagez  r   rA   c                    | j                   S rC   r   rM   s    r?   r   z(OpenAIStreamStructuredResponse.timestamp}  r   rA   Nr   )r   rX   rY   r   r   r   )	r[   r\   r]   r^   r_   r   r   r   r   ra   rA   r?   r   r   Q  s6    I//558. $) ?rA   r   c                ~    t        j                  t        | d      d| j                  | j	                         d      S )Nr   r   rP   )rN   r   )r   rS   rP   )r/   "ChatCompletionMessageToolCallParamr   r   args_as_json_str)r   s    r?   r   r     s7    22:++A4F4F4HI rA   c                   | j                   }|t        j                         S i }|j                  +|j	                  |j                  j                  d             |j                  +|j	                  |j                  j                  d             t        j                  |j                  |j                  |j                  |      S )NT)exclude_none)request_tokensresponse_tokenstotal_tokensdetails)
r   r   r    completion_tokens_detailsupdate
model_dumpprompt_tokens_detailsprompt_tokenscompletion_tokensr   )rj   r   r   s      r?   rf   rf     s    NNE}||~"$**6NN5::EESWEXY&&2NN566AAtATU|| ..!33++	
 	
rA   )r   r   rY   z'chat.ChatCompletionMessageToolCallParam)rj   z)chat.ChatCompletion | ChatCompletionChunkrY   r   )J
__future__r   _annotationscollections.abcr   r   
contextlibr   dataclassesr   r   r	   r
   	itertoolsr   typingr   r   r   httpxr   AsyncHTTPClienttyping_extensionsr    r   r   r   r   r   rh   r   r   r   r   r   r   r   r   r   r   r    settingsr!   rJ   r"   r$   r%   r&   r'   r(   r)   r*   openair+   r,   r-   openai.typesr.   r/   openai.types.chatr0   'openai.types.chat.chat_completion_chunkr1   ImportError_import_errorrZ   r5   r4   rE   r   r   r   rf   ra   rA   r?   <module>r     s0   2 3 * ( '  + + 0 * 6 6 >    $ "  	::,5K 	3' L
% L
 L
^ [#z [# [#| $1 $ $N ,%= , ,^
y
  
	_ s   D D		DD