o
    +iO                     @  s  d dl m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 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 d
dl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'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d
dl.m/Z/m0Z0 d
dl1m2Z2 d
dl3m4Z4 ddl5m6Z6m7Z7 d
dl8m9Z9m:Z: G dd de	e6 Z;G dd de	e6 Z<G dd de	e6 Z=G dd de	e6 Z>d0d$d%Z?d&Z@eeefZAed'd1d.d/ZBdS )2    )annotationsN)TracebackType)TYPE_CHECKINGAnyTypeGenericCallablecast)SelfIterator	AwaitableAsyncIteratorassert_never)	BaseModel)BetaToolUseBlock)BetaMCPToolUseBlock)BetaServerToolUseBlock   )	NOT_GIVENNotGiven)consume_sync_iteratorconsume_async_iterator)buildconstruct_typeconstruct_type_unchecked   )BetaCitationEventBetaThinkingEventBetaInputJsonEventBetaSignatureEventParsedBetaTextEventParsedBetaMessageStopEventParsedBetaMessageStreamEventParsedBetaContentBlockStopEvent)StreamAsyncStream)BetaRawMessageStreamEvent)is_given   )ResponseFormatT
parse_text)ParsedBetaMessageParsedBetaContentBlockc                   @     e Zd ZU ded< 	 d3d	d
Zed4ddZed5ddZd6ddZd7ddZ	d8ddZ
d9d d!Zd:d"d#Zd;d%d&Zd<d(d)Zd:d*d+Zed;d,d-Zd7d.d/Zd=d0d1Zd2S )>BetaMessageStreamIterator[str]text_stream
raw_stream!Stream[BetaRawMessageStreamEvent]output_formatResponseFormatT | NotGivenreturnNonec                 C  *   || _ |  | _|  | _d | _|| _d S N)_raw_stream__stream_text__r0   
__stream__	_iterator*_BetaMessageStream__final_message_snapshot!_BetaMessageStream__output_formatselfr1   r3    rA   c/var/www/html/psymed-ai/venv/lib/python3.10/site-packages/anthropic/lib/streaming/_beta_messages.py__init__.   
   


zBetaMessageStream.__init__httpx.Responsec                 C     | j jS r8   r9   responser@   rA   rA   rB   rH   9      zBetaMessageStream.response
str | Nonec                 C     | j jdS Nz
request-idrH   headersgetrI   rA   rA   rB   
request_id=      zBetaMessageStream.request_id-ParsedBetaMessageStreamEvent[ResponseFormatT]c                 C  s
   | j  S r8   )r<   __next__rI   rA   rA   rB   rT   A   s   
zBetaMessageStream.__next__7Iterator[ParsedBetaMessageStreamEvent[ResponseFormatT]]c                 c  s    | j D ]}|V  qd S r8   r<   r@   itemrA   rA   rB   __iter__D   s   
zBetaMessageStream.__iter__r
   c                 C  s   | S r8   rA   rI   rA   rA   rB   	__enter__H   s   zBetaMessageStream.__enter__exc_typetype[BaseException] | NoneexcBaseException | Noneexc_tbTracebackType | Nonec                 C  s   |    d S r8   closer@   r[   r]   r_   rA   rA   rB   __exit__K   s   zBetaMessageStream.__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r9   rb   rI   rA   rA   rB   rb   S   s   zBetaMessageStream.close"ParsedBetaMessage[ResponseFormatT]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_doner=   rI   rA   rA   rB   get_final_message[   s   z#BetaMessageStream.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 rA   type.0brA   rA   rB   
<listcomp>s       z4BetaMessageStream.get_final_text.<locals>.<listcomp>Q content block type(s) that you can access by calling get_final_message().content rj   contentrr   appendrm   RuntimeErrorjoinr@   messagetext_blocksblockrA   rA   rB   get_final_textc   s   


z BetaMessageStream.get_final_textc                 C  s   t |  dS )z)Blocks until the stream has been consumedN)r   rI   rA   rA   rB   ri   x   s   zBetaMessageStream.until_donec                 C     | j d usJ | j S r8   )r=   rI   rA   rA   rB   current_message_snapshot}      z*BetaMessageStream.current_message_snapshotc                 c  sL    | j D ]}t|| j| jjj| jd| _t|| jd}|D ]}|V  qqd S N)eventcurrent_snapshotrequest_headersr3   )r   message_snapshot)	r9   accumulate_eventr=   rH   requestrO   r>   build_eventsr   r@   	sse_eventevents_to_firer   rA   rA   rB   r;      s   
zBetaMessageStream.__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rr   deltarm   r@   chunkrA   rA   rB   r:      s   
z!BetaMessageStream.__stream_text__N)r1   r2   r3   r4   r5   r6   r5   rE   r5   rK   r5   rS   )r5   rU   r5   r
   r[   r\   r]   r^   r_   r`   r5   r6   r5   r6   r5   rg   r5   rk   )r5   r/   )__name__
__module____qualname____annotations__rC   propertyrH   rQ   rT   rY   rZ   rd   rb   rj   r   ri   r   r;   r:   rA   rA   rA   rB   r.   #   (   
 
	








r.   c                   @  s.   e Zd ZdZddd	ZdddZdddZdS )BetaMessageStreamManagerzWrapper over MessageStream that is returned by `.stream()`.

    ```py
    with client.beta.messages.stream(...) as stream:
        for chunk in stream:
            ...
    ```
    api_request/Callable[[], Stream[BetaRawMessageStreamEvent]]r3   r4   r5   r6   c                C     d | _ || _|| _d S r8   )!_BetaMessageStreamManager__stream&_BetaMessageStreamManager__api_request(_BetaMessageStreamManager__output_formatr@   r   r3   rA   rA   rB   rC         
z!BetaMessageStreamManager.__init__"BetaMessageStream[ResponseFormatT]c                 C  s   |   }t|| jd| _| jS Nr3   )r   r.   r   r   r@   r1   rA   rA   rB   rZ      s   z"BetaMessageStreamManager.__enter__r[   r\   r]   r^   r_   r`   c                 C  s   | j d ur| j   d S d S r8   )r   rb   rc   rA   rA   rB   rd      s   
z!BetaMessageStreamManager.__exit__N)r   r   r3   r4   r5   r6   )r5   r   r   )r   r   r   __doc__rC   rZ   rd   rA   rA   rA   rB   r      s
    
	

r   c                   @  r-   )>BetaAsyncMessageStreamAsyncIterator[str]r0   r1   &AsyncStream[BetaRawMessageStreamEvent]r3   r4   r5   r6   c                 C  r7   r8   )r9   r:   r0   r;   r<   /_BetaAsyncMessageStream__final_message_snapshot&_BetaAsyncMessageStream__output_formatr?   rA   rA   rB   rC      rD   zBetaAsyncMessageStream.__init__rE   c                 C  rF   r8   rG   rI   rA   rA   rB   rH      rJ   zBetaAsyncMessageStream.responserK   c                 C  rL   rM   rN   rI   rA   rA   rB   rQ      rR   z!BetaAsyncMessageStream.request_idrS   c                   s   | j  I d H S r8   )r<   	__anext__rI   rA   rA   rB   r      s   z BetaAsyncMessageStream.__anext__<AsyncIterator[ParsedBetaMessageStreamEvent[ResponseFormatT]]c                 C s"   | j 2 z	3 d H W }|V  q6 d S r8   rV   rW   rA   rA   rB   	__aiter__   s   z BetaAsyncMessageStream.__aiter__r
   c                   s   | S r8   rA   rI   rA   rA   rB   
__aenter__   s   z!BetaAsyncMessageStream.__aenter__r[   r\   r]   r^   r_   r`   c                   s   |   I d H  d S r8   ra   rc   rA   rA   rB   	__aexit__   s   z BetaAsyncMessageStream.__aexit__c                   s   | j  I dH  dS re   rf   rI   rA   rA   rB   rb      s   zBetaAsyncMessageStream.closerg   c                   s$   |   I dH  | jdusJ | jS rh   )ri   r   rI   rA   rA   rB   rj      s   z(BetaAsyncMessageStream.get_final_messagerk   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 )	rl   Nrm   rn   ro   c                 S  rp   rA   rq   rs   rA   rA   rB   rv     rw   z9BetaAsyncMessageStream.get_final_text.<locals>.<listcomp>rx   ry   rz   r   rA   rA   rB   r      s   


z%BetaAsyncMessageStream.get_final_textc                   s   t | I dH  dS )z(Waits until the stream has been consumedN)r   rI   rA   rA   rB   ri     s   z!BetaAsyncMessageStream.until_donec                 C  r   r8   )r   rI   rA   rA   rB   r     r   z/BetaAsyncMessageStream.current_message_snapshotc                 C sV   | j 2 z#3 d H W }t|| j| jjj| jd| _t|| jd}|D ]}|V  q!q6 d S r   )	r9   r   r   rH   r   rO   r   r   r   r   rA   rA   rB   r;     s   z!BetaAsyncMessageStream.__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   rA   rA   rB   r:   $  s   
z&BetaAsyncMessageStream.__stream_text__N)r1   r   r3   r4   r5   r6   r   r   r   )r5   r   r   r   r   r   r   )r5   r   )r   r   r   r   rC   r   rH   rQ   r   r   r   r   rb   rj   r   ri   r   r;   r:   rA   rA   rA   rB   r      r   r   c                   @  s4   e Zd ZdZeddd	d
ZdddZdddZdS )BetaAsyncMessageStreamManagera+  Wrapper over BetaAsyncMessageStream 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.beta.messages.stream(...) as stream:
        async for chunk in stream:
            ...
    ```
    r   r   1Awaitable[AsyncStream[BetaRawMessageStreamEvent]]r3   r4   r5   r6   c                C  r   r8   )&_BetaAsyncMessageStreamManager__stream+_BetaAsyncMessageStreamManager__api_request-_BetaAsyncMessageStreamManager__output_formatr   rA   rA   rB   rC   6  r   z&BetaAsyncMessageStreamManager.__init__'BetaAsyncMessageStream[ResponseFormatT]c                   s$   | j I d H }t|| jd| _| jS r   )r   r   r   r   r   rA   rA   rB   r   @  s   z(BetaAsyncMessageStreamManager.__aenter__r[   r\   r]   r^   r_   r`   c                   s$   | j d ur| j  I d H  d S d S r8   )r   rb   rc   rA   rA   rB   r   E  s   
z'BetaAsyncMessageStreamManager.__aexit__N)r   r   r3   r4   r5   r6   )r5   r   r   )r   r   r   r   r   rC   r   r   rA   rA   rA   rB   r   *  s    

r   r   r&   r   rg   r5   3list[ParsedBetaMessageStreamEvent[ResponseFormatT]]c                 C  s  g }| j dkr||  |S | j dkr||  |S | j dkr-|ttt d|d |S | j dkr9||  |S | j dkr||  |j| j }| jj dkrd|j dkrb|ttd| jj	|j	d	 |S | jj d
kr|j dkst|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)rr   r   content_block_startr   r   rm   )rr   rm   snapshotinput_json_deltatool_usemcp_tool_use
input_json)rr   partial_jsonr   citations_deltacitation)rr   r   r   thinking_deltathinking)rr   r   r   signature_delta	signature)rr   r   content_block_stop)rr   indexcontent_block)rr   r|   r   r!   r)   r{   r   r   r    rm   r   r   inputr   r   	citationsr   r   r   r   r   r   r#   )r   r   r   r   event_to_firerA   rA   rB   r   O  s   

S

Q
O

K


D:
0
&



r   
__json_bufr   r   )ParsedBetaMessage[ResponseFormatT] | Noner   httpx.Headersr3   r4   c           
   
   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 rP| j	dkrGtt
t t
jdi tt| j S td| j	 d| j	dkrg|jtttt| j d |S | j	dkrI|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 }|rz|r|ddnd}d|v r||dd|_ n||dd|_ W n t!y } zt!d| d|"d |d }~ww 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(rGt)| j |S | j	dkri|j| j }	|	j	d
krgt*|rgt+|	j||	_,|S | j	dkr| jj-|_-| jj.|_.| jj/|_/| j0j1|j0_1| j2|_2| j0j3d ur| j0j3|j0_3| j0j4d ur| j0j4|j0_4| j0j5d ur| j0j5|j0_5| j0j6d ur| j0j6|j0_6|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   rm   r   r   )	from_json    zutf-8zanthropic-betary   z&fine-grained-tool-streaming-2025-05-14ztrailing-strings)partial_modeTzhUnable to parse tool parameter JSON from model. Please retry your request or adjust your prompt. Error: z. JSON: r   r   r   r   r   r   rA   )7
isinstancer	   r   r   r&   r   r   	TypeErrorbuiltinsrr   r+   r)   	constructr   to_dictr}   r{   r|   r   r,   r   r   r   rm   TRACKS_TOOL_INPUTjiterr   bytesgetattrJSON_BUF_PROPERTYr   rP   r   
ValueErrordecodesetattrr   r   r   r   r   r   r'   r*   parsed_output	containerstop_reasonstop_sequenceusageoutput_tokenscontext_managementinput_tokenscache_creation_input_tokenscache_read_input_tokensserver_tool_use)
r   r   r   r3   r{   r   json_bufanthropic_betaer   rA   rA   rB   r     s   
 
H
>
&" 




r   )r   r&   r   rg   r5   r   )
r   r&   r   r   r   r   r3   r4   r5   rg   )C
__future__r   r   typesr   typingr   r   r   r   r   r	   typing_extensionsr
   r   r   r   r   httpxpydanticr   (anthropic.types.beta.beta_tool_use_blockr   ,anthropic.types.beta.beta_mcp_tool_use_blockr   /anthropic.types.beta.beta_server_tool_use_blockr   _typesr   r   _utilsr   r   _modelsr   r   r   _beta_typesr   r   r   r   r    r!   r"   r#   
_streamingr$   r%   
types.betar&   _utils._utilsr'   _parse._responser)   r*   types.beta.parsed_beta_messager+   r,   r.   r   r   r   r   r   r   r   rA   rA   rA   rB   <module>   s>     (
r#r
%^