
    gt                    ,   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
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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& ddlm'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<m=Z= ddl>m?Z?m@Z@mAZA ddlBmCZCmDZD ddlEmFZF ddlGmHZI ddlJmKZL  G d dee4         ZM G d dee4         ZN G d dee4         ZO G d d ee4         ZP G d! d"ee4         ZQ G d# d$      ZRd&d%ZSy)'    )annotationsN)TracebackType)TYPE_CHECKINGAnyGenericCallableIterable	AwaitableAsyncIteratorcast)SelfIteratorassert_never)	from_json   )ParsedChoiceSnapshotParsedChatCompletionSnapshot#ParsedChatCompletionMessageSnapshot)
ChunkEventContentDoneEventRefusalDoneEventContentDeltaEventRefusalDeltaEventLogprobsContentDoneEventLogprobsRefusalDoneEventChatCompletionStreamEventLogprobsContentDeltaEventLogprobsRefusalDeltaEvent"FunctionToolCallArgumentsDoneEvent#FunctionToolCallArgumentsDeltaEvent   )accumulate_delta   )	NOT_GIVENIncExNotGiven)is_givenconsume_sync_iteratorconsume_async_iterator)
model_dump)buildconstruct_type   )ResponseFormatThas_parseable_inputmaybe_parse_contentparse_chat_completionget_input_tool_by_namesolve_response_format_tparse_function_tool_arguments)StreamAsyncStream)ChatCompletionChunkParsedChatCompletionChatCompletionToolParam)LengthFinishReasonErrorContentFilterFinishReasonError)ChoiceLogprobs)Choice)ResponseFormatc                      e Zd ZdZ	 	 	 	 	 	 	 	 ddZddZddZddZ	 	 	 	 	 	 	 	 ddZddZ	ddZ
dd	Zedd
       ZddZy)ChatCompletionStream+  Wrapper over the Chat Completions streaming API that adds helpful
    events such as `content.done`, supports automatically parsing
    responses & tool calls and accumulates a `ChatCompletion` object
    from each individual chunk.

    https://platform.openai.com/docs/api-reference/streaming
    c                   || _         |j                  | _        | j                         | _        t        ||      | _        y Nresponse_formatinput_tools_raw_streamresponse	_response
__stream__	_iteratorChatCompletionStreamState_stateself
raw_streamrE   rF   s       [/var/www/openai/venv/lib/python3.12/site-packages/openai/lib/streaming/chat/_completions.py__init__zChatCompletionStream.__init__8   6     &#,,*/]hi    c                6    | j                   j                         S N)rL   __next__rP   s    rR   rX   zChatCompletionStream.__next__D   s    ~~&&((rU   c              #  6   K   | j                   D ]  }|  y wrW   rL   rP   items     rR   __iter__zChatCompletionStream.__iter__G   s     NNDJ #s   c                    | S rW    rY   s    rR   	__enter__zChatCompletionStream.__enter__K   s    rU   c                $    | j                          y rW   closerP   exc_typeexcexc_tbs       rR   __exit__zChatCompletionStream.__exit__N   s     	

rU   c                8    | j                   j                          yz
        Close the response and release the connection.

        Automatically called if the response body is read to completion.
        N)rJ   rd   rY   s    rR   rd   zChatCompletionStream.closeV   s     	rU   c                V    | j                          | j                  j                         S )V  Waits until the stream has been read to completion and returns
        the accumulated `ParsedChatCompletion` object.

        If you passed a class type to `.stream()`, the `completion.choices[0].message.parsed`
        property will be the content deserialised into that class, if there was any content returned
        by the API.
        
until_donerN   get_final_completionrY   s    rR   rp   z)ChatCompletionStream.get_final_completion^   s!     	{{//11rU   c                    t        |        | S )*Blocks until the stream has been consumed.)r(   rY   s    rR   ro   zChatCompletionStream.until_donei   s    d#rU   c                .    | j                   j                  S rW   rN   current_completion_snapshotrY   s    rR   ru   z0ChatCompletionStream.current_completion_snapshotn       {{666rU   c              #  z   K   | j                   D ](  }| j                  j                  |      }|D ]  }|  * y wrW   rH   rN   handle_chunkrP   	sse_eventevents_to_fireevents       rR   rK   zChatCompletionStream.__stream__r   s9     ))I![[55i@N' ( *s   9;N)rQ   zStream[ChatCompletionChunk]rE   6type[ResponseFormatT] | ResponseFormatParam | NotGivenrF   ,Iterable[ChatCompletionToolParam] | NotGivenreturnNoner   z*ChatCompletionStreamEvent[ResponseFormatT])r   z4Iterator[ChatCompletionStreamEvent[ResponseFormatT]]r   r   rf   ztype[BaseException] | Nonerg   zBaseException | Nonerh   zTracebackType | Noner   r   r   r   r   z%ParsedChatCompletion[ResponseFormatT]r   r   )__name__
__module____qualname____doc__rS   rX   r^   ra   ri   rd   rp   ro   propertyru   rK   r`   rU   rR   r@   r@   /   s    
j 0
j P	
j
 B
j 

j), " %	
 
	2
 7 7rU   r@   c                  H    e Zd ZdZ	 	 	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 	 	 ddZy)	ChatCompletionStreamManageraK  Context manager over a `ChatCompletionStream` that is returned by `.stream()`.

    This context manager ensures the response cannot be leaked if you don't read
    the stream to completion.

    Usage:
    ```py
    with client.beta.chat.completions.stream(...) as stream:
        for event in stream:
            ...
    ```
    c               <    d | _         || _        || _        || _        y rW   )$_ChatCompletionStreamManager__stream)_ChatCompletionStreamManager__api_request-_ChatCompletionStreamManager__response_format)_ChatCompletionStreamManager__input_toolsrP   api_requestrE   rF   s       rR   rS   z$ChatCompletionStreamManager.__init__   s%     GK(!0(rU   c                    | j                         }t        || j                  | j                        | _        | j                  S N)rQ   rE   rF   )r   r@   r   r   r   rP   rQ   s     rR   ra   z%ChatCompletionStreamManager.__enter__   s=    '')
,! 22**
 }}rU   c                R    | j                   | j                   j                          y y rW   )r   rd   re   s       rR   ri   z$ChatCompletionStreamManager.__exit__   s#     ==$MM! %rU   N)r   z)Callable[[], Stream[ChatCompletionChunk]]rE   r~   rF   r   r   r   )r   z%ChatCompletionStream[ResponseFormatT]r   )r   r   r   r   rS   ra   ri   r`   rU   rR   r   r   y   sd    
)>
) P	
)
 B
) 

)	"," "" %	"
 
"rU   r   c                      e Zd ZdZ	 	 	 	 	 	 	 	 ddZddZddZddZ	 	 	 	 	 	 	 	 ddZddZ	ddZ
dd	Zedd
       ZddZy)AsyncChatCompletionStreamrA   c                   || _         |j                  | _        | j                         | _        t        ||      | _        y rC   rG   rO   s       rR   rS   z"AsyncChatCompletionStream.__init__   rT   rU   c                R   K   | j                   j                          d {   S 7 wrW   )rL   	__anext__rY   s    rR   r   z#AsyncChatCompletionStream.__anext__   s     ^^--////s   '%'c               H   K   | j                   2 3 d {   }| 7 
6 y wrW   r[   r\   s     rR   	__aiter__z#AsyncChatCompletionStream.__aiter__   s!     .. 	$J	.s   "  " "c                   K   | S wrW   r`   rY   s    rR   
__aenter__z$AsyncChatCompletionStream.__aenter__   s     s   c                @   K   | j                          d {    y 7 wrW   rc   re   s       rR   	__aexit__z#AsyncChatCompletionStream.__aexit__   s      jjls   c                T   K   | j                   j                          d{    y7 wrk   )rJ   acloserY   s    rR   rd   zAsyncChatCompletionStream.close   s      nn##%%%s   (&(c                r   K   | j                          d{    | j                  j                         S 7 w)rm   Nrn   rY   s    rR   rp   z.AsyncChatCompletionStream.get_final_completion   s0      oo{{//11 	 s   757c                8   K   t        |        d{    | S 7 w)rr   N)r)   rY   s    rR   ro   z$AsyncChatCompletionStream.until_done   s     $T*** 	+s   c                .    | j                   j                  S rW   rt   rY   s    rR   ru   z5AsyncChatCompletionStream.current_completion_snapshot   rv   rU   c                  K   | j                   2 3 d {   }| j                  j                  |      }|D ]  }| 	 17 ,6 y wrW   rx   rz   s       rR   rK   z$AsyncChatCompletionStream.__stream__   sB     #// 	)![[55i@N' (	/s%   AAA A)A AAN)rQ   z AsyncStream[ChatCompletionChunk]rE   r~   rF   r   r   r   r   )r   z9AsyncIterator[ChatCompletionStreamEvent[ResponseFormatT]]r   r   r   r   r   )r   r   r   r   rS   r   r   r   r   rd   rp   ro   r   ru   rK   r`   rU   rR   r   r      s    
j 5
j P	
j
 B
j 

j0, " %	
 
&	2
 7 7rU   r   c                  H    e Zd ZdZ	 	 	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 	 	 ddZy)	 AsyncChatCompletionStreamManageraV  Context manager over a `AsyncChatCompletionStream` that is returned by `.stream()`.

    This context manager ensures the response cannot be leaked if you don't read
    the stream to completion.

    Usage:
    ```py
    async with client.beta.chat.completions.stream(...) as stream:
        for event in stream:
            ...
    ```
    c               <    d | _         || _        || _        || _        y rW   ))_AsyncChatCompletionStreamManager__stream._AsyncChatCompletionStreamManager__api_request2_AsyncChatCompletionStreamManager__response_format._AsyncChatCompletionStreamManager__input_toolsr   s       rR   rS   z)AsyncChatCompletionStreamManager.__init__   s%     LP(!0(rU   c                   K   | j                    d {   }t        || j                  | j                        | _        | j                  S 7 7wr   )r   r   r   r   r   r   s     rR   r   z+AsyncChatCompletionStreamManager.__aenter__  sF     ---
1! 22**
 }} .s   AA
8Ac                n   K   | j                   #| j                   j                          d {    y y 7 wrW   )r   rd   re   s       rR   r   z*AsyncChatCompletionStreamManager.__aexit__  s0      ==$--%%''' %'s   *535N)r   z+Awaitable[AsyncStream[ChatCompletionChunk]]rE   r~   rF   r   r   r   )r   z*AsyncChatCompletionStream[ResponseFormatT]r   )r   r   r   r   rS   r   r   r`   rU   rR   r   r      sd    
)@
) P	
)
 B
) 

)	(,( "( %	(
 
(rU   r   c                  p    e Zd ZdZeed	 	 	 	 	 ddZddZedd       ZddZ	ddZ
ddZ	 	 	 	 	 	 dd	Zy
)rM   aS  Helper class for manually accumulating `ChatCompletionChunk`s into a final `ChatCompletion` object.

    This is useful in cases where you can't always use the `.stream()` method, e.g.

    ```py
    from openai.lib.streaming.chat import ChatCompletionStreamState

    state = ChatCompletionStreamState()

    stream = client.chat.completions.create(..., stream=True)
    for chunk in response:
        state.handle_chunk(chunk)

        # can also access the accumulated `ChatCompletion` mid-stream
        state.current_completion_snapshot

    print(state.get_final_completion())
    ```
    )rF   rE   c                   d | _         g | _        t        |      r|D cg c]  }| c}ng | _        || _        t        j                  |      r|| _        y t        | _        y c c}w rW   )	7_ChatCompletionStreamState__current_completion_snapshot/_ChatCompletionStreamState__choice_event_statesr'   _input_tools_response_formatinspectisclassr$   _rich_response_format)rP   rF   rE   tools       rR   rS   z"ChatCompletionStreamState.__init__6  s`     SW*=?">F{>Sk:kdTk:Y[ /IPYhIio"ox" ;s   	A!c                Z    t        | j                  | j                  | j                        S )zParse the final completion object.

        Note this does not provide any guarantees that the stream has actually finished, you must
        only call this method when the stream is finished.
        )chat_completionrE   rF   )r1   ru   r   r   rY   s    rR   rp   z.ChatCompletionStreamState.get_final_completionC  s,     % << 66))
 	
rU   c                6    | j                   J | j                   S rW   )r   rY   s    rR   ru   z5ChatCompletionStreamState.current_completion_snapshotO  s     11===111rU   c                h    | j                  |      | _        | j                  || j                        S )zTAccumulate a new chunk into the snapshot and returns an iterable of events to yield.)chunkcompletion_snapshot)_accumulate_chunkr   _build_events)rP   r   s     rR   ry   z&ChatCompletionStreamState.handle_chunkT  s9    -1-C-CE-J*!! $ B B " 
 	
rU   c                    	 | j                   |j                     S # t        $ r6 t        | j                        }| j                   j                  |       |cY S w xY w)N)rF   )r   index
IndexErrorChoiceEventStater   append)rP   choicechoice_states      rR   _get_choice_statez+ChatCompletionStreamState._get_choice_state]  sU    	 --fll;; 	 +8I8IJL&&--l;	 s    <AAc                   | j                   }|t        |      S |j                  D ]  }	 |j                  |j                     }|j                  j
                  xs g }t        t        t        t        t        t        dt        |j                  t        t        dt        |j                  j
                  xs g       D ci c]  \  }}|dddii c}}d                  t        d|j                  j                                                 |_        t        |      D ]z  \  }}	|j                  j
                  xs g |   }
|	j                  dk(  r7|
j                  dk(  sJ |	j                   j"                  |
j                   _        it$        spt'        |	       | 	 |j.                  rf|j.                  |_        t1        | j2                  | j4                        r4|j.                  dk(  rt7        |      |j.                  dk(  r
t9               |j                  j:                  re|j                  j<                  sOt?        | j@                        r:tC        tE        |j                  j:                  d      d      |j                  _#        |j                  j
                  xs g D ]  }|j                  j
                  xs g |j                     }|j                  dk(  rtI        | j4                  |j                   jJ                        }|sg|jM                  di       jM                  d      s|j                   jN                  stC        tE        |j                   jN                  d      d      |j                   _        t$        st'        |        |jP                  ~|jP                  AtS        tT        |jP                  j:                  |jP                  j<                        |_(        |jP                  j:                  r`|jP                  j:                  g |jP                  _        |jP                  j:                  jW                  |jP                  j:                         |jP                  j<                  sY|jP                  j<                  g |jP                  _        |jP                  j<                  jW                  |jP                  j<                          |jX                  |_,        |jZ                  |_-        |S c c}}w # t(        $ rn t        t*        t        t*        i |j                  ddh	      d
|j                  j                         i            }|j                  j-                  |       Y w xY w)Nzdict[object, object]Tfunctionparsed_arguments)parsed
tool_calls)excludetype_valuedeltaexclude_unsetr   messagerD   length)
completioncontent_filterzutf-8)partial_mode)rF   namestrict)contentrefusal).r   $_convert_initial_chunk_into_snapshotchoicesr   r   r   r   r   r,   r"   r*   r%   	enumerater   to_dicttyper   r   r   r   r   r   r   finish_reasonr/   r   r   r:   r;   r   r   r'   r   r   bytesr   r2   r   get	argumentslogprobsr+   r<   extendusagesystem_fingerprint)rP   r   r   r   choice_snapshotprevious_tool_callsidx_
tool_index	prev_toolnew_tooltool_call_chunktool_call_snapshot
input_tools                 rR   r   z+ChatCompletionStreamState._accumulate_chunke  s   "@@&7>>mmF7D"5"="=fll"K&5&=&=&H&H&NB#*.7"A.  6 *$3$;$; -1(-6: ?HH_H_HjHjHpnp>q;.>qFC 14jCUW[B\5]0]>q;.)*
-&!"( !!79M9M9OP++'@ .77J-K)J	 / 7 7 B B Hb*UH ~~3'}}
:::=F=O=O=`=`)):&$Y/ .L* ##060D0D-&t7L7LZ^ZkZkl++x7 6ATUU++/??<>>  ''//'//77T7781:/11997C!%2''.
 $*<<#:#:#@b#@&5&=&=&H&H&NBP_PePe%f"%**j8!7$($5$5<N<W<W<\<\"J
 #&NN:r:>>xH.77AAGP!"4"="="G"GQ)-H*33D # !34% $A( *"++3/4& & 7 7 & 7 70O, ..*33;;C?AO44<'0088??@W@WX..*33;;C?AO44<'0088??@W@WXm $p %*KK!161I1I.""K;..  D"&("2$//dWI/V%v||';';'=	# $++22?CDs,   BT>T,CTTTA3VVc               F   g }|j                  t        t        d||             |j                  D ]l  }| j	                  |      }|j                  |j
                     }|j                  j                  u|j                  j                  _|j                  t        t        d|j                  j                  |j                  j                  |j                  j                               |j                  j                  `|j                  j                  J|j                  t        t        d|j                  j                  |j                  j                               |j                  j                  r|j                  j                  }|J |j                  j                  D ]  }||j
                     }	|	j                  dk(  r|j                  J |j                  t        t         d|	j                  j"                  |j
                  |	j                  j$                  |	j                  j&                  |j                  j$                  xs d	
             t(        st+        |	        |j,                  |j,                  |j,                  j                  r`|j,                  j                  rJ|j                  t        t.        d|j,                  j                  |j,                  j                               |j,                  j                  r`|j,                  j                  rJ|j                  t        t0        d|j,                  j                  |j,                  j                               |j3                  |j5                  ||| j6                               o |S )Nr   )r   r   snapshotzcontent.delta)r   r   r   r   zrefusal.delta)r   r   r   r   z#tool_calls.function.arguments.delta )r   r   r   r   r   arguments_deltazlogprobs.content.delta)r   r   r   zlogprobs.refusal.delta)r   r   r   )choice_chunkr   rE   )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   get_done_eventsr   )
rP   r   r   r|   r   r   r   r   tool_call_delta	tool_calls
             rR   r   z'ChatCompletionStreamState._build_events  s    LN*7%BUV	
 mmF11&9L199&,,GO||##/O4K4K4S4S4_%%),$ll22!0!8!8!@!@.66== ||##/O4K4K4S4S4_%%),$ll22!0!8!8!@!@	 ||&&,44??
!---'-||'>'>O *?+@+@ AI ~~3.77CCC&--! C%J%.%7%7%<%<&5&;&;*3*<*<*F*F1:1C1C1T1T0?0H0H0R0R0XVX
 '$Y/# (?& */G/G/S??**/G/G/O/O"))5!9$*OO$;$;%4%=%=%E%E	 ??**/G/G/O/O"))5!9$*OO$;$;%4%=%=%E%E	 !!,,!'$3$($9$9 - K $Z rU   N)rF   r   rE   r~   r   r   r   r   )r   r7   r   z4Iterable[ChatCompletionStreamEvent[ResponseFormatT]])r   ChoiceChunkr   r   r   r7   r   r   )r   r7   r   r   r   0list[ChatCompletionStreamEvent[ResponseFormatT]])r   r   r   r   r$   rS   rp   r   ru   ry   r   r   r   r`   rU   rR   rM   rM   !  s    . ENR[	y By P	y
 
y

 2 2
 A#FY #Y :	Y
 
:YrU   rM   c                  X    e Zd ZddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 d	dZy)
r   c               v    || _         d| _        d| _        d| _        d| _        t               | _        d | _        y )NF)r   _content_done_refusal_done_logprobs_content_done_logprobs_refusal_doneset_done_tool_calls*_ChoiceEventState__current_tool_call_index)rP   rF   s     rR   rS   zChoiceEventState.__init__E  s<    '""&+#&+#*-%59&rU   c                  g }|j                   rd|j                  | j                  ||             | j                  6| j                  | j                  vr| j                  ||| j                         |j                  j                  xs g D ]x  }| j                  |j                  k7  rL|j                  | j                  ||             | j                  | j                  ||| j                         |j                  | _        z |S )N)r   rE   )r|   r   r   )	r   r   _content_done_eventsr  r  _add_tool_done_eventr   r   r   )rP   r   r   rE   r|   r  s         rR   r   z ChoiceEventState.get_done_eventsO  s    LN((!!))/[j)k
 ..:22$:O:OO))#1$3#== *  &++66<"<I--@%%--o_n-o 11=--'5(7#'#A#A .  .7__D* = rU   c                  g }|j                   j                  r| j                  sd| _        t        ||j                         }||j                   _        |j                  t        t        dt        t        t              t        |               d|j                   j                  |             |j                   j                  H| j                  s<d| _        |j                  t        t        d|j                   j                               |j                  ^|j                  j                  H| j                  s<d| _        |j                  t        t         d|j                  j                  	             |j                  ^|j                  j                  H| j"                  s<d| _        |j                  t        t$        d
|j                  j                               |S )NT)rE   r   z'type[ContentDoneEvent[ResponseFormatT]]zcontent.done)r   r   r   zrefusal.done)r   r   zlogprobs.content.done)r   r   zlogprobs.refusal.done)r   r   r  r0   r   r   r+   r   r   r   r3   r   r  r   r   r	  r   r
  r   )rP   r   rE   r|   r   s        rR   r  z%ChoiceEventState._content_done_eventsx  s    LN""**43E3E!%D( /'//F .4O##*!! AS"234KO4\] (+33;;! ""**6t?Q?Q!%D!!&^_E\E\EdEde
 $$0((00<//*.D'!!.5LVeVnVnVvVvw
 $$0((00<//*.D'!!.5LVeVnVnVvVvw rU   c          
        || j                   v ry | j                   j                  |       |j                  j                  J |j                  j                  |   }|j                  dk(  rt        | j                  |j                        }||j                  _        |j                  t        t        d||j                  j                  |j                  j                  |             y t        rt        |       y y )Nr   )rF   r   z"tool_calls.function.arguments.done)r   r   r   r   r   )r  addr   r   r   r4   r   r   r   r   r+   r   r   r   r   r   )rP   r|   r   r   r   r   s         rR   r  z%ChoiceEventState._add_tool_done_event  s     ...!!*-&&11===,44??
K""j0< --8J8S8S  <L''8!!6=$+4499099CC%5	 +, rU   N)rF   zlist[ChatCompletionToolParam]r   r   )r   r  r   r   rE   r~   r   r  )r   r   rE   r~   r   r  )r|   r  r   r   r   intr   r   )r   r   r   rS   r   r  r  r`   rU   rR   r   r   D  s    :' "' .	'
 P' 
:'R> .> P	>
 
:>@$- I$- .	$-
 $- 
$-rU   r   c           	     .   | j                         }t        d|d         }| j                  D ]A  }i |j                  ddh      d|j                  j                         i||j
                  <   C t        t        t        t        dd i|dd	i
            S )Nzlist[object]r   Tr   r   r   r   objectzchat.completionr   )r   r   r   r*   r   r   r   r,   )r   datar   r   s       rR   r   r     s    ==?D>4	?3G--!
dWIF!
v||++-!
   $.$d +	

 
rU   r  )T
__future__r   r   typesr   typingr   r   r   r   r	   r
   r   r   typing_extensionsr   r   r   jiterr   _typesr   r   r   _eventsr   r   r   r   r   r   r   r   r   r   r   r    _deltasr"   r$   r%   r&   _utilsr'   r(   r)   _compatr*   _modelsr+   r,   _parsingr.   r/   r0   r1   r2   r3   r4   
_streamingr5   r6   
types.chatr7   r8   r9   _exceptionsr:   r;   types.chat.chat_completionr<    types.chat.chat_completion_chunkr=   r  #types.chat.completion_create_paramsr>   ResponseFormatParamr@   r   r   r   rM   r   r   r`   rU   rR   <module>r+     s    "   b b b : :  k k    ' 1 1 N N " -   / ] ] S 9 F YG7?3 GT,"'/": ,"^G 8 GT,(w'? ,(^` 8 `F	X- X-vrU   