o
    ưi7                     @   s`   d Z ddlZddlmZmZmZmZ ddlmZ ddl	m
Z
mZ de
fddZG d	d
 d
ZdS )z
Handler for LiteLLM database-backed skills operations.

This module contains the actual database operations for skills CRUD.
Used by the transformation layer and skills injection hook.
    N)AnyDictListOptional)verbose_logger)LiteLLM_SkillsTableNewSkillRequestreturnc                 C   s^   ddl }|  }|ddur(t|d tr ||d |d< nt|d tr(	 tdi |S )zw
    Convert a Prisma skill record to LiteLLM_SkillsTable.
    
    Handles Base64 decoding of file_content field.
    r   Nfile_content )base64Z
model_dumpget
isinstancestr	b64decodebytesr   )Zprisma_skillr   datar   r   `/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/litellm_proxy/skills/handler.py_prisma_skill_to_litellm   s   r   c                	   @   s   e Zd ZdZedd Ze	ddedee de	fdd	Z
e	
	ddededee	 fddZedede	fddZededeeef fddZededee	 fddZdS )LiteLLMSkillsHandlerz
    Handler for LiteLLM database-backed skills operations.

    This class provides static methods for CRUD operations on skills
    stored in the LiteLLM proxy database (LiteLLM_SkillsTable).
    c                     s"   ddl m}  | du rtd| S )z(Get the prisma client from proxy server.r   prisma_clientNzRPrisma client is not initialized. Database connection required for LiteLLM skills.)Zlitellm.proxy.proxy_serverr   
ValueErrorr   r   r   r   _get_prisma_client-   s   z'LiteLLMSkillsHandler._get_prisma_clientNr   user_idr	   c                    s   t  I dH }dt  }|| j| j| jd||d}| jdur.ddlm	} || j|d< | j
durAddlm} || j
|d	< | jdurK| j|d
< | jdurU| j|d< td| d| j  |jjj|dI dH }t|S )z
        Create a new skill in the LiteLLM database.

        Args:
            data: NewSkillRequest with skill details
            user_id: Optional user ID for tracking

        Returns:
            LiteLLM_SkillsTable record
        NZlitellm_skill_Zcustom)skill_iddisplay_titledescriptioninstructionssourceZ
created_byZ
updated_byr   )
safe_dumpsmetadata)Base64r
   	file_name	file_typez%LiteLLMSkillsHandler: Creating skill z with title=)r   )r   r   uuiduuid4r   r   r   r!   Z*litellm.litellm_core_utils.safe_json_dumpsr    r
   Zprisma.fieldsr"   encoder#   r$   r   debugdblitellm_skillstablecreater   )r   r   r   r   Z
skill_datar    r"   Z	new_skillr   r   r   create_skill9   s4   





z!LiteLLMSkillsHandler.create_skill   r   limitoffsetc                    sR   t  I dH }td|  d|  |jjj| |ddidI dH }dd |D S )	z
        List skills from the LiteLLM database.

        Args:
            limit: Maximum number of skills to return
            offset: Number of skills to skip

        Returns:
            List of LiteLLM_SkillsTable records
        Nz0LiteLLMSkillsHandler: Listing skills with limit=z	, offset=Z
created_atZdesc)Ztakeskiporderc                 S   s   g | ]}t |qS r   )r   ).0sr   r   r   
<listcomp>   s    z4LiteLLMSkillsHandler.list_skills.<locals>.<listcomp>)r   r   r   r(   r)   r*   Z	find_many)r.   r/   r   Zskillsr   r   r   list_skillsn   s   z LiteLLMSkillsHandler.list_skillsr   c                    sX   t  I dH }td|   |jjjd| idI dH }|du r(td|  t|S )z
        Get a skill by ID from the LiteLLM database.

        Args:
            skill_id: The skill ID to retrieve

        Returns:
            LiteLLM_SkillsTable record

        Raises:
            ValueError: If skill not found
        Nz$LiteLLMSkillsHandler: Getting skill r   whereSkill not found: )	r   r   r   r(   r)   r*   find_uniquer   r   r   r   Zskillr   r   r   	get_skill   s   zLiteLLMSkillsHandler.get_skillc                    st   t  I dH }td|   |jjjd| idI dH }|du r(td|  |jjjd| idI dH  | ddS )z
        Delete a skill by ID from the LiteLLM database.

        Args:
            skill_id: The skill ID to delete

        Returns:
            Dict with id and type of deleted skill

        Raises:
            ValueError: If skill not found
        Nz%LiteLLMSkillsHandler: Deleting skill r   r6   r8   Zskill_deleted)idtype)	r   r   r   r(   r)   r*   r9   r   deleter:   r   r   r   delete_skill   s   
z!LiteLLMSkillsHandler.delete_skillc              
      sd   z	t | I dH W S  ty   Y dS  ty1 } ztd|  d|  W Y d}~dS d}~ww )aO  
        Fetch a skill from the database (used by skills injection hook).

        This is a convenience method that returns None instead of raising
        an exception if the skill is not found.

        Args:
            skill_id: The skill ID to fetch

        Returns:
            LiteLLM_SkillsTable or None if not found
        Nz+LiteLLMSkillsHandler: Error fetching skill z: )r   r;   r   	Exceptionr   warning)r   er   r   r   fetch_skill_from_db   s   z(LiteLLMSkillsHandler.fetch_skill_from_db)N)r-   r   )__name__
__module____qualname____doc__staticmethodr   r   r   r   r   r,   intr   r5   r;   r   r?   rC   r   r   r   r   r   %   s:    
4r   )rG   r%   typingr   r   r   r   Zlitellm._loggingr   Zlitellm.proxy._typesr   r   r   r   r   r   r   r   <module>   s    