o
    ưiv=                     @   s  U d 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 ddlmZ ddlmZ ddlmZmZ er=ddlmZ d	eeef d
efddZdddee d
dfddZ	d+ddde	e d
ee fddZddded
e	e fddZ		d,dddede	e de	e de	e d
e	e fddZdddee d
eee
eef f fddZddded
ee fdd ZG d!d" d"Zdae	e e d#< d
efd$d%Z!ddd&eded
e"fd'd(Z#ddd&eded
e"fd)d*Z$dS )-u   
DB helpers for LiteLLM_ToolTable — the global tool registry.

Tools are auto-discovered from LLM responses and upserted here.
Admins use the management endpoints to read and update input_policy / output_policy.
    N)datetimetimezone)TYPE_CHECKINGAnyDictListOptionalTupleUnion)verbose_proxy_logger)ToolDiscoveryQueueItem)LiteLLM_ToolTableRowToolPolicyOverrideRow)PrismaClientrowreturnc                    s  t  dd}t|r|  nt ts fdddD  tdi d ddd ddd	 d	d
 d
p:dd dpBddt dpKdd dd dd dd dd dd dd dd dd dd dS )z@Convert a Prisma model instance or dict to LiteLLM_ToolTableRow.
model_dumpNc                    s   i | ]	}|t  |d qS N)getattr).0kr    \/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/db/tool_registry_writer.py
<dictcomp>   s    z!_row_to_model.<locals>.<dictcomp>)tool_id	tool_nameorigininput_policyoutput_policy
call_countassignmentskey_hashteam_id	key_alias
user_agentlast_used_at
created_at
updated_at
created_by
updated_byr    r   r   r   	untrustedr   r    r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r   )r   callable
isinstancedictr   getint)r   r   r   r   r   _row_to_model   sT   





	







r2   prisma_clientr   itemsc                    s(  |sdS zudd |D }|sW dS t tj}| jj}|D ]Q}|dd}|dp,d}|dp3d	}|d
}	|d}
|d}|d}|jd|itt	
 ||ddd|||	|
|||dddi||dddI dH  qtdt| W dS  ty } ztd| W Y d}~dS d}~ww )z
    Batch-upsert tool registry rows via Prisma.

    On first insert: sets input_policy/output_policy = "untrusted" (default), call_count = 1.
    On conflict: increments call_count; preserves existing policies.
    Nc                 S   s   g | ]	}| d r|qS r   )r0   )r   itemr   r   r   
<listcomp>S   s    z&batch_upsert_tools.<locals>.<listcomp>r   r+   r   Zuser_definedr)   systemr"   r#   r$   r%   r,      )r   r   r   r   r   r    r)   r*   r"   r#   r$   r%   r&   	increment)r    r(   r&   createupdatewheredataz)tool_registry_writer: upserted %d tool(s)z1tool_registry_writer batch_upsert_tools error: %s)r   nowr   utcdblitellm_tooltabler0   upsertstruuiduuid4r   debuglen	Exceptionerror)r3   r4   r@   rA   tabler6   r   r   r)   r"   r#   r$   r%   er   r   r   batch_upsert_toolsF   s`   






rO   r   c              
      sx   z |dur
d|ini }| j jj|ddidI dH }dd |D W S  ty; } ztd| g W  Y d}~S d}~ww )	z6Return all tools, optionally filtered by input_policy.Nr   r'   Zdesc)r?   orderc                 S   s   g | ]}t |qS r   )r2   r   r   r   r   r   r7      s    zlist_tools.<locals>.<listcomp>z)tool_registry_writer list_tools error: %srC   rD   	find_manyrK   r   rL   )r3   r   r?   rowsrN   r   r   r   
list_tools   s   rU   r   c              
      sh   z| j jjd|idI dH }|du rW dS t|W S  ty3 } ztd| W Y d}~dS d}~ww )z&Return a single tool row by tool_name.r   r?   Nz'tool_registry_writer get_tool error: %s)rC   rD   find_uniquer2   rK   r   rL   )r3   r   r   rN   r   r   r   get_tool   s   
rX   r*   r   c           
   
      s   zL|pd}t tj}tt ||pd|pd||||d}||d}|dur,||d< |dur4||d< | jjj	d|i||d	d
I dH  t
| |I dH W S  tyf }	 ztd|	 W Y d}	~	dS d}	~	ww )z^Update input_policy and/or output_policy for a tool. Upserts the row if it does not exist yet.r8   r,   )r   r   r   r   r)   r*   r'   r(   )r*   r(   Nr   r   r   r;   r>   z1tool_registry_writer update_tool_policy error: %s)r   rA   r   rB   rF   rG   rH   rC   rD   rE   rX   rK   r   rL   )
r3   r   r*   r   r   Z_updated_byrA   Zcreate_dataZupdate_datarN   r   r   r   update_tool_policy   sD   
rY   
tool_namesc              
      sn   |si S z| j jjdd|iidI dH }dd |D W S  ty6 } ztd| i W  Y d}~S d}~ww )z[
    Return a {tool_name: (input_policy, output_policy)} map for the given tool names.
    r   inrV   Nc                 S   s0   i | ]}|j t|d dpdt|ddpdfqS )r   r,   r   r   r   rQ   r   r   r   r      s    z&get_tools_by_names.<locals>.<dictcomp>z1tool_registry_writer get_tools_by_names error: %srR   )r3   rZ   rT   rN   r   r   r   get_tools_by_names   s"   
r]   c                    s  g }zk| j jjdd|iiddddI dH }|D ]R}t|ddp"d}t|d	g p*g }t|d
g p2g }|D ]}|t||dt|dddt|ddddd q5|D ]}	|t||t|	ddddt|	ddddd qQq|W S  ty }
 ztd|
 g W  Y d}
~
S d}
~
ww )z
    Return override-like rows for a tool by finding object permissions that have
    this tool in blocked_tools, then resolving each permission to key/team scope for display.
    blocked_toolshasT)verification_tokensteams)r?   includeNobject_permission_idr+   r`   ra   tokenblockedr$   )Zoverride_idr   r#   r"   r   r$   r'   r(   r#   Z
team_aliasz6tool_registry_writer list_overrides_for_tool error: %s)	rC   litellm_objectpermissiontablerS   r   appendr   rK   r   rL   )r3   r   outpermspermop_idtokensra   tZteamrN   r   r   r   list_overrides_for_tool   s`   




rn   c                   @   s   e Zd ZdZdddZdefddZdd
dZdedefddZ	dedefddZ
		ddee dee dee deeef fddZdS )ToolPolicyRegistryu   
    In-memory registry of tool policies synced from DB.
    Hot path uses get_effective_policies only — no DB, no cache.
    r   Nc                 C   s   i | _ i | _i | _d| _d S )NF)_tool_input_policies_tool_output_policies_blocked_tools_by_op_id_initializedselfr   r   r   __init__*  s   
zToolPolicyRegistry.__init__c                 C   s   | j S r   )rs   rt   r   r   r   is_initialized0  s   z!ToolPolicyRegistry.is_initializedr3   r   c              
      s   zT|j j I dH }dd |D | _dd |D | _|j j I dH }i | _|D ]}t|dd}t|ddp8g }|rBt|| j|< q)d| _	t
dt| jt| j W dS  tyh } zt
d	|  d}~ww )
zCLoad all tool policies and object-permission blocked_tools from DB.Nc                 S       i | ]}|j t|d dpdqS )r   r,   r\   rQ   r   r   r   r   7      z?ToolPolicyRegistry.sync_tool_policy_from_db.<locals>.<dictcomp>c                 S   rx   )r   r,   r\   rQ   r   r   r   r   ;  ry   rc   r^   TzMToolPolicyRegistry: synced %d tool policies and %d object permissions from DBz5ToolPolicyRegistry sync_tool_policy_from_db error: %s)rC   rD   rS   rp   rq   rf   rr   r   listrs   r   inforJ   rK   	exception)ru   r3   Ztoolsri   r   rk   re   rN   r   r   r   sync_tool_policy_from_db3  s<   
z+ToolPolicyRegistry.sync_tool_policy_from_dbr   c                 C      | j |dS Nr,   )rp   r0   ru   r   r   r   r   get_input_policyT     z#ToolPolicyRegistry.get_input_policyc                 C   r~   r   )rq   r0   r   r   r   r   get_output_policyW  r   z$ToolPolicyRegistry.get_output_policyrZ   rc   team_object_permission_idc                 C   sv   |si S t  }||fD ]}|r| r|| j| g  qi }|D ]}||v r/d||< q$| j|d||< q$|S )z
        Return effective input_policy per tool from in-memory state.
        If tool is in key or team blocked_tools -> "blocked", else global input_policy or "untrusted".
        re   r,   )setstripr=   rr   r0   rp   )ru   rZ   rc   r   re   rk   resultnamer   r   r   get_effective_policiesZ  s   

z)ToolPolicyRegistry.get_effective_policies)r   N)r3   r   r   NNN)__name__
__module____qualname____doc__rv   boolrw   r}   rF   r   r   r   r   r   r   r   r   r   r   ro   $  s$    

!
ro   _tool_policy_registryc                   C   s   t du rt a t S )z/Return the global ToolPolicyRegistry singleton.N)r   ro   r   r   r   r   get_tool_policy_registryx  s   r   rc   c              
      s   |r|sdS z=| j jjd|idI dH }|du rW dS tt|dg p$g }||v r-W dS || | j jjd|id|idI dH  W dS  ty] } zt	d| W Y d}~dS d}~ww )	zGAdd tool_name to the permission's blocked_tools if not already present.Frc   rV   Nr^   Tr>   zDtool_registry_writer add_tool_to_object_permission_blocked error: %s)
rC   rf   rW   rz   r   rg   r=   rK   r   rL   r3   rc   r   r   currentrN   r   r   r   %add_tool_to_object_permission_blocked  s2   
r   c              
      s   |r sdS zA| j jjd|idI dH }|du rW dS tt|dg p$g } |vr-W dS  fdd|D }| j jjd|id|idI dH  W d	S  tya } ztd
| W Y d}~dS d}~ww )z\Remove tool_name from the permission's blocked_tools. Returns False if tool was not in list.Frc   rV   Nr^   c                    s   g | ]}| kr|qS r   r   )r   rm   r5   r   r   r7     s    z>remove_tool_from_object_permission_blocked.<locals>.<listcomp>r>   TzItool_registry_writer remove_tool_from_object_permission_blocked error: %s)	rC   rf   rW   rz   r   r=   rK   r   rL   r   r   r5   r   *remove_tool_from_object_permission_blocked  s4   r   r   r   )%r   rG   r   r   typingr   r   r   r   r   r	   r
   Zlitellm._loggingr   Zlitellm.proxy._typesr   Zlitellm.types.tool_managementr   r   Zlitellm.proxy.utilsr   r/   r2   rO   rF   rU   rX   rY   r]   rn   ro   r   __annotations__r   r   r   r   r   r   r   r   <module>   s    $/
>


.

7Q
