
    jP                         d dl mZmZmZmZmZ d dlZd dl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 ej.                   G d	 d
             Z G d d      Zy)    )AnyDictListOptionalTupleN)clientPromptVersionUpdate)core)prompt_version_detail)opik_query_language   )typesc                   D    e Zd ZU dZeed<   eed<   ej                  ed<   y)PromptSearchResultz_Result from searching prompts, containing name, template structure, and latest version details.nametemplate_structurer   N)__name__
__module____qualname____doc__str__annotations__r   PromptVersionDetail     w/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/opik/api_objects/prompt/client.pyr   r      s    i
I0DDDr   r   c                      e Zd Zdej                  fdZej                  j                  dddddfde	de	de
ee	ef      dej                  d	e	d
e
e	   de
e	   de
e	   de
ee	      dej                  fdZ	 	 	 	 	 d!de	de	dej"                  de
ee	ef      d	e	d
e
e	   de
e	   de
e	   de
ee	      dej                  fdZde	de
ej                     fdZ	 	 d"de	de
e	   de
e	   de
ej                     fdZ	 	 d"de	de
e	   de
e	   deej                     fdZ	 	 d"de	de
e	   de
e	   deej                     fdZdddde
e	   de
eee	ef         dee   fdZ	 	 d"dee	   de
ee	      de
e   ddfd Zy)#PromptClientr   c                     || _         y )N)_rest_client)selfr   s     r   __init__zPromptClient.__init__   s
    "r   textNr   promptmetadatatyper   iddescriptionchange_descriptiontagsreturnc
                 ,   | j                  |      }
d}|
|
j                  |k7  r,t        j                  j	                  ||
j                  |      |dk(  r;	 t        j                  |
j                        }t        j                  |      }||k(  }n|
j                  |k(  }|
*|r(|
j                  |k7  s|
j                  |j                  k7  r| j                  |||||||||		      }
|
S # t
        j                  t        f$ r |
j                  |k(  }Y rw xY w)a  
        Creates the prompt detail for the given prompt name and template.

        Parameters:
        - name: The name of the prompt.
        - prompt: The template content for the prompt.
        - metadata: Optional metadata for the prompt.
        - type: The template type (MUSTACHE or JINJA2).
        - template_structure: Either "text" (default) or "chat".
        - id: Optional unique identifier (UUID) for the prompt.
        - description: Optional description of the prompt (up to 255 characters).
        - change_description: Optional description of changes in this version.
        - tags: Optional list of tags to associate with the prompt.

        Returns:
        - A Prompt object for the provided prompt name and template.

        Raises:
        - PromptTemplateStructureMismatch: If a prompt with the same name already exists but has a different
          template_structure (e.g., trying to create a text prompt when a chat prompt exists, or vice versa).
          Template structure is immutable after prompt creation.
        Fprompt_nameexisting_structureattempted_structurechat)	r   r$   r&   r%   r   r'   r(   r)   r*   )_get_latest_versionr   opik
exceptionsPromptTemplateStructureMismatchjsonloadstemplateJSONDecodeError	TypeErrorr%   r&   value_create_new_version)r!   r   r$   r%   r&   r   r'   r(   r)   r*   prompt_versiontemplates_equalexisting_messagesnew_messagess                 r   create_promptzPromptClient.create_prompt   s=   D 11$7  %004FFooEE $'5'H'H(: F   "V+H(,

>3J3J(K%#'::f#5L&7<&GO #1"9"9V"C ""&&(2""djj0!55!#5'#5 6 
N ; ,,i8 H&4&=&=&GOHs   9C( ((DDc
                    | j                  |      }
|
|||	| j                  j                  j                  |||||||||		       | j                  j                  j	                  |      }|	|j
                  t        j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |	|j                  |j                   |j"                  |j$                        }|S t        j                  |||      }| j                  j                  j'                  |||      }|S )N)	r   r'   r(   r8   r%   r)   r&   r   r*   r   r'   	prompt_idcommitr8   r%   r&   r)   r*   	variablesr   
created_at
created_by)r8   r%   r&   )r   versionr   )r2   r    promptsrA   retrieve_prompt_versionr*   r   r   r'   rE   rF   r8   r%   r&   r)   rG   r   rH   rI   create_prompt_version)r!   r   r$   r&   r%   r   r'   r(   r)   r*   existing_versionnew_prompt_version_detailnew_prompt_version_detail_datas                r   r<   z PromptClient._create_new_versionm   sv     33D9 #Nk59I%%33'!#5#5 4 
 !!))AA B  & $=$B$B$J,A,U,U0337AA4;;6??6??277'@'S'S7AA'@'S'S8CC8CC-)4 )( .C-V-V!.*
 )-(9(9(A(A(W(W6#5 )X )%
 )(r   c                 (    | j                  |d       S )Nr   rF   )
get_prompt)r!   r   s     r   r2   z PromptClient._get_latest_version   s     D66r   rF   raise_if_not_template_structurec                 d   	 | j                   j                  j                  ||      }|j                  du xr |dk(  }|r|S |;|j                  |k7  r,t        j
                  j                  ||j                  |      |S # t        j                  $ r}|j                  dk7  r|Y d}~yd}~ww xY w)a  
        Retrieve the prompt detail for a given prompt name and commit version.

        Parameters:
            name: The name of the prompt.
            commit: An optional commit version of the prompt. If not provided, the latest version is retrieved.
            raise_if_not_template_structure: Optional template structure validation. If provided and doesn't match, raises PromptTemplateStructureMismatch.

        Returns:
            Prompt: The details of the specified prompt.
        rR   Nr#   r-     )
r    rK   rL   r   r3   r4   r5   rest_api_coreApiErrorstatus_code)r!   r   rF   rT   r=   should_skip_validationes          r   rS   zPromptClient.get_prompt   s    "	!..66NN O N 11T9 >3v= # &%% 0;"559XXooEE $'5'H'H(G F   "!%% 	}}# $ 		s   ?B >B B/B**B/searchfilter_stringc                 (   	 | j                   j                  j                  |      j                  }|t	        |      dk(  rt        d|z         |D cg c]  }||j                  k(  s|j                    }}t	        |      dk(  rt        d|z         d}|r+t        j                  j                  |      }|j                  }|d   }	| j                  |	||      S c c}w # t        j                  $ r}
|
j                  dk7  r|
Y d}
~
g S d}
~
ww xY w)a4	  
        Retrieve all the prompt details for a given prompt name.

        Parameters:
            name: The name of the prompt.
            search: Optional search text to find in template or change description fields.
            filter_string: A filter string to narrow down the search using Opik Query Language (OQL).
                The format is: "<COLUMN> <OPERATOR> <VALUE> [AND <COLUMN> <OPERATOR> <VALUE>]*"

                Supported columns include:
                - `id`, `commit`, `template`, `change_description`, `created_by`: String fields with full operator support
                - `metadata`: Dictionary field (use dot notation, e.g., "metadata.environment")
                - `type`: Enum field (=, != only)
                - `tags`: List field (use "contains" operator only)
                - `created_at`: DateTime field (use ISO 8601 format, e.g., "2024-01-01T00:00:00Z")

                Examples:
                - `tags contains "production"` - Filter by tag
                - `tags contains "v1" AND tags contains "production"` - Filter by multiple tags
                - `template contains "customer"` - Filter by template content
                - `created_by = "user@example.com"` - Filter by creator
                - `created_at >= "2024-01-01T00:00:00Z"` - Filter by creation date
                - `metadata.environment = "prod"` - Filter by metadata field

        Returns:
            List[PromptVersionDetail]: A list of prompt versions for the given name.

        Example:
            # Get all versions of a prompt
            versions = prompt_client.get_all_prompt_versions(name="my-prompt")

            # Filter by tags (versions containing "production" tag)
            versions = prompt_client.get_all_prompt_versions(
                name="my-prompt",
                filter_string='tags contains "production"'
            )

            # Search for specific text in template or change description fields
            versions = prompt_client.get_all_prompt_versions(
                name="my-prompt",
                search="customer"
            )

            # Combine search and filtering
            versions = prompt_client.get_all_prompt_versions(
                name="my-prompt",
                search="customer",
                filter_string='tags contains "production"'
            )
        rC   Nr   zNo prompts found for name: )r\   filtersrV   )r    rK   get_promptscontentlen
ValueErrorr   r'   r   OpikQueryLanguagefor_prompt_versionsparsed_filters$_get_prompt_versions_by_id_paginatedrW   rX   rY   )r!   r   r\   r]   prompts_matching_name_stringxfiltered_prompt_listr_   oqlrE   r[   s              r   get_all_prompt_versionsz$PromptClient.get_all_prompt_versions   s;   p	+/+<+<+D+D+P+P ,Q ,g ) -4349 !>!EFF ;$:daffn: ! $ '(A- !>!EFF%)G);;OO! ,,,Q/I<<&' =  $$ %% 	}}# $ 			s1   AC" C)C7A%C" C" "D5DDrE   r_   c                    d}d}g }	 | j                   j                  j                  |||||      j                  }|xs g }|j	                  |D 	cg c]z  }	t        j                  |	j                  |	j                  |	j                  |	j                  |	j                  |	j                  |	j                  |	j                  |	j                  	      | c}	       t!        |      |k  r	 |S |dz  }c c}	w )Nr   d   )r'   pagesizer\   r_   )	r'   rE   r8   r&   r%   rF   rH   rI   r*   )r    rK   get_prompt_versionsra   extendr   r   r'   rE   r8   r&   r%   rF   rH   rI   r*   rb   )
r!   rE   r\   r_   ro   rp   rK   prompt_versions_pageversionsrJ   s
             r   rg   z1PromptClient._get_prompt_versions_by_id_paginatedC  s    CE#'#4#4#<#<#P#P $Q $ g ! ,1rHNN $, $, *=="::")"3"3!(!1!1$\\!(!1!1&~~#*#5#5#*#5#5$\\
 $,& 8}t#  AID? s   A?C.)r   rf   rf   c                Z   	 |t        j                  |      nd}d}d}g }	 | j                  j                  j	                  ||||      }|j
                  xs g }t        |      dk(  rnY|j                  |D 	cg c])  }	|	j                  |	j                  xs d|	j                  f+ c}	       t        |      |k  rn|dz  }t        |      dk(  rg S g }
|D ]  \  }}}	 | j                  j                  j                  |      }||j                  t        j                  |j                  |j                  |j                   |j"                  |j$                  |j&                  |j(                  ||j*                  |j                  |j,                  |j.                        }|
j1                  t3        |||	              |
S c c}	w # t4        j6                  $ r}|j8                  d
k(  rY d}~|d}~ww xY w# t4        j6                  $ r}|j8                  d
k7  r|g cY d}~S d}~ww xY w)a  
        Search prompt containers by optional name substring and filters, then
        return the latest version detail for each matched prompt container.

        Parameters:
            name: Optional substring of the prompt name to search for.
            parsed_filters: List of parsed filters (OQL) that will be stringified for the backend.

        Returns:
            List[PromptSearchResult]: Each result contains name, template_structure, and prompt_version_detail.
        Nr   i  )ro   rp   r   r_   r   r#   rC   rD   )r   r   r   rV   )r6   dumpsr    rK   r`   ra   rb   rr   r   r   r*   rL   r   r   r'   rE   rF   r8   r%   r&   r)   rG   rH   rI   appendr   rW   rX   rY   )r!   r   rf   filters_strro   rp   prompt_infoprompts_pagera   presultsr.   r   r*   latest_versionr[   s                   r   search_promptszPromptClient.search_promptso  sE   "H	.<.H

>*d  DDFHK#0088DD'	  E   '..4"w<1$""OVWw!affa22<faffEwW w<$&	 " ;1$	 13G9D5/ %)%6%6%>%>%V%V( &W &N 'N,?,?,G)>)R)R-00&4&>&>#1#8#8%3%<%<%3%<%<!/!4!4/=/P/P!%&4&>&>/=/P/P'5'@'@'5'@'@* NN*!,/A2@- :EF N] XP %-- }}+ G	 %% 	}}#I	sg   A7G: 9.G'+G: G: C G?G: G: G7G2*G: 0G22G77G: :H*H%H*%H*version_idsmergec                 l    t        |      }| j                  j                  j                  |||       y)a`  
        Update tags for one or more prompt versions in a single batch operation.

        Parameters:
            version_ids: List of prompt version IDs to update.
            tags: Tags to set or merge. Semantics:
                - None: No change to tags (preserves existing tags).
                - []: Clear all tags (when merge is False or None).
                - ['tag1', 'tag2']: Set or merge tags (based on merge parameter).
            merge: Controls tag update behavior. Semantics:
                - None: Use backend default behavior (replace mode).
                - False: Replace all existing tags (replace mode).
                - True: Merge new tags with existing tags (union).

        Example:
            # Replace tags on multiple versions (default behavior)
            prompts_client.batch_update_prompt_version_tags(
                version_ids=["version-id-1", "version-id-2"],
                tags=["production", "v2"]
            )

            # Merge new tags with existing tags
            prompts_client.batch_update_prompt_version_tags(
                version_ids=["version-id-1"],
                tags=["hotfix"],
                merge=True
            )

            # Clear all tags
            prompts_client.batch_update_prompt_version_tags(
                version_ids=["version-id-1"],
                tags=[]
            )
        )r*   )idsupdate
merge_tagsN)r	   r    rK   update_prompt_versions)r!   r   r*   r   r   s        r    batch_update_prompt_version_tagsz-PromptClient.batch_update_prompt_version_tags  s5    P %$/!!88Fu 	9 	
r   )r#   NNNN)NN)r   r   r   rest_clientOpikApir"   prompt_types
PromptTypeMUSTACHEr   r   r   r   r   r   r   rA   PromptVersionDetailTyper<   r2   rS   rl   rg   r   r~   boolr   r   r   r   r   r      s   #{22 # )5(?(?(H(H"( %),0$(QQ Q 4S>*	Q
 %%Q  Q SMQ c]Q %SMQ tCy!Q 
	2	2Qr #) %),0$(C)C) C) $;;	C)
 4S>*C)  C) SMC) c]C) %SMC) tCy!C) 
	2	2C)J77	';;	<7 !%9=	.. . *2#	.
 
';;	<.j !%'+	XX X  }	X
 
#77	8Xz !%!%	** * #	*
 
#77	8*^ #9=	Y smY !d38n!56	Y
 
 	!Y| %) $	+
#Y+
 tCy!+
 ~	+

 
+
r   r   )typingr   r   r   r   r   r6   dataclassesopik.exceptionsr3   opik.rest_apir   r   r	   r
   rW   opik.rest_api.typesr   opik.api_objectsr    r   r   	dataclassr   r   r   r   r   <module>r      sQ    3 3    D / 5 0 # E E E_
 _
r   