o
    i9                     @  s2  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
mZmZmZmZ d dlmZmZmZmZmZmZ d dlZddlmZmZ ddlmZ erZdd	lmZmZ dd
lm Z  e
dZ!G dd de	e! Z"G dd de	e! Z#G dd dZ$G dd dZ%eG dd deZ&d"ddZ'ddd#d d!Z(dS )$    )annotationsN)TracebackType)TYPE_CHECKINGAnyGenericTypeVarIteratorOptionalAsyncIteratorcast)SelfProtocol	TypeGuardoverride
get_originruntime_checkable   )
is_mappingextract_type_var_from_base)APIError)OpenAIAsyncOpenAI)FinalRequestOptions_Tc                   @     e Zd ZU dZded< dZded< ded< dd	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d1d)d*ZdS )2StreamzJProvides the core interface to iterate over a synchronous stream response.httpx.ResponseresponseNOptional[FinalRequestOptions]_optionsSSEBytesDecoder_decoderoptionscast_totype[_T]clientr   r#   returnNonec                C  0   || _ || _|| _|| _| | _|  | _d S Nr   _cast_to_clientr   Z_make_sse_decoderr!   
__stream__	_iteratorselfr$   r   r&   r#    r2   K/home/kim/smarthome/.venv/lib/python3.10/site-packages/openai/_streaming.py__init__      
zStream.__init__r   c                 C  s
   | j  S r*   )r/   __next__r1   r2   r2   r3   r6   -   s   
zStream.__next__Iterator[_T]c                 c  s    | j D ]}|V  qd S r*   r/   r1   itemr2   r2   r3   __iter__0   s   
zStream.__iter__Iterator[ServerSentEvent]c                 c  s    | j | j E d H  d S r*   )r!   
iter_bytesr   r7   r2   r2   r3   _iter_events4   s   zStream._iter_eventsc           	      c  s   t t| j}| j}| jj}|  }z|D ]}|jdr n|j	rk|j	drk|
 }|j	dkr^t|r^|dr^d }|d}t|rJ|d}|rQt|tsSd}t|| jj|d d|||j	d||dV  q|
 }t|r|drd }|d}t|r|d}|rt|tsd}t|| jj|d d|| jd ur| jjr||j	dn|||dV  qW |  d S W |  d S |  w 	Nz[DONE]zthread.errormessagez"An error occurred during streaming)rB   requestbody)dataevent)rE   r$   r   )r   r   r,   r   r-   _process_response_datar?   rE   
startswithrF   jsonr   get
isinstancestrr   rC   r   synthesize_event_and_dataclose	r1   r$   r   Zprocess_dataiteratorsserE   rB   rA   r2   r2   r3   r.   7   s`   




0.zStream.__stream__r   c                 C  s   | S r*   r2   r7   r2   r2   r3   	__enter__p   s   zStream.__enter__exc_typetype[BaseException] | NoneexcBaseException | Noneexc_tbTracebackType | Nonec                 C  s   |    d S r*   rN   r1   rS   rU   rW   r2   r2   r3   __exit__s   s   zStream.__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)r   rN   r7   r2   r2   r3   rN   {   s   zStream.close)
r$   r%   r   r   r&   r   r#   r   r'   r(   r'   r   )r'   r8   )r'   r=   r'   r   rS   rT   rU   rV   rW   rX   r'   r(   r'   r(   )__name__
__module____qualname____doc____annotations__r   r4   r6   r<   r?   r.   rR   r[   rN   r2   r2   r2   r3   r      s   
 




9
r   c                   @  r   )2AsyncStreamzLProvides the core interface to iterate over an asynchronous stream response.r   r   Nr   r   zSSEDecoder | SSEBytesDecoderr!   r"   r$   r%   r&   r   r#   r'   r(   c                C  r)   r*   r+   r0   r2   r2   r3   r4      r5   zAsyncStream.__init__r   c                   s   | j  I d H S r*   )r/   	__anext__r7   r2   r2   r3   rg      s   zAsyncStream.__anext__AsyncIterator[_T]c                 C s"   | j 2 z	3 d H W }|V  q6 d S r*   r9   r:   r2   r2   r3   	__aiter__   s   zAsyncStream.__aiter__AsyncIterator[ServerSentEvent]c                 C s.   | j | j 2 z	3 d H W }|V  q
6 d S r*   )r!   aiter_bytesr   )r1   rQ   r2   r2   r3   r?      s   zAsyncStream._iter_eventsc           	      C s  t t| j}| j}| jj}|  }z|2 z3 d H W }|jdr# n|j	ro|j	dro|
 }|j	dkrbt|rb|drbd }|d}t|rN|d}|rUt|tsWd}t|| jj|d d|||j	d||dV  q|
 }t|r|drd }|d}t|r|d}|rt|tsd}t|| jj|d d|| jd ur| jjr||j	dn|||dV  q6 W | I d H  d S W | I d H  d S | I d H  w r@   )r   r   r,   r   r-   rG   r?   rE   rH   rF   rI   r   rJ   rK   rL   r   rC   r   rM   acloserO   r2   r2   r3   r.      s`   




0".zAsyncStream.__stream__r   c                   s   | S r*   r2   r7   r2   r2   r3   
__aenter__   s   zAsyncStream.__aenter__rS   rT   rU   rV   rW   rX   c                   s   |   I d H  d S r*   rY   rZ   r2   r2   r3   	__aexit__   s   zAsyncStream.__aexit__c                   s   | j  I dH  dS r\   )r   rl   r7   r2   r2   r3   rN      s   zAsyncStream.close)
r$   r%   r   r   r&   r   r#   r   r'   r(   r]   )r'   rh   )r'   rj   r^   r_   r`   )ra   rb   rc   rd   re   r   r4   rg   ri   r?   r.   rm   rn   rN   r2   r2   r2   r3   rf      s   
 




9
rf   c                   @  sr   e Zd ZddddddddZedddZedddZedddZedddZdddZ	e
dddZdS ) ServerSentEventNrF   rE   idretryrF   
str | NonerE   rq   rr   
int | Noner'   r(   c                C  s,   |d u rd}|| _ || _|pd | _|| _d S )N )_id_data_event_retry)r1   rF   rE   rq   rr   r2   r2   r3   r4      s   

zServerSentEvent.__init__c                 C     | j S r*   )rx   r7   r2   r2   r3   rF        zServerSentEvent.eventc                 C  rz   r*   )rv   r7   r2   r2   r3   rq     r{   zServerSentEvent.idc                 C  rz   r*   )ry   r7   r2   r2   r3   rr     r{   zServerSentEvent.retryrL   c                 C  rz   r*   )rw   r7   r2   r2   r3   rE     r{   zServerSentEvent.datar   c                 C  s   t | jS r*   )rI   loadsrE   r7   r2   r2   r3   rI     s   zServerSentEvent.jsonc              	   C  s&   d| j  d| j d| j d| j d	S )NzServerSentEvent(event=z, data=z, id=z, retry=)rp   r7   r2   r2   r3   __repr__  s   &zServerSentEvent.__repr__)
rF   rs   rE   rs   rq   rs   rr   rt   r'   r(   )r'   rs   )r'   rt   )r'   rL   )r'   r   )ra   rb   rc   r4   propertyrF   rq   rr   rE   rI   r   r~   r2   r2   r2   r3   ro      s"    
ro   c                   @  sj   e Zd ZU ded< ded< ded< ded< dd
dZd ddZd!ddZd"ddZd#ddZd$ddZ	dS )%
SSEDecoderz	list[str]rw   rs   rx   rt   ry   _last_event_idr'   r(   c                 C  s   d | _ g | _d | _d | _d S r*   )rx   rw   r   ry   r7   r2   r2   r3   r4   !  s   
zSSEDecoder.__init__rP   Iterator[bytes]r=   c                 c  sB    |  |D ]}| D ]}|d}| |}|r|V  qqdS )^Given an iterator that yields raw binary data, iterate over it & yield every event encounteredutf-8N)_iter_chunks
splitlinesdecoder1   rP   chunkZraw_linelinerQ   r2   r2   r3   r>   '  s   

zSSEDecoder.iter_bytesc                 c  sP    d}|D ]}|j ddD ]}||7 }|dr|V  d}qq|r&|V  dS dS )^Given an iterator that yields raw binary data, iterate over it and yield individual SSE chunks    Tkeependss   s   

s   

Nr   endswithr1   rP   rE   r   r   r2   r2   r3   r   1  s   

zSSEDecoder._iter_chunksAsyncIterator[bytes]rj   c                 C sL   |  |2 z3 dH W }| D ]}|d}| |}|r!|V  qq6 dS )r   Nr   )_aiter_chunksr   r   r   r2   r2   r3   rk   =  s   

zSSEDecoder.aiter_bytesc                 C sZ   d}|2 z3 dH W }|j ddD ]}||7 }|dr!|V  d}qq6 |r+|V  dS dS )r   r   NTr   r   r   r   r2   r2   r3   r   G  s   

zSSEDecoder._aiter_chunksr   rL   ServerSentEvent | Nonec              	   C  s  |s,| j s| js| js| jd u rd S t| j d| j| j| jd}d | _ g | _d | _|S |dr3d S |d\}}}|drF|dd  }|dkrO|| _ d S |dkr[| j| d S |dkrkd	|v rf	 d S || _d S |d
krzt	|| _W d S  t
tfy   Y d S w 	 d S )N
rp   : r   rF   rE   rq    rr   )rx   rw   r   ry   ro   joinrH   	partitionappendint	TypeError
ValueError)r1   r   rQ   	fieldname_valuer2   r2   r3   r   S  sP   


	zSSEDecoder.decodeNr`   rP   r   r'   r=   )rP   r   r'   r   rP   r   r'   rj   )rP   r   r'   r   )r   rL   r'   r   )
ra   rb   rc   re   r4   r>   r   rk   r   r   r2   r2   r2   r3   r     s   
 






r   c                   @  s    e Zd ZdddZdd	d
ZdS )r    rP   r   r'   r=   c                 C     dS )r   Nr2   r1   rP   r2   r2   r3   r>        zSSEBytesDecoder.iter_bytesr   rj   c                 C  r   )zdGiven an async iterator that yields raw binary data, iterate over it & yield every event encounteredNr2   r   r2   r2   r3   rk     r   zSSEBytesDecoder.aiter_bytesNr   r   )ra   rb   rc   r>   rk   r2   r2   r2   r3   r      s    
r    typtyper'   ;TypeGuard[type[Stream[object]] | type[AsyncStream[object]]]c                 C  s$   t | p| }t|ot|ttfS )zaTypeGuard for determining whether or not the given type is a subclass of `Stream` / `AsyncStream`)r   inspectisclass
issubclassr   rf   )r   originr2   r2   r3   is_stream_class_type  s   r   )failure_message
stream_clsr   rs   c                C  s*   ddl m}m} t| dtd||f|dS )a  Given a type like `Stream[T]`, returns the generic type variable `T`.

    This also handles the case where a concrete subclass is given, e.g.
    ```py
    class MyStream(Stream[bytes]):
        ...

    extract_stream_chunk_type(MyStream) -> bytes
    ```
    r   )r   rf   r   ztuple[type, ...])indexZgeneric_basesr   )Z_base_clientr   rf   r   r   )r   r   r   rf   r2   r2   r3   extract_stream_chunk_type  s   r   )r   r   r'   r   )r   r   r   rs   r'   r   ))
__future__r   rI   r   typesr   typingr   r   r   r   r   r	   r
   r   Ztyping_extensionsr   r   r   r   r   r   ZhttpxZ_utilsr   r   _exceptionsr   r-   r   r   Z_modelsr   r   r   rf   ro   r   r    r   r   r2   r2   r2   r3   <module>   s,   ( mn)i

	