
     j"D                        d Z ddlZddlmZmZ ddlmZmZmZm	Z	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mZmZmZmZmZ ddlmZ  G d de          Z G d	 d
e          Z G d de          Z  G d de          Z!ee e!f         Z" G d d          Z# G d de          Z$ G d de$          Z% G d de$          Z&ee%e&f         Z'dS )z@private    N)ABCabstractmethod)	AnyDictListLiteralOptionalSequenceTuple	TypedDictUnion)CreateDatasetItemRequestCreateDatasetRequestDatasetDatasetItem
DatasetRunDatasetStatusMapValueObservationPromptPrompt_ChatPrompt_TextTraceWithFullDetails)langfuse_loggerc                   $    e Zd ZU eed<   eed<   dS )ChatMessageDictrolecontentN__name__
__module____qualname__str__annotations__     X/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/langfuse/model.pyr   r      "         
IIILLLLLr&   r   c                   $    e Zd ZU eed<   eed<   dS )ChatMessagePlaceholderDictr   r   Nr   r%   r&   r'   r*   r*      r(   r&   r*   c                   :    e Zd ZU ed         ed<   eed<   eed<   dS )'ChatMessageWithPlaceholdersDict_Messagemessagetyper   r   Nr    r!   r"   r   r$   r#   r%   r&   r'   r,   r,   "   s3         
)

IIILLLLLr&   r,   c                   0    e Zd ZU ed         ed<   eed<   dS )+ChatMessageWithPlaceholdersDict_Placeholderplaceholderr.   nameNr/   r%   r&   r'   r1   r1   (   s*         
-
    
IIIIIr&   r1   c                       e Zd ZdZdZedededee	eeef                  fd            Z
ededee         fd            Zedded	eeeef                  defd
            ZdS )TemplateParser{{}}r   	start_idxreturnc                 L   |                      t          j        |          }|dk    rdS |                      t          j        |          }|dk    rdS | |t	          t          j                  z   |                                         }|||t	          t          j                  z   fS )zHReturns (variable_name, start_pos, end_pos) or None if no variable foundN)findr5   OPENINGCLOSINGlenstrip)r   r8   	var_startvar_endvariable_names        r'   _parse_next_variablez#TemplateParser._parse_next_variable7   s    
 LL!7CC	??4,,~5yAAb==4N2333g=

%'' 	 y'C8N4O4O*OPPr&   c                     g }d}|t          |           k     rTt                              | |          }|sn6|                    |d                    |d         }|t          |           k     T|S )Nr      )r?   r5   rD   append)r   namescurr_idxresults       r'   find_variable_namesz"TemplateParser.find_variable_namesI   sv    W%%#88(KKF LL###ayH W%% r&   Ndatac                    || S g }d}|t          |           k     rt                              | |          }|s|                    | |d                     n|\  }}}|                    | ||                    ||v r3|                    ||         t	          ||                   nd           n|                    | ||                    |}|t          |           k     d                    |          S )Nr    )r?   r5   rD   rG   r#   join)r   rL   result_listrI   rJ   rC   rA   rB   s           r'   compile_templatezTemplateParser.compile_templateW   s"   <NW%%#88(KKF ""7899#566606-M9gwx	'9:;;;$$""04]0C0OC]+,,,UW    ""79W+<#=>>>H# W%%& ww{###r&   N)r    r!   r"   r=   r>   staticmethodr#   intr	   r   rD   r   rK   r   r   rQ   r%   r&   r'   r5   r5   3   s        GGQQ!$Q	%S#&	'Q Q Q \Q" S T#Y    \ $ $# $Xd38n-E $QT $ $ $ \$ $ $r&   r5   c                      e Zd ZU eed<   eed<   eeef         ed<   ee         ed<   ee         ed<   e	e         ed<   dde
d	efd
Zedeeef         deeeeeeef         eef                  f         fd            Zeedee         fd                        Zededefd            Zedefd            Zededefd            Zededefd            ZdS )BasePromptClientr3   versionconfiglabelstagscommit_messageFpromptis_fallbackc                     |j         | _         |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        || _        d S rR   )r3   rW   rX   rY   rZ   r[   r]   )selfr\   r]   s      r'   __init__zBasePromptClient.__init__}   sH    K	~mmK	$3&r&   kwargsr9   c                     d S rR   r%   r_   ra   s     r'   compilezBasePromptClient.compile   s	     	r&   c                     d S rR   r%   r_   s    r'   	variableszBasePromptClient.variables   s	     	r&   otherc                     d S rR   r%   r_   rh   s     r'   __eq__zBasePromptClient.__eq__       r&   c                     d S rR   r%   rf   s    r'   get_langchain_promptz%BasePromptClient.get_langchain_prompt   rl   r&   r   c                 b    t                               |           }t          j        dd|          S )Nz{{\s*(\w+)\s*}}z{\g<1>})rV   _escape_json_for_langchainresub)r   json_escaped_contents     r'   _get_langchain_prompt_stringz-BasePromptClient._get_langchain_prompt_string   s,    /JJ7SSv(*6JKKKr&   textc                 (   g }g }dt          |           }}||k     rb| |         }|dk    r|dz   |k     r*| |dz            dk    r|                    d           |dz  }H|dz   }||k     r?| |                                         r%|dz  }||k     r| |                                         %||k     o	| |         dv }|                    |rdnd           |                    |           |dz  }|dk    rl|dz   |k     r+| |dz            dk    r|                    d           |dz  }|r|                                nd	}|                    |rdnd           |dz  }H|                    |           |dz  }||k     bd
                    |          S )uJ  Escapes every curly-brace that is part of a JSON object by doubling it.

        A curly brace is considered “JSON-related” when, after skipping any
        immediate whitespace, the next non-whitespace character is a single
        or double quote.

        Braces that are already doubled (e.g. {{variable}} placeholders) are
        left untouched.

        Parameters
        ----------
        text : str
            The input string that may contain JSON snippets.

        Returns:
        -------
        str
            The string with JSON-related braces doubled.
        r   {   r6   rF   >   "'}r7   FrN   )r?   rG   isspacepoprO   )ru   outstackinchjis_jsons           r'   rp   z+BasePromptClient._escape_json_for_langchain   s   * #d))1!eeaB Syyq5199a!e!3!3JJt$$$FA E!eeQ 1 1eFA !eeQ 1 1e a%9DGz$9

7344444W%%%Q sq5199a!e!3!3JJt$$$FA).9%))+++E

7344444Q JJrNNNFAK !eeN wws||r&   NF)r    r!   r"   r#   r$   rT   r   r   r   r	   r   boolr`   r   r   r
   r   r1   rd   propertyrg   objectrk   rn   rS   rt   rp   r%   r&   r'   rV   rV   u   s        
IIILLLcNI
s)OOOSM!!!' 'v 'D ' ' ' ' c3h	S#X;=	
		
   ^ 49    ^ X F t    ^ c    ^ Lc Lc L L L \L
 ? ? ? ? ? \? ? ?r&   rV   c                        e Zd Zddedef fdZdeeef         defdZ	e
dee         fd            Zd	edefd
Zdeeef         defdZ xZS )TextPromptClientFr\   r]   c                 d    t                                          ||           |j        | _        d S rR   )superr`   r\   )r_   r\   r]   	__class__s      r'   r`   zTextPromptClient.__init__   s*    ---mr&   ra   r9   c                 B    t                               | j        |          S rR   )r5   rQ   r\   rc   s     r'   rd   zTextPromptClient.compile   s    ..t{FCCCr&   c                 @    t                               | j                  S )z5Return all the variable names in the prompt template.)r5   rK   r\   rf   s    r'   rg   zTextPromptClient.variables   s     11$+>>>r&   rh   c                     t          || j                  r@| j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S dS )NF)
isinstancer   r3   rW   r\   rX   rj   s     r'   rk   zTextPromptClient.__eq__   sc    eT^,, 		UZ' 0LEM10K5</0 K5</	 ur&   c                 ~    |r t                               | j        |          n| j        }|                     |          S )af  Convert Langfuse prompt into string compatible with Langchain PromptTemplate.

        This method adapts the mustache-style double curly braces {{variable}} used in Langfuse
        to the single curly brace {variable} format expected by Langchain.

        kwargs: Optional keyword arguments to precompile the template string. Variables that match
                the provided keyword arguments will be precompiled. Remaining variables must then be
                handled by Langchain's prompt template.

        Returns:
            str: The string that can be plugged into Langchain's PromptTemplate.
        )r5   rQ   r\   rt   )r_   ra   r\   s      r'   rn   z%TextPromptClient.get_langchain_prompt  sC     N++DK@@@ 	 00888r&   r   )r    r!   r"   r   r   r`   r   r#   r   rd   r   r   rg   r   rk   rn   __classcell__r   s   @r'   r   r      s        $ ${ $ $ $ $ $ $ $Dc3h DC D D D D ?49 ? ? ? X?	F 	t 	 	 	 	9U38_ 9 9 9 9 9 9 9 9 9r&   r   c                        e Zd Zddedef fdZdeeef         de	ee
eef         eef                  fdZedee         fd            Zd	edefd
Zdeeef         deeeeef         ef                  fdZ xZS )ChatPromptClientFr\   r]   c                    t                                          ||           g | _        |j        D ]}t          |d          rJt          |d          r:|j        dk    r/| j                            t          d|j                             \t          |d          rDt          |d          r4| j                            t          d|j	        |j
                             d S )	Nr.   r3   r2   )r.   r3   r   r   r-   )r.   r   r   )r   r`   r\   hasattrr.   rG   r1   r3   r,   r   r   )r_   r\   r]   pr   s       r'   r`   zChatPromptClient.__init__  s   ---=? 	 	Aq&!! ga&8&8 QV}=T=T""?*V      F## 9(=(= "";&V !	    	 	r&   ra   r9   c           
      B   g }g }| j         D ]}|d         dk    rL|}|                    t          |d         t                              |d         |                               [|d         dk    r|d         }||v rP||         }t          |t                    r|D ]}t          |t                    rpt          |          }	|                    dd          |	d<   t                              |                    dd	          |          |	d<   |                    |	           |                    t          dt          |                               d
| d}
t          j        |
           Ӑi|                    t          dt          |                               d
| dt          |           }t          j        |           |                    |           |                    |d                    |rd| d}t          j        |           |S )a  Compile the prompt with placeholders and variables.

        Args:
            **kwargs: Can contain both placeholder values (list of chat messages) and variable values.
                     Placeholders are resolved first, then variables are substituted.

        Returns:
            List of compiled chat messages as plain dictionaries, with unresolved placeholders kept as-is.
        r.   r-   r   r   )r   r   r2   r3   	NOT_GIVENrN   zPlaceholder 'z^' should contain a list of chat messages with 'role' and 'content' fields. Appended as string.z,' must contain a list of chat messages, got zPlaceholders zE have not been resolved. Pass them as keyword arguments to compile().)r\   rG   r   r5   rQ   r   listdictgetr#   r   warningr.   )r_   ra   compiled_messagesunresolved_placeholderschat_messagemessage_objplaceholder_nameplaceholder_valuemsgcompiled_msgno_role_content_in_placeholderplaceholder_not_a_listunresolved_placeholders_messages                r'   rd   zChatPromptClient.compile0  s   .  	 VX K 4	I 4	ILF#y00*!((#(0 . ? ?'	2"! !      f%66#/#7 #v--(./?(@%!"3T:: H#4 X XC)#t44 X/3Cyy7:wwv{7S7SV 4$2$C$C(+	2(>(>(.%& %& !-Y 7 !2 8 8 F F F F 1 8 8$3-8034E0F0F%& %& %&!" !" !" BBQa  BB  BB  BB > / 78V W W W W+X. *00+%0(+,=(>(>     2YAQ  2Y  2Y  @D  EV  @W  @W  2Y  2Y.'/0FGGGG &,,\:::+22<3GHHH" 	E /]>U  /]  /]  /]+#$CDDD  r&   c                     g }| j         D ]A}|d         dk    r3|                    t                              |d                              B|S )z:Return all the variable names in the chat prompt template.r.   r-   r   )r\   extendr5   rK   )r_   rg   r   s      r'   rg   zChatPromptClient.variables  sa     	 K 	 	LF#y00  "66|I7NOO   r&   rh   c                 F   t          || j                  r| j        |j        k    oz| j        |j        k    ojt	          | j                  t	          |j                  k    o@t          d t          | j        |j                  D                       o| j        |j        k    S dS )Nc              3      K   | ]m\  }}|d          dk    o/|d          dk    o#|d         |d         k    o|d         |d         k    p)|d          dk    o|d          dk    o|d         |d         k    V  ndS )r.   r-   r   r   r2   r3   Nr%   ).0m1m2s      r'   	<genexpr>z*ChatPromptClient.__eq__.<locals>.<genexpr>  s         B 6
i/ ;vJ)3;vJ"V*4; yMR	]:	 6
m3 5vJ-75vJ"V*4     r&   F)	r   r   r3   rW   r?   r\   allziprX   rj   s     r'   rk   zChatPromptClient.__eq__  s    eT^,, 		UZ' 0LEM10$$EL(9(990    #&dk5<"@"@    0( K5</+0 ur&   c                     | j         di |}g }|D ]}t          |t                    rcd|v r_|d         dk    rS|d         }	 ddlm} |                     ||                     V# t          $ r}d}t          |          |d}~ww xY wt          |t                    r>d	|v r:d
|v r6|                    |d	         |                     |d
                   f           |S )a  Convert Langfuse prompt into string compatible with Langchain ChatPromptTemplate.

        It specifically adapts the mustache-style double curly braces {{variable}} used in Langfuse
        to the single curly brace {variable} format expected by Langchain.
        Placeholders are filled-in from kwargs and unresolved placeholders are returned as Langchain MessagesPlaceholder.

        kwargs: Optional keyword arguments to precompile the template string. Variables that match
                the provided keyword arguments will be precompiled. Remaining variables must then be
                handled by Langchain's prompt template.
                Can also contain placeholders (list of chat messages) which will be resolved prior to variable
                compilation.

        Returns:
            List of messages in the format expected by Langchain's ChatPromptTemplate:
            (role, content) tuples for regular messages or MessagesPlaceholder objects for unresolved placeholders.
        r.   r2   r3   r   )MessagesPlaceholder)rC   zVlangchain_core is required to use get_langchain_prompt() with unresolved placeholders.Nr   r   r%   )rd   r   r   langchain_core.prompts.chatr   rG   ImportErrorrt   )	r_   ra   r   langchain_messagesr   r   r   eimport_errors	            r'   rn   z%ChatPromptClient.get_langchain_prompt  sG   & )DL22622@B$ 	 	C#t$$ 33v;-;W;W#&v; ;OOOOOO&--++:JKKK    # ; ; ;#{L%l33:; c4(( Vs]]yC?O?O&--K ==c)nMM   "!s   %A((
B	2BB	r   )r    r!   r"   r   r   r`   r   r#   r   r
   r   r   r1   rd   r   r   rg   r   rk   r   rn   r   r   s   @r'   r   r     s5        {       ,T!S/T! 
cNO-XX	

T! T! T! T!l 	49 	 	 	 X	F t    8,"c3h,"	eE#s(OS()	*," ," ," ," ," ," ," ,"r&   r   )(__doc__rq   abcr   r   typingr   r   r   r   r	   r
   r   r   r   langfuse.apir   r   r   r   r   r   r   r   r   r   r   r   langfuse.loggerr   r   r*   r,   r1   ChatMessageWithPlaceholdersDictr5   rV   r   r   PromptClientr%   r&   r'   <module>r      s    				 # # # # # # # # X X X X X X X X X X X X X X X X X X X X X X                            , + + + + +    i   
       
    i       )   
 #(+/1# ?$ ?$ ?$ ?$ ?$ ?$ ?$ ?$Ds s s s ss s s sl+9 +9 +9 +9 +9' +9 +9 +9\A" A" A" A" A"' A" A" A"H %'778r&   