Ë
    uPêj“  ã                   óÊ   — U d Z ddlZddlmZ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 ddlmZmZmZmZ dd	lmZ d
Zeed<    edd¬«      Zeed<   defd„Z G d„ d«      Zy)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ÚFinal)Úverbose_logger)ÚInMemoryCache)ÚLITELLM_SKILL_ID_PREFIX)ÚLiteLLM_SkillsTableÚNewSkillRequestÚUserAPIKeyAuth)Ú get_primary_resource_owner_scopeÚget_resource_owner_scopesÚis_proxy_adminÚuser_can_access_resource_owner)ÚSkillsRepositoryÚ__litellm_skill_not_found__Ú_NEGATIVE_SKILL_SENTINELi'  é<   )Úmax_size_in_memoryÚdefault_ttlÚ_SKILL_CACHEÚreturnc                 ó¶   — ddl }| j                  «       }|j                  d«      �*t        |d   t        «      r|j                  |d   «      |d<   t        di |¤ŽS )u´   Convert a Prisma skill record to LiteLLM_SkillsTable.

    Handles Base64 decoding of file_content field â€” model_dump() converts
    Base64 fields to base64-encoded strings.
    r   NÚfile_content© )Úbase64Ú
model_dumpÚgetÚ
isinstanceÚstrÚ	b64decoder   )Úprisma_skillr   Údatas      ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/litellm_proxy/skills/handler.pyÚ_prisma_skill_to_litellmr#   !   s[   € ó à×)Ñ)Ó+€Dà‡x�x�ÓÐ+Ü�d˜>Ñ*¬CÔ0Ø#)×#3Ñ#3°D¸Ñ4HÓ#IˆD�Ñ äÑ& Ñ&Ð&ó    c                   ó2  — e Zd ZdZed„ «       Ze	 	 ddededz  dedz  de	fd„«       Z
e	 	 	 dd	ed
ededz  dee	   fd„«       Zedededz  fd„«       Ze	 ddededz  de	fd„«       Ze	 ddededz  deeef   fd„«       Ze	 ddededz  de	dz  fd„«       Zy)ÚLiteLLMSkillsHandlerz2CRUD for skills stored in ``litellm_skillstable``.c               ƒ   ó4   K  — ddl m}  | €t        d«      ‚| S ­w)Nr   ©Úprisma_clientzRPrisma client is not initialized. Database connection required for LiteLLM skills.)Úlitellm.proxy.proxy_serverr)   Ú
ValueErrorr(   s    r"   Ú_get_prisma_clientz'LiteLLMSkillsHandler._get_prisma_client5   s!   è ø€ å<àÐ ÜÐqÓrÐrØÐùs   ‚Nr!   Úuser_idÚuser_api_key_dictr   c              ƒ   óØ  K  — t         j                  «       ƒ d {  –—† }t        › t        j                  «       › �}t        |«      xs |}|€t        d«      ‚|| j                  | j                  | j                  d||dœ}| j                  �ddlm}  || j                  «      |d<   | j                  �$ddlm} |j!                  | j                  «      |d<   | j"                  �| j"                  |d	<   | j$                  �| j$                  |d
<   t'        j(                  d|| j                  «       t+        |«      j,                  j/                  |¬«      ƒ d {  –—† }	t1        |	«      S 7 �ŒK7 Œ­w)Nz?Unable to record skill ownership: caller has no identity scope.Úcustom)Úskill_idÚdisplay_titleÚdescriptionÚinstructionsÚsourceÚ
created_byÚ
updated_byr   )Ú
safe_dumpsÚmetadata)ÚBase64r   Ú	file_nameÚ	file_typez5LiteLLMSkillsHandler: Creating skill %s with title=%s)r!   )r&   r,   r   ÚuuidÚuuid4r   r+   r2   r3   r4   r9   Ú*litellm.litellm_core_utils.safe_json_dumpsr8   r   Úprisma.fieldsr:   Úencoder;   r<   r   Údebugr   ÚtableÚcreater#   )
r!   r-   r.   r)   r1   ÚownerÚ
skill_datar8   r:   Ú	new_skills
             r"   Úcreate_skillz!LiteLLMSkillsHandler.create_skill=   sR  è ø€ ô &:×%LÑ%LÓ%N×Nˆä4Ð5´d·j±j³l°^ÐDˆÜ7Ð8IÓJÒUÈgˆØˆ=ô Ð^Ó_Ð_ð !Ø!×/Ñ/Ø×+Ñ+Ø ×-Ñ-ØØØñ-
ˆ
ð �=‰=Ð$ÝMá%/°·±Ó%>ˆJ�zÑ"à×ÑÐ(Ý,à)/¯©°t×7HÑ7HÓ)IˆJ�~Ñ&Ø�>‰>Ð%Ø&*§n¡nˆJ�{Ñ#Ø�>‰>Ð%Ø&*§n¡nˆJ�{Ñ#ä×ÑÐTÐV^Ð`d×`rÑ`rÔsä!1°-Ó!@×!FÑ!F×!MÑ!MÐS]Ð!MÓ!^×^ˆ	Ü'¨	Ó2Ð2ðO  OùðL _ús"   ‚E*šE%›D:E*ÅE(ÅE*Å(E*ÚlimitÚoffsetc              ƒ   óh  K  — t         j                  «       ƒ d {  –—† }t        j                  d| |«       | |ddidœ}|�#t	        |«      st        |«      }|sg S dd|ii|d<    t        |«      j                  j                  di |¤Žƒ d {  –—† }|D �cg c]  }t        |«      ‘Œ c}S 7 ŒŽ7 Œc c}w ­w)	Nz=LiteLLMSkillsHandler: Listing skills with limit=%s, offset=%sÚ
created_atÚdesc)ÚtakeÚskipÚorderr6   ÚinÚwherer   )
r&   r,   r   rB   r   r   r   rC   Ú	find_manyr#   )rI   rJ   r.   r)   Úfind_many_kwargsÚowner_scopesÚskillsÚss           r"   Úlist_skillsz LiteLLMSkillsHandler.list_skillsl   sÊ   è ø€ ô &:×%LÑ%LÓ%N×Nˆä×ÑÐ\Ð^cÐekÔlð ØØ" FÐ+ñ3
Ðð
 Ð(´Ð@QÔ1RÜ";Ð<MÓ"NˆLÙØ�	Ø)5¸¸lÐ7KÐ(LÐ˜WÑ%àMÔ.¨}Ó=×CÑC×MÑMÑaÐP`Ña×aˆØ5;Ö<°Ô(¨Õ+Ò<Ð<ð!  Oøð búÚ<ùs4   ‚B2šB)›A0B2ÂB+ÂB2ÂB-Â&B2Â+B2Â-B2r1   c              ƒ   ó:  K  — t         j                  | «      }|t        k(  ry|�|S t        j	                  «       ƒ d{  –—† }t        |«      j                  j                  d| i¬«      ƒ d{  –—† }t         j                  | |�|«       |S t        «       |S 7 ŒY7 Œ,­w)z•Cache-first read of the Prisma skill row. Owner-scope filtering
        happens on the cached row, so the cache is per-skill not per-caller.
        Nr1   ©rR   )	r   Ú	get_cacher   r&   r,   r   rC   Úfind_uniqueÚ	set_cache)r1   Úcachedr)   Úskills       r"   Ú_load_skillz LiteLLMSkillsHandler._load_skill„   s›   è ø€ ô
 %×.Ñ.¨xÓ8ˆØÔ-Ò-ØØÐØˆMä%9×%LÑ%LÓ%N×NˆÜ-¨mÓ<×BÑB×NÑNÐV`ÐbjÐUkÐNÓl×lˆÜ×Ñ˜x°%Ð2C¨ÔbØˆô JbÔbØˆð  OøØlús!   ‚;B½B¾.BÁ,BÁ-+BÂBc              ƒ   óØ   K  — t        j                  d| «       t        j                  | «      ƒ d {  –—† }|�t	        t        |dd «      |«      st        d| › �«      ‚t        |«      S 7 Œ6­w)Nz&LiteLLMSkillsHandler: Getting skill %sr6   úSkill not found: )r   rB   r&   r`   r   Úgetattrr+   r#   )r1   r.   r_   s      r"   Ú	get_skillzLiteLLMSkillsHandler.get_skill”   sl   è ø€ ô
 	×ÑÐEÀxÔPä1×=Ñ=¸hÓG×Gˆð ˆ=Ô >¼wÀuÈlÐ\`Ó?aÐctÔ uÜÐ0°°
Ð;Ó<Ð<ä'¨Ó.Ð.ð Hús   ‚/A*±A(²7A*c              ƒ   óž  K  — t         j                  «       ƒ d {  –—† }t        j                  d| «       t         j	                  | «      ƒ d {  –—† }|�t        t        |dd «      |«      st        d| › �«      ‚t        |«      j                  j                  d| i¬«      ƒ d {  –—†  t        j                  | t        «       | ddœS 7 Œ¬7 Œ{7 Œ'­w)Nz'LiteLLMSkillsHandler: Deleting skill %sr6   rb   r1   rZ   Úskill_deleted)ÚidÚtype)r&   r,   r   rB   r`   r   rc   r+   r   rC   Údeleter   r]   r   )r1   r.   r)   r_   s       r"   Údelete_skillz!LiteLLMSkillsHandler.delete_skill£   sÁ   è ø€ ô
 &:×%LÑ%LÓ%N×NˆÜ×ÑÐFÈÔQä1×=Ñ=¸hÓG×GˆØˆ=Ô >¼wÀuÈlÐ\`Ó?aÐctÔ uÜÐ0°°
Ð;Ó<Ð<ä˜}Ó-×3Ñ3×:Ñ:À*ÈhÐAWÐ:ÓX×XÐXÜ×Ñ˜xÔ)AÔBà¨Ñ8Ð8ð  Oøð Høð 	Yús4   ‚CšC›2CÁC	ÁACÂ#CÂ$$CÃ	CÃCc              ƒ   ó¼   K  — 	 t         j                  | |¬«      ƒ d{  –—† S 7 Œ# t        $ r Y yt        $ r!}t	        j
                  d| |«       Y d}~yd}~ww xY w­w)z‚Skills-injection-hook helper: returns None instead of raising on
        not-found / not-authorized so the hook can silently skip.)r.   Nz1LiteLLMSkillsHandler: Error fetching skill %s: %s)r&   rd   r+   Ú	Exceptionr   Úwarning)r1   r.   Úes      r"   Úfetch_skill_from_dbz(LiteLLMSkillsHandler.fetch_skill_from_db´   sZ   è ø€ ð	Ü-×7Ñ7¸ÐTeÐ7Óf×fÐfÐfùÜò 	ÙÜò 	Ü×"Ñ"Ð#VÐX`ÐbcÔdÜûð	üs@   ‚A„% ž#Ÿ% ¢A£% ¥	A®A°A¸AÁAÁAÁA)NN)é   r   N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr,   r	   r   r
   r   rH   ÚintÚlistrX   r   r`   rd   Údictrj   ro   r   r$   r"   r&   r&   2   sˆ  „ Ù<àñó ðð ð #Ø37ñ,3Øð,3à�t‘ð,3ð *¨DÑ0ð,3ð 
ò	,3ó ð,3ð\ àØØ37ñ=Øð=àð=ð *¨DÑ0ð=ð 
Ð!Ñ	"ò	=ó ð=ð. ð Cð ¨C°$©Jò ó ðð ð 48ñ/Øð/à)¨DÑ0ð/ð 
ò/ó ð/ð ð 48ñ9Øð9à)¨DÑ0ð9ð 
ˆc�3ˆh‰ò9ó ð9ð  ð 48ñØðà)¨DÑ0ðð 
˜tÑ	#òó ñr$   r&   )rt   r=   Útypingr   r   Úlitellm._loggingr   Úlitellm.caching.in_memory_cacher   Ú+litellm.llms.litellm_proxy.skills.constantsr   Úlitellm.proxy._typesr   r	   r
   Ú-litellm.proxy.common_utils.resource_ownershipr   r   r   r   Ú'litellm.repositories.table_repositoriesr   r   Ú__annotations__r   r#   r&   r   r$   r"   ú<module>r�      si   ðòó ß å +Ý 9Ý Oß UÑ U÷ó õ Eð #@Ð ˜%Ó ?Ù#°uÈ"ÔM€ˆeÓ Mð'Ð.Aó '÷"Oò Or$   