o
    ZhJ                     @  s  d dl mZ d dlZd dlZd dlZd dl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  mZ d dlm  m  mZ d dlZd dlmZ d dlmZ d dlm Z m!Z! d dl"m#Z# d dl$m%Z% d dl&m%Z' e(e)Z*ejj+ejj,ejj-ejj.ejj/ejj0dd	Z1g Z2e23d
d e4 j5j6j7D  e23dd ej4j8e4 dd9 D  e:e2Z;eeee% ej<ee	e=ef f Z>eej?e	e=ef f Z@G dd deZAeejBeAe>f ZCeeC ZDd[ddZEd\ddZFd]ddZGd^d!d"ZHd_d#d$ZId`d&d'ZJdad)d*ZK		dbdcd0d1ZLddd3d4ZMded6d7ZNddd8d9ZOdfd;d<ZPdgd>d?ZQdhdAdBZRdidDdEZSeeTe
e= e=edF edG f ZUG dHdI dIeZVG dJdK dKeZWdjdPdQZXdkdSdTZYdldmdYdZZZdS )n    )annotationsN)AnyCallableDictListLiteralOptionalSequenceType	TypedDictUnioncast)BaseTooltool)FunctionDescriptionconvert_to_openai_tool)dereference_refs)	BaseModel)stringnumberintegerbooleanarrayobjectnullc                 C  s   g | ]}|j qS  )name.0fr   r   ]/var/www/html/lang_env/lib/python3.10/site-packages/langchain_google_genai/_function_utils.py
<listcomp>0   s    r"   c                 C  s   g | ]}|qS r   r   r   r   r   r!   r"   2   s    F)Zpreserving_proto_field_namec                   @     e Zd ZU ded< ded< dS )	_ToolDictz"Sequence[_FunctionDeclarationLike]function_declarationsz$Optional[_GoogleSearchRetrievalLike]google_search_retrievalN__name__
__module____qualname____annotations__r   r   r   r!   r$   F      
 r$   schemaDict[str, Any]returnc                 C  s   i }|   D ][\}}|dkrq|dkrt||d< q|dkr%t||d< q|dkrBt|dkr:tdt| d t|d   S |d	v rOt| |d
< q|tvr]td| d q|||< q|S )Ndefinitionsitems
propertiesZallOf   z3Only first value for 'allOf' key is supported. Got z", ignoring other than first value!r   )type_typer4   Key 'z&' is not supported in schema, ignoring)	r1   _format_json_schema_to_gapic_get_properties_from_schemalenloggerwarningstrupper_ALLOWED_SCHEMA_FIELDS_SET)r-   Zconverted_schemakeyvaluer   r   r!   r7   R   s.   
r7   Optional[gapic.Schema]c                 C  s.   | rt | }t|}t|}tj|S d S N)r   r7   jsondumpsgapicSchema	from_json)r-   Zdereferenced_schemaZformatted_schemaZjson_schemar   r   r!   _dict_to_gapic_schemal   s   
rH   r   *Union[FunctionDescription, Dict[str, Any]]gapic.FunctionDeclarationc                 C  s2   t j| dp| d| dt| di dS )Nr   titledescription
parametersr   rL   rM   )rE   FunctionDeclarationgetrH   r   r   r   r!   $_format_dict_to_function_declarationu   s
   rQ   tools
_ToolsType
gapic.Toolc                   sn  t | tjjstd | g} t  | D ]t fdddD r&t	dt tjrSt tjr4nj
}d|v r?|j _d|v rJ j|j d|v rR|j _qt trtfd	dd
D snt} j| qttdv rd }t d tjjst	dt| d|rdd |D } j| dv rtd  _qt} j| q S )NzPconvert_to_genai_function_declarations expects a Sequence and not a single tool.c                 3      | ]}| v V  qd S rB   r   r   )
gapic_toolr   r!   	<genexpr>       z9convert_to_genai_function_declarations.<locals>.<genexpr>)r&   z`Providing multiple google_search_retrieval or mixing with function_declarations is not supportedr&   r%   google_searchc                 3  rU   rB   r   r   r   r   r!   rW      s
    
)r%   r&   z+function_declarations should be a listgot ''c                 S     g | ]}t |qS r   )%_format_to_gapic_function_declaration)r   fdr   r   r!   r"      s    z:convert_to_genai_function_declarations.<locals>.<listcomp>)
isinstancecollectionsabcr	   r:   r;   rE   Toolany
ValueErrorZ	_raw_toolr&   r%   extendrY   dictr\   appendr   r$   r4   GoogleSearchRetrieval)rR   rtr]   r%   fdsr   )rV   r   r!   &convert_to_genai_function_declarations   sh   

rj   c                   s    d fdd  t | | S )Nrawr   r/   c                   s^   t | tr fdd| D S t | tr fdd|  D S t | tjr- t| | S | S )Nc                   s   g | ]} |qS r   r   )r   v_traverse_valuesr   r!   r"      s    z:tool_to_dict.<locals>._traverse_values.<locals>.<listcomp>c                   s   i | ]	\}}| |qS r   r   r   krl   rm   r   r!   
<dictcomp>   s    z:tool_to_dict.<locals>._traverse_values.<locals>.<dictcomp>)r^   listre   r1   protoMessager4   to_dict)rk   rm   r   r!   rn      s   

z&tool_to_dict.<locals>._traverse_values)rk   r   r/   r   )r4   ru   r   r   rm   r!   tool_to_dict   s   	rv   _FunctionDeclarationLikec                   s  t  tr	t S t  trt rt S t  tr{t fdddD r1 d dkr1 d }n/t fdddD rFd vrFtt }nd v r[ d 	d	r[t
tt d }ntt }|	dpfi |d< |d 	d	sti |d< ttt|S t rtt  S td
  )Nc                 3  rU   rB   r   r   rp   r   r   r!   rW      rX   z8_format_to_gapic_function_declaration.<locals>.<genexpr>)r4   functionr4   ry   c                 3  rU   rB   r   rx   r   r   r!   rW      rX   )r   rL   rM   r2   zUnsupported tool type )r^   r   )_format_base_tool_to_function_declarationr4   is_basemodel_subclass_safe#_convert_pydantic_to_genai_functionre   allr   rP   r   rQ   r   callablecallable_as_lc_toolrc   )r   ry   r   r   r!   r\      s*   

"

r\   r   c              	   C  s   | j stj| j| jtjtjjdtjtjjdidgddS t	| j t
r(| j }n!t| j tr4| j  }nt| j tr@| j  }n	td| j  dt|}tj| jpV|d| jp]|d|dS )	NZ__arg1r4   )r4   r2   requiredrN   z=args_schema must be a Pydantic BaseModel or JSON schema, got .rK   rL   )Zargs_schemarE   rO   r   rL   rF   r
   OBJECTSTRINGr^   re   
issubclassr   model_json_schemaBaseModelV1r-   NotImplementedErrorrH   rP   )r   r-   rM   r   r   r!   rz      s8   rz   pydantic_modelType[BaseModel]	tool_nameOptional[str]tool_descriptionc                 C  s   t | tr
|  }nt | tr|  }ntd|  t|}|dd  tj	|r+|n|
d|r3|n|
dt|
d|
dg t|d  dd	}|S )
Nz1pydantic_model must be a Pydantic BaseModel, got r0   rK   rL   r2   r   r4   )r2   r   type_rN   )r   r   r   r   r-   r   r   poprE   rO   rP   _get_properties_from_schema_any	TYPE_ENUM)r   r   r   r-   Zfunction_declarationr   r   r!   r|     s(   





r|   r   c                 C  s   t | tr	t| S i S rB   )r^   r   r8   r-   r   r   r!   r   1  s   
r   r   c           	        s  i }|   D ]\}}t|tstd| dt|  qt|ts/td| d|  qi }|ds@|ds@|drvt|}||d< t	|rPd|d	< |d}|rv|t
jjt
jjfv rv|t
jjkrid
nd  fdd|D d }|dr|d |d< |d}|rt|tr||d< |dt
jjkr|drt|d|d< |dt
jjkr|drt|d trt|d d tr|d d }|d}|rt||d< t|trdd |  D |d< nt
jj|d< |dkrd|vr|d t| |d< |||< q|S )Nr6   z#' is not supported in schema, type=zValue 'z)' is not supported in schema, ignoring v=r4   anyOfr   Tnullabler   r   c                   s   g | ]}| d  kr|qS r   )rP   )r   valZ
json_type_r   r!   r"   L  s    z/_get_properties_from_schema.<locals>.<listcomp>enumrL   r1   r   r2   c                 S  s   g | ]
\}}d |vr|qS )defaultr   ro   r   r   r!   r"   e  s    r   rK   z is )r1   r^   r<   r:   r;   r4   r   rP   _get_type_from_schema_is_nullable_schemaglmr
   ARRAYr   _get_items_from_schema_anyrr   re   r   r   )	r-   r2   rp   rl   Zproperties_itemZ
item_type_Zany_of_typesrL   Zv_propertiesr   r   r!   r8   7  s`   








r8   c                 C  s   t | tttfrt| S i S rB   )r^   re   rr   r<   _get_items_from_schemar   r   r   r!   r   t  s   r   Union[Dict, List, str]c                 C  s   i }t | trt| D ]\}}t||d| < q|S t | trdt| |d< |d tjjkr:d| v r:t| d |d< d| v sBd| v rP| 	dpM| 	dpMd|d< t
| rXd|d< d	| v rb| d	 |d	< |S td
| i|d< t
d
| irvd|d< |S )Nitemr   r2   rK   rL    Tr   r   r4   )r^   r   	enumerater   r   r   r   r
   r   rP   r   )r-   r1   irl   r   r   r!   r   z  s*   

r   intc                 C  s   t | ptjjS rB   )_get_nullable_type_from_schemar   r
   r   r   r   r   r!   r     s   r   Optional[int]c                 C  s   d| v rdd | d D }dd |D }|r|d S 	 tjjS d| v s'd| v rRd| v r/| d n| d }t |tr:|S d| v rDt| d nt| d }t|tjjS 	 tjjS )Nr   c                 S  r[   r   r   r   Z
sub_schemar   r   r!   r"         z2_get_nullable_type_from_schema.<locals>.<listcomp>c                 S  s   g | ]}|d ur|qS rB   r   r   tr   r   r!   r"     s    r   r4   r   )r^   r   r<   r   rP   r   r
   r   r-   typesr   styper   r   r!   r     s"   	
 r   boolc                 C  s   d| v rdd | d D }t dd |D S d| v sd| v rKd| v r&| d n| d }t|tr1dS d| v r;t| d nt| d }t|tjjd u S 	 dS )	Nr   c                 S  r[   r   r   r   r   r   r!   r"     r   z'_is_nullable_schema.<locals>.<listcomp>c                 s  s    | ]}|d u V  qd S rB   r   r   r   r   r!   rW     rX   z&_is_nullable_schema.<locals>.<genexpr>r4   r   F)	rb   r^   r   r<   r   rP   r   r
   r   r   r   r   r!   r     s   
 r   )autononerb   Tc                   @  r#   )_FunctionCallingConfigDictz,Union[gapic.FunctionCallingConfig.Mode, str]modezOptional[List[str]]allowed_function_namesNr'   r   r   r   r!   r     r,   r   c                   @  s   e Zd ZU ded< dS )_ToolConfigDictr   function_calling_configNr'   r   r   r   r!   r     s   
 r   tool_choice_ToolChoiceType	all_names	List[str]c                 C  s   d }| du s
| dkrd}|}nW| dkrd}nP| dkrd}nIt | tr(d}| g}n>t | tr2d}| }n4t | tr_d| v rE| d }| d	}n!d
| v rW| d
 d }| d
 d	}ntd| dtd| t| |ddS )NTrb   ANYr   ZAUTOr   NONEr   r   r   z.Unrecognized tool choice format:

tool_choice=zN

Should match Google GenerativeAI ToolConfig or FunctionCallingConfig format.)r   r   )r   )r^   r<   rr   re   rP   rc   r   r=   )r   r   r   r   r   r   r!   _tool_choice_to_tool_config  s@   



r   r
   c                 C  s(   t ddrddlm} || S t| tS )Nzlangchain_core.utils.pydanticis_basemodel_subclassr   )r   )safe_importZlangchain_core.utils.pydanticr   r   r   )r   r   r   r   r!   r{     s   

r{   r   module_namer<   attribute_namec                 C  s6   zt | }|rt||W S W dS  ty   Y dS w )NTF)	importlibimport_modulehasattrImportError)r   r   moduler   r   r!   r     s   
r   )r-   r.   r/   r.   )r-   r.   r/   rA   )r   rI   r/   rJ   )rR   rS   r/   rT   )r   rT   r/   r$   )r   rw   r/   rJ   )r   r   r/   rJ   )NN)r   r   r   r   r   r   r/   rJ   )r-   r   r/   r.   )r-   r   r/   r.   )r-   r   r/   r.   )r-   r.   r/   r   )r-   r.   r/   r   )r-   r.   r/   r   )r   r   r   r   r/   r   )r   r
   r/   r   )r   )r   r<   r   r<   r/   r   )[
__future__r   r_   r   rC   loggingtypingr   r   r   r   r   r   r	   r
   r   r   r   Zgoogle.ai.generativelanguageZaiZgenerativelanguager   Z)google.ai.generativelanguage_v1beta.typesZgenerativelanguage_v1betar   rE   rs   Zlangchain_core.toolsr   r   r   Z%langchain_core.utils.function_callingr   r   Z langchain_core.utils.json_schemar   Zpydanticr   Zpydantic.v1r   	getLoggerr(   r:   r   NUMBERZINTEGERZBOOLEANr   r   r   Z_ALLOWED_SCHEMA_FIELDSrd   rF   Z_pbZ
DESCRIPTORfieldsru   keyssetr>   rO   r<   rw   rg   Z_GoogleSearchRetrievalLiker$   ra   Z	_ToolTyperS   r7   rH   rQ   rj   rv   r\   rz   r|   r   r8   r   r   r   r   r   re   r   r   r   r   r{   r   r   r   r   r!   <module>   s    4





	

A

&
 

=





*