Ë
    tPêjOG  ã                   ó¾   — d Z ddlmZmZ ddlmZmZ ddlmZ ddl	m
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«      Z G d„ d«      Z G d„ de
«      Zy)z¯
Arize Phoenix prompt manager that integrates with LiteLLM's prompt management system.
Fetches prompt versions from Arize Phoenix and provides workspace-based access control.
é    )ÚAnyÚFinal)Ú
DictLoaderÚselect_autoescape)ÚImmutableSandboxedEnvironment)ÚCustomPromptManagement)ÚPromptManagementBaseÚPromptManagementClient)ÚAllMessageValues)Ú
PromptSpec)ÚStandardCallbackDynamicParamsé   )ÚArizePhoenixClientc            
       óR   — e Zd ZdZ	 d	dedeeeef      deeef   dedz  fd„Zd„ Z	y)
ÚArizePhoenixPromptTemplatezA
    Represents a prompt template loaded from Arize Phoenix.
    NÚtemplate_idÚmessagesÚmetadataÚmodelc                 óp  — || _         || _        || _        |xs |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        |j                  di «      | _        |j                  dd«      | _	        |j                  dd	«      | _
        y )
NÚ
model_nameÚmodel_providerÚtemperatureÚ
max_tokensÚinvocation_parametersÚdescriptionÚ Útemplate_formatÚMUSTACHE)r   r   r   Úgetr   r   r   r   r   r   r   )Úselfr   r   r   r   s        ú|/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/arize/arize_phoenix_prompt_manager.pyÚ__init__z#ArizePhoenixPromptTemplate.__init__   s�   € ð 'ˆÔØ ˆŒØ ˆŒØÒ8˜hŸl™l¨<Ó8ˆŒ
Ø&Ÿl™lÐ+;Ó<ˆÔØ#Ÿ<™<¨Ó6ˆÔØ"Ÿ,™, |Ó4ˆŒØ%-§\¡\Ð2IÈ2Ó%NˆÔ"Ø#Ÿ<™<¨°rÓ:ˆÔØ'Ÿ|™|Ð,=¸zÓJˆÕó    c                 ó<   — d| j                   › d| j                  › d�S )NzArizePhoenixPromptTemplate(id='z
', model='z'))r   r   ©r!   s    r"   Ú__repr__z#ArizePhoenixPromptTemplate.__repr__.   s#   € Ø0°×1AÑ1AÐ0BÀ*ÈTÏZÉZÈLÐXZÐ[Ð[r$   ©N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚlistÚdictr   r#   r'   © r$   r"   r   r      s[   „ ñð !ñKàðKð �t˜C ˜H‘~Ñ&ðKð �s˜C�x‘.ð	Kð
 �T‰zóKó$\r$   r   c                   óÀ   — e Zd ZdZ	 	 	 ddedz  dedz  dedz  fd„Zdeddfd	„Zd
eeef   dede	fd„Z
ddedeeef   dz  dee   fd„Zdede	dz  fd„Zdee   fd„Zy)ÚArizePhoenixTemplateManageram  
    Manager for loading and rendering prompt templates from Arize Phoenix.

    Supports:
    - Fetching prompt versions from Arize Phoenix API
    - Workspace-based access control through Arize Phoenix permissions
    - Mustache/Handlebars-style templating (using Jinja2)
    - Model configuration and invocation parameters
    - Multi-message chat templates
    NÚapi_keyÚapi_baseÚ	prompt_idc           
      ó0  — || _         || _        || _        i | _        t	        | j                   | j                  ¬«      | _        t        t        i «      t        ddg«      dddddd	¬
«      | _	        | j                  r| j                  | j                  «       y y )N)r3   r4   ÚhtmlÚxmlz{{z}}z{%z%}z{#z#})ÚloaderÚ
autoescapeÚvariable_start_stringÚvariable_end_stringÚblock_start_stringÚblock_end_stringÚcomment_start_stringÚcomment_end_string)r3   r4   r5   Úpromptsr   Úarize_clientr   r   r   Ú	jinja_envÚ_load_prompt_from_arize)r!   r3   r4   r5   s       r"   r#   z$ArizePhoenixTemplateManager.__init__>   sŠ   € ð ˆŒØ ˆŒØ"ˆŒØ>@ˆŒÜ.°t·|±|ÈdÏmÉmÔ\ˆÔô 7Ü˜b“>Ü(¨&°%¨Ó9à"&Ø $Ø#Ø!Ø!%Ø#ô

ˆŒð �>Š>Ø×(Ñ(¨¯©Õ8ð r$   Úprompt_version_idÚreturnc                 óä   — 	 | j                   j                  |«      }|r"| j                  ||«      }|| j                  |<   yt	        d|› d�«      ‚# t
        $ r}t        d|› d|› �«      ‚d}~ww xY w)z2Load a specific prompt version from Arize Phoenix.zPrompt version 'ú' not foundzFailed to load prompt version 'z' from Arize Phoenix: N)rB   Úget_prompt_versionÚ_parse_prompt_datarA   Ú
ValueErrorÚ	Exception)r!   rE   Úprompt_dataÚtemplateÚes        r"   rD   z3ArizePhoenixTemplateManager._load_prompt_from_arize`   s‹   € ð
	là!%×!2Ñ!2×!EÑ!EÐFWÓ!XˆKáØ"&×"9Ñ"9¸+ÐGXÓ"Y�Ø2:�—‘Ð.Ò/ä Ð#3Ð4EÐ3FÀkÐ!RÓSÐSøÜò 	lÜÐ=Ð>OÐ=PÐPfÐghÐfiÐjÓkÐkûð	lús   ‚>A ÁA Á	A/ÁA*Á*A/Údatac           
      óú  — |j                  di «      }|j                  dg «      }|j                  di «      }i }d|v r|d   }n6d|v r|d   }n,|j                  «       D ]  \  }}t        |t        «      sŒ|} n |j                  d«      |j                  d«      |j                  dd	«      |j                  d
«      |j                  dd«      ||j                  d«      |j                  d«      dœ}	t	        |||	¬«      S )zBParse Arize Phoenix prompt data and extract messages and metadata.rN   r   r   ÚopenaiÚ	anthropicr   r   r   r   Útemplate_typer   r   r   r   )r   r   r   rT   r   r   r   r   )r   r   r   )r    ÚitemsÚ
isinstancer/   r   )
r!   rP   rE   Útemplate_datar   Úinvocation_paramsÚprovider_paramsÚkeyÚvaluer   s
             r"   rJ   z.ArizePhoenixTemplateManager._parse_prompt_datan   s  € à#Ÿx™x¨
°BÓ7ˆØ'×+Ñ+¨J¸Ó;ˆð $(§8¡8Ð,CÀRÓ#HÐØˆð Ð(Ñ(Ø/°Ñ9‰OØÐ-Ñ-Ø/°Ñ<‰Oð 0×5Ñ5Ó7ò ‘
��UÜ˜e¤TÕ*Ø&+�OÙðð Ÿ(™( <Ó0Ø"Ÿh™hÐ'7Ó8ØŸ8™8 M°2Ó6Ø!ŸX™X oÓ6Ø#Ÿx™xÐ(9¸:ÓFØ%6Ø*×.Ñ.¨}Ó=Ø)×-Ñ-¨lÓ;ñ	
ˆô *Ø)ØØô
ð 	
r$   r   Ú	variablesc                 ó  — || j                   vrt        d|› d�«      ‚| j                   |   }g }|j                  D ]Î  }|j                  dd«      }|j                  dg «      }g }|D ]|  }	|	j                  d«      dk(  rU|	j                  dd«      }
| j                  j                  |
«      } |j                  di |xs i ¤Ž}|j                  |«       Œl|j                  |	«       Œ~ d	j                  |«      }|j                  ||d
œ«       ŒÐ |S )zIRender a template with the given variables and return formatted messages.z
Template 'rH   ÚroleÚuserÚcontentÚtypeÚtextr   ú )r^   r`   r0   )	rA   rK   r   r    rC   Úfrom_stringÚrenderÚappendÚjoin)r!   r   r\   rN   Úrendered_messagesÚmessager^   Úcontent_partsÚrendered_content_partsÚpartrb   Újinja_templateÚrendered_textÚfinal_contents                 r"   Úrender_templatez+ArizePhoenixTemplateManager.render_template•   s  € à˜dŸl™lÑ*Ü˜z¨+¨°kÐBÓCÐCàŸ,™, {Ñ3ˆØ;=Ðà×(Ñ(ò 	OˆGØ—;‘;˜v vÓ.ˆDØ#ŸK™K¨	°2Ó6ˆMð &(Ð"Ø%ò 	8�Ø—8‘8˜FÓ# vÒ-ØŸ8™8 F¨BÓ/�Dà%)§^¡^×%?Ñ%?ÀÓ%E�NØ$9 N×$9Ñ$9Ñ$N¸Yº_È"Ñ$N�MØ*×1Ñ1°-Õ@ð +×1Ñ1°$Õ7ð	8ð  ŸH™HÐ%;Ó<ˆMà×$Ñ$¨d¸}Ñ%MÕNð)	Oð, !Ð r$   c                 ó8   — | j                   j                  |«      S )zGet a template by ID.)rA   r    )r!   r   s     r"   Úget_templatez(ArizePhoenixTemplateManager.get_templateµ   s   € à�|‰|×Ñ Ó,Ð,r$   c                 óH   — t        | j                  j                  «       «      S )z List all available template IDs.)r.   rA   Úkeysr&   s    r"   Úlist_templatesz*ArizePhoenixTemplateManager.list_templates¹   s   € ä�D—L‘L×%Ñ%Ó'Ó(Ð(r$   ©NNNr(   )r)   r*   r+   r,   r-   r#   rD   r/   r   r   rJ   r.   r   rp   rr   ru   r0   r$   r"   r2   r2   2   sÒ   „ ñ	ð #Ø#Ø $ñ	 9à�t‘ð 9ð ˜‘*ð 9ð ˜‘:ó	 9ðDl¸ð lÀó lð%
 t¨C°¨H¡~ð %
È#ð %
ÐRló %
ñN!¨3ð !¸4ÀÀSÀ¹>ÈDÑ;Pð !Ð\`ÐaqÑ\ró !ð@-¨ð -Ð0JÈTÑ0Qó -ð)  S¡	ô )r$   r2   c                   ó¤  ‡ — e Zd ZdZ	 	 	 ddedz  dedz  dedz  fˆ fd„Zedefd„«       Zedefd	„«       Z		 d ded
e
eef   dz  deee   e
eef   f   fd„Z	 	 	 	 d!dedz  dee   de
eef   ez  dz  de
eef   dz  dedz  d
e
eef   dz  deee   e
eef   dz  f   fd„Zdee   fd„Zd"d„Zdedz  dedz  dedefd„Z	 	 d#dedz  dedz  d
e
dz  dededz  dedz  defd„Z	 	 	 ddedz  d
e
dz  dededz  dedz  dedz  defd„Z	 	 	 	 	 d$dedee   de
dedz  d
e
dz  dededz  dedz  dedz  dedz  dedz  deeee   e
f   fd„Zˆ xZS )%ÚArizePhoenixPromptManagera	  
    Arize Phoenix prompt manager that integrates with LiteLLM's prompt management system.

    This class enables using prompt versions from Arize Phoenix with the
    litellm completion() function by implementing the PromptManagementBase interface.

    Usage:
        # Configure Arize Phoenix access
        arize_config = {
            "workspace": "your-workspace",
            "access_token": "your-token",
        }

        # Use with completion
        response = litellm.completion(
            model="arize/gpt-4o",
            prompt_id="UHJvbXB0VmVyc2lvbjox",
            prompt_variables={"question": "What is AI?"},
            arize_config=arize_config,
            messages=[{"role": "user", "content": "This will be combined with the prompt"}]
        )
    Nr3   r4   r5   c                 ó\   •— t        ‰| �  di |¤Ž || _        || _        || _        d | _        y )Nr0   )Úsuperr#   r3   r4   r5   Ú_prompt_manager)r!   r3   r4   r5   ÚkwargsÚ	__class__s        €r"   r#   z"ArizePhoenixPromptManager.__init__Ö   s2   ø€ ô 	‰ÑÑ"˜6Ò"ØˆŒØ ˆŒØ"ˆŒØCGˆÕr$   rF   c                  ó   — y)z9Integration name used in model names like 'arize/gpt-4o'.Úarizer0   r&   s    r"   Úintegration_namez*ArizePhoenixPromptManager.integration_nameã   s   € ð r$   c                 ó”   — | j                   €1t        | j                  | j                  | j                  ¬«      | _         | j                   S )z*Get or create the prompt manager instance.)r3   r4   r5   )r{   r2   r3   r4   r5   r&   s    r"   Úprompt_managerz(ArizePhoenixPromptManager.prompt_managerè   s@   € ð ×ÑÐ'Ü#>ØŸ™ØŸ™ØŸ.™.ô$ˆDÔ ð
 ×#Ñ#Ð#r$   Úprompt_variablesc                 óp  — | j                   j                  |«      }|st        d|› d�«      ‚| j                   j                  ||xs i «      }|j                  |j
                  |j                  dœ}|j                  }i }d|v r|d   }n	d|v r|d   }|j                  «       D ]  \  }}	||vsŒ|	||<   Œ ||fS )a  
        Get a prompt template and render it with variables.

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

        Returns:
            Tuple of (rendered_messages, metadata)
        zPrompt template 'rH   )r   r   r   rR   rS   )	r‚   rr   rK   rp   r   r   r   r   rU   )
r!   r5   rƒ   rN   rh   r   rX   rY   rZ   r[   s
             r"   Úget_prompt_templatez-ArizePhoenixPromptManager.get_prompt_templateó   së   € ð ×-Ñ-×:Ñ:¸9ÓEˆÙÜÐ0°°¸;ÐGÓHÐHð $(×#6Ñ#6×#FÑ#FÀyÐRbÒRhÐfhÓ#iÐð —^‘^Ø#×/Ñ/Ø"×-Ñ-ñ
ˆð $,×#AÑ#AÐØˆàÐ(Ñ(Ø/°Ñ9‰OØÐ-Ñ-Ø/°Ñ<ˆOð *×/Ñ/Ó1ò 	&‰JˆC�Ø˜(Ò"Ø %�˜’ð	&ð ! (Ð*Ð*r$   Úuser_idr   Úfunction_callÚlitellm_paramsc                 óp  — |s||fS 	 | j                  ||«      \  }}	|r||z   }
n|}
|€i }|	j                  d«      r| j                  s|	d   |d<   | j                  sdD ]  }||	v sŒ|	|   ||<   Œ |
|fS # t        $ r8}ddl}|j                  j                  j                  d|«       ||fcY d}~S d}~ww xY w)z^
        Pre-call hook that processes the prompt template before making the LLM call.
        Nr   ©r   r   Útop_pÚfrequency_penaltyÚpresence_penaltyr   z/Error in Arize Phoenix prompt pre_call_hook: %s)	r…   r    Úignore_prompt_manager_modelÚ%ignore_prompt_manager_optional_paramsrL   ÚlitellmÚ_loggingÚverbose_proxy_loggerÚerror)r!   r†   r   r‡   rˆ   r5   rƒ   r|   rh   Úprompt_metadataÚfinal_messagesÚparamrO   r�   s                 r"   Úpre_call_hookz'ArizePhoenixPromptManager.pre_call_hook   sö   € ñ Ø˜^Ð+Ð+ð%	,à15×1IÑ1IÈ)ÐUeÓ1fÑ.Ð˜ñ !à!2°XÑ!=‘à!)�ð Ð%Ø!#�ð ×"Ñ" 7Ô+°D×4TÒ4TØ*9¸'Ñ*B�˜wÑ'à×=Ò=ðò G�Eð  Ò/Ø0?ÀÑ0F˜ uÒ-ðGð " >Ð1Ð1øäò 	,ãà×Ñ×1Ñ1×7Ñ7Ð8iÐklÔmØ˜^Ð+Õ+ûð	,ús$   ˆAA4 Á&A4 Á4	B5Á=-B0Â*B5Â0B5c                 ó6   — | j                   j                  «       S )z!Get list of available prompt IDs.)r‚   ru   r&   s    r"   Úget_available_promptsz/ArizePhoenixPromptManager.get_available_promptsW  s   € à×"Ñ"×1Ñ1Ó3Ð3r$   c                 óD   — | j                   rd| _        | j                   yy)z"Reload prompts from Arize Phoenix.N)r5   r{   r‚   r&   s    r"   Úreload_promptsz(ArizePhoenixPromptManager.reload_prompts[  s   € à�>Š>Ø#'ˆDÔ Ø×Óð r$   Úprompt_specÚdynamic_callback_paramsc                 ó
   — |duS )zù
        Determine if prompt management should run based on the prompt_id.

        Arize Phoenix needs a prompt_id to compile, so it declines requests without one;
        prompt loading itself happens in the _compile_prompt_helper method.
        Nr0   )r!   r5   rœ   r�   s       r"   Úshould_run_prompt_managementz6ArizePhoenixPromptManager.should_run_prompt_managementa  s   € ð  Ð$Ð$r$   Úprompt_labelÚprompt_versionc                 ó`  — |€t        d«      ‚	 || j                  j                  vr| j                  j                  |«       | j	                  ||«      \  }}|j                  d«      }	i }
dD ]  }||v sŒ||   |
|<   Œ t        |||	|
d¬«      S # t        $ r}t        d|› d|› �«      ‚d}~ww xY w)aM  
        Compile an Arize Phoenix prompt template into a PromptManagementClient structure.

        This method:
        1. Loads the prompt version from Arize Phoenix
        2. Renders it with the provided variables
        3. Returns formatted chat messages
        4. Extracts model and optional parameters from metadata
        Nú6prompt_id is required for Arize Phoenix prompt managerr   rŠ   )r5   Úprompt_templateÚprompt_template_modelÚprompt_template_optional_paramsÚcompleted_messageszError compiling prompt 'z': )rK   r‚   rA   rD   r…   r    r
   rL   )r!   r5   rœ   rƒ   r�   r    r¡   rh   r”   Útemplate_modelÚoptional_paramsr–   rO   s                r"   Ú_compile_prompt_helperz0ArizePhoenixPromptManager._compile_prompt_helpero  sï   € ð$ ÐÜÐUÓVÐVð 	Kà × 3Ñ 3× ;Ñ ;Ñ;Ø×#Ñ#×;Ñ;¸IÔFð 26×1IÑ1IÈ)ÐUeÓ1fÑ.Ð˜ð %4×$7Ñ$7¸Ó$@ˆNð &(ˆOðò D�ð ˜OÒ+Ø-<¸UÑ-C�O EÒ*ðDô *Ø#Ø 1Ø&4Ø0?Ø#'ôð øô ò 	KÜÐ7¸	°{À#ÀaÀSÐIÓJÐJûð	Kús   �A$B Á4B Â	B-ÂB(Â(B-c              ƒ   óR   K  — |€t        d«      ‚| j                  ||||||¬«      S ­w)zœ
        Async version of compile prompt helper. Since Arize Phoenix operations are synchronous,
        this simply delegates to the sync version.
        r£   )r5   rœ   rƒ   r�   r    r¡   )rK   rª   )r!   r5   rƒ   r�   rœ   r    r¡   s          r"   Úasync_compile_prompt_helperz5ArizePhoenixPromptManager.async_compile_prompt_helper¥  sD   è ø€ ð ÐÜÐUÓVÐVØ×*Ñ*ØØ#Ø-Ø$;Ø%Ø)ð +ó 
ð 	
ùs   ‚%'r   Únon_default_paramsrŽ   r�   c                 óD   — t        j                  | |||||||||	|
|¬«      S )zu
        Get chat completion prompt from Arize Phoenix and return processed model, messages, and parameters.
        )rœ   r    r¡   rŽ   r�   )r	   Úget_chat_completion_prompt)r!   r   r   r­   r5   rƒ   r�   rœ   r    r¡   rŽ   r�   s               r"   r¯   z4ArizePhoenixPromptManager.get_chat_completion_prompt½  s;   € ô" $×>Ñ>ØØØØØØØ#Ø#Ø%Ø)Ø(CØ2Wô
ð 	
r$   rv   r(   )NNNN)rF   N)NN)NNNFF)r)   r*   r+   r,   r-   r#   Úpropertyr€   r2   r‚   r/   r   Útupler.   r   r…   r—   r™   r›   r   r   ÚboolrŸ   Úintr
   rª   r¬   r¯   Ú__classcell__)r}   s   @r"   rx   rx   ¾   sY  ø„ ñð2 #Ø#Ø $ñ	Hà�t‘ðHð ˜‘*ðHð ˜‘:õ	Hð ð #ò ó ðð ð$Ð ;ò $ó ð$ð 37ñ++àð++ð ˜s C˜x™.¨4Ñ/ð++ð 
ˆtÐ$Ñ% t¨C°¨H¡~Ð5Ñ	6ó	++ðb 6:Ø04Ø $Ø26ñ5,à�t‘ð5,ð Ð'Ñ(ð5,ð ˜C ˜H‘~¨Ñ+¨dÑ2ð	5,ð
 ˜S #˜X™¨Ñ-ð5,ð ˜‘:ð5,ð ˜s C˜x™.¨4Ñ/ð5,ð 
ˆtÐ$Ñ% t¨C°¨H¡~¸Ñ'<Ð<Ñ	=ó5,ðn4 t¨C¡yó 4ó ð%à˜‘:ð%ð   $Ñ&ð%ð "?ð	%ð
 
ó%ð( $(Ø%)ñ4Kà˜‘:ð4Kð   $Ñ&ð4Kð  ™+ð	4Kð
 "?ð4Kð ˜D‘jð4Kð ˜d™
ð4Kð 
 ó4Kðv *.Ø#'Ø%)ñ
à˜‘:ð
ð  ™+ð
ð "?ð	
ð
   $Ñ&ð
ð ˜D‘jð
ð ˜d™
ð
ð 
 ó
ð@ *.Ø#'Ø%)Ø38Ø=Bñ
àð
ð Ð'Ñ(ð
ð !ð	
ð
 ˜‘:ð
ð  ™+ð
ð "?ð
ð   $Ñ&ð
ð ˜D‘jð
ð ˜d™
ð
ð &*¨D¡[ð
ð 04°d©{ð
ð 
ˆs�DÐ)Ñ*¨DÐ0Ñ	1÷
r$   rx   N)r,   Útypingr   r   Újinja2r   r   Újinja2.sandboxr   Ú-litellm.integrations.custom_prompt_managementr   Ú+litellm.integrations.prompt_management_baser	   r
   Úlitellm.types.llms.openair   Ú"litellm.types.prompts.init_promptsr   Úlitellm.types.utilsr   Úarize_phoenix_clientr   r   r2   rx   r0   r$   r"   ú<module>r¾      sS   ðñ÷
 ç 0Ý 8å P÷õ 7Ý 9Ý =å 4÷\ñ \÷6I)ñ I)ôX]
Ð 6õ ]
r$   