
     j                     v   U d dl mZ d dlm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mZ d dlm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 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+m,Z, d dl-m.Z. d dl/m0Z0 d dl1m2Z2 	 d dl3Z3e3j4        5                    d          r/d dl6m7Z7m8Z8 d dl9m:Z; d dl<m=Z= d dl>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE d dlFmGZGmHZH n.d dlIm:Z; d dlJm7Z7m8Z8 d dlKm=Z= d dl>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE d dlFmGZGmHZH n# eL$ r  eMd          w xY wdZNeOePd<    eQ            ZReeeS                  ePd<   dZTeee                  ePd<   dZU	 d dlVmWZW eRX                    eW           n# eL$ r Y nw xY w	 d d lYmZZ[ e[ZTn# eL$ r Y nw xY we G d! d"                      Z\e G d# d$                      Z] G d% d&          Z^ G d' d(e;          Z_d)ed*efd+Z`d,ed*efd-Zad.eejb        ecf         d*efd/Zdd0eHd*efd1Zed0eHd*efd2Zfd3ee	eOef                  d*efd4Zgd3ee	eOef                  d5ehd*efd6ZidS )7    )OrderedDict)Token)	dataclassfield)
AnyDictListLiteralOptionalSequenceSetTypeUnioncast)UUIDN)contexttrace)_AgnosticContextManager)propagate_attributes)LangfuseOtelSpanAttributes)Langfuse)
get_client)_detach_context_token_safely)LangfuseAgentLangfuseChainLangfuseGenerationLangfuseRetrieverLangfuseSpanLangfuseTool)_get_timestamp)_extract_model_name)langfuse_logger)TraceContext1)AgentActionAgentFinish)BaseCallbackHandler)Document)	AIMessageBaseMessageChatMessageFunctionMessageHumanMessageSystemMessageToolMessage)ChatGeneration	LLMResultz[Please install langchain to use the Langfuse langchain integration: 'pip install langchain'zlangsmith:hiddenLANGSMITH_TAG_HIDDENCONTROL_FLOW_EXCEPTION_TYPESLANGGRAPH_COMMAND_TYPEi   )GraphBubbleUp)Commandc                   0    e Zd ZU ee         ed<   eed<   dS )	_RunStateparent_run_idroot_run_idN)__name__
__module____qualname__r   r   __annotations__     l/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/langfuse/langchain/CallbackHandler.pyr8   r8   k   s.         D>!!!r@   r8   c                   r    e Zd ZU  ee          Zee         ed<   dZ	e
e         ed<   dZe
e         ed<   dS )_RootRunState)default_factoryrun_idsN
resume_keypropagation_context_manager)r;   r<   r=   r   setrE   r   r   r>   rF   r   strrG   r   r?   r@   rA   rC   rC   q   s^         s333GSY333 $J$$$EI*A!BIIIIIr@   rC   c                       e Zd ZdeddfdZdededdfdZdedee         fdZ	dede
fd	Zdefd
Zdee         fdZdS )_PendingResumeTraceContextStoremax_sizereturnNc                 :    || _         t                      | _        d S N)	_max_sizer   	_contexts)selfrL   s     rA   __init__z(_PendingResumeTraceContextStore.__init__y   s    !9Dr@   rF   trace_contextc                    || j         |<   | j                             |           t          | j                   | j        k    r| j                             d           d S d S )NF)last)rQ   move_to_endlenrP   popitemrR   rF   rT   s      rA   storez%_PendingResumeTraceContextStore.store}   sb    %2z""":...t~//N"""..... 0/r@   c                 8    | j                             |d           S rO   )rQ   poprR   rF   s     rA   takez$_PendingResumeTraceContextStore.take   s    ~!!*d333r@   c                     || j         v S rO   )rQ   r^   s     rA   __contains__z,_PendingResumeTraceContextStore.__contains__   s    T^++r@   c                 *    t          | j                  S rO   )rX   rQ   rR   s    rA   __len__z'_PendingResumeTraceContextStore.__len__   s    4>"""r@   c                 N    t          | j                                                  S rO   )listrQ   keysrc   s    rA   rg   z$_PendingResumeTraceContextStore.keys   s    DN''))***r@   )r;   r<   r=   intrS   rI   r#   r[   r   r_   boolra   rd   r	   rg   r?   r@   rA   rK   rK   x   s        G G G G G G/3 /| / / / / /4s 4x'= 4 4 4 4,s ,t , , , ,# # # # #+d3i + + + + + +r@   rK   c                   6   e Zd Zddddee         dee         ddfdZddded	ed
ee         dedef
dZ	dee
eef                  dee         fdZddd	ed
ee         dee
eef                  ddfdZd	edee         fdZd	edee         fdZd	edee         fdZd	edee         fdZdedefdZdededdfdZdedee
eef                  deee         ee         f         fdZdee         dee         ddfdZd	eddfdZd	ededdfdZdedeed         ef         fd Zd!ee
eef                  d"ededeed#         ed$         ed%         ed&         ed'         ed(         f         fd)Zd!ee
eef                  dedefd*Z ddded	ed
ee         dedef
d+Z!dee
eef                  d,ee"e                  de
eef         fd-Z#ddd.d/d
ee         d,ee"e                  dee
eef                  d0edee
eef                  f
d1Z$dddd2d!ee
eef                  ded	ed
ee         d,ee"e                  dee
eef                  dedefd3Z%d	ed
ee         dee
eef                  ddfd4Z&d	ee         ddfd5Z'd
ee         dee(e)e*e+e,e-e.f         fd6Z/d	edee)e*e+e,e-e.f         ddfd7Z0d	edeee)e*e+e,e-e.f                  fd8Z1ddd9e2d	ed
ee         dedef
d:Z3ddd;e4d	ed
ee         dedef
d<Z5ddd=e
eef         d	ed
ee         dedef
d>Z6ddd?ded	ed
ee         d,ee"e                  deddfd@Z7dddd2d!ee
eef                  dAe"e"e8                  d	ed
ee         d,ee"e                  dee
eef                  dedefdBZ9dddd2d!ee
eef                  dCe"e         d	ed
ee         d,ee"e                  dee
eef                  dedefdDZ:dddd2d!ee
eef                  dEed	ed
ee         d,ee"e                  dee
eef                  dedefdFZ;dddd2d!ee
eef                  dGed	ed
ee         d,ee"e                  dee
eef                  dedefdHZ<dddIe=e>         d	ed
ee         dedef
dJZ?dddKed	ed
ee         dedef
dLZ@ddded	ed
ee         dedef
dMZA	 	 	 d^d!ee
eef                  d	edCe"e         d
ee         d,ee"e                  dee
eef                  deddfdNZBeCde
eef         de
eef         fdO            ZDd!ee
eef                  dee
eef                  de
eef         dee         fdPZEd_dQZFdddReGd	ed
ee         dedef
dSZHddded	ed
ee         dedef
dTZIdUeddfdVZJd	eddfdWZK	 	 	 d`d,ee"e                  dee
eef                  d0edee
eef                  fdXZLdYe8de
eef         fdZZMdAe"e8         de"e
eef                  fd[ZN	 dad\ed	ed
ee         deddf
d]ZOdS )bLangchainCallbackHandlerN)
public_keyrT   rl   rT   rM   c                    t          |          | _        i | _        i | _        i | _        t                      | _        || _        t          t                    | _
        i | _        i | _        d| _        dS )a  Initialize the LangchainCallbackHandler.

        Args:
            public_key: Optional Langfuse public key. If not provided, will use the default client configuration.
            trace_context: Optional context for connecting to an existing trace (distributed tracing) or
                setting a custom trace id for the root LangChain run. Pass a `TraceContext` dict, e.g.
                `{"trace_id": "<trace_id>"}` (and optionally `{"parent_span_id": "<span_id>"}`) to link
                the trace to an upstream system.

        Example:
            Use a custom trace id without context managers:

            ```python
            from langfuse.langchain import CallbackHandler

            handler = CallbackHandler(trace_context={"trace_id": "my-trace-id"})
            ```
        )rl   N)r   _langfuse_client_runs_context_tokens_prompt_to_parent_run_maprH   #_updated_completion_start_time_memo_trace_contextrK   !MAX_PENDING_RESUME_TRACE_CONTEXTS_pending_resume_trace_contexts_run_states_root_run_stateslast_trace_id)rR   rl   rT   s      rA   rS   z!LangchainCallbackHandler.__init__   s~    0 !+j A A A  	
 35:<&>Aee0+.M-/
 /
+ 35;=,0r@   )r9   tokenrun_idr9   kwargsc                b   t          j        d| d|            || j        v rt          | j        |         t                    ri|| j        vrbt          t          | j        |                   }|                    t                                 | j        	                    |           dS dS dS dS )z?Run on new LLM token. Only available when streaming is enabled.zon llm new token: run_id: z parent_run_id: )completion_start_timeN)
r"   debugro   
isinstancer   rr   r   updater    add)rR   ry   rz   r9   r{   current_generations         rA   on_llm_new_tokenz)LangchainCallbackHandler.on_llm_new_token   s     	PPPPP	
 	
 	
 dj  4:f-/ABB !dFFF!%&8$*V:L!M!M%%N<L<L%MMM488@@@@@ !   FFr@   metadatac                 Z    |r|                     d          nd }|d S t          |          S )N	thread_id)getrI   )rR   r   r   s      rA   _get_langgraph_resume_keyz2LangchainCallbackHandler._get_langgraph_resume_key   s6     2:CHLL---t	49~~r@   r   c                ~   || j         v rd S |0|}t          |h|                     |                    | j        |<   nf| j                             |          }||j        n|}| j                            |t                                }|j                            |           t          ||          | j         |<   d S )N)rE   rF   )r9   r:   )
rv   rC   r   rw   r   r:   
setdefaultrE   r   r8   )rR   rz   r9   r   r:   parent_stateroot_run_states          rA   
_track_runz#LangchainCallbackHandler._track_run   s     T%%%F  K1>99(CC2 2 2D!+..
  +//>>L,8,D((-  "2==]__ N "&&v...#,'#$
 $
 $
   r@   c                 6    | j                             |          S rO   )rv   r   rR   rz   s     rA   _get_run_statez'LangchainCallbackHandler._get_run_state  s    ##F+++r@   c                 r    |                      |          }|d S | j                            |j                  S rO   )r   rw   r   r:   rR   rz   	run_states      rA   _get_root_run_statez,LangchainCallbackHandler._get_root_run_state  s:    ''//	4$(()>???r@   c                 T    |                      |          }|d S |j        }d |_        |S rO   )r   rF   )rR   rz   r   rF   s       rA   _pop_root_run_resume_keyz1LangchainCallbackHandler._pop_root_run_resume_key  s6    11&99!4#.
$(!r@   c                 B    |                      |          }||j        nd S rO   )r   r9   r   s      rA   _get_parent_run_idz+LangchainCallbackHandler._get_parent_run_id  s(    ''//	*3*?y&&TIr@   inputsc                 d    t           d uo't          |t                     ot          |dd           d uS )Nresume)r4   r   getattr)rR   r   s     rA   _is_langgraph_resumez-LangchainCallbackHandler._is_langgraph_resume  s;    "$. <6#9::<$//t;	
r@   rF   c                >    | j                             ||           d S NrF   rT   )ru   r[   rZ   s      rA   _store_resume_trace_contextz4LangchainCallbackHandler._store_resume_trace_context"  s3     	+11! 	2 	
 	
 	
 	
 	
r@   c                   | j         	d | j         fS t          j                                                    }|j        rdS |                     |          sdS |                     |          }|dS || j                            |          fS )N)NN)	rs   r   get_current_spanget_span_contextis_validr   r   ru   r_   )rR   r   r   current_span_contextrF   s        rA   _take_root_trace_contextz1LangchainCallbackHandler._take_root_trace_context)  s     *,,,$577HHJJ  ( 	: ((00 	:33H==
:4>CCJOOOOr@   c                R    | j         d S ||d S |                     ||           d S r   )rs   r   rZ   s      rA   _restore_root_trace_contextz4LangchainCallbackHandler._restore_root_trace_context@  sP     *F!6F 	((! 	) 	
 	
 	
 	
 	
r@   c                 0    |                      |           d S rO   )r   r   s     rA   _clear_root_run_resume_keyz3LangchainCallbackHandler._clear_root_run_resume_keyO  s     	%%f-----r@   observationc                    | j         d S |                     |          }|d S |                     ||j        |j        d           d S )N)trace_idparent_span_idr   )rs   r   r   r   id)rR   rz   r   rF   s       rA   _persist_resume_trace_contextz6LangchainCallbackHandler._persist_resume_trace_contextT  sm    *F226::
F((!'0"-.  	) 	
 	
 	
 	
 	
r@   error)DEFAULTERRORc                     t          fdt          D                       r%dt                    pt                    j        fS dt                    fS )Nc              3   8   K   | ]}t          |          V  d S rO   )r   ).0tr   s     rA   	<genexpr>zOLangchainCallbackHandler._get_error_level_and_status_message.<locals>.<genexpr>i  s-      JJz%##JJJJJJr@   r   r   )anyr3   rI   typer;   )rR   r   s    `rA   #_get_error_level_and_status_messagez<LangchainCallbackHandler._get_error_level_and_status_messaged  s\    
 JJJJ-IJJJJJ 	Ac%jj@DKK,@@@E

""r@   
serializedcallback_typetool	retriever
generationagentchainspanc                     |dk    rdS |dk    rdS |dk    rdS |dk    rQ|r'd|v r#|d         }t          d |D                       rdS  | j        |fi |}d|                                v rdS dS d	S )
a  Determine Langfuse observation type from LangChain component.

        Args:
            serialized: LangChain's serialized component dict
            callback_type: The type of callback (e.g., "chain", "tool", "retriever", "llm")
            **kwargs: Additional keyword arguments from the callback

        Returns:
            The appropriate Langfuse observation type string
        r   r   llmr   r   r   c              3   B   K   | ]}d |                                 v V  dS )r   N)lower)r   parts     rA   r   zQLangchainCallbackHandler._get_observation_type_from_serialized.<locals>.<genexpr>  s/      FF4w$**,,.FFFFFFr@   r   r   )r   get_langchain_run_namer   )rR   r   r   r{   
class_pathnames         rA   %_get_observation_type_from_serializedz>LangchainCallbackHandler._get_observation_type_from_serializedn  s    * F""6k));e##<g%% #dj00'-
FF:FFFFF #"7 /4.zDDVDDD$**,,&&w7vr@   c                    d|v r|d         t          |d                   S |dS 	 t          |d                   S # t          t          f$ r Y nw xY w	 t          |d         d                   S # t          t          f$ r Y nw xY wdS )a  Retrieve the name of a serialized LangChain runnable.

        The prioritization for the determination of the run name is as follows:
        - The value assigned to the "name" key in `kwargs`.
        - The value assigned to the "name" key in `serialized`.
        - The last entry of the value assigned to the "id" key in `serialized`.
        - "<unknown>".

        Args:
            serialized (Optional[Dict[str, Any]]): A dictionary containing the runnable's serialized data.
            **kwargs (Any): Additional keyword arguments, potentially including the 'name' override.

        Returns:
            str: The determined name of the Langchain runnable.
        r   Nz	<unknown>r   )rI   KeyError	TypeError)rR   r   r{   s      rA   r   z/LangchainCallbackHandler.get_langchain_run_name  s    $ Vv :vf~&&&;	z&)***)$ 	 	 	D		z$'+,,,)$ 	 	 	D	 {s!   < AAA/ /BBc                   	 |                      d|||           |                     |          }||                     |          \  }}|                    t	          t
          t          d                  |          ||                    d          ddi                                           ||d	k    r| 	                    ||
           n|| 
                    |           n+# t          $ r}t          j        |           Y d}~nd}~ww xY w||                     |           dS dS # ||                     |           w w xY w)zRun when Retriever errors.on_retriever_errorr   NDEBUGr   WARNINGr   r   totalr   levelstatus_messageinputcost_detailsr   rz   r   _log_debug_event_detach_observationr   r   r   r   r
   r   endr   r   	Exceptionr"   	exception_reset	rR   r   rz   r9   r{   r   r   r   es	            rA   r   z+LangchainCallbackHandler.on_retriever_error  s   	$!!$fm5 "    226::K&(,(P(PQV(W(W%~"" )O!PQ  $2 **X..")1 #   #%%% (Ui-?-?66%; 7     #*33F;;; 	) 	) 	)%a((((((((	) $F##### %$}$F#### %0   C#C& %D, &
D0D	D, 	DD, ,Etagsc                l   i }||d|iS ||S d|v r&t          |d         t                    r|d         |d<   d|v r&t          |d         t                    r|d         |d<   d|v r&t          |d         t                    r|d         |d<   |d|v rt          |d         t                    rsd|v r#t          |d         t                    r|d         ng }t          t          |          t          |pg           z            }d	 t          |          D             |d<   t	          |d
          |d<   |S )Nr   langfuse_session_id
session_idlangfuse_user_iduser_idlangfuse_trace_name
trace_namelangfuse_tagsc                 ,    g | ]}t          |          S r?   )rI   )r   tags     rA   
<listcomp>zMLangchainCallbackHandler._parse_langfuse_trace_attributes.<locals>.<listcomp>	  s    !G!G!Gs#c((!G!G!Gr@   Fr   )r   rI   rf   rH   _strip_langfuse_keys_from_dict)rR   r   r   
attributesr   merged_tagss         rA    _parse_langfuse_trace_attributesz9LangchainCallbackHandler._parse_langfuse_trace_attributes  s    &(
 0D>! H,,*+S2
 2
, (00E'FJ|$))j'(#/
 /
) %--?$@Jy! H,,*+S2
 2
, (00E'FJ|$x''Jx7PRV,W,W' #h..x8$?? / )) 	  s=11C
OOCDDK!G!Gc+6F6F!G!G!GJv!?%!P!P
:r@   Fr   r   keep_langfuse_trace_attributesr   c                x    |                      |||          }||S |r|                                ni }d|d<   |S )Nr   Tis_langchain_root)1_LangchainCallbackHandler__join_tags_and_metadatacopy)rR   r9   r   r   r   observation_metadataroot_metadatas          rA   #_get_langchain_observation_metadataz<LangchainCallbackHandler._get_langchain_observation_metadata  sd      $<<+I  =  
  
 $''7KS,11333QS-1)*r@   r9   r   r   c                T   |                      |||           d }d }	d }
	 |                     d|||           |                     |||            | j        |fi |}|                     |||          }|rt
          |v rdnd } | j        |dfi |}||                     ||          }t          |	                    dd           |	                    d	d           |	                    d
d           |	                    dd           |	                    dd                     }| 
                    |          }|||_        |                                 |                     |          }t          |t                    rR|                     ||          \  }	}
|                    |
||||t%          t&          d         d z  |                    }n6|                    ||||t%          t&          d         d z  |                    }|                     ||           | j        |         j        | _        d S # t0          $ rd}|C|                     |	|
           |*|                     |           |                     |           t9          j        |           Y d }~d S d }~ww xY w)Nrz   r9   r   on_chain_start)r   r  r   r   )r   r   r   r   r   r   r   )r   r   r   r   r   )r   r   r   rT   r   as_typer   r   r   r   r  r   r   r   r   )r   r   _register_langfuse_promptr   r  r2   r   r   r   r   r   rG   	__enter___get_parent_observationr   r   r   start_observationr   r
   _attach_observationro   r   rx   r   r   _exit_propagation_contextr   r"   r   )rR   r   r   rz   r9   r   r   r{   r   rF   rT   	span_namespan_metadata
span_levelobservation_typeparsed_trace_attributesrG   r   obsr   s                       rA   r  z'LangchainCallbackHandler.on_chain_start%  s{    	v]XVVV
R	)!! &- "    **]X +    43JII&III DD+! E  M
 %)S-AT-I-ItJItIG   '-   
 $*.*O*O%D +P + +' /C377	4HH6::<NN044VTBB488TJJ6::<NN/ / /+ "&!9!9&!A!A!-3 #> ,55777..}==C#x(( ,0,I,I!H -J - -)
M ,,"/",*  FG$N"  - 
 
 ,,",*  FG$N"  - 	 	 $$VT222!%F!3!<D 	) 	) 	)|00) 1    !(226:::KK'''%a(((((((((	)s   HH9 9
J'AJ""J'c                    |r|sdS |o|                     dd          }|r|| j        |<   dS || j        v r| j        |         }|| j        |<   dS dS )a  We need to register any passed Langfuse prompt to the parent_run_id so that we can link following generations with that prompt.

        If parent_run_id is None, we are at the root of a trace and should not attempt to register the prompt, as there will be no LLM invocation following it.
        Otherwise it would have been traced in with a parent run consisting of the prompt template formatting and the LLM invocation.
        Nlangfuse_prompt)r   rq   )rR   rz   r9   r   r  registered_prompts         rA   r
  z2LangchainCallbackHandler._register_langfuse_prompt  s      	F 	F"Lx||4Et'L'L 	G<KD*=999 d<<< $ >} M5FD*6222 =<r@   c                 4    ||| j         v r| j         |= d S d S d S rO   )rq   r   s     rA   _deregister_langfuse_promptz4LangchainCallbackHandler._deregister_langfuse_prompt  s4    &D,J"J"J.v666 "J"Jr@   c                 @    |r|| j         v r| j         |         S | j        S rO   )ro   rn   )rR   r9   s     rA   r  z0LangchainCallbackHandler._get_parent_observation  s.      	-]dj88:m,,$$r@   c                     t          j        |j                  }t          j        |          }|| j        |<   || j        |<   d S rO   )r   set_span_in_context
_otel_spanr   attachro   rp   )rR   rz   r   ctxry   s        rA   r  z,LangchainCallbackHandler._attach_observation  sE     '(>??s##(
6',V$$$r@   c           	      
   | j                             |d           }|rt          |           t          t          t
          t          t          t          t          t          f         | j                            |d                     S rO   )rp   r]   r   r   r   r   r   r   r   r   r   ro   )rR   rz   ry   s      rA   r   z,LangchainCallbackHandler._detach_observation  sx     $((66 	0(///"! JNN64((

 

 
	
r@   actionc                   |                      ||           	 |                     d|||           | j                            |d          }|Q|j                            t          j        d           |                    ||                    d                     dS dS # t          $ r}t          j        |           Y d}~dS d}~ww xY w)zRun on agent action.)rz   r9   on_agent_action)r"  Nr   r   outputr   )r   r   ro   r   r  set_attributer   OBSERVATION_TYPEr   r   r"   r   )rR   r"  rz   r9   r{   	agent_runr   s          rA   r$  z(LangchainCallbackHandler.on_agent_action  s    	v]CCC	)!!!6= "    
vt44I$$22.?     ! **X.. !      %$  	) 	) 	)%a(((((((((	)s   BB" "
C,CCfinishc                n   	 |                      d|||           | j                            |d           }|Q|j                            t
          j        d           |                    ||                    d                     d S d S # t          $ r}t          j
        |           Y d }~d S d }~ww xY w)Non_agent_finish)r*  r   r   r%  )r   ro   r   r  r'  r   r(  r   r   r"   r   )rR   r*  rz   r9   r{   r)  r   s          rA   r,  z(LangchainCallbackHandler.on_agent_finish  s    	)!!!6= "   
 
vt44I$$22.?     ! **X.. !      %$  	) 	) 	)%a(((((((((	)s   BB 
B4B//B4outputsc                ~   	 |                      d|||           |                     |          }||                    ||                    d                     |*|                     |           |                     |           |                                 |                     |           n+# t          $ r}t          j
        |           Y d }~nd }~ww xY w|,|                     |           |                     |           d S d S # |+|                     |           |                     |           w w xY w)Non_chain_end)r-  r   r%  )r   r   r   r   r   r  r   r  r   r"   r   r   )rR   r-  rz   r9   r{   r   r   s          rA   r/  z%LangchainCallbackHandler.on_chain_end#  sy   	$!!w "    ++F33D" **X..    
 !(33F;;;226:::


00888 	) 	) 	)%a((((((((	) $..v666F##### %$}$..v666F#### %s0   B/B2 1D 2
C<CD CD /D<)r9   r   c                   	 |                      d|||           |                     |          \  }}|                     |          }||                    t	          t
          t          d                  |          ||                    d          ddi           |H|dk    r|                     ||	           n| 	                    |           | 
                    |           |                                 n+# t          $ r}	t          j        |	           Y d }	~	nd }	~	ww xY w|,| 
                    |           |                     |           d S d S # |+| 
                    |           |                     |           w w xY w)
Non_chain_errorr   r   r   r   r   r   r   r   )r   r   r   r   r   r   r
   r   r   r   r  r   r   r"   r   r   )
rR   r   rz   r9   r   r{   r   r   r   r   s
             rA   r1  z'LangchainCallbackHandler.on_chain_errorH  s   !	$!!"2FMQV!WWW$($L$LU$S$S!E>226::K&"" )O!PQ  $2 **X..")1 #    !(	))::#){ ;     77???226:::!!! 	) 	) 	)%a((((((((	) $..v666F##### %$}$..v666F#### %s0   C8C; :E ;
D#DE D##E /Fmessagesc                D                          |||           	                      d|||             j        ||t          t          t           fd|D                                 |f||d| d S # t          $ r}t          j        |           Y d }~d S d }~ww xY w)Nr  on_chat_model_start)r2  c                 :    g | ]}                     |          S r?   )_create_message_dictsr   mrR   s     rA   r   z@LangchainCallbackHandler.on_chat_model_start.<locals>.<listcomp>  s'    III133A66IIIr@   r   r   )	r   r   (_LangchainCallbackHandler__on_llm_actionr   r	   _flatten_comprehensionr   r"   r   )	rR   r   r2  rz   r9   r   r   r{   r   s	   `        rA   r4  z,LangchainCallbackHandler.on_chat_model_startt  s
    	v]XVVV	)!!%v}x "    !D *IIIIIII    !        	) 	) 	)%a(((((((((	)s   AA6 6
B BBpromptsc          
      F   |                      |||           	 |                     d|||            | j        ||t          t          t          |          dk    r|d         n|          |f||d| d S # t          $ r}t          j        |           Y d }~d S d }~ww xY w)Nr  on_llm_start)r<     r   r9  )	r   r   r:  r   r	   rX   r   r"   r   )	rR   r   r<  rz   r9   r   r   r{   r   s	            rA   r>  z%LangchainCallbackHandler.on_llm_start  s     	v]XVVV	)!!w "    !D TW):):71::HH	
 !        	) 	) 	)%a(((((((((	)s   AA7 7
B BB 	input_strc          	         |                      |||           	 |                     d|||           |                     |||          }|si }|                    d |                                D                         | j        |dfi |}	|                     |          }
t          |
t                    r:|
	                    | j
         | j        |fi ||	|||rt          |v rdnd           }n3|
	                     | j        |fi ||	|||rt          |v rdnd 	          }|                     ||           d S # t          $ r}t          j        |           Y d }~d S d }~ww xY w)
Nr  on_tool_start)r@  r  c                     i | ]
\  }}|||S rO   r?   r   keyvalues      rA   
<dictcomp>z:LangchainCallbackHandler.on_tool_start.<locals>.<dictcomp>  s#    RRR
U@Qe@Q@Q@Qr@   r   r   )rT   r   r  r   r   r   )r   r  r   r   r   )r   r   r  r   itemsr   r  r   r   r  rs   r   r2   r  r   r"   r   )rR   r   r@  rz   r9   r   r   r{   metar  parent_observationr   r   s                rA   rB  z&LangchainCallbackHandler.on_tool_start  s    	v]XVVV,	)!!) "    ;;+! <  D  KKRRfllnnRRR    JtIF   &,    "&!=!=m!L!L,h77 );;"&"544ZJJ6JJ,#!%)T.Bd.J.J''PT <   *;;44ZJJ6JJ,#!%)T.Bd.J.J''PT <   $$VT22222 	) 	) 	)%a(((((((((	)s   D"D> >
E'E""E'queryc                   |                      |||           	 |                     d|||            | j        |fi |}|                     |||          }	|rt          |v rdnd }
 | j        |dfi |}|                     |          }t          |t                    rE|	                    | j
        |||	|t          t          t          d                  |
                    }n>|	                    |||	|t          t          t          d                  |
          	          }|                     ||           d S # t          $ r}t!          j        |           Y d }~d S d }~ww xY w)
Nr  on_retriever_start)rK  r  r   r   r   r  r	  )r   r   r   r  r2   r   r  r   r   r  rs   r   r   r
   r  r   r"   r   )rR   r   rK  rz   r9   r   r   r{   r  r  r  r  rJ  r   r   s                  rA   rM  z+LangchainCallbackHandler.on_retriever_start  s    	v]XVVV+	)!!$fm5 "    43JII&III DD+! E  M
 %)S-AT-I-ItJItIK   +1    "&!=!=m!L!L,h77 );;"&"5",* )O!PQ"  < 
 
 *;;",* )O!PQ"  < 	 	 $$VT22222 	) 	) 	)%a(((((((((	)s   D D< <
E%E  E%	documentsc                   	 |                      d|||           |                     |          }|S||                     |           |                    ||                    d                                                     n+# t          $ r}t          j        |           Y d }~nd }~ww xY w|| 	                    |           d S d S # || 	                    |           w w xY w)Non_retriever_end)rN  r   r%  
r   r   r   r   r   r   r   r"   r   r   )rR   rN  rz   r9   r{   r   r   s          rA   rP  z)LangchainCallbackHandler.on_retriever_end(  s$   	$!!"FMY "    226::K& (33F;;;""$ **X.. #   #%%% 	) 	) 	)%a((((((((	) $F##### %$}$F#### %0   BB C 
B.B)$C )B..C C&r&  c                   	 |                      d|||           |                     |          }|S||                     |           |                    ||                    d                                                     n+# t          $ r}t          j        |           Y d }~nd }~ww xY w|| 	                    |           d S d S # || 	                    |           w w xY w)Non_tool_end)r&  r   r%  rQ  )rR   r&  rz   r9   r{   r   r   s          rA   rT  z$LangchainCallbackHandler.on_tool_endD  s   	$!!-v!VVV226::K& (33F;;;""! **X.. #   #%%% 	) 	) 	)%a((((((((	) $F##### %$}$F#### %rR  c                   	 |                      d|||           |                     |          }||                     |          \  }}|                    |t	          t
          t          d                  |          |                    d          ddi                                           ||dk    r| 	                    ||	           n|| 
                    |           n+# t          $ r}t          j        |           Y d }~nd }~ww xY w||                     |           d S d S # ||                     |           w w xY w)
Non_tool_errorr   r   r   r   r   r   r   r   r   r   r   r   r   s	            rA   rV  z&LangchainCallbackHandler.on_tool_error_  s   	$!!/6=PU!VVV226::K&(,(P(PQV(W(W%~""#1 )O!PQ  !**X..")1 #   #%%% (Ui-?-?66%; 7     #*33F;;; 	) 	) 	)%a((((((((	) $F##### %$}$F#### %r   c                    |                      |||           	 |                    di                               dd           }|r4t          |t                    r|                    d |D                        |                     |||          }	d }
|}|I| j                            |          }
|
r|                     |           n|                     |          }|I | j	        |fi ||| 
                    ||||dnd          |	|                     |          |
d	}|                     |          }t          |t                    r |j        d| j        d
d|}n |j        ddd
i|}|                     ||           | j        |         j        | _        d S # t(          $ r}t+          j        |           Y d }~d S d }~ww xY w)Nr  invocation_paramstoolsc                     g | ]}d |dS )r   rolecontentr?   )r   r   s     rA   r   z<LangchainCallbackHandler.__on_llm_action.<locals>.<listcomp>  s     TTTdD A ATTTr@   )r   r   r{   TF)r9   r   r   r   )r   r   r   modelmodel_parameterspromptr   )rT   r  r  r?   )r   r   r   rf   extend_parse_model_and_log_errorsrq   r  r   r   r  _parse_model_parametersr  r   r  rs   r  ro   r   rx   r   r"   r   )rR   r   rz   r<  r9   r   r   r{   rZ  
model_namer  current_parent_run_idr^  rJ  r   r   s                   rA   __on_llm_actionz(LangchainCallbackHandler.__on_llm_action  s    	v]XVVV;	)JJ2B77;;GTJJE VE400 VTTeTTTUUU99% :  J !%$1! (3$($B$F$F)% %! % 445JKKK,0,C,C-- -) (3 43JII&II  DD"/% %, 484 E   $$($@$@$H$H+ G" "&!=!=m!L!L,h77 	A/A "&"5(   

 B/A  (,3 
 $$VZ888!%F!3!<D 	) 	) 	)%a(((((((((	)s   FF" "
G,GGc                 8   | d                              d          dk    r?| d                              d          r$i | d         | d         d         | d<   | d         d= d | d                              d          | d                              d          | d                              d          | d                              d	          | d                              d
          | d                              d          | d                              d          | d                              d          | d                              d          | d                              d          | d                              d          d                                D             S )z+Parse the model parameters from the kwargs.rY  _typezIBM watsonx.aiparamsc                     i | ]
\  }}|||S rO   r?   rD  s      rA   rG  zDLangchainCallbackHandler._parse_model_parameters.<locals>.<dictcomp>  s2     
 
 
U"  % $ !  r@   temperature
max_tokensmax_completion_tokenstop_pfrequency_penaltypresence_penaltyrequest_timeoutdecoding_methodmin_new_tokensmax_new_tokensstop_sequences)rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  )r   rH  )r{   s    rA   rd  z0LangchainCallbackHandler._parse_model_parameters  s    %&**7337GGGFM

#h-- H+,-+,-h7+F&' *+H5
 
  &&9:>>}MM$%89==lKK)/0C)D)H)H+* *   3488AA%+,?%@%D%D'& & %++>$?$C$CDV$W$W#)*=#>#B#BCT#U#U#)*=#>#B#BCT#U#U"()<"="A"ABR"S"S"()<"="A"ABR"S"S"()<"="A"ABR"S"S   egg%
 
 
 	
r@   c                    	 t          |          pt          |fi |}|r|S n+# t          $ r}t          j        |           Y d}~nd}~ww xY w|                                  dS )z5Parse the model name and log errors if parsing fails.N)_parse_model_name_from_metadatar!   r   r"   r   _log_model_parse_warning)rR   r   r   r{   re  r   s         rA   rc  z4LangchainCallbackHandler._parse_model_and_log_errors  s    		)8  ;$Z::6::   "!!"  	) 	) 	)%a((((((((	) 	%%'''ts   # 
AAAc                 `    t          | d          st          j        d           d| _        d S d S )N_model_parse_warning_loggedzLangfuse was not able to parse the LLM model. The LLM call will be recorded without model name. Please create an issue: https://github.com/langfuse/langfuse/issues/new/chooseT)hasattrr"   warningr{  rc   s    rA   ry  z1LangchainCallbackHandler._log_model_parse_warning  sJ    t:;; 	4# A   04D,,,	4 	4r@   responsec                F   	 |                      d||||           |j        d         d         }t          |t                    r|                     |j                  nt          |          }t          |          }t          |          }| 	                    |          }	|	?|	
                    ||||                    d          |                                           n+# t          $ r}
t          j        |
           Y d }
~
nd }
~
ww xY w| j                            |           |,|                     |           |                     |           d S d S # | j                            |           |+|                     |           |                     |           w w xY w)N
on_llm_end)r~  r{   r   r   )r&  usageusage_detailsr   r_  )r   generationsr   r0   _convert_message_to_dictmessage_extract_raw_response_parse_usage_parse_modelr   r   r   r   r   r"   r   rr   discardr   r   )rR   r~  rz   r9   r{   response_generationextracted_response	llm_usager_  r   r   s              rA   r  z#LangchainCallbackHandler.on_llm_end  s   #	$!!fmhv "    #+"6r":2"> 1>BB@--.A.IJJJ*+>??  %X..I !**E11&99J%!!-#"+ **X.. "   #%%% 	) 	) 	)%a((((((((	) 4<<VDDD$//777F##### %$ 4<<VDDD$//777F#### %s1   CC" !E "
D
,D E D

E A	F c                   	 |                      d|||           |                     |          }||                     |          \  }}|                    |t	          t
          t          d                  |          |                    d          ddi                                           ||dk    r| 	                    ||	           n|| 
                    |           n+# t          $ r}t          j        |           Y d }~nd }~ww xY w||                     |           d S d S # ||                     |           w w xY w)
Non_llm_errorr   r   r   r   r   rW  r   r   r   )	rR   r   rz   r9   r{   r   r   r   r   s	            rA   r  z%LangchainCallbackHandler.on_llm_error9  s   	$!!.&-u!UUU11&99J%(,(P(PQV(W(W%~!!#1 )O!PQ  !**X..")1 "   #%%% (Ui-?-?66%: 7     #*33F;;; 	) 	) 	)%a((((((((	) $F##### %$}$F#### %r   r:   c                     |                      |          }|d S | j                            |j        d           }|| j                            |d            d S |j        D ]}| j                            |d            d S rO   )r   rw   r]   r:   rv   rE   )rR   r:   r   r   rz   s        rA   r   zLangchainCallbackHandler._reset_  s    ''44	F.2293H$OO!  d333F$, 	/ 	/F  ....	/ 	/r@   c                     |                      |          }|d S |j        }|d S d |_        |                    d d d            d S rO   )r   rG   __exit__)rR   rz   r   managers       rA   r  z2LangchainCallbackHandler._exit_propagation_contextl  sX    11&99!F <?F592tT*****r@   c                     i }|t          |          dk    r||d<   ||                    |           |i k    rt          ||          nd S )Nr   r   )rX   r   r   )rR   r   r   r   
final_dicts        rA   __join_tags_and_metadataz1LangchainCallbackHandler.__join_tags_and_metadatay  si     
D		A!%Jvh''' R +:7UVVV	
r@   r  c                    t          |t                    rd|j        d}n/t          |t                    r}d|j        d}t	          |d          r)|j        "t          |j                  dk    r
|j        |d<   t	          |d          r)|j        "t          |j                  dk    r
|j        |d<   nt          |t                    rd|j        d}n}t          |t                    rd|j        |j
        d	}nWt          |t                    rd
|j        d}n7t          |t                    r|j        |j        d}nt          d|           d|j        v r|j        d         |d<   |j        r
|j        |d<   |S )Nuserr\  	assistant
tool_callsr   invalid_tool_callssystemr   )r]  r^  tool_call_idfunctionzGot unknown type r   additional_kwargs)r   r-   r^  r)   r|  r  rX   r  r.   r/   r  r,   r+   r]  
ValueErrorr  )rR   r  message_dicts      rA   r  z1LangchainCallbackHandler._convert_message_to_dict  s   g|,,  	<4:w+W+WLL++ 	<$/GOLLL ..@&2*++a//-4-?\* !566P.:233a775<5O12// 	<$,IILL-- 	<"? ' 4 LL
 11 	<$.7?KKLL-- 	<$+LW_MMLL:::;;;W...#*#<V#DL $ 	J070IL,-r@   c                        fd|D             S )Nc                 :    g | ]}                     |          S r?   )r  r7  s     rA   r   zBLangchainCallbackHandler._create_message_dicts.<locals>.<listcomp>  s'    CCCQ--a00CCCr@   r?   )rR   r2  s   ` rA   r6  z.LangchainCallbackHandler._create_message_dicts  s      DCCC(CCCCr@   
event_namec                 @    t          j        d| d| d|            d S )NzEvent: z
, run_id: z, parent_run_id: )r"   r~   )rR   r  rz   r9   r{   s        rA   r   z)LangchainCallbackHandler._log_debug_event  s>     	TjTTFTT]TT	
 	
 	
 	
 	
r@   )NNN)rM   N)NNFrO   )Pr;   r<   r=   r   rI   r#   rS   r   r   r   r   r   r   r8   r   rC   r   r   r   ri   r   r   tupler   r   r   r   BaseExceptionr
   r   r   r   r   r   r	   r   r  r  r
  r  r   r   r   r   r   r   r   r  r  r   r%   r$  r&   r,  r/  r1  r*   r4  r>  rB  rM  r   r(   rP  rT  rV  r:  staticmethodrd  rc  ry  r1   r  r  r   r  r   r  r6  r   r?   r@   rA   rk   rk      s        %)04	.1 .1 .1 SM.1  -	.1
 
.1 .1 .1 .1j )-A A AA 	A
  ~A A 
A A A A, c3h0	#    .2
 
 
 
  ~	

 4S>*
 

 
 
 
>,T ,hy.A , , , ,@$ @8M3J @ @ @ @	t 	 	 	 	 	J J(4. J J J J
3 
4 
 
 
 

 
1=
	
 
 
 
PP(0c3h(@P	x}h|44	5P P P P.
%c]
;CL;Q
	
 
 
 
. .$ . . . .

t 
# 
RV 
 
 
 
 #"#	w)*C/	0# # # #)"4S>2)CF)RU)		
) ) ) )V""4S>2">A"	" " " "R )-&$ &$ &$&$ 	&$
  ~&$ &$ 
&$ &$ &$ &$P(#DcN3(;CDI;N(	c3h( ( ( (\ %)-1/4    ~ tCy!	
 4S>* )- 
$sCx.	!   8 )-$(-1c) c) c)T#s(^,c) c)
 c)  ~c) tCy!c) 4S>*c) c) 
c) c) c) c)JG G  ~	G
 4S>*G 
G G G G47(4. 7T 7 7 7 7%%d^%		
% % % % -- 
- 
- - - -$

		
	

 
 
 
D )-) ) )) 	)
  ~) ) 
) ) ) )H )-) ) )) 	)
  ~) ) 
) ) ) )D )-#$ #$ #$c3h#$ 	#$
  ~#$ #$ 
#$ #$ #$ #$T )-$(*$ *$ *$*$ 	*$
  ~*$ tCy!*$ *$ 
*$ *$ *$ *$d )-$(-1 )  )  )T#s(^, ) tK() )
  )  ~ ) tCy! ) 4S>* )  ) 
 )  )  )  )P )-$(-1) ) )T#s(^,) c)
 )  ~) tCy!) 4S>*) ) 
) ) ) )F )-$(-19) 9) 9)T#s(^,9) 9)
 9)  ~9) tCy!9) 4S>*9) 9) 
9) 9) 9) 9)B )-$(-18) 8) 8)T#s(^,8) 8)
 8)  ~8) tCy!8) 4S>*8) 8) 
8) 8) 8) 8)~ )-$ $ $H%$ 	$
  ~$ $ 
$ $ $ $B )-$ $ $$ 	$
  ~$ $ 
$ $ $ $@ )-#$ #$ #$#$ 	#$
  ~#$ #$ 
#$ #$ #$ #$T )-$(-1G) G)T#s(^,G) G) c	G)
  ~G) tCy!G) 4S>*G) G) 
G) G) G) G)R 
S#X 
4S> 
 
 
 \
@ T#s(^, 4S>*	
 S#X 
#   ,4 4 4 4 )-+$ +$ +$+$ 	+$
  ~+$ +$ 
+$ +$ +$ +$d )-$$ $$ $$$$ 	$$
  ~$$ $$ 
$$ $$ $$ $$L/$ /4 / / / /+ + + + + + %)-1/4	
 
tCy!
 4S>*
 )-	

 
$sCx.	!
 
 
 
$) )S#X ) ) ) )VD[)D	d38n	D D D D )-		
 	
	
 	
  ~		

 	
 
	
 	
 	
 	
 	
 	
r@   rk   last_responserM   c                     | j         6| j                                         dk    r| j                                         S t          | d          r| j        j        S dS )z<Extract the response from the last response of the LLM call.N r  )textstripr|  r  r  )r  s    rA   r  r    s`     %-*<*B*B*D*D*J*J!'')))			*	* $66 rr@   matrixc                     d | D             S )Nc                     g | ]	}|D ]}|
S r?   r?   )r   rowitems      rA   r   z*_flatten_comprehension.<locals>.<listcomp>  s%    333Ss33tD3333r@   r?   )r  s    rA   r;  r;    s    33F3333r@   r  c                 6   t          | d          r| j        } g d}t          t          |                                           t          fddD                       r%t                                                    dk    s@t          fddD                       r't                                                    dk    rS |D ]I\  }}|v r@                    |          }t          |t                    rt          |          n|}||<   Jt          t                    rd	v rt                    d	i           }|                                D ]I\  }}|d
| <   |dk    s|                    d          r)dv rt          dd         |z
            d<   Jdv rt                    di           }	|	                                D ]I\  }}|d| <   |dk    s|                    d          r)dv rt          dd         |z
            d<   Jdv rt          d         t                    rm                    d          }
|
D ]U}t          |t                    r>d|v r:d|v r6|d         }|d|d          <   dv rt          dd         |z
            d<   Vdv rt          d         t                    rm                    d          }|D ]U}t          |t                    r>d|v r:d|v r6|d         }|d|d          <   dv rt          dd         |z
            d<   Vdv rt          d         t                    r                    d          }|D ]}t          |t                    ryd|v rud|v rq|d         }|d|d          <   dv rt          dd         |z
            d<   d|d          v r.t          dd|d                   |z
            d|d          <   d                                 D             rnd S )N__dict__))input_tokensr   )output_tokensr&  )total_tokensr   )prompt_tokensr   )completion_tokensr&  )prompt_token_countr   )candidates_token_countr&  )total_token_countr   )inputTokenCountr   )outputTokenCountr&  )totalTokenCountr   )input_token_countr   )generated_token_countr&  c              3       K   | ]}|v V  	d S rO   r?   r   
openai_keyusage_models     rA   r   z%_parse_usage_model.<locals>.<genexpr>  s<       	
 	
 +%	
 	
 	
 	
 	
 	
r@   )r  r  r  prompt_tokens_detailscompletion_tokens_details   c              3       K   | ]}|v V  	d S rO   r?   r  s     rA   r   z%_parse_usage_model.<locals>.<genexpr>  s<       
 
 +%
 
 
 
 
 
r@   )r  r  r     input_token_detailsinput_priority	priority_r   r   output_token_detailsoutput_r&  r  modalitytoken_countinput_modality_candidates_tokens_detailsoutput_modality_cache_tokens_detailscached_modality_c                 D    i | ]\  }}t          |t                    ||S r?   )r   rh   )r   kvs      rA   rG  z&_parse_usage_model.<locals>.<dictcomp>r  s-    NNNDAq:a;M;MN1aNNNr@   )r|  r  r   r   r   allrX   rg   r]   r   rf   sumdictrH  
startswithmax)r  conversion_list	model_keylangfuse_keycaptured_countfinal_countr  rE  rF  r  r  r  r  r  r  s                 @rA   _parse_usage_modelr    s   
 uj!!   O* tUZZ\\**K 	 	
 	
 	
 	
	
 	
 	
 		
 		
   ""##q(( 
 
 
 

 
 
 	
 	
 )   ""##q((#2 	4 	4	<##(__Y77N nd33$N####  )4K%+t$$ T K//"-//2G"L"L17799 P P
U.3NSNN+ *$${(C(C$k))+.q+g2F2N+O+OK(![00#.??3I2#N#N 288:: R R
U/4OcOO, *$${(C(C${**,/;x3H53P,Q,QK) #k11j/0$7
 7
1 %0OO4K$L$L!- 
T 
TtT**	T"d**%-- /EHMK D$z2B D DE+--/21k'6JU6R/S/SG, '+55*34d;
 ;
5 )48S(T(T%1 
V 
VtT**	V"d**%-- /EINK E4
3C E EF;..03A{87Lu7T0U0UH- "[00Z./6
 6
0 $/??3I#J#J ,  tT**"d**%-- /EINK E4
3C E EF+--/21k'6JU6R/S/SG,;j)9;;{JJLO{+OT*=M+O+OPSXXM M$Hd:6F$H$HI ONK$5$5$7$7NNNK%/;;4/r@   r~  c                 h   ddg}d }| j         7|D ]4}|| j         v r)| j         |         rt          | j         |                   } n5t          | d          r| j        D ]}|D ]}|j        r'd|j        v rt          |j        d                   }| nt          |di           }t          |di           }t          |t                    r|                    dd           nd p=t          |t                    r|                    dd           nd pt          |dd           }|rt          |          } nь|S )Ntoken_usager  r  usage_metadatar  response_metadataz amazon-bedrock-invocationMetrics)	
llm_outputr  r|  r  generation_infor   r   r  r   )	r~  llm_usage_keysr  rE  r   generation_chunkmessage_chunkr  chunk_usages	            rA   r  r  w  s   #W-NI&! 	 	Ch)))h.A#.F).x/B3/GHH	x'' "". !	 !	J$.     #3 $(8(HHH 2(89IJ! !I !, '(8)R H H$+M;NPR$S$S!
 &&7>>")--gt<<<!F &&7>>")-->   "F }.>EE     2; ? ?IE r@   c                 r    dg}d }| j         *|D ]'}|| j         v r| j         |         r| j         |         } n(|S )Nre  )r  )r~  llm_model_keys	llm_modelrE  s       rA   r  r    sZ    "^NI&! 	 	Ch)))h.A#.F)$/4	r@   r   c                 `    | t          | t                    sd S |                     dd           S )Nls_model_name)r   r  r   r   s    rA   rx  rx    s0    z(D99t<<...r@   r   c                     | t          | t                    s| S dg}g d}|                                 }|D ]}|                    |d            |s|D ]}|                    |d            |S )Nr  )r   r   r   r   )r   r  r   r]   )r   r   langfuse_metadata_keyslangfuse_trace_attribute_keysmetadata_copyrE  s         rA   r   r     s     z(D99 	% % %! MMOOM% % %#t$$$$) )0 	) 	)Cc4((((r@   )jcollectionsr   contextvarsr   dataclassesr   r   typingr   r   r	   r
   r   r   r   r   r   r   uuidr   pydanticopentelemetryr   r   opentelemetry.util._decoratorr   langfuser   langfuse._client.attributesr   langfuse._client.clientr   langfuse._client.get_clientr   langfuse._client.propagationr   langfuse._client.spanr   r   r   r   r   r   langfuse._utilsr    langfuse.langchain.utilsr!   langfuse.loggerr"   langfuse.typesr#   	langchain__version__r  langchain_core.agentsr%   r&   langchain_core.callbacksr'   LangchainBaseCallbackHandlerlangchain_core.documentsr(   langchain_core.messagesr)   r*   r+   r,   r-   r.   r/   langchain_core.outputsr0   r1   langchain.callbacks.baselangchain.schema.agentlangchain.schema.documentImportErrorModuleNotFoundErrorr2   rI   r>   rH   r3   r  r4   rt   langgraph.errorsr5   r   langgraph.typesr6   LangGraphCommandr8   rC   rK   rk   r  r;  	BaseModelr  r  r  r  rx  ri   r   r?   r@   rA   <module>r     s   # # # # # # #       ( ( ( ( ( ( ( (                               ( ( ( ( ( ( ( ( A A A A A A ) ) ) ) ) ) B B B B B B , , , , , , 2 2 2 2 2 2 E E E E E E                + * * * * * 8 8 8 8 8 8 + + + + + + ' ' ' ' ' '-'',, %
BBBBBBBB	
 	
 	
 	
 	
 	
 	655555	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	EDDDDDDDD	
 	
 	
 	
 	
 	
 	DCCCCCCC666666	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
	
 	
 	
 	
 	
 	
 	
 	

    

e  
 / c . . .9< c$}"56 > > >.2 c+ 2 2 2$( !	...... $$]3333 	 	 	D		;;;;;;- 	 	 	D	        
 J J J J J J J J+ + + + + + + +2s
 s
 s
 s
 s
; s
 s
 s
l)
 
 
 
 
 
43 43 4 4 4 4\0eH$6$<= \0# \0 \0 \0 \0~.9 . . . . .b
9 
 
 
 
 
/htCH~.F /3 / / / /tCH~&HL     s1   A;D	 	DE1 1E98E9=F FF