Ë
    uPêj¥,  ã                   ó`   — d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZ  G d„ d«      Zy)	z²
Prompt Injection Handler for LiteLLM Skills

Handles extraction of skill content (SKILL.md) from stored ZIP files
and injection into the system prompt for non-Anthropic models.
é    N)ÚBytesIO)ÚAnyÚFinal)Úverbose_logger)ÚLiteLLM_SkillsTablec            	       ó¶   — e Zd ZdZdededz  fd„Zdedeeef   fd„Z		 ddede
e   d	edefd
„Zde
e   deeef   fd„Zdedeeef   fd„Zdedeeef   fd„Zy)ÚSkillPromptInjectionHandlera  
    Handles skill content extraction and system prompt injection.

    Responsibilities:
    - Extract SKILL.md content from skill ZIP files
    - Extract ALL files from ZIP for code execution
    - Inject skill content into system message
    - Create execute_code tool definition
    ÚskillÚreturnNc                 ó   — |j                   s|j                  S 	 t        |j                   «      }t        j                  |d«      5 }|j                  «       D ]a  }|j                  d«      sŒ|j                  |«      j                  d«      }|sŒ8d|j                  xs |j                  › d|› �c cddd«       S  |j                  «       D ]a  }|j                  d«      sŒ|j                  |«      j                  d«      }|sŒ8d|j                  xs |j                  › d|› �c cddd«       S  |j                  «       D ]a  }|j                  d«      sŒ|j                  |«      j                  d«      }|sŒ8d|j                  xs |j                  › d|› �c cddd«       S  	 ddd«       |j                  S # 1 sw Y   |j                  S xY w# t        $ r6}t        j                  d	|j                  |«       Y d}~|j                  S d}~ww xY w)
ap  
        Extract skill content from the stored zip file.

        Looks for SKILL.md or README.md in the zip and returns its content.
        This content describes the skill's capabilities and instructions.

        Args:
            skill: The skill from LiteLLM database

        Returns:
            The skill content as a string, or None if not available
        ÚrzSKILL.mdzutf-8z
## Skill: z

Nz	README.mdz.mdzGSkillPromptInjectionHandler: Error extracting content from skill %s: %s)Úfile_contentÚinstructionsr   ÚzipfileÚZipFileÚnamelistÚendswithÚreadÚdecodeÚdisplay_titleÚskill_idÚ	Exceptionr   Úwarning)Úselfr
   Ú
zip_bufferÚzfÚnameÚcontentÚes          úw/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/litellm_proxy/skills/prompt_injection.pyÚextract_skill_contentz1SkillPromptInjectionHandler.extract_skill_content   s  € ð ×!Ò!Ø×%Ñ%Ð%ð	Ü '¨×(:Ñ(:Ó ;ˆJÜ—‘ ¨SÓ1ð e°RàŸK™K›Mò e�DØ—}‘} ZÕ0Ø"$§'¡'¨$£-×"6Ñ"6°wÓ"?˜Ú"Ø%/°×0CÑ0CÒ0UÀuÇ~Á~Ð/VÐVZÐ[bÐZcÐ#dÑd÷eñ eðeð ŸK™K›Mò e�DØ—}‘} [Õ1Ø"$§'¡'¨$£-×"6Ñ"6°wÓ"?˜Ú"Ø%/°×0CÑ0CÒ0UÀuÇ~Á~Ð/VÐVZÐ[bÐZcÐ#dÑd÷eñ eðeð ŸK™K›Mò e�DØ—}‘} UÕ+Ø"$§'¡'¨$£-×"6Ñ"6°wÓ"?˜Ú"Ø%/°×0CÑ0CÒ0UÀuÇ~Á~Ð/VÐVZÐ[bÐZcÐ#dÑd÷)eñ eñ e÷!eð4 ×!Ñ!Ð!÷5eð4 ×!Ñ!Ð!ûô ò 	Ü×"Ñ"ØYÐ[`×[iÑ[iÐkl÷ð ð ×!Ñ!Ð!ûð	ús}   š+G Á%F7Á+"F7Â!F7Â/	G Â9%F7Ã"F7Ä!F7Ä#	G Ä-%F7Å"F7Å6!F7Æ	G Æ!F7Æ#G Æ7GÆ<G ÇG Ç	HÇ!HÈHc                 ó¾  — i }|j                   s|S 	 t        |j                   «      }t        j                  |d«      5 }|j	                  «       D ]¾  }|j                  d«      rŒ|j                  d«      }t        |«      dkD  rdj                  |dd «      }n|}|sŒNt        j                  |«      }|j                  d«      st        j                  |«      r"t        j                  d|j                  |«       Œ«|j!                  |«      ||<   ŒÀ 	 ddd«       |S # 1 sw Y   |S xY w# t"        $ r,}	t        j                  d|j                  |	«       Y d}	~	|S d}	~	ww xY w)a  
        Extract ALL files from skill ZIP for code execution.

        Returns a dict mapping file paths to their binary content.
        The paths have the skill folder prefix removed (e.g., "slack-gif-creator/core/..." -> "core/...").

        Args:
            skill: The skill from LiteLLM database

        Returns:
            Dict mapping file paths to binary content
        r   ú/é   Nz..zMSkillPromptInjectionHandler: Skipping entry with invalid path in skill %s: %szESkillPromptInjectionHandler: Error extracting files from skill %s: %s)r   r   r   r   r   r   ÚsplitÚlenÚjoinÚ	posixpathÚnormpathÚ
startswithÚisabsr   r   r   r   r   )
r   r
   Úfilesr   r   r   ÚpartsÚ
clean_pathÚ
normalizedr   s
             r    Úextract_all_filesz-SkillPromptInjectionHandler.extract_all_filesJ   sQ  € ð *,ˆà×!Ò!ØˆLð 	Ü '¨×(:Ñ(:Ó ;ˆJÜ—‘ ¨SÓ1ð 6°RØŸK™K›Mò 6�Dà—}‘} SÔ)Ø ð !ŸJ™J s›O�EÜ˜5“z A’~Ø%(§X¡X¨e°A°B¨iÓ%8™
à%)˜
á%Ø ô "+×!3Ñ!3°JÓ!?�JØ!×,Ñ,¨TÔ2´i·o±oÀjÔ6QÜ&×.Ñ.ØkØ!ŸN™NØ ôð
 !à(*¯©°«�E˜*Ò%ñ36÷6ð@ ˆ÷A6ð@ ˆûô ò 	Ü×"Ñ"ØWÐY^×YgÑYgÐij÷ð ð ˆûð	ús5   ’+D' ½CDÄD' ÄD$ÄD' Ä$D' Ä'	EÄ0!EÅEÚdataÚskill_contentsÚuse_anthropic_formatc                 óÞ  — |s|S ddj                  |«      z   }|r3|j                  dd«      }|r
||z   |d<   |S |j                  «       |d<   |S |j                  dg «      }|s|S d}t        |«      D ].  \  }}	t	        |	t
        «      sŒ|	j                  d«      dk(  sŒ,|} n |�!||   j                  dd«      }
|
|z   ||   d<   n#|j                  d	d|j                  «       d
œ«       ||d<   |S )ag  
        Inject skill content into the system prompt.

        For Anthropic messages API (use_anthropic_format=True):
        - Injects into top-level 'system' parameter (not in messages array)

        For OpenAI-style APIs (use_anthropic_format=False):
        - Injects into messages array with role="system"

        Args:
            data: The request data dict
            skill_contents: List of skill content strings to inject
            use_anthropic_format: If True, use top-level 'system' param for Anthropic

        Returns:
            Modified data dict with skill content in system prompt
        z

---

# Available Skills

z

---

ÚsystemÚ ÚmessagesNÚroler   r   )r8   r   )r'   ÚgetÚstripÚ	enumerateÚ
isinstanceÚdictÚinsert)r   r1   r2   r3   Úskill_sectionÚcurrent_systemr7   Úsystem_msg_idxÚiÚmsgÚcurrent_contents              r    Ú inject_skill_content_to_messagesz<SkillPromptInjectionHandler.inject_skill_content_to_messages€   s#  € ñ( ØˆKð  CÀ]×EWÑEWÐXfÓEgÑgˆáà$(§H¡H¨X°rÓ$:ˆNÙØ!/°-Ñ!?��X‘ð ˆKð "/×!4Ñ!4Ó!6��X‘ØˆKð Ÿ(™( :¨rÓ2ˆÙØˆKð ˆÜ Ó)ò 	‰FˆAˆsÜ˜#œtÕ$¨¯©°«¸HÓ)DØ!"�Ùð	ð
 Ð%à%-¨nÑ%=×%AÑ%AÀ)ÈRÓ%PˆOØ2AÀMÑ2QˆH�^Ñ$ YÒ/ð �O‰O˜A¨¸]×=PÑ=PÓ=RÑSÔTà#ˆˆZÑØˆó    Úskill_modulesc                 ó  — g }|dd D ]K  }|j                  d«      sŒ|j                  dd«      j                  dd«      }|j                  d|› d�«       ŒM d}|rd	d
j                  |«      › �}ddd|› �dddddœidgdœdœdœS )aw  
        Create the execute_code tool definition.

        This tool allows the model to execute Python code with access
        to the skill's modules (e.g., 'from core.gif_builder import GIFBuilder').

        Args:
            skill_modules: List of available module paths (e.g., ["core/gif_builder.py"])

        Returns:
            OpenAI-style tool definition
        Né   z.pyr#   ú.r6   zfrom z import ...z Available modules: z, ÚfunctionÚexecute_codezQExecute Python code in a sandboxed environment. Generated files will be returned.ÚobjectÚcodeÚstringzPPython code to execute. You can import skill modules and use standard libraries.)ÚtypeÚdescription©rP   Ú
propertiesÚrequired©r   rQ   Ú
parameters©rP   rK   )r   ÚreplaceÚappendr'   )r   rG   Úmodule_examplesÚmodÚimport_pathÚmodule_hints         r    Úcreate_execute_code_toolz4SkillPromptInjectionHandler.create_execute_code_toolº   sÉ   € ð "$ˆØ   !Ð$ò 	IˆCØ�|‰|˜EÕ"à!Ÿk™k¨#¨sÓ3×;Ñ;¸EÀ2ÓF�Ø×&Ñ&¨¨{¨m¸;Ð'GÕHð		Ið ˆÙØ0°·±¸?Ó1KÐ0LÐMˆKð à&Ø!rÐs~Ðrð   Aà$àØ$,Ø+}ñ!ð#ð "( ñ	ññ
ð 	
rF   c                 óÖ  — |j                   j                  dd«      j                  dd«      }|j                  xs+ |j                  xs |j                  xs d|j                   › �}d}t        |«      |kD  r|d|dz
   dz   }d	||d
i g dœdœdœ}|j                  rOt        |j                  t        «      r5|j                  j                  d«      }|rt        |t        «      r||d	   d<   |S )aO  
        Convert a LiteLLM skill to an OpenAI-style tool.

        The skill's instructions are used as the function description,
        allowing the model to understand when and how to use the skill.

        Args:
            skill: The skill from LiteLLM database

        Returns:
            OpenAI-style tool definition
        ú-Ú_ú úSkill: é   Né   ú...rK   rM   rR   rU   rW   rV   ©
r   rX   r   rQ   r   r&   Úmetadatar<   r=   r9   )r   r
   Ú	func_namerQ   Úmax_desc_lengthÚtoolÚparamss          r    Úconvert_skill_to_toolz1SkillPromptInjectionHandler.convert_skill_to_toolå   sù   € ð !Ÿ>™>×1Ñ1°#°sÓ;×CÑCÀCÈÓMˆ	ð ×(Ñ(Òr¨E×,=Ñ,=ÒrÀ×ATÑATÒrÐZaÐbg×bpÑbpÐaqÐXrˆð "&ˆÜˆ{Ó˜oÒ-Ø%Ð&;¨¸!Ñ(;Ð<¸uÑDˆKð à!Ø*à$Ø"$Ø "ñññ'
ˆð �>Š>œj¨¯©¼Ô>Ø!ŸN™N×.Ñ.¨|Ó<ˆFÙœ* V¬TÔ2Ø17��ZÑ  Ñ.àˆrF   c                 óÄ  — |j                   j                  dd«      j                  dd«      }|j                  xs+ |j                  xs |j                  xs d|j                   › �}d}t        |«      |kD  r|d|dz
   dz   }d	i g d
œ}|j                  rIt        |j                  t        «      r/|j                  j                  d«      }|rt        |t        «      r|}|||dœS )a   
        Convert a LiteLLM skill to an Anthropic-style tool (messages API format).

        Args:
            skill: The skill from LiteLLM database

        Returns:
            Anthropic-style tool definition with name, description, input_schema
        r`   ra   rb   rc   rd   Nre   rf   rM   rR   rV   )r   rQ   Úinput_schemarg   )r   r
   ri   rQ   rj   ro   rl   s          r    Úconvert_skill_to_anthropic_toolz;SkillPromptInjectionHandler.convert_skill_to_anthropic_tool  sè   € ð !Ÿ>™>×1Ñ1°#°sÓ;×CÑCÀCÈÓMˆ	à×(Ñ(Òr¨E×,=Ñ,=ÒrÀ×ATÑATÒrÐZaÐbg×bpÑbpÐaqÐXrˆà!%ˆÜˆ{Ó˜oÒ-Ø%Ð&;¨¸!Ñ(;Ð<¸uÑDˆKð ØØñ(
ˆð �>Š>œj¨¯©¼Ô>Ø!ŸN™N×.Ñ.¨|Ó<ˆFÙœ* V¬TÔ2Ø%�ð Ø&Ø(ñ
ð 	
rF   )F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ústrr!   r=   Úbytesr0   ÚlistÚboolrE   r   r^   rm   rp   © rF   r    r	   r	      sË   „ ñð,"Ð+>ð ,"À3ÈÁ:ó ,"ð\4Ð':ð 4¸tÀCÈÀJÑ?Oó 4ðn SXñ8Øð8Ø*.¨s©)ð8ØKOð8à	ó8ðt)
°d¸3±ið )
ÀDÈÈcÈÁNó )
ðV+Ð+>ð +À4ÈÈSÈÁ>ó +ðZ!
Ð5Hð !
ÈTÐRUÐWZÐRZÉ^ô !
rF   r	   )rt   r(   r   Úior   Útypingr   r   Úlitellm._loggingr   Úlitellm.proxy._typesr   r	   ry   rF   r    ú<module>r~      s*   ðñó Û Ý ß å +Ý 4÷b
ò b
rF   