o
    +i]V                     @  sV  d dl mZ d dlZd dlmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZ d dlmZmZ d dlmZmZ d dlZddlmZmZmZ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'm(Z(m)Z)m*Z* ddl+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 erddl:m;Z;m<Z< ede
e%e e'e e)e*f dZ=edZ>e?e@ZAG dd deddZBG dd dee=e3f ZCG dd deCe&e3f ee>e3f eZDG dd  d eDe4e3 e3f ZEG d!d" d"eDe0e3 e3f ZFG d#d$ d$eCe(e3f ee>e3f eZGG d%d& d&eGe4e3 e3f ZHG d'd( d(eGe1e3 e3f ZIdS ))    )annotationsN)ABCabstractmethod)TYPE_CHECKINGAnyListUnionGenericTypeVarCallableIterableIterator	CoroutineAsyncIterator)contextmanagerasynccontextmanager)	TypedDictoverride   )BodyQueryHeadersNotGiven)consume_sync_iteratorconsume_async_iterator)BetaMessageBetaMessageParam   )BetaFunctionToolBetaRunnableToolBetaAsyncFunctionToolBetaAsyncRunnableToolBetaBuiltinFunctionToolBetaAsyncBuiltinFunctionTool)DEFAULT_THRESHOLDDEFAULT_SUMMARY_PROMPTCompactionControl   )BetaMessageStreamBetaAsyncMessageStream)ResponseFormatTParsedBetaMessageParsedBetaContentBlock)ParseMessageCreateParamsBase)BetaToolResultBlockParam)	AnthropicAsyncAnthropicAnyFunctionToolT)boundRunnerItemTc                   @  s.   e Zd ZU ded< ded< ded< ded< d	S )
RequestOptionszHeaders | Noneextra_headerszQuery | Noneextra_queryzBody | None
extra_bodyz'float | httpx.Timeout | None | NotGiventimeoutN)__name__
__module____qualname____annotations__ r=   r=   ]/var/www/html/psymed-ai/venv/lib/python3.10/site-packages/anthropic/lib/tools/_beta_runner.pyr4   7   s
   
 r4   F)totalc                   @  s<   e Zd ZddddddZdddZdddZdddZdS )BaseToolRunnerNmax_iterationscompaction_controlparams-ParseMessageCreateParamsBase[ResponseFormatT]optionsr4   toolsIterable[AnyFunctionToolT]rB   
int | NonerC   CompactionControl | NonereturnNonec                C  sX   dd |D | _ i |ddd |d D i| _|| _d| _d | _|| _d| _|| _d S )Nc                 S  s   i | ]}|j |qS r=   )name).0toolr=   r=   r>   
<dictcomp>H   s    z+BaseToolRunner.__init__.<locals>.<dictcomp>messagesc                 S  s   g | ]}|qS r=   r=   rN   messager=   r=   r>   
<listcomp>K   s    z+BaseToolRunner.__init__.<locals>.<listcomp>Fr   )_tools_by_name_params_options_messages_modified_cached_tool_call_response_max_iterations_iteration_count_compaction_control)selfrD   rF   rG   rB   rC   r=   r=   r>   __init__?   s   	
zBaseToolRunner.__init__ParseMessageCreateParamsBase[ResponseFormatT] | Callable[[ParseMessageCreateParamsBase[ResponseFormatT]], ParseMessageCreateParamsBase[ResponseFormatT]]c                 C  s   t |r	|| j}|| _dS )a  
        Update the parameters for the next API call. This invalidates any cached tool responses.

        Args:
            params (ParsedMessageCreateParamsBase[ResponseFormatT] | Callable): Either new parameters or a function to mutate existing parameters
        N)callablerV   )r]   rD   r=   r=   r>   set_messages_paramsT   s   

z"BaseToolRunner.set_messages_paramsrQ   5BetaMessageParam | ParsedBetaMessage[ResponseFormatT]c                   s2   dd |D  d_  fdd d_dS )zAdd one or more messages to the conversation history.

        This invalidates the cached tool response, i.e. if tools were already called, then they will
        be called again on the next loop iteration.
        c                 S  s(   g | ]}t |tr|j|jd n|qS )rolecontent)
isinstancer   rd   re   rR   r=   r=   r>   rT   i   s    z2BaseToolRunner.append_messages.<locals>.<listcomp>Tc                   s   i | dg j d  iS )NrQ   )rV   rD   message_paramsr]   r=   r>   <lambda>n   s    z0BaseToolRunner.append_messages.<locals>.<lambda>N)rX   ra   rY   )r]   rQ   r=   rh   r>   append_messagesc   s   
zBaseToolRunner.append_messagesboolc                 C  s   | j d ur| j| j krdS dS )NTF)rZ   r[   r]   r=   r=   r>   _should_stopq   s   zBaseToolRunner._should_stop)rD   rE   rF   r4   rG   rH   rB   rI   rC   rJ   rK   rL   )rD   r_   rK   rL   )rQ   rb   rK   rL   rK   rl   )r9   r:   r;   r^   ra   rk   rn   r=   r=   r=   r>   r@   >   s    

r@   c                      s   e Zd Zdddd. fddZd/ddZd0ddZeed0ddZd1ddZ	d0ddZ
d2d!d"Zd3d$d%Zd3d&d'Zd4d)d*Zd5d,d-Z  ZS )6BaseSyncToolRunnerNrA   rD   rE   rF   r4   rG   Iterable[BetaRunnableTool]clientr/   rB   rI   rC   rJ   rK   rL   c                  0   t  j|||||d || _|  | _d | _d S N)rD   rF   rG   rB   rC   superr^   _client__run__	_iterator_last_messager]   rD   rF   rG   rr   rB   rC   	__class__r=   r>   r^   x   s   

zBaseSyncToolRunner.__init__r3   c                 C  s
   | j  S N)ry   __next__rm   r=   r=   r>   r      s   
zBaseSyncToolRunner.__next__Iterator[RunnerItemT]c                 c  s    | j D ]}|V  qd S r~   ry   r]   itemr=   r=   r>   __iter__   s   
zBaseSyncToolRunner.__iter__c                 c  s    t  r~   NotImplementedErrorrm   r=   r=   r>   _handle_request      z"BaseSyncToolRunner._handle_requestrl   c           	        sv  | j du s
| j d sdS |  }d}|dur,|jj|jjpd |jjp$d }||jj }| j dt}||k r9dS t	
d| d| d | j d	| jd	 }t| jd
 }|d d dkrvdd |d d D }|rr||d d< n|  g |td| j dtd}| jjjj||| jd ddid}t	
d|jj  t|jd   jdkrtd|  fdd dS )
        Check token usage and compact messages if threshold exceeded.
        Returns True if compaction was performed, False otherwise.
        NenabledFr   context_token_thresholdToken usage  has exceeded the threshold of . Performing compaction.modelrQ   rd   	assistantc                 S  (   g | ]}t |tr|d dkr|qS typetool_userf   dictgetrN   blockr=   r=   r>   rT          z9BaseSyncToolRunner._check_and_compact.<locals>.<listcomp>re   usersummary_promptrc   
max_tokensX-Stainless-Helper
compactionr   rQ   r   r5   &Compaction complete. New token usage: text1Compaction response content is not of type 'text'c                   "   i | ddd j dgdgiS NrQ   r   r   )r   r   rc   r   rg   first_contentr=   r>   rj          z7BaseSyncToolRunner._check_and_compact.<locals>.<lambda>Tr\   _get_last_messageusageinput_tokenscache_creation_input_tokenscache_read_input_tokensoutput_tokensr   r$   loginforV   listpopr   r%   rw   betarQ   createre   r   
ValueErrorra   	r]   rS   tokens_usedtotal_input_tokens	thresholdr   rQ   non_tool_blocksresponser=   r   r>   _check_and_compact   s^   





z%BaseSyncToolRunner._check_and_compactc                 c  s    |   sU|  }|V  |  }|d usJ W d    n1 s!w   Y  |  jd7  _|  sI|  }|d u r@td d S | jsI| 	|| d| _d | _
|   rd S d S Nr   z;Tool call was not requested, exiting from tool runner loop.Frn   r   r   r[   r   generate_tool_call_responser   debugrX   rk   rY   r]   r   rS   r   r=   r=   r>   rx      s$   

zBaseSyncToolRunner.__run__"ParsedBetaMessage[ResponseFormatT]c                 C  s    t |  |  }|dusJ |S z
        Consumes the tool runner stream and returns the last message if it has not been consumed yet.
        If it has, it simply returns the last message.
        N)r   r   r]   last_messager=   r=   r>   
until_done  s   zBaseSyncToolRunner.until_doneBetaMessageParam | Nonec                 C  s,   | j durtd | j S |  }|| _ |S a  Generate a MessageParam by calling tool functions with any tool use blocks from the last message.

        Note the tool call response is cached, repeated calls to this method will return the same response.

        None can be returned if no tool call was applicable.
        Nz$Returning cached tool call response.rY   r   r   _generate_tool_call_responser]   r   r=   r=   r>   r     s   

z.BaseSyncToolRunner.generate_tool_call_responsec                 C  s   |   }|sd S dd |D }|sd S g }|D ]Z}| j|j}|d u r5|d|jd|j ddd qz||j}|d|j|d W q tyq } zt	j
d	|j |d
 |d|jt|dd W Y d }~qd }~ww d|dS )Nc                 S     g | ]	}|j d kr|qS r   r   r   r=   r=   r>   rT   $      zCBaseSyncToolRunner._generate_tool_call_response.<locals>.<listcomp>tool_resultError: Tool '' not foundTr   tool_use_idre   is_errorr   r   re   #Error occurred while calling tool: exc_infor   rc   #_get_last_assistant_message_contentrU   r   rM   appendidcallinput	Exceptionr   	exceptionreprr]   re   tool_use_blocksresultsr   rO   resultexcr=   r=   r>   r     sB   
z/BaseSyncToolRunner._generate_tool_call_response)ParsedBetaMessage[ResponseFormatT] | Nonec                 C  s   t | jr	|  S | jS r~   r`   rz   rm   r=   r=   r>   r   G  s   
z$BaseSyncToolRunner._get_last_message4list[ParsedBetaContentBlock[ResponseFormatT]] | Nonec                 C  s*   |   }|d u s|jdks|jsd S |jS Nr   r   rd   re   r   r=   r=   r>   r   L  s   z6BaseSyncToolRunner._get_last_assistant_message_content)rD   rE   rF   r4   rG   rq   rr   r/   rB   rI   rC   rJ   rK   rL   rK   r3   )rK   r   ro   rK   r   rK   r   rK   r   rK   r   )r9   r:   r;   r^   r   r   r   r   r   r   rx   r   r   r   r   r   __classcell__r=   r=   r|   r>   rp   w   s     



T




(rp   c                   @     e Zd ZeedddZdS )BetaToolRunnerrK   ,Iterator[ParsedBetaMessage[ResponseFormatT]]c                 c  s0    | j jjjdi | j| j}|| _|V  d S Nr=   rw   r   rQ   parserV   rW   rz   r]   rS   r=   r=   r>   r   U  s   
zBetaToolRunner._handle_requestN)rK   r   r9   r:   r;   r   r   r   r=   r=   r=   r>   r   T      r   c                   @  r   )BetaStreamingToolRunnerrK   ,Iterator[BetaMessageStream[ResponseFormatT]]c                 c  sT    | j jjjdi | j| j}|j| _|V  W d    d S 1 s#w   Y  d S r   rw   r   rQ   streamrV   rW   get_final_messagerz   r]   r  r=   r=   r>   r   ^  s
    "z'BetaStreamingToolRunner._handle_requestN)rK   r   r   r=   r=   r=   r>   r   ]  r   r   c                      s   e Zd Zdddd. fddZd/ddZd0ddZeed0ddZd1ddZ	d0ddZ
d2d!d"Zd3d$d%Zd4d'd(Zd5d*d+Zd3d,d-Z  ZS )6BaseAsyncToolRunnerNrA   rD   rE   rF   r4   rG   Iterable[BetaAsyncRunnableTool]rr   r0   rB   rI   rC   rJ   rK   rL   c                  rs   rt   ru   r{   r|   r=   r>   r^   i  s   

zBaseAsyncToolRunner.__init__r3   c                   s   | j  I d H S r~   )ry   	__anext__rm   r=   r=   r>   r    s   zBaseAsyncToolRunner.__anext__AsyncIterator[RunnerItemT]c                 C s"   | j 2 z	3 d H W }|V  q6 d S r~   r   r   r=   r=   r>   	__aiter__  s   zBaseAsyncToolRunner.__aiter__c                 C s   t  r~   r   rm   r=   r=   r>   r     r   z#BaseAsyncToolRunner._handle_requestrl   c           	        s  | j du s| j d sdS |  I dH }d}|dur0|jj|jjp"d |jjp(d }||jj }| j dt}||k r=dS t	
d| d| d | j d	| jd	 }t| jd
 }|d d dkrzdd |d d D }|rv||d d< n|  g | jd
 td| j dtd}| jjjj||| jd ddidI dH }t	
d|jj  t|jd   jdkrtd|  fdd dS )r   Nr   Fr   r   r   r   r   r   rQ   r   rd   r   c                 S  r   r   r   r   r=   r=   r>   rT     r   z:BaseAsyncToolRunner._check_and_compact.<locals>.<listcomp>re   r   r   rc   r   r   r   r   r   r   r   c                   r   r   r   rg   r   r=   r>   rj     r   z8BaseAsyncToolRunner._check_and_compact.<locals>.<lambda>Tr   r   r=   r   r>   r     s`   





z&BaseAsyncToolRunner._check_and_compactc              	   C s   |   sh|  4 I d H }|V  |  I d H }|d usJ W d   I d H  n1 I d H s.w   Y  |  jd7  _|  I d H s\|  I d H }|d u rStd d S | js\| 	|| d| _d | _
|   rd S d S r   r   r   r=   r=   r>   rx     s$   (
zBaseAsyncToolRunner.__run__r   c                   s.   t | I dH  |  I dH }|dusJ |S r   )r   r   r   r=   r=   r>   r     s
   zBaseAsyncToolRunner.until_doner   c                   s4   | j durtd | j S |  I dH }|| _ |S r   r   r   r=   r=   r>   r     s   

z/BaseAsyncToolRunner.generate_tool_call_responser   c                   s    t | jr|  I d H S | jS r~   r   rm   r=   r=   r>   r     s   
z%BaseAsyncToolRunner._get_last_messager   c                   s2   |   I d H }|d u s|jdks|jsd S |jS r   r   r   r=   r=   r>   r     s
   z7BaseAsyncToolRunner._get_last_assistant_message_contentc                   s   |   I d H }|sd S dd |D }|sd S g }|D ]]}| j|j}|d u r9|d|jd|j ddd qz||jI d H }|d|j|d W q tyx } zt	j
d	|j |d
 |d|jt|dd W Y d }~qd }~ww d|dS )Nc                 S  r   r   r   r   r=   r=   r>   rT   $  r   zDBaseAsyncToolRunner._generate_tool_call_response.<locals>.<listcomp>r   r   r   Tr   r   r   r   r   rc   r   r   r=   r=   r>   r     sD   
z0BaseAsyncToolRunner._generate_tool_call_response)rD   rE   rF   r4   rG   r  rr   r0   rB   rI   rC   rJ   rK   rL   r   )rK   r  ro   r   r   r   r   )r9   r:   r;   r^   r  r	  r   r   r   r   rx   r   r   r   r   r   r   r=   r=   r|   r>   r  f  s     




T




r  c                   @  r   )BetaAsyncToolRunnerrK   1AsyncIterator[ParsedBetaMessage[ResponseFormatT]]c                 C s6   | j jjjdi | j| jI d H }|| _|V  d S r   r   r   r=   r=   r>   r   I  s   $
z#BetaAsyncToolRunner._handle_requestN)rK   r  r9   r:   r;   r   r   r   r=   r=   r=   r>   r
  H  r   r
  c                   @  r   )BetaAsyncStreamingToolRunnerrK   6AsyncIterator[BetaAsyncMessageStream[ResponseFormatT]]c              	   C sh   | j jjjdi | j| j4 I d H }|j| _|V  W d   I d H  d S 1 I d H s-w   Y  d S r   r  r  r=   r=   r>   r   R  s
   (.z,BetaAsyncStreamingToolRunner._handle_requestN)rK   r  r  r=   r=   r=   r>   r  Q  r   r  )J
__future__r   loggingabcr   r   typingr   r   r   r   r	   r
   r   r   r   r   r   
contextlibr   r   typing_extensionsr   r   httpx_typesr   r   r   r   _utilsr   r   
types.betar   r   _beta_functionsr   r   r    r!   r"   r#   _beta_compaction_controlr$   r%   r&   streaming._beta_messagesr(   r)   types.beta.parsed_beta_messager*   r+   r,    types.beta.message_create_paramsr-   'types.beta.beta_tool_result_block_paramr.   rw   r/   r0   r1   r3   	getLoggerr9   r   r4   r@   rp   r   r   r  r
  r  r=   r=   r=   r>   <module>   sL    4 
$9 ^	
	 c 	