o
    iw                     @  s  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l3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z>m?Z?m@Z@ ddlAmBZBmCZC ddlDmEZE ddlFmGZH ddlImJZK G dd dee4 ZLG dd dee4 ZMG dd dee4 ZNG dd  d ee4 ZOG d!d" d"ee4 ZPG d#d$ d$ZQd/d)d*ZRd0d-d.ZSdS )1    )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   )OmitIncExomit)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parse_function_tool_arguments)StreamAsyncStream)ChatCompletionChunkParsedChatCompletionChatCompletionToolUnionParam)LengthFinishReasonErrorContentFilterFinishReasonError)ChoiceLogprobs)Choice)ResponseFormatc                   @  x   e Zd ZdZd*d
dZd+ddZd,ddZd-ddZd.ddZd/ddZ	d0d d!Z
d-d"d#Zed1d%d&Zd,d'd(Zd)S )2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
    
raw_streamStream[ChatCompletionChunk]response_format2type[ResponseFormatT] | ResponseFormatParam | Omitinput_tools-Iterable[ChatCompletionToolUnionParam] | OmitreturnNonec                C  *   || _ |j| _|  | _t||d| _d S NrB   rD   _raw_streamresponse	_response
__stream__	_iteratorChatCompletionStreamState_stateselfr@   rB   rD    rU   `/home/kim/smarthome/.venv/lib/python3.10/site-packages/openai/lib/streaming/chat/_completions.py__init__7      
zChatCompletionStream.__init__*ChatCompletionStreamEvent[ResponseFormatT]c                 C  s
   | j  S N)rP   __next__rT   rU   rU   rV   r[   C   s   
zChatCompletionStream.__next__4Iterator[ChatCompletionStreamEvent[ResponseFormatT]]c                 c  s    | j D ]}|V  qd S rZ   rP   rT   itemrU   rU   rV   __iter__F   s   
zChatCompletionStream.__iter__r   c                 C  s   | S rZ   rU   r\   rU   rU   rV   	__enter__J   s   zChatCompletionStream.__enter__exc_typetype[BaseException] | NoneexcBaseException | Noneexc_tbTracebackType | Nonec                 C  s   |    d S rZ   closerT   rc   re   rg   rU   rU   rV   __exit__M   s   zChatCompletionStream.__exit__c                 C  s   | j   dS z
        Close the response and release the connection.

        Automatically called if the response body is read to completion.
        N)rN   rj   r\   rU   rU   rV   rj   U   s   zChatCompletionStream.close%ParsedChatCompletion[ResponseFormatT]c                 C  s   |    | 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_donerR   get_final_completionr\   rU   rU   rV   rr   ]   s   
z)ChatCompletionStream.get_final_completionc                 C  s   t |  | S )*Blocks until the stream has been consumed.)r'   r\   rU   rU   rV   rq   h   s   zChatCompletionStream.until_doner   c                 C     | j jS rZ   rR   current_completion_snapshotr\   rU   rU   rV   rv   m      z0ChatCompletionStream.current_completion_snapshotc                 c  s8    | j D ]}t|sq| j|}|D ]}|V  qqd S rZ   rL   $_is_valid_chat_completion_chunk_weakrR   handle_chunkrT   	sse_eventevents_to_fireeventrU   rU   rV   rO   q   s   
zChatCompletionStream.__stream__N)r@   rA   rB   rC   rD   rE   rF   rG   rF   rY   )rF   r]   rF   r   rc   rd   re   rf   rg   rh   rF   rG   rF   rG   rF   rn   rF   r   )__name__
__module____qualname____doc__rW   r[   ra   rb   rl   rj   rr   rq   propertyrv   rO   rU   rU   rU   rV   r>   .       







r>   c                   @  .   e Zd ZdZdd
dZdddZdddZdS )ChatCompletionStreamManageraF  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.chat.completions.stream(...) as stream:
        for event in stream:
            ...
    ```
    api_request)Callable[[], Stream[ChatCompletionChunk]]rB   rC   rD   rE   rF   rG   c                C     d | _ || _|| _|| _d S rZ   )$_ChatCompletionStreamManager__stream)_ChatCompletionStreamManager__api_request-_ChatCompletionStreamManager__response_format)_ChatCompletionStreamManager__input_toolsrT   r   rB   rD   rU   rU   rV   rW         
z$ChatCompletionStreamManager.__init__%ChatCompletionStream[ResponseFormatT]c                 C  s"   |   }t|| j| jd| _| jS N)r@   rB   rD   )r   r>   r   r   r   rT   r@   rU   rU   rV   rb      s   z%ChatCompletionStreamManager.__enter__rc   rd   re   rf   rg   rh   c                 C  s   | j d ur| j   d S d S rZ   )r   rj   rk   rU   rU   rV   rl      s   
z$ChatCompletionStreamManager.__exit__N)r   r   rB   rC   rD   rE   rF   rG   )rF   r   r   )r   r   r   r   rW   rb   rl   rU   rU   rU   rV   r   z   
    

r   c                   @  r=   )2AsyncChatCompletionStreamr?   r@    AsyncStream[ChatCompletionChunk]rB   rC   rD   rE   rF   rG   c                C  rH   rI   rK   rS   rU   rU   rV   rW      rX   z"AsyncChatCompletionStream.__init__rY   c                   s   | j  I d H S rZ   )rP   	__anext__r\   rU   rU   rV   r      s   z#AsyncChatCompletionStream.__anext__9AsyncIterator[ChatCompletionStreamEvent[ResponseFormatT]]c                 C s"   | j 2 z	3 d H W }|V  q6 d S rZ   r^   r_   rU   rU   rV   	__aiter__   s   z#AsyncChatCompletionStream.__aiter__r   c                   s   | S rZ   rU   r\   rU   rU   rV   
__aenter__   s   z$AsyncChatCompletionStream.__aenter__rc   rd   re   rf   rg   rh   c                   s   |   I d H  d S rZ   ri   rk   rU   rU   rV   	__aexit__   s   z#AsyncChatCompletionStream.__aexit__c                   s   | j  I dH  dS rm   )rN   acloser\   rU   rU   rV   rj      s   zAsyncChatCompletionStream.closern   c                   s   |   I dH  | j S )ro   Nrp   r\   rU   rU   rV   rr      s   
z.AsyncChatCompletionStream.get_final_completionc                   s   t | I dH  | S )rs   N)r(   r\   rU   rU   rV   rq      s   z$AsyncChatCompletionStream.until_doner   c                 C  rt   rZ   ru   r\   rU   rU   rV   rv      rw   z5AsyncChatCompletionStream.current_completion_snapshotc                 C sB   | j 2 z3 d H W }t|sq| j|}|D ]}|V  qq6 d S rZ   rx   r{   rU   rU   rV   rO      s   z$AsyncChatCompletionStream.__stream__N)r@   r   rB   rC   rD   rE   rF   rG   r   )rF   r   r   r   r   r   r   )r   r   r   r   rW   r   r   r   r   rj   rr   rq   r   rv   rO   rU   rU   rU   rV   r      r   r   c                   @  r   ) AsyncChatCompletionStreamManageraQ  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.chat.completions.stream(...) as stream:
        for event in stream:
            ...
    ```
    r   +Awaitable[AsyncStream[ChatCompletionChunk]]rB   rC   rD   rE   rF   rG   c                C  r   rZ   ))_AsyncChatCompletionStreamManager__stream._AsyncChatCompletionStreamManager__api_request2_AsyncChatCompletionStreamManager__response_format._AsyncChatCompletionStreamManager__input_toolsr   rU   rU   rV   rW     r   z)AsyncChatCompletionStreamManager.__init__*AsyncChatCompletionStream[ResponseFormatT]c                   s(   | j I d H }t|| j| jd| _| jS r   )r   r   r   r   r   r   rU   rU   rV   r     s   z+AsyncChatCompletionStreamManager.__aenter__rc   rd   re   rf   rg   rh   c                   s$   | j d ur| j  I d H  d S d S rZ   )r   rj   rk   rU   rU   rV   r     s   
z*AsyncChatCompletionStreamManager.__aexit__N)r   r   rB   rC   rD   rE   rF   rG   )rF   r   r   )r   r   r   r   rW   r   r   rU   rU   rU   rV   r      r   r   c                   @  sb   e Zd ZdZeedd"d	d
Zd#ddZed$ddZd%ddZ	d&ddZ
d'ddZd(dd Zd!S ))rQ   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())
    ```
    )rD   rB   rD   rE   rB   rC   rF   rG   c                C  sL   d | _ g | _t|rdd |D ng | _|| _t|r!|| _d S t| _d S )Nc                 S  s   g | ]}|qS rU   rU   ).0ZtoolrU   rU   rV   
<listcomp>B  s    z6ChatCompletionStreamState.__init__.<locals>.<listcomp>)	7_ChatCompletionStreamState__current_completion_snapshot/_ChatCompletionStreamState__choice_event_statesr&   _input_tools_response_formatinspectisclassr%   _rich_response_format)rT   rD   rB   rU   rU   rV   rW   9  s
   z"ChatCompletionStreamState.__init__rn   c                 C  s   t | j| j| jd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.
        )Zchat_completionrB   rD   )r0   rv   r   r   r\   rU   rU   rV   rr   F  s
   z.ChatCompletionStreamState.get_final_completionr   c                 C  s   | j d usJ | j S rZ   )r   r\   rU   rU   rV   rv   R  s   z5ChatCompletionStreamState.current_completion_snapshotchunkr5   4Iterable[ChatCompletionStreamEvent[ResponseFormatT]]c                 C  s   |  || _| j|| jdS )zTAccumulate a new chunk into the snapshot and returns an iterable of events to yield.)r   completion_snapshot)_accumulate_chunkr   _build_events)rT   r   rU   rU   rV   rz   W  s
   z&ChatCompletionStreamState.handle_chunkchoiceChoiceChunkChoiceEventStatec                 C  s>   z| j |j W S  ty   t| jd}| j | | Y S w )N)rD   )r   index
IndexErrorr   r   append)rT   r   choice_staterU   rU   rV   _get_choice_state`  s   z+ChatCompletionStreamState._get_choice_statec                 C  s  | j }|d u rt|S |jD ]b}zd|j|j }|jjpg }ttttt	tdt
|jttddd t|jjp4g D ddtd|j d|_t|D ]%\}}|jjpWg | }|jdkrm|jdksfJ |jj|j_qNtrst| qNW n' ty   tttti |j
dd	hd
d|j id}|j| Y nw |jr|j|_t| j| jdr|jdkrt|d|jdkrt |jjr|jjst| j r|jj! rt"t#|jjddd|j_$|jjpg D ]A}	|jjpg |	j }
|
jdkrt%| j|
jj&d}|r|'di 'dr|
jj(rt"t#|
jj(ddd|
j_qtr%t|
 q|j)d urq|j)d u r?t*t+|j)j|j)jd|_)q|j)jrX|j)jd u rOg |j)_|j)j,|j)j |j)jrq|j)jd u rhg |j)_|j)j,|j)j q|j-|_-|j.|_.|S )Nzdict[object, object]Tc                 S  s   i | ]\}}|d ddiiqS )functionparsed_argumentsTrU   )r   idx_rU   rU   rV   
<dictcomp>  s    z?ChatCompletionStreamState._accumulate_chunk.<locals>.<dictcomp>)parsed
tool_calls)excludetype_valuer   deltaZexclude_unsetr   messagerJ   length)
completionZcontent_filterzutf-8)Zpartial_mode)rD   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   r8   r9   r   r   r&   r   lstripr   bytesr   r1   r   get	argumentslogprobsr*   r:   extendusagesystem_fingerprint)rT   r   r   r   choice_snapshotZprevious_tool_calls
tool_indexZ	prev_toolZnew_toolZtool_call_chunktool_call_snapshotZ
input_toolrU   rU   rV   r   h  s    












z+ChatCompletionStreamState._accumulate_chunkr   0list[ChatCompletionStreamEvent[ResponseFormatT]]c          
      C  s  g }| ttd||d |jD ]}| |}|j|j }|jjd ur;|jjd ur;| tt	d|jj|jj|jj
d |jjd urV|jjd urV| ttd|jj|jjd |jjr|jj}|d usdJ |jjD ]3}||j }	|	jdkr|jd us{J | ttd|	jj|j|	jj|	jj|jjpd	d
 qhtrt|	 qh|jd ur|jd ur|jjr|jjr| ttd|jj|jjd |jjr|jjr| ttd|jj|jjd ||j||| jd q|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   Zarguments_deltazlogprobs.content.delta)r   r   r   zlogprobs.refusal.delta)r   r   r   )choice_chunkr   rB   )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   )
rT   r   r   r}   r   r   r   r   Ztool_call_delta	tool_callrU   rU   rV   r     s   


	


		z'ChatCompletionStreamState._build_eventsN)rD   rE   rB   rC   rF   rG   r   r   )r   r5   rF   r   )r   r   rF   r   r   r5   rF   r   )r   r5   r   r   rF   r   )r   r   r   r   r%   rW   rr   r   rv   rz   r   r   r   rU   rU   rU   rV   rQ   $  s    


	
 rQ   c                   @  s4   e Zd ZdddZdddZdddZdddZdS )r   rD   "list[ChatCompletionToolUnionParam]rF   rG   c                C  s0   || _ d| _d| _d| _d| _t | _d | _d S )NF)r   _content_done_refusal_done_logprobs_content_done_logprobs_refusal_doneset_done_tool_calls*_ChoiceEventState__current_tool_call_index)rT   rD   rU   rU   rV   rW   J  s   
zChoiceEventState.__init__r   r   r   r   rB   rC   r   c                C  s   g }|j r#|| j||d | jd ur#| j| jvr#| j||| jd |jjp(g D ]$}| j|jkrI|| j||d | jd urI| j||| jd |j| _q)|S )N)r   rB   )r}   r   r   )	r   r   _content_done_eventsr   r   _add_tool_done_eventr   r   r   )rT   r   r   rB   r}   r   rU   rU   rV   r   T  s2   


z ChoiceEventState.get_done_eventsc                C  s   g }|j jr*| js*d| _t||j d}||j _|ttdttt	d|j j|d |j j
d urB| jsBd| _|ttd|j j
d |jd ur_|jjd ur_| js_d| _|ttd|jjd	 |jd ur||jj
d ur|| js|d| _|ttd
|jj
d |S )NT)rB   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   r/   r   r   r*   r   r   r   r   r   r   r   r   r   r   r   )rT   r   rB   r}   r   rU   rU   rV   r   }  sR   

z%ChoiceEventState._content_done_eventsr}   r   intc             
   C  s   || j v rd S | j | |jjd usJ |jj| }|jdkr?t| j|jd}||j_|	t
td||jj|jj|d d S trGt| d S d S )Nr   )rD   r   z"tool_calls.function.arguments.done)r   r   r   r   r   )r   addr   r   r   r2   r   r   r   r   r*   r   r   r   r   r   )rT   r}   r   r   r   r   rU   rU   rV   r     s.   


z%ChoiceEventState._add_tool_done_eventN)rD   r   rF   rG   )r   r   r   r   rB   rC   rF   r   )r   r   rB   rC   rF   r   )r}   r   r   r   r   r   rF   rG   )r   r   r   rW   r   r   r   rU   rU   rU   rV   r   I  s
    



)@r   r   r5   rF   r   c                 C  sl   |   }td|d }| jD ]}i |jddhdd|j  i||j< qttttdd i|dd	id
S )Nzlist[object]r   Tr   r   r   r   objectzchat.completionr   )r   r   r   r)   r   r   r   r+   )r   datar   r   rU   rU   rV   r     s(   

r   r|   boolc                 C  s
   | j dkS )Nzchat.completion.chunk)r   )r|   rU   rU   rV   ry     s   
ry   r   )r|   r5   rF   r   )T
__future__r   r   typesr   typingr   r   r   r   r   r	   r
   r   Ztyping_extensionsr   r   r   Zjiterr   _typesr   r   r   Z_eventsr   r   r   r   r   r   r   r   r   r   r   r   Z_deltasr!   r#   r$   r%   Z_utilsr&   r'   r(   Z_compatr)   Z_modelsr*   r+   Z_parsingr-   r.   r/   r0   r1   r2   Z
_streamingr3   r4   Z
types.chatr5   r6   r7   _exceptionsr8   r9   Ztypes.chat.chat_completionr:   Z types.chat.chat_completion_chunkr;   r   Z#types.chat.completion_create_paramsr<   ZResponseFormatParamr>   r   r   r   rQ   r   r   ry   rU   rU   rU   rV   <module>   s>    (8 L/L/  ' 
