o
    ưiS                     @   s   d Z ddlmZmZmZmZmZmZmZ ddl	m
Z
mZmZ ddlmZ er-ddlmZ ne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 G dd dZG dd dZG dd deZdS )z
BitBucket prompt manager that integrates with LiteLLM's prompt management system.
Fetches .prompt files from BitBucket repositories and provides team-based access control.
    )TYPE_CHECKINGAnyDictListOptionalTupleUnion)
DictLoaderEnvironmentselect_autoescape)CustomPromptManagement)Logging)PromptManagementBasePromptManagementClient)AllMessageValues)
PromptSpec)StandardCallbackDynamicParams   )BitBucketClientc                
   @   sB   e Zd ZdZ	ddededeeef dee fddZd	d
 Z	dS )BitBucketPromptTemplatez=
    Represents a prompt template loaded from BitBucket.
    Ntemplate_idcontentmetadatamodelc                 C   sh   || _ || _|| _|p|d| _|d| _|d| _|di di | _dd | D | _	d S )Nr   temperature
max_tokensinputZschemac                 S   s   i | ]\}}|d vr||qS ))r   r   r    ).0kvr   r   n/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/bitbucket/bitbucket_prompt_manager.py
<dictcomp>.   s    z4BitBucketPromptTemplate.__init__.<locals>.<dictcomp>)
r   r   r   getr   r   r   Zinput_schemaitemsoptional_params)selfr   r   r   r   r   r   r!   __init__    s   z BitBucketPromptTemplate.__init__c                 C   s   d| j  d| j dS )NzBitBucketPromptTemplate(id='z
', model='z'))r   r   r&   r   r   r!   __repr__2   s   z BitBucketPromptTemplate.__repr__N)
__name__
__module____qualname____doc__strr   r   r   r'   r)   r   r   r   r!   r      s    	

r   c                   @   s   e Zd ZdZ	ddeeef dee fddZdeddfdd	Z	d
edede
fddZdedeeef fddZ	ddedeeeef  defddZdedee
 fddZdee fddZdS )BitBucketTemplateManagerap  
    Manager for loading and rendering .prompt files from BitBucket repositories.

    Supports:
    - Fetching .prompt files from BitBucket repositories
    - Team-based access control through BitBucket permissions
    - YAML frontmatter for metadata
    - Handlebars-style templating (using Jinja2)
    - Input/output schema validation
    - Model configuration
    Nbitbucket_config	prompt_idc              
   C   s\   || _ || _i | _t|| _tti tddgddddddd	| _| jr,| 	| j d S d S )
Nhtmlxmlz{{z}}z{%z%}z{#z#})loaderZ
autoescapeZvariable_start_stringZvariable_end_stringZblock_start_stringZblock_end_stringZcomment_start_stringZcomment_end_string)
r1   r2   promptsr   bitbucket_clientr
   r	   r   	jinja_env_load_prompt_from_bitbucketr&   r1   r2   r   r   r!   r'   C   s"   

z!BitBucketTemplateManager.__init__returnc              
   C   sf   z| j | d}|r| ||}|| j|< W dS W dS  ty2 } z
td| d| d}~ww )z,Load a specific .prompt file from BitBucket.z.promptzFailed to load prompt 'z' from BitBucket: N)r7   get_file_content_parse_prompt_filer6   	Exception)r&   r2   prompt_contenttemplateer   r   r!   r9   ]   s   z4BitBucketTemplateManager._load_prompt_from_bitbucketr   c                 C   s   | dr#|dd}t|dkr|d  }|d  }n	d}|}nd}|}i }|rQzddl}||p6i }W n tyF   | |}Y n tyP   i }Y nw t	|||dS )	z?Parse a .prompt file content and extract metadata and template.z---      r    r   N)r   r   r   )

startswithsplitlenstripyamlZ	safe_loadImportError_parse_yaml_basicr>   r   )r&   r   r2   partsZfrontmatter_strZtemplate_contentr   rI   r   r   r!   r=   k   s0   
z+BitBucketTemplateManager._parse_prompt_fileyaml_strc                 C   s   i }| dD ]O}| }d|v rV|dsV| dd\}}| }| }| dv r5| dk||< q| r@t|||< q|dd rOt|||< q|d	||< q|S )
z@Basic YAML parser for simple cases when PyYAML is not available.
:#r   )truefalserQ   .rD   z"')rF   rH   rE   lowerisdigitintreplacefloat)r&   rM   resultlinekeyvaluer   r   r!   rK      s    z*BitBucketTemplateManager._parse_yaml_basicr   	variablesc                 C   sF   || j vrtd| d| j | }| j|j}|jdi |p i S )z+Render a template with the given variables.z
Template '' not foundNr   )r6   
ValueErrorr8   Zfrom_stringr   render)r&   r   r]   r@   Zjinja_templater   r   r!   render_template   s
   

z(BitBucketTemplateManager.render_templatec                 C   s   | j |S )zGet a template by ID.)r6   r#   )r&   r   r   r   r!   get_template   s   z%BitBucketTemplateManager.get_templatec                 C   s   t | j S )z List all available template IDs.)listr6   keysr(   r   r   r!   list_templates   s   z'BitBucketTemplateManager.list_templatesr*   )r+   r,   r-   r.   r   r/   r   r   r'   r9   r   r=   rK   ra   rb   r   re   r   r   r   r!   r0   6   s6    


$
r0   c                    @   sH  e Zd ZdZ	d5deeef dee fddZe	defdd	Z
e	defd
dZ	d5dedeeeef  deeeeef f fddZ				d6dee dee deeeeef ef  deeeef  dee deeeef  deee eeeef  f fddZdedee fddZ				d6dee dedee deeeeef ef  deeeef  dee deeeef  defddZdee fddZd7ddZdee d ee d!edefd"d#Z		d8dee d ee dee d!ed$ee d%ee defd&d'Z			d9dee dee d!ed ee d$ee d%ee defd(d)Z				*	*d:d+edee d,edee dee d!ed ee d$ee d%ee d-ee d.ee deeee ef fd/d0Z 					*	*d;d+edee d,edee dee d!ed1e!d ee d2eee  d$ee d%ee d-ee d.ee deeee ef fd3d4Z"dS )<BitBucketPromptManagerah  
    BitBucket prompt manager that integrates with LiteLLM's prompt management system.

    This class enables using .prompt files from BitBucket repositories with the
    litellm completion() function by implementing the PromptManagementBase interface.

    Usage:
        # Configure BitBucket access
        bitbucket_config = {
            "workspace": "your-workspace",
            "repository": "your-repo",
            "access_token": "your-token",
            "branch": "main"  # optional, defaults to main
        }

        # Use with completion
        response = litellm.completion(
            model="bitbucket/gpt-4",
            prompt_id="my_prompt",
            prompt_variables={"variable": "value"},
            bitbucket_config=bitbucket_config,
            messages=[{"role": "user", "content": "This will be combined with the prompt"}]
        )
    Nr1   r2   c                 C   s   || _ || _d | _d S r*   )r1   r2   _prompt_managerr:   r   r   r!   r'      s   
zBitBucketPromptManager.__init__r;   c                 C   s   dS )z<Integration name used in model names like 'bitbucket/gpt-4'.Z	bitbucketr   r(   r   r   r!   integration_name   s   z'BitBucketPromptManager.integration_namec                 C   s"   | j du rt| j| jd| _ | j S )z*Get or create the prompt manager instance.N)r1   r2   )rg   r0   r1   r2   r(   r   r   r!   prompt_manager   s   
z%BitBucketPromptManager.prompt_managerprompt_variablesc                 C   sR   | j |}|std| d| j ||pi }|j|j|jd|j}||fS )a  
        Get a prompt template and render it with variables.

        Args:
            prompt_id: The ID of the prompt template
            prompt_variables: Variables to substitute in the template

        Returns:
            Tuple of (rendered_prompt, metadata)
        zPrompt template 'r^   )r   r   r   )ri   rb   r_   ra   r   r   r   r%   )r&   r2   rj   r@   rendered_promptr   r   r   r!   get_prompt_template   s   z*BitBucketPromptManager.get_prompt_templateuser_idmessagesfunction_calllitellm_paramsc              
   K   s   |s||fS z?|  ||\}}	| |}
|
r|
}nd|dg| }|du r'i }|	dr2|	d |d< dD ]}||	v r@|	| ||< q4||fW S  tyi } zddl}|jjd|  ||fW  Y d}~S d}~ww )z^
        Pre-call hook that processes the prompt template before making the LLM call.
        userZroler   Nr   r   r   Ztop_pZfrequency_penaltyZpresence_penaltyr   z)Error in BitBucket prompt pre_call_hook: )rl   _parse_prompt_to_messagesr#   r>   litellmZ_loggingZverbose_proxy_loggererror)r&   rm   rn   ro   rp   r2   rj   kwargsrk   prompt_metadataZparsed_messagesZfinal_messagesparamrA   ru   r   r   r!   pre_call_hook  s<   


z$BitBucketPromptManager.pre_call_hookr?   c                 C   sV  g }|  d}d}g }|D ]z}|  }|sq| dr<|r0|r0||d|  d d}|dd   g}q| dr`|rT|rT||d|  d d}|d	d   g}q| d
r|rx|rx||d|  d d}|dd   g}q|| q|r|r||d|  d |s|  rd|  dg}|S )z
        Parse prompt content into a list of messages.
        Handles both simple prompts and multi-role conversations.
        rN   Nzsystem:rr   system   zuser:rq      z
assistant:Z	assistant
   )rH   rF   rT   rE   appendjoin)r&   r?   rn   linesZcurrent_roleZcurrent_contentrZ   r   r   r!   rt   M  sV   z0BitBucketPromptManager._parse_prompt_to_messagesresponseinput_messagesc           	      K   s   |S )zL
        Post-call hook for any post-processing after the LLM call.
        r   )	r&   rm   r   r   ro   rp   r2   rj   rw   r   r   r!   post_call_hook  s   z%BitBucketPromptManager.post_call_hookc                 C   s
   | j  S )z!Get list of available prompt IDs.)ri   re   r(   r   r   r!   get_available_prompts  s   
z,BitBucketPromptManager.get_available_promptsc                 C   s   | j rd| _| j dS dS )zReload prompts from BitBucket.N)r2   rg   ri   r(   r   r   r!   reload_prompts  s   
z%BitBucketPromptManager.reload_promptsprompt_specdynamic_callback_paramsc                 C   s   |duS )z
        Determine if prompt management should run based on the prompt_id.

        For BitBucket, we always return True and handle the prompt loading
        in the _compile_prompt_helper method.
        Nr   )r&   r2   r   r   r   r   r!   should_run_prompt_management  s   z3BitBucketPromptManager.should_run_prompt_managementprompt_labelprompt_versionc              
   C   s   |du rt dz9|| jjvr| j| | ||\}}| |}	|d}
i }dD ]}||v r7|| ||< q+t||	|
|ddW S  tyW } z
t d| d| d}~ww )aS  
        Compile a BitBucket prompt template into a PromptManagementClient structure.

        This method:
        1. Loads the prompt template from BitBucket
        2. Renders it with the provided variables
        3. Converts the rendered text into chat messages
        4. Extracts model and optional parameters from metadata
        N2prompt_id is required for BitBucket prompt managerr   rs   )r2   Zprompt_templateZprompt_template_modelZprompt_template_optional_paramsZcompleted_messageszError compiling prompt 'z': )	r_   ri   r6   r9   rl   rt   r#   r   r>   )r&   r2   r   rj   r   r   r   rk   rx   rn   Ztemplate_modelr%   ry   rA   r   r   r!   _compile_prompt_helper  s4   

z-BitBucketPromptManager._compile_prompt_helperc                    s(   |du r	t d| j||||||dS )z
        Async version of compile prompt helper. Since BitBucket operations use sync client,
        this simply delegates to the sync version.
        Nr   )r2   r   rj   r   r   r   )r_   r   )r&   r2   rj   r   r   r   r   r   r   r!   async_compile_prompt_helper  s   z2BitBucketPromptManager.async_compile_prompt_helperFr   non_default_paramsignore_prompt_manager_model%ignore_prompt_manager_optional_paramsc                 C   s   t j| |||||||||	d
S )zq
        Get chat completion prompt from BitBucket and return processed model, messages, and parameters.
        )r   r   r   )r   get_chat_completion_prompt)r&   r   rn   r   r2   rj   r   r   r   r   r   r   r   r   r!   r     s   z1BitBucketPromptManager.get_chat_completion_promptlitellm_logging_objtoolsc                    s.   t j| |||||||||	|
|||dI dH S )zY
        Async version - delegates to PromptManagementBase async implementation.
        )
r2   rj   r   r   r   r   r   r   r   r   N)r    async_get_chat_completion_prompt)r&   r   rn   r   r2   rj   r   r   r   r   r   r   r   r   r   r   r!   r   &  s"   z7BitBucketPromptManager.async_get_chat_completion_promptr*   )NNNN)r;   N)NN)NNN)NNNFF)NNNNFF)#r+   r,   r-   r.   r   r/   r   r   r'   propertyrh   r0   ri   r   rl   r   r   r   rz   rt   r   r   r   r   r   boolr   dictrV   r   r   r   r   LiteLLMLoggingObjr   r   r   r   r!   rf      sX   

	
&	
@C




A
!	

'	

rf   N) r.   typingr   r   r   r   r   r   r   Zjinja2r	   r
   r   Z-litellm.integrations.custom_prompt_managementr   Z*litellm.litellm_core_utils.litellm_loggingr   r   Z+litellm.integrations.prompt_management_baser   r   Zlitellm.types.llms.openair   Z"litellm.types.prompts.init_promptsr   Zlitellm.types.utilsr   r7   r   r   r0   rf   r   r   r   r!   <module>   s     $ 