
    IgKm                       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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 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% ddl&m'Z' ddl(m)Z)m*Z+m,Z-m.Z/ ddl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZF ddlGmHZH ddgZI G d de      ZJ G d  de      ZK G d! d"      ZL G d# d$      ZM G d% d&      ZN G d' d(      ZOy))    )annotations)DictListTypeUnionIterableOptionalcast)partial)LiteralN   )_legacy_response)	NOT_GIVENBodyQueryHeadersNotGiven)maybe_transformasync_maybe_transform)cached_property)SyncAPIResourceAsyncAPIResource)to_streamed_response_wrapper"async_to_streamed_response_wrapper)Stream)completion_create_params)make_request_options)ResponseFormatTvalidate_input_toolsparse_chat_completiontype_to_response_format_param)	ChatModel)ChatCompletionStreamManager AsyncChatCompletionStreamManager)ChatCompletion)ChatCompletionChunk)ParsedChatCompletion)ChatCompletionModality)ChatCompletionToolParam)ChatCompletionAudioParam)ChatCompletionMessageParam) ChatCompletionStreamOptionsParam)$ChatCompletionPredictionContentParam)#ChatCompletionToolChoiceOptionParamCompletionsAsyncCompletionsc                     e Zd Zedd       Zedd       Zeeeeeeeeeeeeeeeeeeeeeeeeeeddded	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	dZeeeeeeeeeeeeeeeeeeeeeeeeeeddded	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
dZy)r/   c                    t        |       S a  
        This property can be used as a prefix for any HTTP method call to return the
        the raw response object instead of the parsed content.

        For more information, see https://www.github.com/openai/openai-python#accessing-raw-response-data-eg-headers
        )CompletionsWithRawResponseselfs    c/var/www/html/answerous/venv/lib/python3.12/site-packages/openai/resources/beta/chat/completions.pywith_raw_responsezCompletions.with_raw_response+   s     *$//    c                    t        |       S z
        An alternative to `.with_raw_response` that doesn't eagerly read the response body.

        For more information, see https://www.github.com/openai/openai-python#with_streaming_response
        ) CompletionsWithStreamingResponser5   s    r7   with_streaming_responsez#Completions.with_streaming_response5   s     055r9   Naudioresponse_formatfrequency_penaltyfunction_call	functions
logit_biaslogprobsmax_completion_tokens
max_tokensmetadata
modalitiesnparallel_tool_calls
predictionpresence_penaltyseedservice_tierstopstorestream_optionstemperaturetool_choicetoolstop_logprobstop_puserextra_headersextra_query
extra_bodytimeoutc                   t               ddi|xs i }dfd}!| j                  dt        i d|d|d|d|d	|d
|d|d|	d|
d|d|d|d|d|d|d|dt              ||||d||||||dt        j
                        t        |||| |!      t        t        t        t              t              d      S )a  Wrapper over the `client.chat.completions.create()` method that provides richer integrations with Python specific types
        & returns a `ParsedChatCompletion` object, which is a subclass of the standard `ChatCompletion` class.

        You can pass a pydantic model to this method and it will automatically convert the model
        into a JSON schema, send it to the API and parse the response content back into the given model.

        This method will also automatically parse `function` tool calls if:
        - You use the `openai.pydantic_function_tool()` helper method
        - You mark your tool schema with `"strict": True`

        Example usage:
        ```py
        from pydantic import BaseModel
        from openai import OpenAI


        class Step(BaseModel):
            explanation: str
            output: str


        class MathResponse(BaseModel):
            steps: List[Step]
            final_answer: str


        client = OpenAI()
        completion = client.beta.chat.completions.parse(
            model="gpt-4o-2024-08-06",
            messages=[
                {"role": "system", "content": "You are a helpful math tutor."},
                {"role": "user", "content": "solve 8x + 31 = 2"},
            ],
            response_format=MathResponse,
        )

        message = completion.choices[0].message
        if message.parsed:
            print(message.parsed.steps)
            print("answer: ", message.parsed.final_answer)
        ```
        X-Stainless-Helper-Methodbeta.chat.completions.parsec                     t        |       S N)r@   chat_completioninput_tools_parse_chat_completionraw_completionr@   rU   s    r7   parserz!Completions.parse.<locals>.parser       ) / .! r9   /chat/completionsmessagesmodelr?   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   r@   F)rN   rO   rP   rQ   streamrR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   post_parserbodyoptionscast_torm   rg   r%   return%ParsedChatCompletion[ResponseFormatT])_validate_input_tools_postr   _type_to_response_formatr   CompletionCreateParamsr   r
   r   r'   r   r%   "r6   rk   rl   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   rh   s"       `                    `        r7   parsezCompletions.parse>   s   ` 	e$ ()F
"

	 zz U U ():	
 $]   !*  ,-B !*  !*  *+> !*  '(8!" &'?'P#$ !$0 "#&4#.#."$0" ;> )??A!D )+'%" 2?CDnU]  /
 /	
r9   c                n   ddi|xs i }t        | j                  j                  j                  j                  fi d|d|d|dddt        |      d	|d
|d|d|d|	d|
d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d |d!|d"|d#|d$| }!t        |!||%      S )&a  Wrapper over the `client.chat.completions.create(stream=True)` method that provides a more granular event API
        and automatic accumulation of each delta.

        This also supports all of the parsing utilities that `.parse()` does.

        Unlike `.create(stream=True)`, the `.stream()` method requires usage within a context manager to prevent accidental leakage of the response:

        ```py
        with client.beta.chat.completions.stream(
            model="gpt-4o-2024-08-06",
            messages=[...],
        ) as stream:
            for event in stream:
                if event.type == "content.delta":
                    print(event.delta, flush=True, end="")
        ```

        When the context manager is entered, a `ChatCompletionStream` instance is returned which, like `.create(stream=True)` is an iterator. The full list of events that are yielded by the iterator are outlined in [these docs](https://github.com/openai/openai-python/blob/main/helpers.md#chat-completions-events).

        When the context manager exits, the response will be closed, however the `stream` instance is still available outside
        the context manager.
        r^   beta.chat.completions.streamrk   rl   r?   rm   Tr@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rQ   rP   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r@   rc   )r   _clientchatcompletionscreatery   r#   "r6   rk   rl   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   api_requests"                                     r7   rm   zCompletions.stream   s   z ()G
"

 =DLL))00#=
#=
 #=
 	#=

 #=
 5_E#=
 0#=
 (#=
  #=
 "#=
 #=
 #8#=
 "#=
 #=
 "#=
  !#=
" !4##=
$ "%#=
& .'#=
( )#=
* &+#=
, -#=
. /#=
0 *1#=
2 $3#=
4 $5#=
6 7#=
8 &9#=
: ;#=
< =#=
> (?#=
@ $A#=
B "C#=
D E#=
H ++
 	
r9   )ru   r4   )ru   r<   Brk   $Iterable[ChatCompletionMessageParam]rl   Union[str, ChatModel]r?   -Optional[ChatCompletionAudioParam] | NotGivenr@   z type[ResponseFormatT] | NotGivenrA   Optional[float] | NotGivenrB   0completion_create_params.FunctionCall | NotGivenrC   6Iterable[completion_create_params.Function] | NotGivenrD   #Optional[Dict[str, int]] | NotGivenrE   Optional[bool] | NotGivenrF   Optional[int] | NotGivenrG   r   rH   #Optional[Dict[str, str]] | NotGivenrI   1Optional[List[ChatCompletionModality]] | NotGivenrJ   r   rK   bool | NotGivenrL   9Optional[ChatCompletionPredictionContentParam] | NotGivenrM   r   rN   r   rO   /Optional[Literal['auto', 'default']] | NotGivenrP   *Union[Optional[str], List[str]] | NotGivenrQ   r   rR   5Optional[ChatCompletionStreamOptionsParam] | NotGivenrS   r   rT   .ChatCompletionToolChoiceOptionParam | NotGivenrU   ,Iterable[ChatCompletionToolParam] | NotGivenrV   r   rW   r   rX   str | NotGivenrY   Headers | NonerZ   Query | Noner[   Body | Noner\   'float | httpx.Timeout | None | NotGivenru   rv   )Brk   r   rl   r   r?   r   r@   Jcompletion_create_params.ResponseFormat | type[ResponseFormatT] | NotGivenrA   r   rB   r   rC   r   rD   r   rE   r   rF   r   rG   r   rH   r   rI   r   rJ   r   rK   r   rL   r   rM   r   rN   r   rO   r   rP   r   rQ   r   rR   r   rS   r   rT   r   rU   r   rV   r   rW   r   rX   r   rY   r   rZ   r   r[   r   r\   r   ru   z,ChatCompletionStreamManager[ResponseFormatT]	__name__
__module____qualname__r   r8   r=   r   r|   rm    r9   r7   r/   r/   *   s   0 0 6 6 @I<E8AJSLU:C.7:C/88AHQ&//8PY7@)2HQ;D+4PY2;FO>G1:,5( )-$("&;DIM
 7M
 %	M

 =M
 :M
 6M
 HM
 JM
 8M
 ,M
  8M
 -M
 6M
 FM
  $!M
" -#M
$ N%M
& 5'M
( ')M
* F+M
, 9-M
. )/M
0 N1M
2 03M
4 D5M
6 <7M
8 /9M
: *;M
< =M
B &CM
D "EM
F  GM
H 9IM
J 
/KM
h @Ifo8AJSLU:C.7:C/88AHQ&//8PY7@)2HQ;D+4PY2;FO>G1:,5( )-$("&;DIi
 7i
 %	i

 =i
 di
 6i
 Hi
 Ji
 8i
 ,i
  8i
 -i
 6i
 Fi
  $!i
" -#i
$ N%i
& 5'i
( ')i
* F+i
, 9-i
. )/i
0 N1i
2 03i
4 D5i
6 <7i
8 /9i
: *;i
< =i
B &Ci
D "Ei
F  Gi
H 9Ii
J 
6Ki
r9   c                     e Zd Zedd       Zedd       Zeeeeeeeeeeeeeeeeeeeeeeeeeeddded	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	dZeeeeeeeeeeeeeeeeeeeeeeeeeeddded	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d
dZy)r0   c                    t        |       S r3   )AsyncCompletionsWithRawResponser5   s    r7   r8   z"AsyncCompletions.with_raw_response:  s     /t44r9   c                    t        |       S r;   )%AsyncCompletionsWithStreamingResponser5   s    r7   r=   z(AsyncCompletions.with_streaming_responseD  s     5T::r9   Nr>   c                  K   t               ddi|xs i }dfd}!| j                  dt        i d|d|d|d|d	|d
|d|d|	d|
d|d|d|d|d|d|d|dt              ||||d||||||dt        j
                         d{   t        |||| |!      t        t        t        t              t              d       d{   S 7 B7 w)a  Wrapper over the `client.chat.completions.create()` method that provides richer integrations with Python specific types
        & returns a `ParsedChatCompletion` object, which is a subclass of the standard `ChatCompletion` class.

        You can pass a pydantic model to this method and it will automatically convert the model
        into a JSON schema, send it to the API and parse the response content back into the given model.

        This method will also automatically parse `function` tool calls if:
        - You use the `openai.pydantic_function_tool()` helper method
        - You mark your tool schema with `"strict": True`

        Example usage:
        ```py
        from pydantic import BaseModel
        from openai import AsyncOpenAI


        class Step(BaseModel):
            explanation: str
            output: str


        class MathResponse(BaseModel):
            steps: List[Step]
            final_answer: str


        client = AsyncOpenAI()
        completion = await client.beta.chat.completions.parse(
            model="gpt-4o-2024-08-06",
            messages=[
                {"role": "system", "content": "You are a helpful math tutor."},
                {"role": "user", "content": "solve 8x + 31 = 2"},
            ],
            response_format=MathResponse,
        )

        message = completion.choices[0].message
        if message.parsed:
            print(message.parsed.steps)
            print("answer: ", message.parsed.final_answer)
        ```
        r^   r_   c                     t        |       S ra   rd   rf   s    r7   rh   z&AsyncCompletions.parse.<locals>.parser  ri   r9   rj   rk   rl   r?   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   r@   F)rN   rO   rQ   rP   rm   rR   rS   rT   rU   rV   rW   rX   Nrn   rp   rt   )rw   rx   r   ry   r   rz   r   r
   r   r'   r   r%   r{   s"       `                    `        r7   r|   zAsyncCompletions.parseM  s    ` 	e$ ()F
"

	 ZZ,U U ():	
 $]   !*  ,-B !*  !*  *+> !*  '(8!" &'?'P#$ !$0" #&4#.#."$0" ;> )??A! !D )+'%" 2?CDnU]   /
 /
 /	
!/
s$   BCC
=CCCCc                |   t        |       ddi|xs i } | j                  j                  j                  j                  d&i d|d|d|dddt        |      d	|d
|d|d|d|	d|
d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d|d |d!|d"|d#|d$| }!t        |!||%      S )'a  Wrapper over the `client.chat.completions.create(stream=True)` method that provides a more granular event API
        and automatic accumulation of each delta.

        This also supports all of the parsing utilities that `.parse()` does.

        Unlike `.create(stream=True)`, the `.stream()` method requires usage within a context manager to prevent accidental leakage of the response:

        ```py
        async with client.beta.chat.completions.stream(
            model="gpt-4o-2024-08-06",
            messages=[...],
        ) as stream:
            async for event in stream:
                if event.type == "content.delta":
                    print(event.delta, flush=True, end="")
        ```

        When the context manager is entered, an `AsyncChatCompletionStream` instance is returned which, like `.create(stream=True)` is an async iterator. The full list of events that are yielded by the iterator are outlined in [these docs](https://github.com/openai/openai-python/blob/main/helpers.md#chat-completions-events).

        When the context manager exits, the response will be closed, however the `stream` instance is still available outside
        the context manager.
        r^   r~   rk   rl   r?   rm   Tr@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r   r   )rw   r   r   r   r   ry   r$   r   s"                                     r7   rm   zAsyncCompletions.stream  s   x 	e$ ()G
"

 ;dll''33:: "
"
"
 "
 	"

 5_E"
 0"
 ("
  "
 ""
 "
 #8"
 ""
 "
 ""
 "
  !4!"
" "#"
$ .%"
& '"
( &)"
* +"
, -"
. */"
0 $1"
2 $3"
4 5"
6 &7"
8 9"
: ;"
< (="
> $?"
@ "A"
B C"
F 0+
 	
r9   )ru   r   )ru   r   r   )Brk   r   rl   r   r?   r   r@   r   rA   r   rB   r   rC   r   rD   r   rE   r   rF   r   rG   r   rH   r   rI   r   rJ   r   rK   r   rL   r   rM   r   rN   r   rO   r   rP   r   rQ   r   rR   r   rS   r   rT   r   rU   r   rV   r   rW   r   rX   r   rY   r   rZ   r   r[   r   r\   r   ru   z1AsyncChatCompletionStreamManager[ResponseFormatT]r   r   r9   r7   r0   r0   9  s   5 5 ; ; @I<E8AJSLU:C.7:C/88AHQ&//8PY7@)2HQ;D+4PY2;FO>G1:,5( )-$("&;DIM
 7M
 %	M

 =M
 :M
 6M
 HM
 JM
 8M
 ,M
  8M
 -M
 6M
 FM
  $!M
" -#M
$ N%M
& 5'M
( ')M
* F+M
, 9-M
. )/M
0 N1M
2 03M
4 D5M
6 <7M
8 /9M
: *;M
< =M
B &CM
D "EM
F  GM
H 9IM
J 
/KM
h @Ifo8AJSLU:C.7:C/88AHQ&//8PY7@)2HQ;D+4PY2;FO>G1:,5( )-$("&;DIj
 7j
 %	j

 =j
 dj
 6j
 Hj
 Jj
 8j
 ,j
  8j
 -j
 6j
 Fj
  $!j
" -#j
$ N%j
& 5'j
( ')j
* F+j
, 9-j
. )/j
0 N1j
2 03j
4 D5j
6 <7j
8 /9j
: *;j
< =j
B &Cj
D "Ej
F  Gj
H 9Ij
J 
;Kj
r9   c                      e Zd ZddZy)r4   c                Z    || _         t        j                  |j                        | _        y N)_completionsr   to_raw_response_wrapperr|   r6   r   s     r7   __init__z#CompletionsWithRawResponse.__init__J  s%    '%==

r9   Nr   r/   ru   Noner   r   r   r   r   r9   r7   r4   r4   I      
r9   r4   c                      e Zd ZddZy)r   c                Z    || _         t        j                  |j                        | _        y r   )r   r   async_to_raw_response_wrapperr|   r   s     r7   r   z(AsyncCompletionsWithRawResponse.__init__S  s%    '%CC

r9   Nr   r0   ru   r   r   r   r9   r7   r   r   R  r   r9   r   c                      e Zd ZddZy)r<   c                F    || _         t        |j                        | _        y r   )r   r   r|   r   s     r7   r   z)CompletionsWithStreamingResponse.__init__\  s    '1

r9   Nr   r   r   r9   r7   r<   r<   [  r   r9   r<   c                      e Zd ZddZy)r   c                F    || _         t        |j                        | _        y r   )r   r   r|   r   s     r7   r   z.AsyncCompletionsWithStreamingResponse.__init__e  s    '7

r9   Nr   r   r   r9   r7   r   r   d  r   r9   r   )P
__future__r   typingr   r   r   r   r   r	   r
   	functoolsr   typing_extensionsr   httpx r   _typesr   r   r   r   r   _utilsr   r   _compatr   	_resourcer   r   	_responser   r   
_streamingr   
types.chatr   _base_clientr   lib._parsingr   r   rw   r    re   r!   ry   types.chat_modelr"   lib.streaming.chatr#   r$   types.chat.chat_completionr%    types.chat.chat_completion_chunkr&   !types.chat.parsed_chat_completionr'   #types.chat.chat_completion_modalityr(   %types.chat.chat_completion_tool_paramr)   &types.chat.chat_completion_audio_paramr*   (types.chat.chat_completion_message_paramr+   /types.chat.chat_completion_stream_options_paramr,   3types.chat.chat_completion_prediction_content_paramr-   3types.chat.chat_completion_tool_choice_option_paramr.   __all__r/   r0   r4   r   r<   r   r   r9   r7   <module>r      s    # D D D  %  ! @ @ = ' ; Z ! 3 1  + ` 9 D F J M O S ` h g,
-L
/ L
^M
' M
`
 

 

 

 
r9   