Ë
    uPêjÃ  ã            
       ó¤  — U d Z ddlZddlmZmZmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZmZ ddlmZmZmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZmZmZ ddl 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+m,Z,m-Z-m.Z. ddl/m0Z0 e
rddl1m2Z2 ddl3m4Z4  e«       Z5ee6d<    G d„ de«      Z7 G d„ de«      Z8 G d„ de«      Z9ddde9fd„Z:de;de;fd„Z<de;de=fd „Z>dTde;d!e=dz  de;fd"„Z?de;d#ee;e@f   de;fd$„ZAd%eBe-   deBe-   fd&„ZC	 dUddde;d'e;de=fd(„ZDd)e7de-fd*„ZE G d+„ d,e«      ZFd-ZGee6d.<   d/e,deHfd0„ZI G d1„ d2e«      ZJe5j—                  d3d4g ee#«      ge)¬5«      d ee#«      fd'e;dz  d6efd7„«       ZLe5j—                  d8d4g ee#«      ge)¬5«      d ee#«      fde;d'e;dz  d6efd9„«       ZMd:e-d;e;de.dz  fd<„ZNe5j—                  d=d4g ee#«      ge+¬5«      e5j—                  d>d4g ee#«      ge+¬5«      d ee#«      fde;d'e;dz  d6efd?„«       «       ZOe5j¡                  d@d4g ee#«      g¬A«       ee#«      fdBeFd6efdC„«       ZQe5j¥                  d=d4g ee#«      g¬A«       ee#«      fde;dBeFd6efdD„«       ZSe5j©                  d=d4g ee#«      g¬A«      d ee#«      fde;d'e;dz  d6efdE„«       ZUdFdGdHe-de-fdI„ZVe5j¯                  d=d4g ee#«      g¬A«      d ee#«      fde;dBeJd'e;dz  d6efdJ„«       ZXe5j¡                  dKd4g ee#«      g¬A«       ee#«      fdBe0dLedMed6efdN„«       ZYe5j¡                  dOd%dPg ee#«      g¬A«       edQ«       ee#«      fdRed6edeZe;ef   fdS„«       Z[y)Vz
CRUD ENDPOINTS FOR PROMPTS
é    N)Ú	AwaitableÚMappingÚSequence)Údatetime)ÚPath)ÚTYPE_CHECKINGÚAnyÚFinalÚProtocolÚcast)Ú	APIRouterÚDependsÚFileÚHTTPExceptionÚRequestÚResponseÚ
UploadFile©Ú	BaseModel)Úverbose_proxy_logger)ÚCommonProxyErrorsÚLitellmUserRolesÚUserAPIKeyAuthÚuser_api_key_has_admin_view)Úis_request_body_safe)Úuser_api_key_auth)Úsafe_filename)ÚPromptRepository)ÚListPromptsResponseÚ
PromptInfoÚPromptInfoResponseÚPromptLiteLLMParamsÚ
PromptSpecÚPromptTemplateBase)ÚTestPromptRequest)ÚInMemoryPromptRegistry)ÚPrismaClientÚrouterc                   ó  — e Zd Zedefd„«       Zedefd„«       Zedefd„«       Zedefd„«       Z	ededz  fd„«       Z
edd„«       Zedd	„«       Zedeeeef   z  fd
„«       Zedeeeef   z  dz  fd„«       Zdeeef   fd„Zy)Ú
_PromptRowÚreturnc                  ó   — y ©N© ©Úselfs    úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/prompts/prompt_endpoints.pyÚidz_PromptRow.id3   s   € Øó    c                  ó   — y r-   r.   r/   s    r1   Ú	prompt_idz_PromptRow.prompt_id5   s   € Ø #r3   c                  ó   — y r-   r.   r/   s    r1   Úversionz_PromptRow.version7   s   € Ø!r3   c                  ó   — y r-   r.   r/   s    r1   Úenvironmentz_PromptRow.environment9   s   € Ø"%r3   Nc                  ó   — y r-   r.   r/   s    r1   Ú
created_byz_PromptRow.created_by;   ó   € Ø(+r3   c                  ó   — y r-   r.   r/   s    r1   Ú
created_atz_PromptRow.created_at=   r<   r3   c                  ó   — y r-   r.   r/   s    r1   Ú
updated_atz_PromptRow.updated_at?   r<   r3   c                  ó   — y r-   r.   r/   s    r1   Úlitellm_paramsz_PromptRow.litellm_paramsA   s   € Ø<?r3   c                  ó   — y r-   r.   r/   s    r1   Úprompt_infoz_PromptRow.prompt_infoC   s   € Ø@Cr3   c                  ó   — y r-   r.   r/   s    r1   Ú
model_dumpz_PromptRow.model_dumpF   ó   � r3   )r+   r   )Ú__name__Ú
__module__Ú__qualname__ÚpropertyÚstrr2   r5   Úintr7   r9   r;   r>   r@   r   ÚobjectrB   rD   rF   r.   r3   r1   r*   r*   2   sÙ   „ ØØ�CÒó ØØØ#˜3Ò#ó Ø#ØØ!˜Ò!ó Ø!ØØ%˜SÒ%ó Ø%ØØ+˜C $™JÒ+ó Ø+ØÚ+ó Ø+ØÚ+ó Ø+ØØ?  g¨c°6¨kÑ&:Ñ :Ò?ó Ø?ØØC˜S 7¨3°¨;Ñ#7Ñ7¸$Ñ>ÒCó ØCà5˜G C¨ KÑ0Ô5r3   r*   c                   ó¸   — e Zd ZU eed<   dZeed<   dZeed<   dZedz  ed<   dZ	ee
eef   z  dz  ed<   dZee
eef   z  dz  ed	<   dZedz  ed
<   dZedz  ed<   y)Ú_PromptRowDatar5   é   r7   Údevelopmentr9   Nr;   rB   rD   r>   r@   )rH   rI   rJ   rL   Ú__annotations__r7   rM   r9   r;   rB   r   rN   rD   r>   r   r@   r.   r3   r1   rP   rP   I   s   … ØƒNØ€GˆSÓØ$€K�Ó$Ø!€J��d‘
Ó!Ø8<€N�C˜' # v +Ñ.Ñ.°Ñ5Ó<Ø59€K��w˜s F˜{Ñ+Ñ+¨dÑ2Ó9Ø"&€J�˜4‘Ó&Ø"&€J�˜4‘Ô&r3   rP   c                   óä   — e Zd Zddddœdeeeez  f   deeef   dedee   deee      f
d„Z	d	eeeez  d
z  f   dee   fd„Z
deeeez  f   d	eeef   deed
z     fd„Zdeeef   dee   fd„Zy
)Ú_PromptTableActions.)ÚorderÚtakeÚdistinctÚwhererV   rW   rX   r+   c                 ó   — y r-   r.   )r0   rY   rV   rW   rX   s        r1   Ú	find_manyz_PromptTableActions.find_manyU   s   € ð +.r3   ÚdataNc                 ó   — y r-   r.   )r0   r\   s     r1   Úcreatez_PromptTableActions.create^   rG   r3   c                 ó   — y r-   r.   )r0   rY   r\   s      r1   Úupdatez_PromptTableActions.update`   rG   r3   c                 ó   — y r-   r.   )r0   rY   s     r1   Údelete_manyz_PromptTableActions.delete_manyb   rG   r3   )rH   rI   rJ   r   rL   rM   r   r   r*   r[   r^   r`   rb   r.   r3   r1   rU   rU   T   sß   „ ð
 $'ØØ"%ò.ð �s˜C #™I�~Ñ&ð.ð �s˜C�xÑ ð	.ð
 ð.ð ˜3‘-ð.ð 
�8˜JÑ'Ñ	(ó.ð \˜g c¨3°©9°tÑ+;Ð&;Ñ<Ð[ÀÈ:ÑAVÓ[àu˜w s¨C°#©I ~Ñ6Ðu¸gÀcÈ3ÀhÑ>OÐuÐT]Ð^hÐkoÑ^oÑTpÓuàM G¨C°¨HÑ$5ÐM¸)ÀC¹.ÔMr3   rU   Úprisma_clientr'   r+   c                 ó,   — t        | «      j                  S r-   )r   Útable©rc   s    r1   Ú_prompt_tablerg   e   s   € Ü˜MÓ*×0Ñ0Ð0r3   r5   c                 óf   — d| v r| j                  d«      d   S d| v r| j                  d«      d   S | S )a  
    Extract the base prompt ID by stripping the version suffix if present.

    Args:
        prompt_id: Prompt ID that may include version suffix (e.g., "jack_success.v1" or "jack_success_v1")

    Returns:
        Base prompt ID without version suffix (e.g., "jack_success")

    Examples:
        >>> get_base_prompt_id("jack_success.v1")
        "jack_success"
        >>> get_base_prompt_id("jack_success_v1")
        "jack_success"
        >>> get_base_prompt_id("jack_success")
        "jack_success"
    ú.vr   Ú_v)Úsplit©r5   s    r1   Úget_base_prompt_idrm   i   sB   € ð& ˆyÑØ�‰˜tÓ$ QÑ'Ð'àˆyÑØ�‰˜tÓ$ QÑ'Ð'ØÐr3   c                 óÐ   — d| v r | j                  d«      d   }	 t        |«      S d| v r | j                  d«      d   }	 t        |«      S y# t        $ r Y Œ0w xY w# t        $ r Y yw xY w)aÓ  
    Extract the version number from a versioned prompt ID.

    Args:
        prompt_id: Prompt ID that may include version suffix (e.g., "jack_success.v2" or "jack_success_v2")

    Returns:
        Version number (defaults to 1 if no version suffix or invalid format)

    Examples:
        >>> get_version_number("jack_success.v2")
        2
        >>> get_version_number("jack_success_v2")
        2
        >>> get_version_number("jack_success")
        1
    ri   rQ   rj   )rk   rM   Ú
ValueError)r5   Úversion_strs     r1   Úget_version_numberrq   „   s‹   € ð& ˆyÑØ—o‘o dÓ+¨AÑ.ˆð	Ü�{Ó#Ð#ð
 ˆyÑØ—o‘o dÓ+¨AÑ.ˆð	Ü�{Ó#Ð#ð øô ò 	Ùð	ûô ò 	Øàð	ús"   š
A
 ¾
A Á
	AÁAÁ	A%Á$A%r7   c                 ó.   — |€| S t        | «      }|› d|› �S )aB  
    Construct a versioned prompt ID from a base prompt_id and version number.

    Args:
        prompt_id: Base prompt ID (e.g., "jack_success")
        version: Version number (if None, returns the base prompt_id unchanged)

    Returns:
        Versioned prompt ID (e.g., "jack_success.v4")

    Examples:
        >>> construct_versioned_prompt_id("jack_success", 4)
        "jack_success.v4"
        >>> construct_versioned_prompt_id("jack_success", None)
        "jack_success"
        >>> construct_versioned_prompt_id("jack_success.v2", 4)
        "jack_success.v4"
    ri   )rm   )r5   r7   Úbase_ids      r1   Úconstruct_versioned_prompt_idrt   ©   s,   € ð& €ØÐô (¨	Ó2€GØˆY�b˜˜	Ð"Ð"r3   Úall_prompt_idsc                 óÆ   — t        | ¬«      }g }|D ]1  }t        |¬«      |k(  sŒt        |¬«      }|j                  ||f«       Œ3 |r|j                  d¬«       |d   d   S | S )aá  
    Find the latest version of a prompt from available prompt IDs.

    Args:
        prompt_id: Base prompt ID or versioned prompt ID (e.g., "jack_success" or "jack_success.v2")
        all_prompt_ids: Dictionary of all available prompt IDs (keys are prompt IDs)

    Returns:
        The prompt ID with the highest version number, or the original prompt_id if no versions exist

    Examples:
        >>> all_ids = {"jack.v1": {}, "jack.v2": {}, "jack.v3": {}}
        >>> get_latest_version_prompt_id("jack", all_ids)
        "jack.v3"
        >>> get_latest_version_prompt_id("jack.v1", all_ids)
        "jack.v3"
        >>> all_ids = {"simple": {}}
        >>> get_latest_version_prompt_id("simple", all_ids)
        "simple"
    rl   T)Úreverser   rQ   )rm   rq   ÚappendÚsort)r5   ru   rs   Úmatching_versionsÚstored_prompt_idÚversion_nums         r1   Úget_latest_version_prompt_idr}   Ä   sƒ   € ô* (°)Ô<€Gð  "ÐØ*ò FÐÜÐ(8Ô9¸WÓDÜ,Ð7GÔHˆKØ×$Ñ$ kÐ3CÐ%DÕEðFñ Ø×Ñ tÐÔ,Ø  Ñ# AÑ&Ð&ð Ðr3   Úpromptsc                 óú   — i }| D ]\  }t        |j                  ¬«      }t        |j                  ¬«      }||vr|||<   Œ9t        ||   j                  ¬«      }||kD  sŒX|||<   Œ^ t        |j	                  «       «      S )zï
    Filter a list of prompts to return only the latest version of each unique prompt.

    Args:
        prompts: List of PromptSpec objects

    Returns:
        List of PromptSpec objects with only the latest version of each prompt
    rl   )rm   r5   rq   ÚlistÚvalues)r~   Úlatest_promptsÚpromptrs   r7   Úexisting_versions         r1   Úget_latest_prompt_versionsr…   ë   s‹   € ð 46€Nàò 
1ˆÜ$¨v×/?Ñ/?Ô@ˆÜ$¨v×/?Ñ/?Ô@ˆð ˜.Ñ(Ø&,ˆN˜7Ò#ä1¸NÈ7Ñ<S×<]Ñ<]Ô^ÐØÐ)Ó)Ø*0�˜wÒ'ð
1ô �×%Ñ%Ó'Ó(Ð(r3   r9   c              ƒ   óŽ   K  — t        | «      j                  ||dœ¬«      ƒ d{  –—† }|rt        d„ |D «       «      }|dz   S y7 Œ­w)aA  
    Get the next version number for a prompt in a specific environment.

    Args:
        prisma_client: Prisma database client
        prompt_id: Base prompt ID
        environment: The environment to check versions for

    Returns:
        Next version number (1 if no versions exist, max_version + 1 otherwise)
    ©r5   r9   ©rY   Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr-   ©r7   )Ú.0Úps     r1   ú	<genexpr>z.get_next_version_for_prompt.<locals>.<genexpr>  s   è ø€ Ò E¨q §¥Ñ Eùs   ‚rQ   )rg   r[   Úmax)rc   r5   r9   Úexisting_promptsÚmax_versions        r1   Úget_next_version_for_promptr‘     sY   è ø€ ô %2°-Ó$@×$JÑ$JØ%°kÑBð %Kó %÷ Ðñ Ü Ñ EÐ4DÔ EÓEˆØ˜Q‰Ðàðús   ‚"A¤A¥AÚ	db_promptc           
      óD  — ddl }ddlm} t        j	                  | j                  «       «      }|j                  }t        |t        «      r|j                  |«      n|} |j                  |«      }|j                  }|r9t        |t        «      r|j                  |«      n|}t        j                  |«      }	nt        d¬«      }	|j                  › d|j                  › �}
t        |
||	|j                  |j                   |j                  |j"                  |j$                  ¬«      S )zõ
    Helper function to create a PromptSpec with versioned prompt_id from a DB prompt entry.

    Args:
        db_prompt: The DB prompt object (from prisma)

    Returns:
        PromptSpec with versioned prompt_id (e.g., "chat_prompt.v1")
    r   N)r"   Údb©Úprompt_typeri   ©r5   rB   rD   r>   r@   r7   r9   r;   )ÚjsonÚ"litellm.types.prompts.init_promptsr"   rP   Úmodel_validaterF   rB   Ú
isinstancerL   ÚloadsrD   r    r5   r7   r#   r>   r@   r9   r;   )r’   r˜   r"   ÚrowÚlitellm_params_dataÚlitellm_params_dictrB   Úprompt_info_dataÚprompt_info_dictrD   Úversioned_prompt_ids              r1   Úcreate_versioned_prompt_specr£     sÿ   € ó åFä×.Ñ.¨y×/CÑ/CÓ/EÓF€Cà!$×!3Ñ!3Ðä+5Ð6IÌ3Ô+Oˆ�
‰
Ð&Ô'ÐUhð ð ?Ð/×>Ñ>Ð?RÓS€Nà!Ÿo™oÐÙä,6Ð7GÌÔ,MˆD�J‰JÐ'Ô(ÐScð 	ô !×/Ñ/Ð0@ÓA‰ä ¨TÔ2ˆà$'§M¡M ?°"°S·[±[°MÐ!BÐäØ%Ø%ØØ—>‘>Ø—>‘>Ø—‘Ø—O‘OØ—>‘>ô	ð 	r3   c                   ó6   — e Zd ZU eed<   eed<   dZedz  ed<   y)ÚPromptr5   rB   NrD   )rH   rI   rJ   rL   rS   r"   rD   r    r.   r3   r1   r¥   r¥   L  s   … ØƒNØ'Ó'Ø%)€K�˜dÑ"Ô)r3   r¥   a4  litellm_params.prompt_id cannot be combined with prompt_data keyed by template name. Send a flat template, prompt_data={"content": "...", "metadata": {...}}, together with litellm_params.prompt_id, or send prompt_data={"<template_id>": {"content": "...", "metadata": {...}}} without litellm_params.prompt_id.ÚAMBIGUOUS_PROMPT_DATA_ERRORrB   c                 ó    — | j                   xs i }|j                  d«      }| j                  rt        |t        «      syt        |«      xr d|vS )NÚprompt_dataFÚcontent)Úmodel_extraÚgetr5   r›   ÚdictÚbool)rB   Úextra_fieldsr¨   s      r1   Úis_ambiguous_keyed_prompt_datar¯   Y  sL   € Ø(×4Ñ4Ò:¸€LØ%×)Ñ)¨-Ó8€KØ×#Ò#¬:°kÄ4Ô+HØÜ�ÓÒ= °+Ð!=Ð=r3   c                   ó6   — e Zd ZU dZedz  ed<   dZedz  ed<   y)ÚPatchPromptRequestNrB   rD   )rH   rI   rJ   rB   r"   rS   rD   r    r.   r3   r1   r±   r±   a  s!   … Ø15€NÐ'¨$Ñ.Ó5Ø%)€K�˜dÑ"Ô)r3   r±   z/prompts/listzPrompt Management)ÚtagsÚdependenciesÚresponse_modelÚuser_api_key_dictc           
   ƒ   ó,  K  — ddl m} |j                  }|�ÿt        t        t
           dz  |j                  dd«      «      }|�Ó|D �cg c]  }||j                  v r|j                  |   ‘Œ! }}| r|D �cg c]  }|j                  | k(  sŒ|‘Œ }}g }|D ]u  }	t        t        |	j                  ¬«      |	j                  |	j                  |	j                  |	j                  |	j                  |	j                   ¬«      }
|j#                  |
«       Œw t%        |¬«      S t'        |«      rØt	        |j                  j)                  «       «      }| r|D �cg c]  }|j                  | k(  sŒ|‘Œ }}t+        |¬«      }g }|D ]u  }	t        t        |	j                  ¬«      |	j                  |	j                  |	j                  |	j                  |	j                  |	j                   ¬«      }
|j#                  |
«       Œw t%        |¬«      S t%        g ¬«      S c c}w c c}w c c}w ­w)ud  
    List the prompts that are available on the proxy server

    ðŸ‘‰ [Prompt docs](https://docs.litellm.ai/docs/proxy/prompt_management)

    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/prompts/list" -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "prompts": [
            {
                "prompt_id": "my_prompt_id",
                "litellm_params": {
                    "prompt_id": "my_prompt_id",
                    "prompt_integration": "dotprompt",
                    "prompt_directory": "/path/to/prompts"
                },
                "prompt_info": {
                    "prompt_type": "config"
                },
                "created_at": "2023-11-09T12:34:56.789Z",
                "updated_at": "2023-11-09T12:34:56.789Z"
            }
        ]
    }
    ```
    r   ©ÚIN_MEMORY_PROMPT_REGISTRYNr~   rl   )r5   rB   rD   r>   r@   r9   r;   ©r~   )Ú%litellm.proxy.prompts.prompt_registryr¸   Úmetadatar   r€   rL   r«   ÚIN_MEMORY_PROMPTSr9   r#   rm   r5   rB   rD   r>   r@   r;   rx   r   r   r�   r…   )r9   rµ   r¸   Úkey_metadatar~   r5   Úall_promptsrŒ   Úprompt_listÚoriginal_promptÚprompt_copyr‚   Úprompts_for_displays                r1   Úlist_promptsrÃ   f  s  è ø€ õR Pð ,×4Ñ4€LØÐÜœd¤3™i¨$Ñ.°×0@Ñ0@ÀÈDÓ0QÓRˆØÐð ")öàØÐ 9× KÑ KÑKð *×;Ñ;¸IÓFðˆKð ñ
 Ø*5ÖV Q¸¿¹È+Ó9UšqÐV�ÐVØ!#ˆKØ#.ò 0�ä(Ü0¸?×;TÑ;TÔUØ#2×#AÑ#AØ /× ;Ñ ;Ø.×9Ñ9Ø.×9Ñ9Ø /× ;Ñ ;Ø.×9Ñ9ô�ð ×"Ñ" ;Õ/ð0ô '¨{Ô;Ð;ä"Ð#4Ô5äÐ4×FÑF×MÑMÓOÓPˆÙØ&1ÖR °Q·]±]ÀkÓ5Qš1ÐRˆKÐRÜ :À;Ô Oˆà%'ÐØ-ò 
	4ˆOÜ$Ü,°×7PÑ7PÔQØ.×=Ñ=Ø+×7Ñ7Ø*×5Ñ5Ø*×5Ñ5Ø+×7Ñ7Ø*×5Ñ5ôˆKð  ×&Ñ& {Õ3ð
	4ô #Ð+>Ô?Ð?ä"¨2Ô.Ð.ùòWùò Wùò( Sùs8   ‚AHÁ$HÁ+HÁ3H
ÂH
ÂB>HÅ
HÅHÅ#B1Hz/prompts/{prompt_id}/versionsc              ƒ   ó  K  — ddl m} ddlm} t	        |«      st        dd¬«      ‚t        | ¬«      }g }|�·d	|i}|r||d
<   t        |«      j                  |ddi¬«      ƒ d{  –—† }|D ]€  }	t        |	¬«      }
|j                  t        ||
j                  |
j                  |
j                  |
j                  t!        |
j"                  ¬«      |
j$                  |
j&                  ¬«      «       Œ‚ nët)        |j*                  j-                  «       «      }|D �cg c].  }t        |j"                  ¬«      |k(  r|�|j$                  |k(  r|‘Œ0 }}|D ]v  }t!        |j"                  ¬«      }|j                  t        ||j                  |j                  |j                  |j                  ||j$                  |j&                  ¬«      «       Œx |j/                  d„ d¬«       |st        dd|› �¬«      ‚t1        |¬«      S 7 �Œ”c c}w ­w)uÒ  
    Get all versions of a specific prompt by base prompt ID
    
    ðŸ‘‰ [Prompt docs](https://docs.litellm.ai/docs/proxy/prompt_management)
    
    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/prompts/jack_success/versions" \
        -H "Authorization: Bearer <your_api_key>"
    ```
    
    Example Response:
    ```json
    {
        "prompts": [
            {
                "prompt_id": "jack_success.v1",
                "litellm_params": {...},
                "prompt_info": {"prompt_type": "db"},
                "created_at": "2023-11-09T12:34:56.789Z",
                "updated_at": "2023-11-09T12:34:56.789Z"
            },
            {
                "prompt_id": "jack_success.v2",
                "litellm_params": {...},
                "prompt_info": {"prompt_type": "db"},
                "created_at": "2023-11-09T13:45:12.345Z",
                "updated_at": "2023-11-09T13:45:12.345Z"
            }
        ]
    }
    ```
    r   r·   rf   é“  z*Only proxy admins can view prompt versions©Ústatus_codeÚdetailrl   Nr5   r9   r7   Údesc)rY   rV   ©r’   r—   c                 ó"   — | j                   xs dS )NrQ   rŠ   )rŒ   s    r1   ú<lambda>z%get_prompt_versions.<locals>.<lambda>(  s   € ¨Q¯Y©Yª^¸!€ r3   T)Úkeyrw   é”  z No versions found for prompt ID r¹   )rº   r¸   Úlitellm.proxy.proxy_serverrc   r   r   rm   rg   r[   r£   rx   r#   rB   rD   r>   r@   rq   r5   r9   r;   r€   r¼   r�   ry   r   )r5   r9   rµ   r¸   rc   Úbase_prompt_idÚversioned_promptsÚwhere_clauseÚ
db_promptsr’   Úspecr¾   rƒ   Úprompt_versionsÚversion_numbers                  r1   Úget_prompt_versionsr×   Ä  s  è ø€ õX PÝ8ô 'Ð'8Ô9Ü¨Ð4`ÔaÐaä.¸ÔC€Nð  "ÐØÐ Ø/:¸NÐ.KˆÙØ*5ˆL˜Ñ'Ü"/°Ó">×"HÑ"HØØ˜fÐ%ð #Ió #
÷ 
ˆ
ð $ò 	ˆIÜ/¸)ÔDˆDØ×$Ñ$ÜØ,Ø#'×#6Ñ#6Ø $× 0Ñ 0Ø#Ÿ™Ø#Ÿ™Ü.¸¿¹ÔHØ $× 0Ñ 0Ø#Ÿ™ô	õñ	ô  "Ð";×"MÑ"M×"TÑ"TÓ"VÓWˆð &ö"
àÜ!¨F×,<Ñ,<Ô=ÀÒOØÐ$¨×(:Ñ(:¸kÒ(Iò ð"
ˆð "
ð &ò 	ˆFÜ/¸&×:JÑ:JÔKˆNØ×$Ñ$ÜØ,Ø#)×#8Ñ#8Ø &× 2Ñ 2Ø%×0Ñ0Ø%×0Ñ0Ø*Ø &× 2Ñ 2Ø%×0Ñ0ô	õð	ð 	×ÑÑ#;ÀTÐÔJáÜ¨Ð6VÐWeÐVfÐ4gÔhÐhäÐ'8Ô9Ð9ð]
ûò*"
ùs&   ‚A!G?Á#G7Á$B1G?Ä3G:ÅB0G?Ç:G?Úprompt_specrÐ   c                 ó  — ddl m} 	 | j                  j                  }|r=ddlm}  ||«      }|rÍt        ||j                  dd«      |j                  d«      ¬«      S |j                  | j                  «      }|�ƒ|j                  }|d	k(  rrdd
lm} t        ||«      r`|j                  j                  «       }	|	�Dt!        |	«      dk(  r6t#        |	j%                  «       «      d   }
t        |
|	|
   d   |	|
   d   ¬«      S y# t&        $ r Y yw xY w)zQResolve the raw prompt template from dotprompt content or the in-memory registry.r   r·   )Ú'_get_prompt_data_from_dotprompt_contentr©   Ú r»   )Úlitellm_prompt_idr©   r»   NÚ	dotprompt©ÚDotpromptManagerrQ   )rº   r¸   rB   Údotprompt_contentÚlitellm.integrations.dotpromptrÚ   r$   r«   Úget_prompt_callback_by_idr5   Úintegration_nameÚ0litellm.integrations.dotprompt.dotprompt_managerrß   r›   Úprompt_managerÚget_all_prompts_as_jsonÚlenr€   ÚkeysÚ	Exception)rØ   rÐ   r¸   rà   rÚ   ÚparsedÚprompt_callbackrã   rß   ÚtemplateÚtemplate_ids              r1   Ú_get_prompt_templaterî   0  s$  € åOð!Ø#.×#=Ñ#=×#OÑ#OÐÙõñ DÐDUÓVˆFÙÜ)Ø&4Ø"ŸJ™J y°"Ó5Ø#ŸZ™Z¨
Ó3ôð ð &?×%XÑ%XÐYd×YnÑYnÓ%oˆOØÐ*Ø*9×*JÑ*JÐ Ø# {Ò2õô " /Ð3CÔDØ*9×*HÑ*H×*`Ñ*`Ó*b˜Ø#Ð/´C¸³MÀQÒ4FÜ15°h·m±m³oÓ1FÀqÑ1I˜KÜ#5Ø2=Ø(0°Ñ(=¸iÑ(HØ)1°+Ñ)>¸zÑ)Jô$ð ð øô ò ØØðús   ˆAC> ÁBC> Ã>	D
Ä	D
z/prompts/{prompt_id}z/prompts/{prompt_id}/infoc           
   ƒ   óz  K  — ddl m} ddlm} d}|j                  �Kt        t        t           dz  |j                  j                  dd«      «      }|�| |vrt        dd| › d�¬	«      ‚t        |«      st        d
d|j                  › d|› �¬	«      ‚t        | ¬«      }g }|�Bt        |«      j                  d|idg¬«      ƒ d{  –—† }t        t!        d„ |D «       «      «      }d}	| |k7  rt#        | ¬«      nd}
|rF|�D||dœ}|
�|
|d<   t        |«      j                  |ddid¬«      ƒ d{  –—† }|rt%        |d   ¬«      }	|	€=|€;|j'                  | «      }	|	€(t)        | |j*                  ¬«      }|j'                  |«      }	|	€"t        dd| › d�|rd|› �z   ¬	«      ‚dz   ¬	«      ‚t#        |	j,                  ¬«      }t/        t        |	j,                  ¬«      |	j0                  |	j2                  |	j4                  |	j6                  ||	j8                  |	j:                  ¬«      }t=        |	|«      }t?        |||¬«      S 7 �Œs7 �Œ­w)uT  
    Get detailed information about a specific prompt by ID, including prompt content

    ðŸ‘‰ [Prompt docs](https://docs.litellm.ai/docs/proxy/prompt_management)

    Example Request:
    ```bash
    curl -X GET "http://localhost:4000/prompts/my_prompt_id/info" \
        -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "prompt_id": "my_prompt_id",
        "litellm_params": {
            "prompt_id": "my_prompt_id",
            "prompt_integration": "dotprompt",
            "prompt_directory": "/path/to/prompts"
        },
        "prompt_info": {
            "prompt_type": "config"
        },
        "created_at": "2023-11-09T12:34:56.789Z",
        "updated_at": "2023-11-09T12:34:56.789Z",
        "content": "System: You are a helpful assistant.

User: {{user_message}}"
    }
    ```
    r   r·   rf   Nr~   é�  úPrompt ú
 not foundrÆ   rÅ   z:You are not authorized to access this prompt. Your role - z, Your key's prompts - rl   r5   r9   )rY   rX   c              3   óN   K  — | ]  }|j                   sŒ|j                   –— Œ y ­wr-   ©r9   )r‹   r�   s     r1   r�   z"get_prompt_info.<locals>.<genexpr>Ÿ  s   è ø€ Ò%d¸#ÐTW×TcÓTc c§o¥oÑ%dùs   ‚%”%r‡   r7   rÉ   rQ   ©rY   rV   rW   rÊ   ©r5   ru   z in environment rÛ   r—   )rØ   Úraw_prompt_templateÚenvironments) rº   r¸   rÏ   rc   r»   r   r€   rL   r«   r   r   Ú	user_rolerm   rg   r[   ÚsortedÚsetrq   r£   Úget_prompt_by_idr}   r¼   r5   r#   rB   rD   r>   r@   r9   r;   rî   r!   )r5   r9   rµ   r¸   rc   r~   rÐ   Úall_environmentsÚall_prompt_rowsrØ   Úrequested_versionrÒ   Úenv_promptsÚlatest_prompt_idrÖ   Úprompt_spec_responseÚprompt_templates                    r1   Úget_prompt_infor  Y  s½  è ø€ õ\ PÝ8ð !%€GØ×!Ñ!Ð-Ü”tœC‘y 4Ñ'Ð):×)CÑ)C×)GÑ)GÈ	ÐSWÓ)XÓYˆØÐ 9°GÑ#;Ü¨C¸'À)ÀÈJÐ8WÔXÐXÜ&Ð'8Ô9ÜØØOÐPa×PkÑPkÐOlð  mDð  ELð  DMð  Nô
ð 	
ô
 /¸ÔC€Nð #%ÐØÐ Ü'4°]Ó'C×'MÑ'MØ Ð/Ø#�_ð (Nó (
÷ "
ˆô "¤#Ñ%dÀÔ%dÓ"dÓeÐð
 €KØJSÐWeÒJeÔ1¸IÕFÐkoÐÙ�}Ð0à'Ø&ñ5
ˆð Ð(Ø&7ˆL˜Ñ#Ü#0°Ó#?×#IÑ#IØØ˜fÐ%Øð $Jó $
÷ 
ˆñ
 Ü6ÀÈQÁÔPˆKð Ð˜{Ð2Ø/×@Ñ@ÀÓKˆØÐÜ&BØ#Ø8×JÑJô'Ðð 4×DÑDÐEUÓVˆKàÐÜØØ˜Y˜K zÐ2ÑZeÐ8HÈÈÐ6VÑnô
ð 	
àkmÑnô
ð 	
ô /¸×9NÑ9NÔO€Nô #-Ü$¨{×/DÑ/DÔEØ"×1Ñ1Ø×+Ñ+Ø×)Ñ)Ø×)Ñ)ØØ×+Ñ+Ø×)Ñ)ô	#Ðô 2°+¸~ÓN€OäØ(Ø+Ø%ôð ðy"
ùð$
ûs&   ‚C H;ÃH5ÃA&H;Ä)H8Ä*DH;È8H;z/prompts)r²   r³   Úrequestc           
   ƒ   ó6  K  — ddl m} ddlm} |j                  �D|j                  t
        j                  k7  r4|j                  t
        j                  j                  k7  rt        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚t        | j                  «      rt        d	t        ¬«      ‚	 | j                  r,| j                  j                  r| j                  j                  nd
}t!        || j"                  |¬«      ƒ d{  –—† }t%        |«      j'                  | j"                  |||j(                  | j                  j+                  «       | j                  r| j                  j+                  «       nt-        d¬«      j+                  «       dœ¬«      ƒ d{  –—† }t/        |¬«      }|j1                  |d¬«      }|€t        dd¬«      ‚|S 7 ŒÈ7 Œ6# t2        $ r1}	t5        j6                  d|	«       t        dt9        |	«      ¬«      ‚d}	~	ww xY w­w)u§  
    Create a new prompt

    ðŸ‘‰ [Prompt docs](https://docs.litellm.ai/docs/proxy/prompt_management)

    Example Request:
    ```bash
    curl -X POST "http://localhost:4000/prompts" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "prompt_id": "my_prompt",
            "litellm_params": {
                "prompt_id": "my_prompt",
                "prompt_integration": "dotprompt",
                "prompt_data": {"content": "This is a prompt", "metadata": {"model": "gpt-4"}}
            },
            "prompt_info": {
                "prompt_type": "config"
            }
        }'
    ```
    r   r·   rf   NrÅ   z$Only proxy admins can create promptsrÆ   éô  rð   rR   ©rc   r5   r9   r”   r•   ©r5   r7   r9   r;   rB   rD   ©r\   rÊ   ©rƒ   Úconfig_file_pathzFailed to initialize promptzError creating prompt: %s)rº   r¸   rÏ   rc   rù   r   ÚPROXY_ADMINÚvaluer   r   Údb_not_connected_errorr¯   rB   r¦   rD   r9   r‘   r5   rg   r^   Úuser_idÚmodel_dump_jsonr    r£   Úinitialize_promptré   r   Ú	exceptionrL   )
r  rµ   r¸   rc   r9   Únew_versionÚprompt_db_entryrØ   Úinitialized_promptÚes
             r1   Úcreate_promptr  Þ  sî  è ø€ õB PÝ8ð ×"Ñ"Ð*Ø×#Ñ#Ô'7×'CÑ'CÒCØ×'Ñ'Ô+;×+GÑ+G×+MÑ+MÒMä¨Ð4ZÔ[Ð[àÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcä% g×&<Ñ&<Ô=Ü¨Ô4OÔPÐPð,<ð ×"Ò" w×':Ñ':×'FÒ'Fð ×Ñ×+Ò+àð 	ô $?Ø'Ø×'Ñ'Ø#ô$
÷ 
ˆô (5°]Ó'C×'JÑ'Jà$×.Ñ.Ø&Ø*Ø/×7Ñ7Ø")×"8Ñ"8×"HÑ"HÓ"Jð ×*Ò*ð ×'Ñ'×7Ñ7Ô9ä#°Ô5×EÑEÓGñð (Kó (
÷ "
ˆô  :ÀOÔTˆð 7×HÑHÐP[ÐnrÐHÓsÐàÐ%Ü¨CÐ8UÔVÐVà!Ð!ð?
øð"
ùô4 ò <Ü×&Ñ&Ð'BÀAÔFÜ¨´C¸³FÔ;Ð;ûð<üsP   ‚B7HÂ:AG ÄGÄBG Æ#GÆ$3G ÇHÇG ÇG Ç	HÇ%,HÈHÈHc           
   ƒ   ó*  K  — ddl m} ddlm} |j                  �D|j                  t
        j                  k7  r4|j                  t
        j                  j                  k7  rt        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚t        |j                  «      rt        d	t        ¬«      ‚	 t        | ¬
«      }|j                  r,|j                  j                   r|j                  j                   nd}t#        |«      j%                  d|i¬«      ƒ d{  –—† }|st        dd|› d�¬«      ‚|j'                  | «      }|r&|j                  j(                  dk(  rt        d	d¬«      ‚t+        |||¬«      ƒ d{  –—† }	t#        |«      j-                  ||	||j.                  |j                  j1                  «       |j                  r|j                  j1                  «       nt3        d¬«      j1                  «       dœ¬«      ƒ d{  –—† }
t5        |
¬«      }|j7                  |d¬«      }|€t        dd¬«      ‚|S 7 �Œ!7 ŒÁ7 Œ9# t        $ r}|‚d}~wt8        $ r1}t;        j<                  d|«       t        dt?        |«      ¬«      ‚d}~ww xY w­w)u·  
    Update an existing prompt

    ðŸ‘‰ [Prompt docs](https://docs.litellm.ai/docs/proxy/prompt_management)

    Example Request:
    ```bash
    curl -X PUT "http://localhost:4000/prompts/my_prompt_id" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "prompt_id": "my_prompt",
            "litellm_params": {
                "prompt_id": "my_prompt",
                    "prompt_integration": "dotprompt",
                    "prompt_directory": "/path/to/prompts"
                },
                "prompt_info": {
                    "prompt_type": "config"
                }
            }
        }'
    ```
    r   r·   rf   NrÅ   z$Only proxy admins can update promptsrÆ   r  rð   rl   rR   r5   rˆ   rÎ   úPrompt with ID rò   ÚconfigúCannot update config prompts.r  r”   r•   r	  r
  rÊ   r  zFailed to update promptzError updating prompt: %s) rº   r¸   rÏ   rc   rù   r   r  r  r   r   r  r¯   rB   r¦   rm   rD   r9   rg   r[   rü   r–   r‘   r^   r  r  r    r£   r  ré   r   r  rL   )r5   r  rµ   r¸   rc   rÐ   r9   r�   Úexisting_in_memoryr  r  rØ   r  r  s                 r1   Úupdate_promptr  >  s…  è ø€ õD PÝ8ð ×"Ñ"Ð*Ø×#Ñ#Ô'7×'CÑ'CÒCØ×'Ñ'Ô+;×+GÑ+G×+MÑ+MÒMä¨Ð4ZÔ[Ð[àÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcä% g×&<Ñ&<Ô=Ü¨Ô4OÔPÐPðB<ä 2¸YÔ Gˆð
 ×"Ò" w×':Ñ':×'FÒ'Fð ×Ñ×+Ò+àð 	ô "/¨}Ó!=×!GÑ!GÈ{Ð\jÐNkÐ!GÓ!l×lÐáÜØØ(¨Ð(8¸
ÐCôð ð %>×$NÑ$NÈyÓ$YÐÙÐ"4×"@Ñ"@×"LÑ"LÐPXÒ"XÜØØ6ôð ô $?Ø'Ø$Ø#ô$
÷ 
ˆô (5°]Ó'C×'JÑ'Jà+Ø&Ø*Ø/×7Ñ7Ø")×"8Ñ"8×"HÑ"HÓ"Jð ×*Ò*ð ×'Ñ'×7Ñ7Ô9ä#°Ô5×EÑEÓGñð (Kó (
÷ "
ˆô  :ÀOÔTˆð 7×HÑHÐP[ÐnrÐHÓsÐàÐ%Ü¨CÐ8QÔRÐRà!Ð!ða mùð"
øð"
ùô4 ò ØˆûÜò <Ü×&Ñ&Ð'BÀAÔFÜ¨´C¸³FÔ;Ð;ûð<üso   ‚B7JÂ:A&I Ä IÄ!A!I ÆIÆB	I ÈIÈ3I É JÉI ÉI ÉI É	JÉIÉJÉ,JÊJÊJc              ƒ   óz  K  — ddl m} ddlm} |j                  �D|j                  t
        j                  k7  r4|j                  t
        j                  j                  k7  rt        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚	 |j                  | «      }|€*t        | |j                  ¬	«      }|j                  |«      }|} |€t        d
d| › d�¬«      ‚|j                  j                  dk(  rt        dd¬«      ‚t!        | ¬«      }d|i}|r||d<   t#        |«      j%                  |¬«      ƒ d{  –—†  |j'                  ||xs d¬«       |rd|› �nd}	dd|› d|	› �iS 7 Œ.# t        $ r}
|
‚d}
~
wt(        $ r1}
t+        j,                  d|
«       t        dt/        |
«      ¬«      ‚d}
~
ww xY w­w)uz  
    Delete a prompt

    ðŸ‘‰ [Prompt docs](https://docs.litellm.ai/docs/proxy/prompt_management)

    Example Request:
    ```bash
    curl -X DELETE "http://localhost:4000/prompts/my_prompt_id" \
        -H "Authorization: Bearer <your_api_key>"
    ```

    Example Response:
    ```json
    {
        "message": "Prompt my_prompt_id deleted successfully"
    }
    ```
    r   r·   rf   NrÅ   z$Only proxy admins can delete promptsrÆ   r  rö   rÎ   r  rò   r  rð   zCannot delete config prompts.rl   r5   r9   rˆ   rô   z from rÛ   Úmessagerñ   z deleted successfullyzError deleting prompt: %s)rº   r¸   rÏ   rc   rù   r   r  r  r   r   r  rü   r}   r¼   rD   r–   rm   rg   rb   Údelete_prompts_by_base_idré   r   r  rL   )r5   r9   rµ   r¸   rc   Úexisting_promptr  rÐ   Údelete_whereÚenv_msgr  s              r1   Údelete_promptr%  µ  sÙ  è ø€ õ8 PÝ8ð ×"Ñ"Ð*Ø×#Ñ#Ô'7×'CÑ'CÒCØ×'Ñ'Ô+;×+GÑ+G×+MÑ+MÒMä¨Ð4ZÔ[Ð[àÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcð+<à3×DÑDÀYÓOˆð Ð"Ü&BØ#Ø8×JÑJô'Ðð 8×HÑHÐIYÓZˆOà(ˆIàÐ"Ü¨C¸/È)ÈÐT^Ð8_Ô`Ð`à×&Ñ&×2Ñ2°hÒ>ÜØØ6ôð ô !3¸YÔ Gˆð 0;¸NÐ.KˆÙØ*5ˆL˜Ñ'ô ˜MÓ*×6Ñ6¸\Ð6ÓJ×JÐJà!×;Ñ;¸NÐXcÒXkÐgkÐ;Ôlá3>˜6 + Ñ/ÀBˆØ˜W ^Ð$4Ð4IÈ'ÈÐSÐTÐTð 	Kùô ò ØˆûÜò <Ü×&Ñ&Ð'BÀAÔFÜ¨´C¸³FÔ;Ð;ûð<üsI   ‚BF;ÂB+E0 Ä?E.Å -E0 Å-F;Å.E0 Å0	F8Å9E;Å;F8Æ,F3Æ3F8Æ8F;Úregistryr&   Úupdated_prompt_specc                 óH   — | j                  |¬«      }|€t        dd¬«      ‚|S )N)rƒ   r  zFailed to patch promptrÆ   )Úreload_promptr   )r&  r'  Úinitializeds      r1   Ú_reload_prompt_in_registryr+    s0   € Ø!×/Ñ/Ð7JÐ/ÓK€KØÐÜ¨Ð4LÔMÐMØÐr3   c              ƒ   ó‚  K  — ddl m} ddlm} |j                  �D|j                  t
        j                  k7  r4|j                  t
        j                  j                  k7  rt        dd¬«      ‚|€%t        dt        j                  j                  ¬«      ‚|j                  �&t        |j                  «      rt        d	t        ¬«      ‚	 t        | ¬
«      }|xs d}| |k7  rt        | ¬
«      nd}||dœ}	|�||	d<   t!        |«      j#                  |	ddid¬«      ƒ d{  –—† }
|
st        dd|› d|› �¬«      ‚|
d   }|› d|j$                  › �}|j'                  |«      }|r&|j(                  j*                  dk(  rt        d	d¬«      ‚t-        |¬«      }|j                  �|j                  n|j                  }|j(                  �|j(                  n|j(                  }|j/                  «       |j/                  «       dœ}|j0                  r|j0                  |d<   t!        |«      j3                  d|j4                  i|¬«      ƒ d{  –—† }|€t        dd|› d|› �¬«      ‚t-        |¬«      }t7        ||«      S 7 �ŒV7 Œ4# t        $ r}|‚d}~wt8        $ r1}t;        j<                  d|«       t        dt?        |«      ¬«      ‚d}~ww xY w­w)u³  
    Partially update an existing prompt

    ðŸ‘‰ [Prompt docs](https://docs.litellm.ai/docs/proxy/prompt_management)

    This endpoint allows updating specific fields of a prompt without sending the entire object.
    Only the following fields can be updated:
    - litellm_params: LiteLLM parameters for the prompt
    - prompt_info: Additional information about the prompt

    Example Request:
    ```bash
    curl -X PATCH "http://localhost:4000/prompts/my_prompt_id" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "prompt_info": {
                "prompt_type": "db"
            }
        }'
    ```
    r   r·   rf   NrÅ   z#Only proxy admins can patch promptsrÆ   r  rð   rl   rR   r‡   r7   rÉ   rQ   rõ   rÎ   r  z not found in environment ri   r  r  rÊ   )rB   rD   r;   r2   )rY   r\   zError patching prompt: %s) rº   r¸   rÏ   rc   rù   r   r  r  r   r   r  rB   r¯   r¦   rm   rq   rg   r[   r7   rü   rD   r–   r£   r  r  r`   r2   r+  ré   r   r  rL   )r5   r  r9   rµ   r¸   rc   rÐ   Úenvrÿ   Ú
find_whereÚdb_rowsÚ
target_rowÚversioned_idr"  Úcurrent_specÚupdated_litellm_paramsÚupdated_prompt_infoÚupdate_dataÚupdated_prompt_db_entryr'  r  s                        r1   Úpatch_promptr7    s  è ø€ õD PÝ8ð ×"Ñ"Ð*Ø×#Ñ#Ô'7×'CÑ'CÒCØ×'Ñ'Ô+;×+GÑ+G×+MÑ+MÒMä¨Ð4YÔZÐZàÐÜ¨Ô4E×4\Ñ4\×4bÑ4bÔcÐcà×ÑÐ)Ô.LÈW×McÑMcÔ.dÜ¨Ô4OÔPÐPðK<ä 2¸YÔ GˆØ Ò1 MˆØNWÐ[iÒNiÔ#5À	Õ#JÐosÐð (Øñ3
ˆ
ð Ð(Ø$5ˆJ�yÑ!ä,¨]Ó;×EÑEØØ˜fÐ%Øð  Fó  
÷ 
ˆñ
 ÜØØ(¨Ð(8Ð8RÐSVÐRWÐXôð ð
 $ A™Jˆ
ð "0Ð 0°°:×3EÑ3EÐ2FÐGˆØ!:×!KÑ!KÈLÓ!Yˆá˜×:Ñ:×FÑFÈ(ÒRÜØØ6ôð ô
 ;ÀZÔPˆð '.×&<Ñ&<Ð&HˆG×"Ò"Èl×NiÑNið 	ð
 $+×#6Ñ#6Ð#BˆG×ÒÈ×H`ÑH`ð 	ð 5×DÑDÓFØ.×>Ñ>Ó@ñ.
ˆð ×$Ò$Ø(9×(AÑ(AˆK˜Ñ%ô 0=¸]Ó/K×/RÑ/RØ˜Ÿ™Ð'Øð 0Só 0
÷ *
Ðð
 #Ð*ÜØØ(¨Ð(8Ð8RÐSVÐRWÐXôð ô
 &BÐLcÔ%dÐä)Ð*CÐEXÓYÐYðo
ùðT*
ùô ò ØˆûÜò <Ü×&Ñ&Ð'BÀAÔFÜ¨´C¸³FÔ;Ð;ûð<üs\   ‚CJ?ÃAI4 ÄI/ÄD#I4 È=I2È>0I4 É.J?É/I4 É2I4 É4	J<É=I?É?J<Ê,J7Ê7J<Ê<J?z/prompts/testÚfastapi_requestÚfastapi_responsec              ƒ   óœ  K  — ddl m} ddlm} ddlm}m} ddlm} ddl	m
}	m}
m}m}m}m}m}m}m}m}m} 	  |«       }|j+                  | j,                  ¬«      \  }} |||d¬	«      }|j.                  st1        d
d¬«      ‚| j2                  xs i } |j4                  j7                  |«      j8                  di |¤Ž} |«       }|j;                  |¬«      }|st1        d
d¬«      ‚| j<                  r4|D �cg c]  }|j?                  d«      dk(  sŒ|‘Œ }}|| j<                  z   }n|}|j@                  jC                  «       }d|d<   |j.                  |dœ} | jE                  |«       tG        | |	|
| j?                  dd«      ¬«        || ¬«      }!|!jI                  |||d||
|	||d||||||¬«      ƒ d{  –—† }"tK        |"|«      r|"jM                  dd¬«      S |"S c c}w 7 Œ*# t0        $ r}#|#‚d}#~#wtN        $ r}#t1        d
tQ        |#«      ¬«      ‚d}#~#wtR        $ r1}#tU        jV                  d|#«       t1        dtQ        |#«      ¬«      ‚d}#~#ww xY w­w)u±  
    Test a prompt by rendering it with variables and executing an LLM call.
    
    This endpoint allows testing prompts before saving them to the database.
    The response is always streamed.
    
    ðŸ‘‰ [Prompt docs](https://docs.litellm.ai/docs/proxy/prompt_management)
    
    Example Request:
    ```bash
    curl -X POST "http://localhost:4000/prompts/test" \
        -H "Authorization: Bearer <your_api_key>" \
        -H "Content-Type: application/json" \
        -d '{
            "dotprompt_content": "---\nmodel: gpt-4o\ntemperature: 0.7\n---\n\nUser: Hello {{name}}",
            "prompt_variables": {
                "name": "World"
            }
        }'
    ```
    r   r   rÞ   )ÚPromptManagerÚPromptTemplate)ÚProxyBaseLLMRequestProcessing)Úgeneral_settingsÚ
llm_routerÚproxy_configÚproxy_logging_objÚselect_data_generatorÚuser_api_baseÚuser_max_tokensÚ
user_modelÚuser_request_timeoutÚuser_temperaturer7   )r©   Útest_prompt)r©   r»   rí   rð   z'Model is required in dotprompt metadatarÆ   )Úrendered_contentz$No messages found in rendered promptÚroleÚsystemTÚstream)ÚmodelÚmessagesrM  rÛ   )Úrequest_bodyr>  r?  rM  r
  ÚacompletionN)r  r9  rµ   Ú
route_typerA  r?  r>  r@  rB  rM  rE  rG  rF  rD  rC  r7   )Úexclude_noneÚexclude_unsetzError testing prompt: %sr  r.   ),Úpydanticr   rä   rß   Ú-litellm.integrations.dotprompt.prompt_managerr;  r<  Ú'litellm.proxy.common_request_processingr=  rÏ   r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  r7   Ú_parse_frontmatterrà   rM  r   Úprompt_variablesÚ	jinja_envÚfrom_stringÚrenderÚ_convert_to_messagesÚconversation_historyr«   Úoptional_paramsÚcopyr`   r   Úbase_process_llm_requestr›   rF   ro   rL   ré   r   r  )$r  r8  r9  rµ   r   rß   r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  r7   rå   ÚfrontmatterÚtemplate_contentrì   Ú	variablesrI  Údotprompt_managerÚrendered_messagesÚmsgÚsystem_messagesrN  r^  r\   Úbase_llm_response_processorÚresultr  s$                                       r1   rH  rH  “  s~  è ø€ õ@ #åQ÷õ V÷÷ ÷ ñ ðT<á -£ˆØ(6×(IÑ(IÐRY×RkÑRkÐ(IÓ(lÑ%ˆÐ%ñ )Ð1AÈKÐerÔsˆð �~Š~Ü¨CÐ8aÔbÐbð #×3Ñ3Ò9°rˆ	Ø"_ .×":Ñ":×"FÑ"FÐGWÓ"X×"_Ñ"_Ñ"lÐbkÑ"lÐñ $4Ó#5ÐØ#4×#IÑ#IÐ[kÐ#IÓ#lÐá Ü¨CÐ8^Ô_Ð_ð ×'Ò'à5FÖ%f¨cÈ#Ï'É'ÐRXË/Ð]eÓJe¢cÐ%fˆOÐ%fà&¨×)EÑ)EÑE‰Hà(ˆHð "*×!9Ñ!9×!>Ñ!>Ó!@ˆð %)ˆ˜Ñ!ð —^‘^Ø ñ
ˆð 	�‰�OÔ$äØØ-Ø!Ø—(‘(˜7 BÓ'õ		
ñ .KÐPTÔ-UÐ#Ø&A×&ZÑ&ZØ#Ø-Ø/Ø$Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! '[ó '
÷ !
ˆô& �f˜iÔ(Ø×$Ñ$°$ÀdÐ$ÓKÐKàˆMùòe &gð8!
ùô0 ò ØˆûÜò <Ü¨´C¸³FÔ;Ð;ûÜò <Ü×&Ñ&Ð'AÀ1ÔEÜ¨´C¸³FÔ;Ð;ûð<üsr   ‚5I¸B=G Ã5GÄGÄBG Æ2GÆ3"G ÇIÇG ÇIÇG Ç	I	Ç(G*Ç*I	Ç6HÈI	È,IÉI	É	Iz/utils/dotprompt_json_converterÚutils.Úfilec              ƒ   ó  K  — ddl m} | j                  r| j                  j                  d«      st	        dd¬«      ‚d}	 | j                  «       ƒ d{  –—† }t        t        j                  «       «      t        | j                  «      z  }|j                  |«        |«       }|j                  |«      }|j                  }||dœ|r=|j                  «       r,|j                  «        	 |j                  j!                  «        S S S 7 Œ°# t"        $ r Y S w xY w# t$        $ r}t	        d	d
|› �¬«      ‚d}~ww xY w# |rL|j                  «       r;|j                  «        	 |j                  j!                  «        w # t"        $ r Y w w xY ww w xY w­w)a  
    Convert a .prompt file to JSON format.

    This endpoint accepts a .prompt file upload and returns the equivalent JSON representation
    that can be stored in a database or used programmatically.

    Returns the JSON structure with 'content' and 'metadata' fields.
    r   )r;  z.promptrð   z File must have .prompt extensionrÆ   N)r5   Ú	json_datar  zError converting prompt file: )rU  r;  ÚfilenameÚendswithr   Úreadr   ÚtempfileÚmkdtempr   Úwrite_bytesÚprompt_file_to_jsonÚstemÚexistsÚunlinkÚparentÚrmdirÚOSErrorré   )	rk  rµ   r;  Útemp_file_pathÚfile_contentrå   rm  r5   r  s	            r1   Úconvert_prompt_file_to_jsonr}     s{  è ø€ õ$ Lð �=Š= §¡× 6Ñ 6°yÔ AÜ¨Ð4VÔWÐWà€Nð!à$(§I¡I£K×/ˆô œh×.Ñ.Ó0Ó1´MÀ$Ç-Á-Ó4PÑPˆØ×"Ñ" <Ô0ñ !.£ˆð *×=Ñ=¸nÓMˆ	ð *×.Ñ.ˆ	ð #Ø"ñ
ñ ˜n×3Ñ3Ô5Ø×!Ñ!Ô#ðØ×%Ñ%×+Ñ+Õ-ð	 6ˆ>ð3 0ùô< ò Ùðûô ò ZÜ¨Ð6TÐUVÐTWÐ4XÔYÐYûðZûñ
 ˜n×3Ñ3Ô5Ø×!Ñ!Ô#ðØ×%Ñ%×+Ñ+Õ-øÜò Ùðúð 6ˆ>üs�   ‚=F	Á D ÁDÁA0D Ã"F	Ã'DÄF	ÄD Ä	DÄF	ÄDÄF	Ä	D3ÄD.Ä.D3Ä3D6 Ä6#FÅE5Å4FÅ5	FÅ>FÆ FÆFÆF	r-   )rR   )\Ú__doc__rq  Úcollections.abcr   r   r   r   Úpathlibr   Útypingr   r	   r
   r   r   Úfastapir   r   r   r   r   r   r   rT  r   Úlitellm._loggingr   Úlitellm.proxy._typesr   r   r   r   Úlitellm.proxy.auth.auth_utilsr   Ú$litellm.proxy.auth.user_api_key_authr   Ú%litellm.proxy.common_utils.path_utilsr   Ú'litellm.repositories.table_repositoriesr   r™   r   r    r!   r"   r#   r$   Ú$litellm.types.proxy.prompt_endpointsr%   rº   r&   Úlitellm.proxy.utilsr'   r(   rS   r*   rP   rU   rg   rL   rm   rM   rq   rt   rN   r}   r€   r…   r‘   r£   r¥   r¦   r­   r¯   r±   r«   rÃ   r×   rî   r  Úpostr  Úputr  Údeleter%  r+  Úpatchr7  rH  r¬   r}  r.   r3   r1   ú<module>r�     sÍ  ðòó ß 8Ñ 8Ý Ý ß <Õ <÷÷ ñ õ å 1÷ó õ ?Ý BÝ ?Ý D÷÷ õ CáÝLÝ0á“€ˆÓ ô6�ô 6ô.'�Yô 'ôN˜(ô Nð"1 ð 1Ð4Gó 1ð #ð ¨#ó ð6" #ð "¨#ó "ñJ#¨Sð #¸3À¹:ð #ÐQTó #ð6$¨Cð $ÀÈÈfÈÑAUð $ÐZ]ó $ðN)¨¨ZÑ(8ð )¸TÀ*Ñ=Mó )ð8 GTñØ!ðØ.1ðØ@Cðàóð2*¨Jð *¸:ó *ôZ*ˆYô *ðuð ˜Uó ð>Ð3Fð >È4ó >ô*˜ô *ð
 ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø&ð	 ó ð #Ù(/Ð0AÓ(BñU/Ø�t‘ðU/à%òU/óðU/ðp ‡�Ø#Ø
Ð	ÙÐ+Ó,Ð-Ø&ð	 ó ð #Ù(/Ð0AÓ(Bñc:Øðc:à�t‘ðc:ð &òc:óðc:ðL& jð &À#ð &ÐJ\Ð_cÑJcó &ðR ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø%ð	 ó ð ‡�ØØ
Ð	ÙÐ+Ó,Ð-Ø%ð	 ó ð #Ù(/Ð0AÓ(BñvØðvà�t‘ðvð &òvóóðvðr ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(BñX<ØðX<à%òX<óð
X<ðv ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(Bño<Øðo<àðo<ð &òo<óð
o<ðd ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ð #Ù(/Ð0AÓ(BñO<ØðO<à�t‘ðO<ð &òO<óð
O<ðdÐ)Að ÐXbð Ðgqó ð ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ð #Ù(/Ð0AÓ(Bñ	x<Øðx<àðx<ð �t‘ðx<ð &ò	x<óð
x<ðv ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(Bñ	E<ØðE<àðE<ð ðE<ð &ò	E<óð
E<ðP ‡�Ø%Ø
�WÐ	ÙÐ+Ó,Ð-ð ó ñ ˜C“yÙ(/Ð0AÓ(Bñ5Ø
ð5à%ð5ð 
ˆ#ˆsˆ(�^ò5óñ
5r3   