o
    i+                     @  s  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 erJd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Z!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   )extract_type_var_from_base)GeminiNextGenAPIClientAsyncGeminiNextGenAPIClient_Tc                   @  r   e Zd ZU dZ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,d"d#Zd-d$d%Zd&S ).StreamzJProvides the core interface to iterate over a synchronous stream response.httpx.ResponseresponseSSEBytesDecoder_decodercast_totype[_T]clientr   returnNonec                C  *   || _ || _|| _| | _|  | _d S Nr   _cast_to_client_make_sse_decoderr   
__stream__	_iteratorselfr   r   r    r+   Y/home/ubuntu/.local/lib/python3.10/site-packages/google/genai/_interactions/_streaming.py__init__+   
   
zStream.__init__r   c                 C  s
   | j  S r"   )r(   __next__r*   r+   r+   r,   r/   8   s   
zStream.__next__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_events?   s   zStream._iter_eventsc                 c  sz    t t| j}| j}| jj}|  }z%|D ]}|jdr n||	 ||dV  qW |
  d S W |
  d S |
  w Nz[DONE])datar   r   )r
   r   r$   r   r%   _process_response_datar8   r:   
startswithjsoncloser*   r   r   process_dataiteratorsser+   r+   r,   r'   B   s   zStream.__stream__r   c                 C  s   | S r"   r+   r0   r+   r+   r,   	__enter__R   s   zStream.__enter__exc_typetype[BaseException] | NoneexcBaseException | Noneexc_tbTracebackType | Nonec                 C  s   |    d S r"   r>   r*   rD   rF   rH   r+   r+   r,   __exit__U   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   r>   r0   r+   r+   r,   r>   ]   s   zStream.closeN)r   r   r   r   r   r   r   r    r   r   )r   r1   )r   r6   r   r   rD   rE   rF   rG   rH   rI   r   r    r   r    )__name__
__module____qualname____doc____annotations__r-   r/   r5   r8   r'   rC   rL   r>   r+   r+   r+   r,   r   $   s   
 






r   c                   @  r   ).AsyncStreamzLProvides the core interface to iterate over an asynchronous stream response.r   r   zSSEDecoder | SSEBytesDecoderr   r   r   r   r   r   r    c                C  r!   r"   r#   r)   r+   r+   r,   r-   m   r.   zAsyncStream.__init__r   c                   s   | j  I d H S r"   )r(   	__anext__r0   r+   r+   r,   rX   z   s   zAsyncStream.__anext__AsyncIterator[_T]c                 C s"   | j 2 z	3 d H W }|V  q6 d S r"   r2   r3   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*   rB   r+   r+   r,   r8      s   zAsyncStream._iter_eventsc                 C s   t t| j}| j}| jj}|  }z0|2 z3 d H W }|jdr# n||	 ||dV  q6 W |
 I d H  d S W |
 I d H  d S |
 I d H  w r9   )r
   r   r$   r   r%   r;   r8   r:   r<   r=   acloser?   r+   r+   r,   r'      s   "zAsyncStream.__stream__r   c                   s   | S r"   r+   r0   r+   r+   r,   
__aenter__   s   zAsyncStream.__aenter__rD   rE   rF   rG   rH   rI   c                   s   |   I d H  d S r"   rJ   rK   r+   r+   r,   	__aexit__   s   zAsyncStream.__aexit__c                   s   | j  I dH  dS rM   )r   r]   r0   r+   r+   r,   r>      s   zAsyncStream.closeN)r   r   r   r   r   r   r   r    rN   )r   rY   )r   r[   rO   rP   rQ   )rR   rS   rT   rU   rV   r-   rX   rZ   r8   r'   r^   r_   r>   r+   r+   r+   r,   rW   f   s   
 






rW   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eventr:   idretryrb   
str | Noner:   rc   rd   
int | Noner   r    c                C  s,   |d u rd}|| _ || _|pd | _|| _d S )N )_id_data_event_retry)r*   rb   r:   rc   rd   r+   r+   r,   r-      s   

zServerSentEvent.__init__c                 C     | j S r"   )rj   r0   r+   r+   r,   rb         zServerSentEvent.eventc                 C  rl   r"   )rh   r0   r+   r+   r,   rc      rm   zServerSentEvent.idc                 C  rl   r"   )rk   r0   r+   r+   r,   rd      rm   zServerSentEvent.retrystrc                 C  rl   r"   )ri   r0   r+   r+   r,   r:      rm   zServerSentEvent.datar   c                 C  s   t | jS r"   )r=   loadsr:   r0   r+   r+   r,   r=      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=)ra   r0   r+   r+   r,   __repr__   s   &zServerSentEvent.__repr__)
rb   re   r:   re   rc   re   rd   rf   r   r    )r   re   )r   rf   )r   rn   )r   r   )rR   rS   rT   r-   propertyrb   rc   rd   r:   r=   r   rq   r+   r+   r+   r,   r`      s"    
r`   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]ri   re   rj   rf   rk   _last_event_idr   r    c                 C  s   d | _ g | _d | _d | _d S r"   )rj   ri   rt   rk   r0   r+   r+   r,   r-      s   
zSSEDecoder.__init__rA   Iterator[bytes]r6   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r*   rA   chunkraw_linelinerB   r+   r+   r,   r7      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ry   endswithr*   rA   r:   r|   r~   r+   r+   r,   rx      s   

zSSEDecoder._iter_chunksAsyncIterator[bytes]r[   c                 C sL   |  |2 z3 dH W }| D ]}|d}| |}|r!|V  qq6 dS )rv   Nrw   )_aiter_chunksry   rz   r{   r+   r+   r,   r\      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   r+   r+   r,   r      s   

zSSEDecoder._aiter_chunksr~   rn   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
ra   : r   rb   r:   rc    rd   )rj   ri   rt   rk   r`   joinr<   	partitionappendint	TypeError
ValueError)r*   r~   rB   	fieldname_valuer+   r+   r,   rz   
  sP   


	zSSEDecoder.decodeNrQ   rA   ru   r   r6   )rA   ru   r   ru   rA   r   r   r[   )rA   r   r   r   )r~   rn   r   r   )
rR   rS   rT   rV   r-   r7   rx   r\   r   rz   r+   r+   r+   r,   rs      s   
 






rs   c                   @  s    e Zd ZdddZdd	d
ZdS )r   rA   ru   r   r6   c                 C     dS )rv   Nr+   r*   rA   r+   r+   r,   r7   =     zSSEBytesDecoder.iter_bytesr   r[   c                 C  r   )zdGiven an async iterator that yields raw binary data, iterate over it & yield every event encounteredNr+   r   r+   r+   r,   r\   A  r   zSSEBytesDecoder.aiter_bytesNr   r   )rR   rS   rT   r7   r\   r+   r+   r+   r,   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   rW   )r   originr+   r+   r,   is_stream_class_typeF  s   r   )failure_message
stream_clsr   re   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   rW   r   ztuple[type, ...])indexgeneric_basesr   )_base_clientr   rW   r   r
   )r   r   r   rW   r+   r+   r,   extract_stream_chunk_typeL  s   r   )r   r   r   r   )r   r   r   re   r   r   )#
__future__r   r=   r   typesr   typingr   r   r   r   r   r	   r
   typing_extensionsr   r   r   r   r   r   httpx_utilsr   r%   r   r   r   r   rW   r`   rs   r   r   r   r+   r+   r+   r,   <module>   s(   $ BC)i

	