o
    YiQ,                     @  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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rRd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   )extract_type_var_from_base)GeminiNextGenAPIClientAsyncGeminiNextGenAPIClient)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!    r0   _/home/kim/smarthome/.venv/lib/python3.10/site-packages/google/genai/_interactions/_streaming.py__init__,      
zStream.__init__r   c                 C  s
   | j  S r(   )r-   __next__r/   r0   r0   r1   r4   ;   s   
zStream.__next__Iterator[_T]c                 c  s    | j D ]}|V  qd S r(   r-   r/   itemr0   r0   r1   __iter__>   s   
zStream.__iter__Iterator[ServerSentEvent]c                 c  s    | j | j E d H  d S r(   )r   
iter_bytesr   r5   r0   r0   r1   _iter_eventsB   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_datar=   r?   
startswithjsoncloser/   r"   r   Zprocess_dataiteratorsser0   r0   r1   r,   E   s   zStream.__stream__r   c                 C  s   | S r(   r0   r5   r0   r0   r1   	__enter__U   s   zStream.__enter__exc_typetype[BaseException] | NoneexcBaseException | Noneexc_tbTracebackType | Nonec                 C  s   |    d S r(   rC   r/   rH   rJ   rL   r0   r0   r1   __exit__X   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   rC   r5   r0   r0   r1   rC   `   s   zStream.close)
r"   r#   r   r   r$   r   r!   r   r%   r&   r%   r   )r%   r6   )r%   r;   r%   r   rH   rI   rJ   rK   rL   rM   r%   r&   r%   r&   )__name__
__module____qualname____doc____annotations__r   r2   r4   r:   r=   r,   rG   rP   rC   r0   r0   r0   r1   r   %   s   
 





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)   r.   r0   r0   r1   r2   p   r3   zAsyncStream.__init__r   c                   s   | j  I d H S r(   )r-   	__anext__r5   r0   r0   r1   r\      s   zAsyncStream.__anext__AsyncIterator[_T]c                 C s"   | j 2 z	3 d H W }|V  q6 d S r(   r7   r8   r0   r0   r1   	__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/   rF   r0   r0   r1   r=      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 r>   )r   r   r*   r   r+   r@   r=   r?   rA   rB   acloserD   r0   r0   r1   r,      s   "zAsyncStream.__stream__r   c                   s   | S r(   r0   r5   r0   r0   r1   
__aenter__   s   zAsyncStream.__aenter__rH   rI   rJ   rK   rL   rM   c                   s   |   I d H  d S r(   rN   rO   r0   r0   r1   	__aexit__   s   zAsyncStream.__aexit__c                   s   | j  I dH  dS rQ   )r   ra   r5   r0   r0   r1   rC      s   zAsyncStream.close)
r"   r#   r   r   r$   r   r!   r   r%   r&   rR   )r%   r]   )r%   r_   rS   rT   rU   )rV   rW   rX   rY   rZ   r   r2   r\   r^   r=   r,   rb   rc   rC   r0   r0   r0   r1   r[   i   s   
 





r[   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retryrf   
str | Noner?   rg   rh   
int | Noner%   r&   c                C  s,   |d u rd}|| _ || _|pd | _|| _d S )N )_id_data_event_retry)r/   rf   r?   rg   rh   r0   r0   r1   r2      s   

zServerSentEvent.__init__c                 C     | j S r(   )rn   r5   r0   r0   r1   rf         zServerSentEvent.eventc                 C  rp   r(   )rl   r5   r0   r0   r1   rg      rq   zServerSentEvent.idc                 C  rp   r(   )ro   r5   r0   r0   r1   rh      rq   zServerSentEvent.retrystrc                 C  rp   r(   )rm   r5   r0   r0   r1   r?      rq   zServerSentEvent.datar   c                 C  s   t | jS r(   )rB   loadsr?   r5   r0   r0   r1   rB      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=)re   r5   r0   r0   r1   __repr__   s   &zServerSentEvent.__repr__)
rf   ri   r?   ri   rg   ri   rh   rj   r%   r&   )r%   ri   )r%   rj   )r%   rr   )r%   r   )rV   rW   rX   r2   propertyrf   rg   rh   r?   rB   r   ru   r0   r0   r0   r1   rd      s"    
rd   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]rm   ri   rn   rj   ro   _last_event_idr%   r&   c                 C  s   d | _ g | _d | _d | _d S r(   )rn   rm   rx   ro   r5   r0   r0   r1   r2      s   
zSSEDecoder.__init__rE   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r/   rE   chunkZraw_linelinerF   r0   r0   r1   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r/   rE   r?   r   r   r0   r0   r1   r|      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 )rz   Nr{   )_aiter_chunksr}   r~   r   r0   r0   r1   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   r0   r0   r1   r     s   

zSSEDecoder._aiter_chunksr   rr   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
re   : r   rf   r?   rg    rh   )rn   rm   rx   ro   rd   joinrA   	partitionappendint	TypeError
ValueError)r/   r   rF   	fieldname_valuer0   r0   r1   r~     sP   


	zSSEDecoder.decodeNrU   rE   ry   r%   r;   )rE   ry   r%   ry   rE   r   r%   r_   )rE   r   r%   r   )r   rr   r%   r   )
rV   rW   rX   rZ   r2   r<   r|   r`   r   r~   r0   r0   r0   r1   rw      s   
 






rw   c                   @  s    e Zd ZdddZdd	d
ZdS )r   rE   ry   r%   r;   c                 C     dS )rz   Nr0   r/   rE   r0   r0   r1   r<   B     zSSEBytesDecoder.iter_bytesr   r_   c                 C  r   )zdGiven an async iterator that yields raw binary data, iterate over it & yield every event encounteredNr0   r   r0   r0   r1   r`   F  r   zSSEBytesDecoder.aiter_bytesNr   r   )rV   rW   rX   r<   r`   r0   r0   r0   r1   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   r[   )r   originr0   r0   r1   is_stream_class_typeK  s   r   )failure_message
stream_clsr   ri   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   r[   r   ztuple[type, ...])indexZgeneric_basesr   )Z_base_clientr   r[   r   r   )r   r   r   r[   r0   r0   r1   extract_stream_chunk_typeQ  s   r   )r   r   r%   r   )r   r   r   ri   r%   r   )&
__future__r   rB   r   typesr   typingr   r   r   r   r   r	   r
   r   Ztyping_extensionsr   r   r   r   r   r   ZhttpxZ_utilsr   r+   r   r   Z_modelsr   r   r   r[   rd   rw   r   r   r   r0   r0   r0   r1   <module>   s*   ( DE)i

	