
    Zǻi-%                        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 d dlmZmZmZ  G d dee      Z G d de      Z G d	 d
e      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zy)    )ABC)Enum)AnyDictListCallableOptionalUnionClassVar)	BaseModelFieldmodel_validatorc                   (    e Zd ZdZdZdZdZdZdZdZ	y)	ParameterTypez6Enum for parameter types supported in tool parameters.stringintegernumberbooleanobjectarrayN)
__name__
__module____qualname____doc__STRINGINTEGERNUMBERBOOLEANOBJECTARRAY     Q/opt/lhia/marcimex/agent/venv/lib/python3.12/site-packages/neo4j_graphrag/tool.pyr   r      s#    @FGFGFEr"   r   c                   t    e Zd ZU dZeed<   dZeed<   ee	   ed<   de
eef   fdZede
eef   dd fd	       Zy
)ToolParameterz2Base class for all tool parameters using Pydantic.descriptionFrequiredtypereturnc                 8    | j                   | j                  d}|S )z<Convert the parameter to a dictionary format for tool usage.r(   r&   r+   )selfresults     r#   model_dump_toolzToolParameter.model_dump_tool   s    *.))DDTDT!Ur"   datac                    |j                  d      }|st        d      t        j                  t        t        j
                  t        t        j                  t        t        j                  t        t        j                  t        t        j                  t        i}|j                  |      }|st        d|       |j                  |      S )z%Create a parameter from a dictionary.r(   zParameter type is requiredzUnknown parameter type: )get
ValueErrorr   r   StringParameterr   IntegerParameterr   NumberParameterr   BooleanParameterr   ObjectParameterr    ArrayParametermodel_validate)clsr/   
param_typeparam_classesparam_classs        r#   	from_dictzToolParameter.from_dict   s     XXf%
9::   /!!#3  /!!#3  /
 $''
37
|DEE ))$//r"   N)r   r   r   r   str__annotations__r'   boolr   r   r   r   r.   classmethodr>   r!   r"   r#   r%   r%      s^    <Hd
=
!!c3h 
 0T#s(^ 0 0 0r"   r%   c                   v     e Zd ZU dZej
                  Zee   ed<   dZ	e
ee      ed<   deeef   f fdZ xZS )r3   zString parameter for tools.r(   Nenumr)   c                 Z    t         |          }| j                  r| j                  |d<   |S )NrD   )superr.   rD   r,   r-   	__class__s     r#   r.   zStringParameter.model_dump_tool=   s)    (*99!YYF6Nr"   )r   r   r   r   r   r   r(   r   r@   rD   r	   r   r?   r   r   r.   __classcell__rH   s   @r#   r3   r3   7   sG    %$1$8$8D(=
!8 $D(49
$c3h  r"   r3   c                        e Zd ZU dZej
                  Zee   ed<   dZ	e
e   ed<   dZe
e   ed<   deeef   f fdZ xZS )r4   zInteger parameter for tools.r(   Nminimummaximumr)   c                     t         |          }| j                  | j                  |d<   | j                  | j                  |d<   |S NrL   rM   rF   r.   rL   rM   rG   s     r#   r.   z IntegerParameter.model_dump_toolK   E    (*<<# $F9<<# $F9r"   )r   r   r   r   r   r   r(   r   r@   rL   r	   intrM   r   r?   r   r.   rI   rJ   s   @r#   r4   r4   D   sP    &$1$9$9D(=
!9!GXc]!!GXc]!c3h  r"   r4   c                        e Zd ZU dZej
                  Zee   ed<   dZ	e
e   ed<   dZe
e   ed<   deeef   f fdZ xZS )r5   zNumber parameter for tools.r(   NrL   rM   r)   c                     t         |          }| j                  | j                  |d<   | j                  | j                  |d<   |S rO   rP   rG   s     r#   r.   zNumberParameter.model_dump_tool[   rQ   r"   )r   r   r   r   r   r   r(   r   r@   rL   r	   floatrM   r   r?   r   r.   rI   rJ   s   @r#   r5   r5   T   sP    %$1$8$8D(=
!8#GXe_##GXe_#c3h  r"   r5   c                   :    e Zd ZU dZej
                  Zee   ed<   y)r6   zBoolean parameter for tools.r(   N)	r   r   r   r   r   r   r(   r   r@   r!   r"   r#   r6   r6   d   s    &$1$9$9D(=
!9r"   r6   c                        e Zd ZU dZej
                  Zee   ed<   ded<   dZ	e
e   ed<   dZe
e   ed<    ed	      ed
eeef   deeef   fd              Zdeeef   f fdZ ed	      dd       Z xZS )r8   zArray parameter for tools.r(   r%   itemsN	min_items	max_itemsbeforemodevaluesr)   c                 x    |j                  d      }t        |t              rt        j	                  |      |d<   |S )NrX   )r1   
isinstancedictr%   r>   )r:   r^   rX   s      r#   _preprocess_itemsz ArrayParameter._preprocess_itemsr   s5     

7#eT"+55e<F7Or"   c                     t         |          }| j                  j                         |d<   | j                  | j                  |d<   | j                  | j                  |d<   |S )NrX   minItemsmaxItems)rF   r.   rX   rY   rZ   rG   s     r#   r.   zArrayParameter.model_dump_tool{   s[    (***446w>>%!%F:>>%!%F:r"   afterc                    t        | j                  t              sat        | j                  t              r&t        j	                  | j                        | _        | S t        dt        | j                               t        | j                        t        u r2t        j	                  | j                  j                               | _        | S )Nz+Items must be a ToolParameter or dict, got )r`   rX   r%   ra   r>   r2   r(   
model_dumpr,   s    r#   validate_itemszArrayParameter.validate_items   s    $**m4$**d+*44TZZ@
  !A$tzzBRAST  $**.&001F1F1HIDJr"   )r)   r8   )r   r   r   r   r   r    r(   r   r@   rY   r	   rR   rZ   r   rB   ra   r?   r   rb   r   r.   rj   rI   rJ   s   @r#   r8   r8   j   s    $$1$7$7D(=
!7#Ix}##Ix}#(#tCH~ $sCx.   $c3h  '" #r"   r8   c                       e Zd ZU dZej
                  Zee   ed<   e	e
ef   ed<    ee      Zee
   ed<   dZeed<    ed	      ed
ee
ef   dee
ef   fd              Zddeee
      de	e
ef   f fdZ ed	      dd       Z xZS )r7   zObject parameter for tools.r(   
properties)default_factoryrequired_propertiesTadditional_propertiesr[   r\   r^   r)   c                     |j                  d      }t        |t              rMi }|j                         D ]3  \  }}t        |t              rt        j                  |      ||<   /|||<   5 ||d<   |S )Nrl   )r1   r`   ra   rX   r%   r>   )r:   r^   props	new_propskvs         r#   _preprocess_propertiesz&ObjectParameter._preprocess_properties   sr     

<(eT"I %1a&#0#:#:1#=IaL#$IaL	%
 $-F< r"   excludec                    |xs g }i }| j                   j                         D ]  \  }}||v r|j                         ||<    t        | 	         }||d<   | j                  rd|vr| j                  |d<   d|vr| j
                  |d<   |S )Nrl   r'   ro   additionalProperties)rl   rX   r.   rF   rn   ro   )r,   rv   properties_dictnameparamr-   rH   s         r#   r.   zObjectParameter.model_dump_tool   s    -R*,??002 	<KD%w$)$9$9$;OD!	<
 (*.|##
'(A!%!9!9F:"'1-1-G-GF)*r"   rf   c           	      |   i }| j                   j                         D ]  \  }}t        |t              sCt        |t              rt        j                  |      ||<   ?t        d| dt        |             t        |      t        u r't        j                  |j                               ||<   |||<    || _         | S )Nz	Property z& must be a ToolParameter or dict, got )	rl   rX   r`   r%   ra   r>   r2   r(   rh   )r,   validated_propertiesrz   r{   s       r#   validate_propertiesz#ObjectParameter.validate_properties   s    !??002 	3KD%e]3eT*1>1H1H1O(.$#D6)OPTUZP[}]  e--:-D-DUEUEUEW-X$T*-2$T*	3 /r"   N)r)   r7   )r   r   r   r   r   r   r(   r   r@   r   r?   r%   r   listrn   r   ro   rA   r   rB   ra   r   ru   r	   r.   r~   rI   rJ   s   @r#   r7   r7      s    %$1$8$8D(=
!8S-'((%*4%@c@"&4&(#DcN tCH~   $xS	': d3PS8n & '" #r"   r7   c                       e Zd ZU dZeed<   eed<   ee   ed<   ede	f   ed<   	 dded	ed
ede	f   dee
eeee	f   f      fdZdefdZdefdZddeee      deee	f   fdZde	de	fdZdefdZdefdZy)ToolzWAbstract base class defining the interface for all tools in the neo4j-graphrag library._name_description_parameters._execute_funcNrz   r&   execute_func
parametersc                    || _         || _        || _        t        |t              rt
        j                  |      | _        y t        |t
              r|| _        y |d | _        y t        dt        |      j                   d|       )Nz7Parameters must be None, dict, or ObjectParameter, got z: )r   r   r   r`   ra   r7   r9   r   	TypeErrorr(   r   )r,   rz   r&   r   r   s        r#   __init__zTool.__init__   s     
')j$'.==jID
O4)D#DJ'001J<A r"   r)   c                     | j                   S )zWGet the name of the tool.

        Returns:
            str: Name of the tool.
        )r   ri   s    r#   get_namezTool.get_name   s     zzr"   c                     | j                   S )zvGet a detailed description of what the tool does.

        Returns:
            str: Description of the tool.
        )r   ri   s    r#   get_descriptionzTool.get_description   s        r"   rv   c                 T    | j                   r| j                   j                  |      S i S )zGet the parameters the tool accepts in a dictionary format suitable for LLM providers.

        Returns:
            Dict[str, Any]: Dictionary containing parameter schema information.
        )r   r.   )r,   rv   s     r#   get_parameterszTool.get_parameters   s)     ##33G<<	r"   kwargsc                 &     | j                   di |S )zExecute the tool with the given query and additional parameters.

        Args:
            **kwargs (Any): Additional parameters for the tool.

        Returns:
            Any: The result of the tool execution.
        r!   )r   )r,   r   s     r#   executezTool.execute
  s     "t!!+F++r"   c                 V    d| j                    d| j                   d| j                   dS )Nz
Tool(name=z, description=z, parameters=))r   r   r   ri   s    r#   __str__zTool.__str__  s1    DJJ<~d6G6G5HVZVfVfUgghiir"   c                 "    | j                         S r   )r   ri   s    r#   __repr__zTool.__repr__  s    ||~r"   r   )r   r   r   r   r?   r@   r	   r7   r   r   r
   r   r   r   r   r   r   r   r   r   r!   r"   r#   r   r      s    aJ/**CH%% HL  sCx(	
 U?DcN#BCD.# ! !htCy&9 T#s(^ 	, 	, 	,j j# r"   r   N)abcr   rD   r   typingr   r   r   r   r	   r
   r   pydanticr   r   r   r?   r   r%   r3   r4   r5   r6   r8   r7   r   r!   r"   r#   <module>r      s      G G G 6 6C "0I "0J
m 
}  m  :} :&] &R;m ;|H3 Hr"   