
    i-                        U d 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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  ed	
       G d d             Z ed	
       G d d             Z G d d      Zi Zee	ef   ed<   efdee	z  defdZdedede	defdZ dede	defdZ!dededz  fdZ"dedeeef   fdZ#dejH                  deeef   deeef   fdZ%dedeeedz  f   fd Z&dedeee'f   fd!Z(dedeeef   fd"Z)dedeeef   fd#Z*d$eeef   d%edz  deeef   fd&Z+d'ee   deeef   fd(Z,d'ee   deeef   dz  fd)Z-d'ee   dedz  fd*Z.g d+Z/y),z9Utility helpers for introspecting function-calling tools.    N)abc)	dataclass)Enum)Path)	AnnotatedAnyDictListLiteralMappingSequenceTupleUnionget_args
get_origin)FUNCTION_CALLING_DIRget_function_managerT)frozenc                   @    e Zd ZU dZdZedz  ed<   dZee	   dz  ed<   y)	ParamMetaz.Declarative metadata for Annotated parameters.Ndescriptionenum)
__name__
__module____qualname____doc__r   str__annotations__r   r   r        C/Users/bowang/.openclaw/workspace/ChatDev/utils/function_catalog.pyr   r      s&    8"Kt"!%D(3-$
%r    r   c                   ^    e Zd ZU dZeed<   edz  ed<   eeef   ed<   eed<   eed<   eed<   y)	FunctionMetadataz*Normalized metadata for a Python callable.nameNr   parameters_schemamodule	file_pathmodule_name)r   r   r   r   r   r   r	   r   r   r    r!   r#   r#      s2    4
ItCH~%KNr    r#   c                       e Zd ZdZefdeez  ddfdZddZddZ	dede
dz  fd	Zdee   fd
Zdeee
f   fdZdeeeee
   f      fdZdedee   fdZededz  fd       Zy)FunctionCatalogz5Inspect and cache callable metadata for tool schemas.functions_dirreturnNc                 x    t        |      j                         | _        i | _        d| _        d | _        i | _        y )NF)r   resolve_functions_dir	_metadata_loaded_load_error_module_index)selfr+   s     r!   __init__zFunctionCatalog.__init__$   s6    "=199;68-135r    c                    | j                   j                          i | _        d| _        t	        | j
                        }	 |j                          i }|j                         j                         D ]Y  \  }}	 t        ||| j
                        }|| j                   |<   |j                  |j                  g       }|j                  |       [ |j                         D ]  \  }}	|	j!                           || _        d| _        y# t        $ r}d| _        || _        Y d}~yd}~ww xY w# t        $ r}t        d| d|        Y d}~d}~ww xY w)z,Reload metadata from the function directory.NTz.[FunctionCatalog] Failed to load metadata for z: )r0   clearr3   r2   r   r/   load_functions	Exceptionr1   list_functionsitems_build_function_metadata
setdefaultr(   appendprintsort)
r4   managerexcmodule_indexr$   fnmetadatamodule_bucketr(   namess
             r!   refreshzFunctionCatalog.refresh+   s:   &t':':;	""$ .0..0668HD"V3D"d>Q>QR'/t$ , 7 78L8Lb Q$$T* 9 #/"4"4"6KJJL #7)#  	DL"D	  VFtfBseTUUVs0   D 6AD&	D#DD#&	E
/EE
c                 >    | j                   s| j                          y y N)r1   rH   r4   s    r!   _ensure_loadedzFunctionCatalog._ensure_loadedF   s    ||LLN r    r$   c                 X    | j                          | j                  j                  |      S rJ   )rL   r0   get)r4   r$   s     r!   rN   zFunctionCatalog.getJ   s#    ~~!!$''r    c                 h    | j                          t        | j                  j                               S rJ   )rL   sortedr0   keysrK   s    r!   list_function_namesz#FunctionCatalog.list_function_namesN   s&    dnn))+,,r    c                 V    | j                          | j                  j                         S rJ   )rL   r0   copyrK   s    r!   list_metadatazFunctionCatalog.list_metadataR   s!    ~~""$$r    c                 H   | j                          g }t        | j                  j                               D ]i  }| j                  j	                  |g       }g }|D ]1  }| j
                  j	                  |      }|!|j                  |       3 |j                  ||f       k |S )z6Return functions grouped by Python file (module_name).)rL   rP   r3   rQ   rN   r0   r>   )r4   modulesr(   rG   entriesfn_namemetas          r!   iter_moduleszFunctionCatalog.iter_modulesV   s     	<>!$"4"4"9"9";<K&&**;;E.0G ~~))'2#NN4( ! NNK12 = r    r(   c                 l    | j                          t        | j                  j                  |g             S )z2Return sorted function names for the given module.)rL   listr3   rN   )r4   r(   s     r!   functions_for_modulez$FunctionCatalog.functions_for_modulee   s.     	D&&**;;<<r    c                 :    | j                          | j                  S rJ   )rL   r2   rK   s    r!   
load_errorzFunctionCatalog.load_errork   s    r    )r,   N)r   r   r   r   r   r   r   r5   rH   rL   r#   rN   r
   rR   r	   rU   r   r[   r^   propertyr9   r`   r   r    r!   r*   r*   !   s    ?3G 6cDj 6D 66( ( 04 7 (-T#Y -%tC)9$9: %d5d3C.D)D#EF = =S	 =  I,    r    r*   _catalog_registryr+   r,   c                     t        |       j                         }t        j                  |      }|t	        |      }|t        |<   |S rJ   )r   r.   rb   rN   r*   )r+   	directorycatalogs      r!   get_function_catalogrf   t   sD    ]#++-I##I.G!),'.)$Nr    r$   rD   c                     t        j                  |      }t        |      }t        |      }t	        ||      }t        |dd      }t        j                  |      xs d}t        ||      }	t        | |||||	      S )Nr    )r$   r   r%   r&   r'   r(   )	inspect	signature_resolve_annotations_extract_description_build_parameters_schemagetattrgetsourcefile_derive_module_namer#   )
r$   rD   r+   rj   annotationsr   schemar&   r'   r(   s
             r!   r<   r<   }   s    !!"%I&r*K&r*K%i=FRr*F%%b)/RI%i?K  r    r'   c                 V   | sy	 t        |       j                         j                  |j                               }|j                  r|j	                  d      }t        |j                        }|sydj                  |      S # t        $ r t        |       j                  }|xs dcY S w xY w)Nunknownrh   /)
r   r.   relative_tosuffixwith_suffixr]   partsjoinr9   stem)r'   r+   relativery   r{   s        r!   rp   rp      s    
!	?**,889N9N9PQ??++B/HX^^$xx !I## y !s   A*B 0B $B('B(c                    t        j                  |       }|sy |j                         }|sy |j                  dd      d   }|j	                         D cg c]#  }|j                         s|j                         % }}dj                  |      }d}t        |      |kD  r|d |dz
   j                         dz   }|xs d S c c}w )Nz

   r    iX  u   …)ri   getdocstripsplit
splitlinesrz   lenrstrip)rD   doctrimmedfirst_paragraphlinenormalized_lines
normalizedmax_lens           r!   rl   rl      s    
..
CiikGmmFA.q1O1@1K1K1M^1MQUQ[Q[Q]

1M^*+JG
: 'A+.557%?
 _s   B=)B=c                 ^   t        | di       xs i }t        t        dd       }||S 	 t        j                  | dd      S # t        $ rW 	 t        j                  | d      cY S # t        $ r0 	 t        j                  |       cY cY S # t        $ r	 |cY cY cY S w xY ww xY wt        $ r |cY S w xY w)Nr   get_annotationsT)eval_strinclude_extras)r   )rn   ri   r   	TypeErrorr9   )rD   fallbackr   s      r!   rk   rk      s    r,b17RHg'8$?O&&rDNN  	 **2== 	  ..r22   	 
  sY   A   	B,
A# B,#	B-BBB,BBB,BBB,+B,rj   rq   c                    i }g }| j                   j                         D ]D  }|j                  j                  d      r |j                  t
        j                  j                  t
        j                  j                  fv ra|j                  |j                  t
        j                        }t        |      \  }}t        |      \  }}t        |      }t        ||      }|j                  t
        j                  ur|j!                  d|j                         |||j                  <   |j                  t
        j                  u xr | }	|	s*|j#                  |j                         G d|d}
|r||
d<   |
S )N_defaultobject)type
propertiesrequired)
parametersvaluesr$   
startswithkindri   	ParameterVAR_POSITIONALVAR_KEYWORDrN   _empty_unwrap_annotation_strip_optional_annotation_to_schema_apply_param_metar   r=   r>   )rj   rq   r   r   param
annotationrZ   optional_from_typerr   is_requiredpayloads              r!   rm   rm      s6   !#JH%%,,.::  %::'++::G<M<M<Y<YZZ __UZZ@
-j9
D)8)D&
&&z2"640==.i7!'
5::mmw~~5P>P:POOEJJ'% /*  G &
Nr    r   c                     t        |       }|t        u r0t        |       }|s| d fS |d   }t        d |dd  D        d       }||fS | d fS )Nr   c              3   B   K   | ]  }t        |t              s|  y wrJ   )
isinstancer   ).0args     r!   	<genexpr>z%_unwrap_annotation.<locals>.<genexpr>   s     KHS
3	0JSHs   r~   )r   r   r   next)r   originargsbaserZ   s        r!   r   r      sb    
#F
#t##AwKDHKTRTztr    c                     t        |       }|t        u r[t        |       D cg c]  }|t        d       us| }}t	        |      dk(  r't	        |      t	        t        |             k7  r|d   dfS | dfS c c}w )Nr~   r   TF)r   r   r   r   r   )r   r   r   r   s       r!   r   r      sx    
#F'
3M3s$t*7L3Mt9>c$i3x
/C+DD7D= u Ns
   A3A3c                 r   | t         j                  u s| t        u rddiS t        |       }|t	        |       S |t
        u s,|t        u s$|t        j                  u s|t        j                  u r-t        |       rt        |       d   nt        }dt        |      dS |t        t        t        j                  t        j                  hv rddiS |t         u r9t        |       D cg c]  }|t#        d       us| }}t%        |      }|r|S ddiS |t&        u rt        t        |             }t)        |      S ddiS c c}w )Nr   stringr   arrayr   r;   r   )ri   r   r   r   _primitive_schemar]   r
   r   r   MutableSequencer   r   dictr	   r   MutableMappingr   r   _try_literal_schemar   _literal_schema)r   r   item_annotationr   literalsliteral_schemar   s          r!   r   r      s2   W^^#zS'8!!
#F~ ,,~46S\\+AVsObObEb5=j5I(:.q1s*?;
 	

 $ckk3+=+=>>!!#+J#7Q#7C3d4j;PC#7Q,X6!!!!hz*+v&&H Rs   D40D4c                    t        | t              r<t        | t              r,| D cg c]  }|j                   }}t        |      }|r|S ddiS | t        hv rddiS | t        hv rddiS | t        hv rddiS | t        hv rddiS | t        t        j                  hv rddiS | t        t        j                  hv rdddidS ddiS c c}w )	Nr   r   integernumberbooleanr   r   r   )r   r   
issubclassr   valuer   r   intfloatboolr   r   r   r]   r   )r   memberr   rr   s       r!   r   r     s    *d#
:t(D-78Z6&,,Z8 (v7fh%77cU!!cU	""eW!!dV	""dCKK((!!dCLL))68*<==H# 9s   C rr   rZ   c                     || S t        |       }|j                  r|j                  |d<   |j                  r4t        |j                        |d<   t	        |j                        }|r||d<   |S )Nr   r   r   )r   r   r   r]   _infer_literal_type)rr   rZ   updatedinferreds       r!   r   r   /  se    |6lG!%!1!1yytyy/&tyy1&GFONr    r   c                 P    | sddiS dt        |       i}t        |       }|r||d<   |S )Nr   r   r   )r]   r   )r   rr   literal_types      r!   r   r   =  s9    !!$d6l3F&v.L%vMr    c                 @    | sy t        |       }|y |t        |       dS )N)r   r   )r   r]   )r   r   s     r!   r   r   G  s*    &v.L $v,77r    c                     t        d | D              ryt        d | D              ryt        d | D              ryt        d | D              ryy )	Nc              3   <   K   | ]  }t        |t                y wrJ   )r   r   r   r   s     r!   r   z&_infer_literal_type.<locals>.<genexpr>Q  s     
7u:eT"   r   c              3   b   K   | ]'  }t        |t              xr t        |t                ) y wrJ   )r   r   r   r   s     r!   r   z&_infer_literal_type.<locals>.<genexpr>S  s*     
Vve:eS!A*UD*A&AAvs   -/r   c              3   <   K   | ]  }t        |t                y wrJ   )r   r   r   s     r!   r   z&_infer_literal_type.<locals>.<genexpr>U  s     
8:eU#r   r   c              3   <   K   | ]  }t        |t                y wrJ   )r   r   r   s     r!   r   z&_infer_literal_type.<locals>.<genexpr>W  s     
6ve:eS!vr   r   )all)r   s    r!   r   r   P  sI    

7
77

Vv
VV

8
88

6v
66r    )r*   r#   r   rf   )0r   ri   collectionsr   dataclassesr   r   r   pathlibr   typingr   r   r	   r
   r   r   r   r   r   r   r   utils.function_managerr   r   r   r#   r*   rb   r   r   rf   r<   rp   rl   rk   	Signaturerm   r   r   r   r   r   r   r   r   r   __all__r   r    r!   <module>r      sV   ?   !   m m m m M $& & & $  M  M ` 24 4o-. 3 6J d
 o 3 C  IY &!3 !t ! ! S S4Z  S WS#X%6 &(9(9 PSUXPXHY ^bcfhkck^l B	3 	5i$6F1F+G 	 c4i(8 c d38n @# $sCx. ,d38n I4D cSVh HSM d38n 8 8$sCx.42G 8	 	#* 	r    