o
    iF+                     @  s"  U d dl 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 d dlmZm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 ddlmZmZ ddlmZm Z m!Z! ddlm"Z" ddl#m$Z$ ddl%m&Z&m'Z' ddl(m)Z) edddZ*de+d< e
G dd dee Z,dS )    )annotationsN)Iterator)contextmanager)
ContextVar)	dataclassfieldreplace)AnyGeneric)Tracer)ValidationError)assert_never   )messages)InstrumentationNames)
AgentDepsT
RunContext)
ModelRetryToolRetryErrorUnexpectedModelBehavior)ToolCallPart)ToolDefinition)AbstractToolsetToolsetTool)RunUsagesequential_tool_callsF)defaultzContextVar[bool]_sequential_tool_calls_ctx_varc                   @  s   e Zd ZU dZded< 	 dZded< 	 dZded< 	 eed	Z	d
ed< 	 e
ed7ddZd8ddZed9ddZd:ddZd;dd Z	!	"d<d!d#d=d*d+Zd=d,d-Zd>d5d6ZdS )?ToolManagerzManages tools for an agent run step. It caches the agent run's toolset's tool definitions and handles calling tools and retries.zAbstractToolset[AgentDepsT]toolsetNzRunContext[AgentDepsT] | Nonectxz)dict[str, ToolsetTool[AgentDepsT]] | Nonetools)default_factoryzset[str]failed_toolsreturnIterator[None]c              	   c  s0    t d}zdV  W t | dS t | w )z/Run tool calls sequentially during the context.TN)r   setreset)clstoken r*   _/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/pydantic_ai/_tool_manager.pyr   '   s
   
z!ToolManager.sequential_tool_callsRunContext[AgentDepsT]ToolManager[AgentDepsT]c                   s^    j dur|j j jkr S  fdd jD }t||d} j j| j|I dH dS )zdBuild a new tool manager for the next run step, carrying over the retries from the current run step.Nc                   s"   i | ]}| j j|d d qS )r   r   )r    retriesget).0failed_tool_nameselfr*   r+   
<dictcomp>7   s    z,ToolManager.for_run_step.<locals>.<dictcomp>)r.   )r   r    r!   )r    run_stepr#   r   	__class__r   	get_tools)r3   r    r.   r*   r2   r+   for_run_step1   s   

zToolManager.for_run_steplist[ToolDefinition]c                 C  s&   | j du r	tddd | j  D S )z8The tool definitions for the tools in this tool manager.N4ToolManager has not been prepared for a run step yetc                 S  s   g | ]}|j qS r*   )tool_def)r0   toolr*   r*   r+   
<listcomp>I   s    z)ToolManager.tool_defs.<locals>.<listcomp>)r!   
ValueErrorvaluesr2   r*   r*   r+   	tool_defsC   s   
zToolManager.tool_defscallslist[ToolCallPart]boolc                   s    t  pt fdd|D S )zBWhether to require sequential tool calls for a list of tool calls.c                 3  s&    | ]}  |j rjV  qd S N)get_tool_def	tool_name
sequential)r0   callr3   r;   r*   r+   	<genexpr>M   s    
z7ToolManager.should_call_sequentially.<locals>.<genexpr>)r   r/   any)r3   rA   r*   rI   r+   should_call_sequentiallyK   s   z$ToolManager.should_call_sequentiallynamestrToolDefinition | Nonec                 C  s6   | j du r	tdz| j | jW S  ty   Y dS w )zPGet the tool definition for a given tool name, or `None` if the tool is unknown.Nr:   )r!   r>   r;   KeyError)r3   rM   r*   r*   r+   rE   Q   s   
zToolManager.get_tool_defFT)approvedrH   r   allow_partialwrap_validation_errorsrQ   r	   c             
     s   | j du s| jdu rtd| j |j }r*|jjdkr*| j||||dI dH S | j||||| jj	| jj
| jj| jjdI dH S )a  Handle a tool call by validating the arguments, calling the tool, and handling retries.

        Args:
            call: The tool call part to handle.
            allow_partial: Whether to allow partial validation of the tool arguments.
            wrap_validation_errors: Whether to wrap validation errors in a retry prompt part.
            approved: Whether the tool call has been approved.
        Nr:   outputrR   rS   rQ   )rR   rS   rQ   tracerinclude_contentinstrumentation_versionusage)r!   r    r>   r/   rF   r;   kind
_call_tool_call_function_toolrV   trace_include_contentrX   rY   )r3   rH   rR   rS   rQ   r<   r*   r*   r+   handle_call[   s(   zToolManager.handle_callc             
     s  | j d u s| jd u rtd|j}| j |}zu|d u r=| j r1dddd | j  D  }nd}td|d| |jj	d	krGt
d
t| j||j| jj|d|j||d}|r_dnd}	|j}
t|jtru|
j|jppd|	d}n
|
j|jp{i |	d}| j||||I d H }|W S  ttfy } z\|d ur|jnd}| jj|d}||krtd|d| ||rt|trtj||jddd|jd}t|}nt|trtj||j|jd}t|}nt| |s| j | |d }~ww )Nr:   zAvailable tools: z, c                 s  s    | ]}|V  qd S rD   r*   )r0   rM   r*   r*   r+   rJ      s    z)ToolManager._call_tool.<locals>.<genexpr>zNo tools available.zUnknown tool name: z. externalzExternal tools cannot be calledr   )rF   tool_call_idretrymax_retriestool_call_approvedpartial_outputztrailing-stringsoffz{})rR   r   zTool z exceeded max retries count of F)include_urlinclude_context)rF   contentr`   )!r!   r    r>   rF   r/   joinkeysr   r;   rZ   RuntimeErrorr   r`   r.   rb   args_validator
isinstanceargsrN   validate_jsonvalidate_pythonr   	call_toolr   r   	_messagesRetryPromptParterrorsr   messager   r#   add)r3   rH   rR   rS   rQ   rM   r<   msgr    pyd_allow_partial	validator	args_dictresulterb   current_retrymr*   r*   r+   r[      sn   "




zToolManager._call_toolrV   r   rW   rX   intrY   r   c                  st  t |}	|j|jd|r|	j| ini d|j tdi |r.|	jddi|	jddiini i i ddd}
|j	|	
|j|
di}z| j||||dI d	H }| jd
7  _W n  ty} } z|j}|rw| rw||	j|  |d	}~ww |r| r||	jt|tr|ntj|  W d	   |S W d	   |S W d	   |S 1 sw   Y  |S )zYSee <https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/#execute-tool-span>.)zgen_ai.tool.namezgen_ai.tool.call.idzrunning tool: objecttype)r   
properties)zlogfire.msgzlogfire.json_schema)
attributesrU   Nr   )r   for_versionrF   r`   tool_arguments_attrargs_as_json_strjsondumpstool_result_attrstart_as_current_spanget_tool_span_namer[   
tool_callsr   
tool_retryis_recordingset_attributemodel_responserm   rN   rr   tool_return_ta	dump_jsondecode)r3   rH   rR   rS   rQ   rV   rW   rX   rY   instrumentation_namesspan_attributesspantool_resultr|   partr*   r*   r+   r\      sz   



	



zToolManager._call_function_tool)r$   r%   )r    r,   r$   r-   )r$   r9   )rA   rB   r$   rC   )rM   rN   r$   rO   )FT)
rH   r   rR   rC   rS   rC   rQ   rC   r$   r	   )rH   r   rR   rC   rS   rC   rQ   rC   rV   r   rW   rC   rX   r   rY   r   r$   r	   )__name__
__module____qualname____doc____annotations__r    r!   r   r&   r#   classmethodr   r   r8   propertyr@   rL   rE   r^   r[   r\   r*   r*   r*   r+   r      s2   
 



'Kr   )-
__future__r   r   collections.abcr   
contextlibr   contextvarsr   dataclassesr   r   r   typingr	   r
   opentelemetry.tracer   pydanticr   typing_extensionsr    r   rr   _instrumentationr   _run_contextr   r   
exceptionsr   r   r   r   r!   r   toolsets.abstractr   r   rY   r   r   r   r   r*   r*   r*   r+   <module>   s*    