o
    ưiD                     @   s   d dl Z d dlZd dlmZmZ d dlmZmZmZ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 G dd	 d	Ze ZdS )
    N)datetimetimezone)AnyDictListOptional)
safe_dumps)&handle_update_object_permission_common)PrismaClient)AgentConfigAgentResponsePatchAgentRequestc                
   @   s~  e Zd Zdd Zdd ZdefddZdefd	d
Zd,de	e
e  fddZde
e fddZdedefddZd,de	e
e  fddZ		d-de	e
e  de	e
eeef   fddZdedededefddZdededeeef fdd Zdededed!edef
d"d#Zdededed!edef
d$d%Zedede
eeef  fd&d'Zdede	e fd(d)Zdede	e fd*d+ZdS ).AgentRegistryc                 C   
   g | _ d S N
agent_listself r   c/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/agent_endpoints/agent_registry.py__init__      
zAgentRegistry.__init__c                 C   r   r   r   r   r   r   r   reset_agent_list   r   zAgentRegistry.reset_agent_listagent_configc                 C   s   | j | d S r   )r   appendr   r   r   r   r   register_agent   s   zAgentRegistry.register_agent
agent_namec                    s    fdd| j D | _ d S )Nc                    s   g | ]	}|j  kr|qS r   r   .0agentr   r   r   
<listcomp>       z2AgentRegistry.deregister_agent.<locals>.<listcomp>r   )r   r   r   r   r   deregister_agent   s   
zAgentRegistry.deregister_agentNagent_namesc                    s"    d ur fdd| j D S | j S )Nc                    s   g | ]	}|j  v r|qS r   r   r    r&   r   r   r#      r$   z0AgentRegistry.get_agent_list.<locals>.<listcomp>r   )r   r&   r   r'   r   get_agent_list   s
   
zAgentRegistry.get_agent_listreturnc                 C   s8   g }t jd u r	|S | jD ]}|jt jv r|| q|S r   )litellmZpublic_agent_groupsr   agent_idr   )r   Zpublic_agent_listr"   r   r   r   get_public_agent_list$   s   


z#AgentRegistry.get_public_agent_listc                 C   s   t tj|dd  S )NT)	sort_keys)hashlibsha256jsondumpsencode	hexdigestr   r   r   r   _create_agent_id-   s
   zAgentRegistry._create_agent_idc                 C   sr   |d u rd S |D ].}t |tstd|d}|d}t||gs$q| |}| jtdd|i|d qd S )N+agent_config must be a list of dictionariesr   agent_card_paramsr+   r   r   )
isinstancedict
ValueErrorgetallr4   r   r   )r   r   agent_config_itemr   r6   Zconfig_hashr   r   r   load_agents_from_config2   s   



z%AgentRegistry.load_agents_from_config	db_agentsc                 C   s   |    |r$|D ]}t|tstd| jtdd| |i|d q|r?|D ]}t|ts3td| jtdi |d q(| jS )Nr5   r+   r7   z(db_agents must be a list of dictionariesr   )r   r8   r9   r:   r   r   r4   r   )r   r   r?   r=   Zdb_agentr   r   r   load_agents_from_db_and_configD   s   
"
z,AgentRegistry.load_agents_from_db_and_configr"   prisma_client
created_byc              
      s  z| d}| di }t|dr| }n|rt|ni }t|}| di }t|dr3| }	n|r9t|ni }	t|	}
d}| ddurUt|}t|d|I dH }| d}|rbtt|nd}| d}|||
||ttj	ttj	d	}|dur||d< |dur||d< |dur||d
< dD ]}| |}|dur|||< q|j
jj|ddidI dH }| }|jdurz	|j |d< W n ty   |j |d< Y nw tdi |W S  ty } z	tdt| d}~ww )z.
        Add an agent to the database
        r   litellm_params
model_dumpr6   Nobject_permissionstatic_headersextra_headers)r   rC   r6   rB   
updated_by
created_at
updated_atobject_permission_idZ	tpm_limitZ	rpm_limitZsession_tpm_limitZsession_rpm_limitT)dataincludezError adding agent to DB: r   )r;   hasattrrD   r9   r   r	   r   nowr   utcdblitellm_agentstablecreaterE   	Exceptionr   str)r   r"   rA   rB   r   litellm_params_objlitellm_params_dictrC   agent_card_params_objagent_card_params_dictr6   rK   
agent_copyZstatic_headers_objZstatic_headers_valZextra_headers_valZcreate_data
rate_field_valZcreated_agentZcreated_agent_dicter   r   r   add_agent_to_db]   sx   









	

zAgentRegistry.add_agent_to_dbr+   c              
      sR   z|j jjd|idI dH }t|W S  ty( } z	tdt| d}~ww )z3
        Delete an agent from the database
        r+   whereNzError deleting agent from DB: )rR   rS   deleter9   rU   rV   )r   r+   rA   Zdeleted_agentr^   r   r   r   delete_agent_from_db   s   
z"AgentRegistry.delete_agent_from_dbrH   c              
      s  z|j jjd|idI dH }|durt|}|du r#td| di ||}i }|dr7|d|d< |drEt|d|d< |drSt|d|d< d	D ]}||v rb||||< qUd
|v rz|d
}	t|	durut|	ni |d
< d|v r|d}
|
dur|
ng |d< |ddurt|}|d}t|||I dH }|dur||d< |j jjd|ii ||t	
tjdddidI dH }| }|jdurz	|j |d< W n ty   |j |d< Y nw tdi |W S  ty
 } z	tdt| d}~ww )a  
        Patch an agent in the database.

        Get the existing agent from the database and patch it with the new values.

        Args:
            agent_id: The ID of the agent to patch
            agent: The new agent values to patch
            prisma_client: The Prisma client to use
            updated_by: The user ID of the user who is patching the agent

        Returns:
            The patched agent
        r+   r`   NzAgent with ID z
 not foundr   rC   r6   rL   rF   rG   rE   rK   )rH   rJ   Tra   rM   rN   zError patching agent in DB: r   )rR   rS   find_uniquer9   rU   r;   r   r	   updater   rP   r   rQ   rD   rE   r   rV   )r   r+   r"   rA   rH   existing_agentZaugment_agentupdate_datar\   Zheaders_valueZextra_headers_valuer[   existing_object_permission_idrK   Zpatched_agentZpatched_agent_dictr^   r   r   r   patch_agent_in_db   s   





	
zAgentRegistry.patch_agent_in_dbc              
      s  z| d}| di }t|dr| }n|rt|ni }t|}| di }	t|	dr3|	 }
n|	r9t|	ni }
t|
}| d}|durNtt|nti }| dpXg }||||||ttjd}d	D ]}| |}|durx|||< qi| d
dur|j	j
jd|idI dH }|dur|jnd}t|}t|||I dH }|dur||d< |j	j
jd|i|d
didI dH }| }|jdurz	|j |d
< W n ty   |j |d
< Y nw tdi |W S  ty } z	tdt| d}~ww )z1
        Update an agent in the database
        r   rC   rD   r6   rF   NrG   )r   rC   r6   rF   rG   rH   rJ   rL   rE   r+   r`   rK   Trd   zError updating agent in DB: r   )r;   rO   rD   r9   r   r   rP   r   rQ   rR   rS   re   rK   r	   rf   rE   rU   r   rV   )r   r+   r"   rA   rH   r   rW   rX   rC   rY   rZ   r6   Zstatic_headers_obj_uZstatic_headers_val_uZextra_headers_val_urh   r\   r]   rg   ri   r[   rK   Zupdated_agentZupdated_agent_dictr^   r   r   r   update_agent_in_db  s   










z AgentRegistry.update_agent_in_dbc              
      s   zB| j jjddiddidI dH }g }|D ]*}t|}|jdur;z	|j |d< W n ty:   |j |d< Y nw || q|W S  tyX } z	tdt| d}~ww )z2
        Get all agents from the database
        rI   ZdescrE   T)orderrN   NzError getting agents from DB: )	rR   rS   Z	find_manyr9   rE   rD   rU   r   rV   )rA   Zagents_from_dbZagentsr"   Z
agent_dictr^   r   r   r   get_all_agents_from_dbw  s*   
z$AgentRegistry.get_all_agents_from_dbc              
   C   R   z| j D ]}|j|kr|  W S qW dS  ty( } z	tdt| d}~ww )z:
        Get an agent by its ID from the database
        NError getting agent from DB: )r   r+   rU   rV   )r   r+   r"   r^   r   r   r   get_agent_by_id  s   


zAgentRegistry.get_agent_by_idc              
   C   rn   )z<
        Get an agent by its name from the database
        Nro   )r   r   rU   rV   )r   r   r"   r^   r   r   r   get_agent_by_name  s   


zAgentRegistry.get_agent_by_namer   )NN)__name__
__module____qualname__r   r   r   r   rV   r%   r   r   r(   r,   r   r4   r>   r   r   r@   r
   r_   rc   r   rj   rk   staticmethodrm   rp   rq   r   r   r   r   r      s    	


R


\
^
r   )r.   r0   r   r   typingr   r   r   r   r*   Z*litellm.litellm_core_utils.safe_json_dumpsr   Z8litellm.proxy.management_helpers.object_permission_utilsr	   Zlitellm.proxy.utilsr
   Zlitellm.types.agentsr   r   r   r   Zglobal_agent_registryr   r   r   r   <module>   s       
&