o
    +i>B                     @  sH  d dl mZ d dlmZ d dlmZmZmZmZm	Z	 d dl
mZmZmZmZmZ d dlZd dlmZ d dlm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$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+m,Z, G dd dZ-G dd dZ.G dd dZ/G dd dZ0d%ddZ1d Z2eefZ3d&d#d$Z4dS )'    )annotations)TracebackType)TYPE_CHECKINGAnyTypeCallablecast)SelfIterator	AwaitableAsyncIteratorassert_neverN)	BaseModel)ToolUseBlock)ServerToolUseBlock   )	TextEventCitationEventThinkingEventInputJsonEventSignatureEventMessageStopEventMessageStreamEventContentBlockStopEvent   )MessageContentBlockRawMessageStreamEvent)consume_sync_iteratorconsume_async_iterator)buildconstruct_typeconstruct_type_unchecked)StreamAsyncStreamc                   @     e Zd ZU ded< 	 d1ddZed2d
dZed3ddZd4ddZd5ddZ	d6ddZ
d7ddZd8d d!Zd9d#d$Zd:d&d'Zd8d(d)Zed9d*d+Zd5d,d-Zd;d.d/Zd0S )<MessageStreamIterator[str]text_stream
raw_streamStream[RawMessageStreamEvent]returnNonec                 C  $   || _ |  | _|  | _d | _d S N)_raw_stream__stream_text__r(   
__stream__	_iterator&_MessageStream__final_message_snapshotselfr)    r6   ^/var/www/html/psymed-ai/venv/lib/python3.10/site-packages/anthropic/lib/streaming/_messages.py__init__(      


zMessageStream.__init__httpx.Responsec                 C     | j jS r.   r/   responser5   r6   r6   r7   r=   .      zMessageStream.response
str | Nonec                 C     | j jdS Nz
request-idr=   headersgetr>   r6   r6   r7   
request_id2      zMessageStream.request_idr   c                 C  s
   | j  S r.   )r2   __next__r>   r6   r6   r7   rH   6   s   
zMessageStream.__next__Iterator[MessageStreamEvent]c                 c  s    | j D ]}|V  qd S r.   r2   r5   itemr6   r6   r7   __iter__9   s   
zMessageStream.__iter__r	   c                 C  s   | S r.   r6   r>   r6   r6   r7   	__enter__=   s   zMessageStream.__enter__exc_typetype[BaseException] | NoneexcBaseException | Noneexc_tbTracebackType | Nonec                 C  s   |    d S r.   closer5   rO   rQ   rS   r6   r6   r7   __exit__@   s   zMessageStream.__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/   rV   r>   r6   r6   r7   rV   H   s   zMessageStream.closer   c                 C  s   |    | jdusJ | jS zqWaits until the stream has been read to completion and returns
        the accumulated `Message` object.
        N)
until_doner3   r>   r6   r6   r7   get_final_messageP   s   zMessageStream.get_final_messagestrc                 C  s^   |   }g }|jD ]}|jdkr||j q	|s*tdddd |jD  dd|S )Returns all `text` content blocks concatenated together.

        > [!NOTE]
        > Currently the API will only respond with a single content block.

        Will raise an error if no `text` content blocks were returned.
        textc.get_final_text() can only be called when the API returns a `text` content block.
The API returned ,c                 S     g | ]}|j qS r6   type.0br6   r6   r7   
<listcomp>h       z0MessageStream.get_final_text.<locals>.<listcomp>Q content block type(s) that you can access by calling get_final_message().content r]   contentre   appendr`   RuntimeErrorjoinr5   messagetext_blocksblockr6   r6   r7   get_final_textX   s   


zMessageStream.get_final_textc                 C  s   t |  dS )z)Blocks until the stream has been consumedN)r   r>   r6   r6   r7   r\   m   s   zMessageStream.until_donec                 C     | j d usJ | j S r.   )r3   r>   r6   r6   r7   current_message_snapshotr      z&MessageStream.current_message_snapshotc                 c  s@    | j D ]}t|| jd| _t|| jd}|D ]}|V  qqd S N)eventcurrent_snapshot)r{   message_snapshot)r/   accumulate_eventr3   build_eventsrx   r5   	sse_eventevents_to_firer{   r6   r6   r7   r1   w   s   
zMessageStream.__stream__c                 c  s0    | D ]}|j dkr|jj dkr|jjV  qd S Ncontent_block_delta
text_deltare   deltar`   r5   chunkr6   r6   r7   r0      s   
zMessageStream.__stream_text__N)r)   r*   r+   r,   r+   r:   r+   r@   r+   r   )r+   rI   r+   r	   rO   rP   rQ   rR   rS   rT   r+   r,   r+   r,   r+   r   r+   r^   )r+   r'   )__name__
__module____qualname____annotations__r8   propertyr=   rF   rH   rM   rN   rX   rV   r]   rv   r\   rx   r1   r0   r6   r6   r6   r7   r&      (   
 
	








r&   c                   @  .   e Zd ZdZdddZdd	d
ZdddZdS )MessageStreamManagerzWrapper over MessageStream that is returned by `.stream()`.

    ```py
    with client.messages.stream(...) as stream:
        for chunk in stream:
            ...
    ```
    api_request+Callable[[], Stream[RawMessageStreamEvent]]r+   r,   c                 C     d | _ || _d S r.   )_MessageStreamManager__stream"_MessageStreamManager__api_requestr5   r   r6   r6   r7   r8         
zMessageStreamManager.__init__r&   c                 C  s   |   }t|| _| jS r.   )r   r&   r   r4   r6   r6   r7   rN      s   
zMessageStreamManager.__enter__rO   rP   rQ   rR   rS   rT   c                 C  s   | j d ur| j   d S d S r.   )r   rV   rW   r6   r6   r7   rX      s   
zMessageStreamManager.__exit__N)r   r   r+   r,   )r+   r&   r   )r   r   r   __doc__r8   rN   rX   r6   r6   r6   r7   r      s
    
	
r   c                   @  r%   )<AsyncMessageStreamAsyncIterator[str]r(   r)   "AsyncStream[RawMessageStreamEvent]r+   r,   c                 C  r-   r.   )r/   r0   r(   r1   r2   +_AsyncMessageStream__final_message_snapshotr4   r6   r6   r7   r8      r9   zAsyncMessageStream.__init__r:   c                 C  r;   r.   r<   r>   r6   r6   r7   r=      r?   zAsyncMessageStream.responser@   c                 C  rA   rB   rC   r>   r6   r6   r7   rF      rG   zAsyncMessageStream.request_idr   c                   s   | j  I d H S r.   )r2   	__anext__r>   r6   r6   r7   r      s   zAsyncMessageStream.__anext__!AsyncIterator[MessageStreamEvent]c                 C s"   | j 2 z	3 d H W }|V  q6 d S r.   rJ   rK   r6   r6   r7   	__aiter__   s   zAsyncMessageStream.__aiter__r	   c                   s   | S r.   r6   r>   r6   r6   r7   
__aenter__   s   zAsyncMessageStream.__aenter__rO   rP   rQ   rR   rS   rT   c                   s   |   I d H  d S r.   rU   rW   r6   r6   r7   	__aexit__   s   zAsyncMessageStream.__aexit__c                   s   | j  I dH  dS rY   rZ   r>   r6   r6   r7   rV      s   zAsyncMessageStream.closer   c                   s$   |   I dH  | jdusJ | jS r[   )r\   r   r>   r6   r6   r7   r]      s   z$AsyncMessageStream.get_final_messager^   c                   sf   |   I dH }g }|jD ]}|jdkr||j q|s.tdddd |jD  dd|S )	r_   Nr`   ra   rb   c                 S  rc   r6   rd   rf   r6   r6   r7   ri      rj   z5AsyncMessageStream.get_final_text.<locals>.<listcomp>rk   rl   rm   rr   r6   r6   r7   rv      s   


z!AsyncMessageStream.get_final_textc                   s   t | I dH  dS )z(Waits until the stream has been consumedN)r   r>   r6   r6   r7   r\      s   zAsyncMessageStream.until_donec                 C  rw   r.   )r   r>   r6   r6   r7   rx      ry   z+AsyncMessageStream.current_message_snapshotc                 C sJ   | j 2 z3 d H W }t|| jd| _t|| jd}|D ]}|V  qq6 d S rz   )r/   r~   r   r   rx   r   r6   r6   r7   r1     s   zAsyncMessageStream.__stream__c                 C s:   | 2 z3 d H W }|j dkr|jj dkr|jjV  q6 d S r   r   r   r6   r6   r7   r0     s   
z"AsyncMessageStream.__stream_text__N)r)   r   r+   r,   r   r   r   )r+   r   r   r   r   r   r   )r+   r   )r   r   r   r   r8   r   r=   rF   r   r   r   r   rV   r]   rv   r\   rx   r1   r0   r6   r6   r6   r7   r      r   r   c                   @  r   )AsyncMessageStreamManagera"  Wrapper over AsyncMessageStream that is returned by `.stream()`
    so that an async context manager can be used without `await`ing the
    original client call.

    ```py
    async with client.messages.stream(...) as stream:
        async for chunk in stream:
            ...
    ```
    r   -Awaitable[AsyncStream[RawMessageStreamEvent]]r+   r,   c                 C  r   r.   )"_AsyncMessageStreamManager__stream'_AsyncMessageStreamManager__api_requestr   r6   r6   r7   r8     r   z"AsyncMessageStreamManager.__init__r   c                   s   | j I d H }t|| _| jS r.   )r   r   r   r4   r6   r6   r7   r   &  s   
z$AsyncMessageStreamManager.__aenter__rO   rP   rQ   rR   rS   rT   c                   s$   | j d ur| j  I d H  d S d S r.   )r   rV   rW   r6   r6   r7   r   +  s   
z#AsyncMessageStreamManager.__aexit__N)r   r   r+   r,   )r+   r   r   )r   r   r   r   r8   r   r   r6   r6   r6   r7   r     s
    

r   r{   r   r}   r   r+   list[MessageStreamEvent]c                 C  s  g }| j dkr||  |S | j dkr||  |S | j dkr+|ttd|d |S | j dkr7||  |S | j dkr||  |j| j }| jj dkrb|j dkr`|ttd| jj|jd	 |S | jj d
kr}|j dkr{|tt	d| jj
|jd |S | jj dkr|j dkr|ttd| jj|jpg d |S | jj dkr|j dkr|ttd| jj|jd |S | jj dkr|j dkr|ttd|jd 	 |S trt| j |S | j dkr|j| j }|ttd| j|d |S trt|  |S )Nmessage_startmessage_deltamessage_stop)re   rs   content_block_startr   r   r`   )re   r`   snapshotinput_json_deltatool_use
input_json)re   partial_jsonr   citations_deltacitation)re   r   r   thinking_deltathinking)re   r   r   signature_delta	signature)re   r   content_block_stop)re   indexcontent_block)re   ro   r    r   rn   r   r   r   r`   r   r   inputr   r   	citationsr   r   r   r   r   r   r   )r{   r}   r   r   r6   r6   r7   r   5  s   

L

J
H

F


?
5
+
!


r   
__json_bufr|   Message | Nonec                 C  s  t tt| ts*tttttt t| d} t tt| ts*td|  dt|  |d u rJ| jdkrAt	j
di tt| j S td| j d| jdkra|jtttt| j d |S | jdkr	|j| j }| jjd	kr|jd
kr| j| jj7  _|S | jjdkrt |trddlm} ttt|td}|t| jjd7 }|r||dd|_t|t| |S | jjdkr|jd
kr|j s| jj!g|_ |S |j | jj! |S | jjdkr|jdkr| j"| jj"7  _"|S | jjdkr|jdkr| jj#|_#|S t$rt%| j |S | jdkrS| jj&|_&| jj'|_'| j(j)|j(_)| j(j*d ur,| j(j*|j(_*| j(j+d ur9| j(j+|j(_+| j(j,d urF| j(j,|j(_,| j(j-d urS| j(j-|j(_-|S )N)type_valuez;Unexpected event runtime type, after deserialising twice - z - r   zUnexpected event order, got z before "message_start"r   r   r   r`   r   r   )	from_json    zutf-8T)partial_moder   r   r   r   r   r6   ).
isinstancer   r   r   r   r"   r   	TypeErrorre   r   	constructrs   to_dictrp   rn   ro   r   r!   r   
model_dumpr   r   r`   TRACKS_TOOL_INPUTjiterr   bytesgetattrJSON_BUF_PROPERTYr   r   setattrr   r   r   r   r   r   stop_reasonstop_sequenceusageoutput_tokensinput_tokenscache_creation_input_tokenscache_read_input_tokensserver_tool_use)r{   r|   rn   r   json_bufr6   r6   r7   r~     s   

8
.
 






r~   )r{   r   r}   r   r+   r   )r{   r   r|   r   r+   r   )5
__future__r   typesr   typingr   r   r   r   r   typing_extensionsr	   r
   r   r   r   httpxpydanticr   anthropic.types.tool_use_blockr   %anthropic.types.server_tool_use_blockr   _typesr   r   r   r   r   r   r   r   r   r   r   _utilsr   r   _modelsr    r!   r"   
_streamingr#   r$   r&   r   r   r   r   r   r   r~   r6   r6   r6   r7   <module>   s.    (
k k
"W