U
    ·ÜŸjÆ3  ã                   @  s0  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 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r¤dd	lmZ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œdd„Z$ddœddddœdd„Z%dS )é    )ÚannotationsN)ÚTracebackType)ÚTYPE_CHECKINGÚAnyÚGenericÚTypeVarÚIteratorÚAsyncIteratorÚcast)ÚSelfÚProtocolÚ	TypeGuardÚoverrideÚ
get_originÚruntime_checkableé   )Ú
is_mappingÚextract_type_var_from_base)ÚAPIError)ÚOpenAIÚAsyncOpenAIÚ_Tc                   @  sž   e Zd ZU dZded< ded< ddddd	œd
d„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Z	ddœdd„Z
dddddœdd „Zddœd!d"„Zd#S )$ÚStreamzJProvides the core interface to iterate over a synchronous stream response.úhttpx.ResponseÚresponseÚSSEBytesDecoderÚ_decoderútype[_T]r   ÚNone©Úcast_tor   ÚclientÚreturnc                C  s*   || _ || _|| _| ¡ | _|  ¡ | _d S ©N©r   Ú_cast_toÚ_clientZ_make_sse_decoderr   Ú
__stream__Ú	_iterator©Úselfr    r   r!   © r+   ú5/tmp/pip-unpacked-wheel-2qj3ofc_/openai/_streaming.pyÚ__init__   s
    
zStream.__init__r   ©r"   c                 C  s
   | j  ¡ S r#   )r(   Ú__next__©r*   r+   r+   r,   r/   *   s    zStream.__next__zIterator[_T]c                 c  s   | j D ]
}|V  qd S r#   ©r(   ©r*   Úitemr+   r+   r,   Ú__iter__-   s    
zStream.__iter__úIterator[ServerSentEvent]c                 c  s   | j  | j ¡ ¡E d H  d S r#   )r   Ú
iter_bytesr   r0   r+   r+   r,   Ú_iter_events1   s    zStream._iter_eventsc           
      c  sv  t t| jƒ}| j}| jj}|  ¡ }|D �]<}|j d¡r> �qf|j	d ks`|j	 d¡s`|j	 d¡rÔ| 
¡ }t|ƒrÂ| d¡rÂd }| d¡}t|ƒrš| d¡}|r¨t|tƒs¬d}t|| jj|d d�‚||||d�V  q&| 
¡ }|j	dk�rLt|ƒ�rL| d¡�rLd }| d¡}t|ƒ�r | d¡}|�r2t|tƒ�s6d}t|| jj|d d�‚|||j	d	œ||d�V  q&|D ]}	�qjd S ©
Nz[DONE]z	response.ztranscript.ÚerrorÚmessagez"An error occurred during streaming)r:   ÚrequestÚbody)Údatar    r   )r=   Úevent©r
   r   r%   r   r&   Z_process_response_datar7   r=   Ú
startswithr>   Újsonr   ÚgetÚ
isinstanceÚstrr   r;   ©
r*   r    r   Zprocess_dataÚiteratorÚsser=   r:   r9   Z_sser+   r+   r,   r'   4   sL    
"

ý"


ýzStream.__stream__r   c                 C  s   | S r#   r+   r0   r+   r+   r,   Ú	__enter__g   s    zStream.__enter__útype[BaseException] | NoneúBaseException | NoneúTracebackType | None©Úexc_typeÚexcÚexc_tbr"   c                 C  s   |   ¡  d S r#   ©Úclose©r*   rM   rN   rO   r+   r+   r,   Ú__exit__j   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   rQ   r0   r+   r+   r,   rQ   r   s    zStream.closeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r-   r/   r4   r7   r'   rH   rS   rQ   r+   r+   r+   r,   r      s   
3r   c                   @  sž   e Zd ZU dZded< ded< ddddd	œd
d„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Z	ddœdd„Z
dddddœdd „Zddœd!d"„Zd#S )$ÚAsyncStreamzLProvides the core interface to iterate over an asynchronous stream response.r   r   zSSEDecoder | SSEBytesDecoderr   r   r   r   r   c                C  s*   || _ || _|| _| ¡ | _|  ¡ | _d S r#   r$   r)   r+   r+   r,   r-   ‚   s
    
zAsyncStream.__init__r   r.   c                 Ã  s   | j  ¡ I d H S r#   )r(   Ú	__anext__r0   r+   r+   r,   r[   �   s    zAsyncStream.__anext__zAsyncIterator[_T]c                 C s    | j 2 z3 d H W }|V  q6 d S r#   r1   r2   r+   r+   r,   Ú	__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   )r*   rG   r+   r+   r,   r7   –   s    zAsyncStream._iter_eventsc           
      C sŠ  t t| jƒ}| j}| jj}|  ¡ }|2 �zD3 d H W }|j d¡rF �qp|j	d ksh|j	 d¡sh|j	 d¡rÜ| 
¡ }t|ƒrÊ| d¡rÊd }| d¡}t|ƒr¢| d¡}|r°t|tƒs´d}t|| jj|d d�‚||||d�V  q&| 
¡ }|j	dk�rTt|ƒ�rT| d¡�rTd }| d¡}t|ƒ�r(| d¡}|�r:t|tƒ�s>d}t|| jj|d d�‚|||j	d	œ||d�V  q&6 |2 z3 d H W }	�qt6 d S r8   r?   rE   r+   r+   r,   r'   š   sL    "

ý"


ýzAsyncStream.__stream__r   c                 Ã  s   | S r#   r+   r0   r+   r+   r,   Ú
__aenter__Í   s    zAsyncStream.__aenter__rI   rJ   rK   rL   c                 Ã  s   |   ¡ I d H  d S r#   rP   rR   r+   r+   r,   Ú	__aexit__Ð   s    zAsyncStream.__aexit__c                 Ã  s   | j  ¡ I dH  dS rT   )r   Úacloser0   r+   r+   r,   rQ   Ø   s    zAsyncStream.closeN)rU   rV   rW   rX   rY   r-   r[   r\   r7   r'   r_   r`   rQ   r+   r+   r+   r,   rZ   {   s   
3rZ   c                   @  s–   e Zd Zdddddœddddddœdd„Zedd	œd
d„ƒZedd	œdd„ƒZedd	œdd„ƒZedd	œdd„ƒZdd	œdd„Z	e
dd	œdd„ƒZdS )ÚServerSentEventN©r>   r=   ÚidÚretryú
str | Noneú
int | Noner   )r>   r=   rd   re   r"   c                C  s,   |d krd}|| _ || _|pd | _|| _d S )NÚ )Ú_idÚ_dataÚ_eventÚ_retry)r*   r>   r=   rd   re   r+   r+   r,   r-   â   s    
zServerSentEvent.__init__r.   c                 C  s   | j S r#   )rk   r0   r+   r+   r,   r>   ò   s    zServerSentEvent.eventc                 C  s   | j S r#   )ri   r0   r+   r+   r,   rd   ö   s    zServerSentEvent.idc                 C  s   | j S r#   )rl   r0   r+   r+   r,   re   ú   s    zServerSentEvent.retryrD   c                 C  s   | j S r#   )rj   r0   r+   r+   r,   r=   þ   s    zServerSentEvent.datar   c                 C  s   t  | j¡S r#   )rA   Úloadsr=   r0   r+   r+   r,   rA     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=ú)rc   r0   r+   r+   r,   Ú__repr__  s    zServerSentEvent.__repr__)rU   rV   rW   r-   Úpropertyr>   rd   re   r=   rA   r   ro   r+   r+   r+   r,   rb   á   s    úrb   c                   @  sŒ   e Zd ZU ded< ded< ded< ded< dd	œd
d„Zdddœdd„Zdddœdd„Zdddœdd„Zdddœdd„Zdddœdd„Z	dS )Ú
SSEDecoderz	list[str]rj   rf   rk   rg   rl   Ú_last_event_idr   r.   c                 C  s   d | _ g | _d | _d | _d S r#   )rk   rj   rr   rl   r0   r+   r+   r,   r-     s    zSSEDecoder.__init__úIterator[bytes]r5   ©rF   r"   c                 c  s@   |   |¡D ]0}| ¡ 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©r*   rF   ÚchunkZraw_lineÚlinerG   r+   r+   r,   r6     s    

zSSEDecoder.iter_bytesc                 c  sJ   d}|D ]2}|j dd�D ] }||7 }| d¡r|V  d}qq|rF|V  dS )ú^Given an iterator that yields raw binary data, iterate over it and yield individual SSE chunksó    T©Úkeepends©s   s   

s   

N©rx   Úendswith©r*   rF   r=   r{   r|   r+   r+   r,   rw      s    
zSSEDecoder._iter_chunksúAsyncIterator[bytes]r]   c                 C sJ   |   |¡2 z83 dH W }| ¡ D ]"}| d¡}|  |¡}|r|V  qq
6 dS )ru   Nrv   )Ú_aiter_chunksrx   ry   rz   r+   r+   r,   r^   ,  s    

zSSEDecoder.aiter_bytesc                 C sT   d}|2 z:3 dH W }|j dd�D ] }||7 }| d¡r |V  d}q q6 |rP|V  dS )r}   r~   NTr   r�   r‚   r„   r+   r+   r,   r†   6  s    

zSSEDecoder._aiter_chunksrD   zServerSentEvent | None)r|   r"   c              	   C  s  |sX| j s$| js$| js$| jd kr$d S t| j d | j¡| j| jd�}d | _ g | _d | _|S | d¡rfd S | d¡\}}}| d¡rŒ|dd … }|dkrœ|| _ nb|dkr²| j |¡ nL|dkrÌd	|krÄqþ|| _n2|d
krþzt	|ƒ| _W qþ t
tfk
rú   Y qþX n d S )NÚ
rc   ú:ú r   r>   r=   rd   ú re   )rk   rj   rr   rl   rb   Újoinr@   Ú	partitionÚappendÚintÚ	TypeErrorÚ
ValueError)r*   r|   rG   Ú	fieldnameÚ_Úvaluer+   r+   r,   ry   B  s@    
ü

zSSEDecoder.decodeN)
rU   rV   rW   rY   r-   r6   rw   r^   r†   ry   r+   r+   r+   r,   rq   
  s   


rq   c                   @  s,   e Zd Zdddœdd„Zdddœdd	„Zd
S )r   rs   r5   rt   c                 C  s   dS )ru   Nr+   ©r*   rF   r+   r+   r,   r6   u  s    zSSEBytesDecoder.iter_bytesr…   r]   c                 C  s   dS )zdGiven an async iterator that yields raw binary data, iterate over it & yield every event encounteredNr+   r”   r+   r+   r,   r^   y  s    zSSEBytesDecoder.aiter_bytesN)rU   rV   rW   r6   r^   r+   r+   r+   r,   r   s  s   r   Útypez;TypeGuard[type[Stream[object]] | type[AsyncStream[object]]])Útypr"   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   rZ   )r–   Úoriginr+   r+   r,   Úis_stream_class_type~  s    r›   )Úfailure_messagerf   )Ú
stream_clsrœ   r"   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   rZ   r   ztuple[type, ...])ÚindexZgeneric_basesrœ   )Z_base_clientr   rZ   r   r
   )r�   rœ   r   rZ   r+   r+   r,   Úextract_stream_chunk_type„  s    ürŸ   )&Ú
__future__r   rA   r—   Útypesr   Útypingr   r   r   r   r   r	   r
   Útyping_extensionsr   r   r   r   r   r   ZhttpxÚ_utilsr   r   Ú_exceptionsr   r&   r   r   r   r   rZ   rb   rq   r   r›   rŸ   r+   r+   r+   r,   Ú<module>   s(   $ ef)i
	ý