
    jKj                     L   	 d dl Z d dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZmZmZmZmZ d dlmZ 	 d dlmZ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!m"Z" d d
l#m$Z$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2  ejf                  d      Z4e G d d             Z5e G d de5             Z6ee5e6f   Z7e
ee7f   Z8 G d de      Z9d Z:de;e!   de;e<e=e	f      fdZ>dede<e=e	f   fdZ?e G d d             Z@	 	 d2d ee'e<f   d!ee=   d"ee=   de@fd#ZA	 d2d$e%d!ee=   d"ee=   de@fd%ZBd&e2d'eCd(eee=eDef      d)ee
e=e	f      d*e
e=e	f   f
d+ZEd,eCdeDfd-ZFd.ee
e=e	f      d/e	dee=   fd0ZGd'eCde=fd1ZHy# e$ r	  ed      w xY w# eef$ r d dlmZ d dlmZmZ Y cw xY w)3    NzJPlease install LangChain to use this feature: 'pip install langchain-core')	dataclass)AnyDictListOptionalSequenceUnioncast)UUID)AgentActionAgentFinish)BaseCallbackHandler)Document)	AIMessageBaseMessageFunctionMessageHumanMessageSystemMessageToolCallToolMessage)ChatGeneration	LLMResult)	BaseModel)setup)warn_if_posthog_ai_gateway)sanitize_langchain)get_model_paramswith_privacy_mode)Clientposthogc                   `    e Zd ZU eed<   	 eed<   	 ee   ed<   	 ee   ed<   	 edefd       Z	y)SpanMetadataname
start_timeend_timeinputreturnc                 N    | j                   sy| j                   | j                  z
  S )Nr   )r%   r$   )selfs    o/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/ai/langchain/callbacks.pylatencyzSpanMetadata.latency@   s    }}}}t..    N)
__name__
__module____qualname__str__annotations__floatr   r   propertyr+    r,   r*   r"   r"   5   sF    
I7 uoC=</ / /r,   r"   c                       e Zd ZU dZee   ed<   	 dZee   ed<   	 dZee	ee
f      ed<   	 dZee   ed<   	 dZeee	ee
f         ed<   	 dZee	ee
f      ed<   y)GenerationMetadataNprovidermodelmodel_paramsbase_urltoolsposthog_properties)r-   r.   r/   r7   r   r0   r1   r8   r9   r   r   r:   r;   r   r<   r4   r,   r*   r6   r6   G   s    "Hhsm"0E8C=-1L(4S>*1D"Hhsm"9,0E8Dc3h()0&37c3h07(r,   r6   c                   |   e Zd ZU dZeed<   	 eeee	e
f      ed<   	 eeee	ee
f      ed<   	 ee   ed<   	 ee   ed<   	 eeeef      ed<   	 eed<   	 ee
e
f   ed	<   	 	 dQd
d
d
dd
ddee   deeee	e
f      deeee	ee
f      deeeef      dedeeeef      fdZd
d
ddeeef   deeef   de
dee
   deeeef      f
dZd
ddeeef   de
dee
   defdZd
ddede
dee
   defd Zd
ddeeef   d!eee      de
dee
   fd"Zd
ddeeef   d#ee   de
dee
   def
d$Zd
dd%ede
dee
   ded&ef
d'Zd
dd(ede
dee
   defd)Zd
ddede
dee
   defd*Zd
d
ddeeeef      d+ede
dee
   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
d
d/dede
dee
   d0eee      ded&efd1Z d
d
ddeeeef      d2ede
dee
   deeeef      ded&efd3Z!d
dd4e"e#   de
dee
   defd5Z$d
d
d/dede
dee
   d0eee      ded&efd6Z%d
dd7e&de
dee
   ded&ef
d8Z'd
dd9e(de
dee
   ded&ef
d:Z)d;ed<ed=ede
dee
   f
d>Z*d;ed<ed=ede
dee
   d?efd@Z+dQde
dee
   fdAZ,de
fdBZ-de
d&e
fdCZ.	 dQdeeeef      dDede
dee
   fdEZ/	 	 dRdeeef   de
d!eeeeef      ee   f   deeeef      dFeeeef      f
dGZ0de
d&ee1   fdHZ2de
fdIZ3dede
dee
   fdJZ4de
dee
   defdKZ5dede
dLe6dedee
   f
dMZ7de
dee
   d(eeef   fdNZ8	 dQdede
dLe9d-eeef   dee
   f
dOZ:	 dQd;ede
dee
   fdPZ;y
)SCallbackHandlerzG
    The PostHog LLM observability callback handler for LangChain.
    
_ph_client_distinct_id	_trace_id_trace_input_trace_name_properties_runs_parent_treeNF)distinct_idtrace_id
propertiesprivacy_modegroupsclientrG   rH   rI   rJ   rK   c                    |xs
 t               | _        || _        || _        |xs i | _        || _        |xs i | _        i | _        i | _        y)a  
        Args:
            client: PostHog client instance.
            distinct_id: Optional distinct ID of the user to associate the trace with.
            trace_id: Optional trace ID to use for the event.
            properties: Optional additional metadata to use for the trace.
            privacy_mode: Whether to redact the input and output of the trace.
            groups: Optional additional PostHog groups to use for the trace.
        N)	r   r?   r@   rA   rD   _privacy_mode_groupsrE   rF   )r)   rL   rG   rH   rI   rJ   rK   s          r*   __init__zCallbackHandler.__init__{   sP    & !+EG'!%+)|
r,   )parent_run_idmetadata
serializedinputsrun_idrQ   rR   c                ~    | j                  d|||       | j                  ||        | j                  ||||fi | y)zBRecord the start of a LangChain chain run for trace/span tracking.on_chain_start)rT   N_log_debug_event_set_parent_of_run_set_trace_or_span_metadata)r)   rS   rT   rU   rQ   rR   kwargss          r*   rW   zCallbackHandler.on_chain_start   sM     	.fU6(((	
9?	
r,   )rQ   outputsr\   c                .    | j                  dd|||       y)z;Capture a completed LangChain chain run as a trace or span.on_chain_endr]   N_capture_trace_or_span_run)r)   r]   rU   rQ   r\   s        r*   r_   zCallbackHandler.on_chain_end   s     	''Iw	
r,   errorc                .    | j                  dd|||       y)z8Capture a failed LangChain chain run as a trace or span.on_chain_errorrb   Nr`   r)   rb   rU   rQ   r\   s        r*   rd   zCallbackHandler.on_chain_error   s     	''gufm	
r,   messagesc                    | j                  d|||       | j                  ||       |D cg c]  }|D ]  }t        |        }}} | j                  |||fi | yc c}}w )z=Record the start of a chat model run for generation tracking.on_chat_model_start)rf   N)rY   rZ   _convert_message_to_dict_set_llm_metadata)	r)   rS   rf   rU   rQ   r\   rowmessager&   s	            r*   rh   z#CallbackHandler.on_chat_model_start   s     	!6=8 	 	
 	69A
9A#QTg$W-QT- 	 
 	z65CFC
s   Apromptsc                |    | j                  d|||       | j                  ||        | j                  |||fi | y)z7Record the start of an LLM run for generation tracking.on_llm_start)rm   N)rY   rZ   rj   )r)   rS   rm   rU   rQ   r\   s         r*   ro   zCallbackHandler.on_llm_start   sD     	nfmWU6z67EfEr,   tokenr'   c                .    | j                  d|||       y)z?Run on new LLM token. Only available when streaming is enabled.on_llm_new_token)rp   N)rY   )r)   rp   rU   rQ   r\   s        r*   rr   z CallbackHandler.on_llm_new_token   s     	0&-uUr,   responsec                2    | j                  dd||||       y)z
        The callback works for both streaming and non-streaming runs. For streaming runs, the chain must set `stream_usage=True` in the LLM.
        
on_llm_endrs   )r\   N_capture_generation_run)r)   rs   rU   rQ   r\   s        r*   ru   zCallbackHandler.on_llm_end   s$     	$$*hf 	% 	
r,   c                .    | j                  dd|||       y)z:Capture a failed LLM run as a PostHog AI generation event.on_llm_errorrb   Nrv   re   s        r*   ry   zCallbackHandler.on_llm_error   s     	$$GUFM	
r,   	input_strc                ~    | j                  d|||       | j                  ||        | j                  ||||fi | y)z;Record the start of a LangChain tool run for span tracking.on_tool_start)rz   NrX   )r)   rS   rz   rU   rQ   rR   r\   s          r*   r|   zCallbackHandler.on_tool_start
  sS     	V]i 	 	
 	6(((	6=	
<B	
r,   outputc                .    | j                  dd|||       y)z1Capture a completed LangChain tool run as a span.on_tool_endr}   Nr`   )r)   r}   rU   rQ   r\   s        r*   r   zCallbackHandler.on_tool_end  s     	''8VV]	
r,   )rQ   tagsr   c                .    | j                  dd|||       y)z.Capture a failed LangChain tool run as a span.on_tool_errorrb   Nr`   r)   rb   rU   rQ   r   r\   s         r*   r   zCallbackHandler.on_tool_error*  s     	''WeV]	
r,   queryc                ~    | j                  d|||       | j                  ||        | j                  ||||fi | y)z@Record the start of a LangChain retriever run for span tracking.on_retriever_start)r   NrX   )r)   rS   r   rU   rQ   rR   r\   s          r*   r   z"CallbackHandler.on_retriever_start8  sN     	2FMQVW6(((v}	
8>	
r,   	documentsc                .    | j                  dd|||       y)z6Capture a completed LangChain retriever run as a span.on_retriever_endr   Nr`   )r)   r   rU   rQ   r\   s        r*   r   z CallbackHandler.on_retriever_endI  s     	''Y	
r,   c                .    | j                  dd|||       y)zRun when Retriever errors.on_retriever_errorrb   Nr`   r   s         r*   r   z"CallbackHandler.on_retriever_errorV  s     	'' '5&-	
r,   actionc                ~    | j                  d|||       | j                  ||        | j                  d|||fi | y)zRun on agent action.on_agent_action)r   NrX   )r)   r   rU   rQ   r\   s        r*   r   zCallbackHandler.on_agent_actiond  sH     	/vV6(((vv}WPVWr,   finishc                .    | j                  dd|||       y)z5Capture a completed LangChain agent action as a span.on_agent_finishr   Nr`   )r)   r   rU   rQ   r\   s        r*   r   zCallbackHandler.on_agent_finishq  s     	''x	
r,   
event_namepayload_namepayloadc                 X     | j                   |||fi ||i | j                  |||       y N)rY   "_pop_run_and_capture_trace_or_span)r)   r   r   r   rU   rQ   s         r*   ra   z*CallbackHandler._capture_trace_or_span_run~  s<     		
2>1H	
 	//wOr,   extrac                 \     | j                   |||fi ||i| | j                  |||       y r   )rY   _pop_run_and_capture_generation)r)   r   r   r   rU   rQ   r   s          r*   rw   z'CallbackHandler._capture_generation_run  sD     		
2>1H	
LQ	
 	,,V]GLr,   c                 (    ||| j                   |<   yy)zd
        Set the parent run ID for a chain run. If there is no parent, the run is the root.
        NrF   )r)   rU   rQ   s      r*   rZ   z"CallbackHandler._set_parent_of_run  s     $(5Df% %r,   c                 Z    	 | j                   j                  |       y# t        $ r Y yw xY w)z;
        Remove the parent run ID for a chain run.
        N)rF   popKeyError)r)   rU   s     r*   _pop_parent_of_runz"CallbackHandler._pop_parent_of_run  s-    	!!&) 		s    	**c                 b    |}|| j                   v r| j                   |   }|| j                   v r|S )z3
        Finds the root ID of a chain run.
        r   )r)   rU   ids      r*   _find_root_runzCallbackHandler._find_root_run  s<     D%%%""2&B D%%%	r,   r&   c                     |dnd}t        |fi |xs |}t        ||t        j                         d       | j                  |<   y )Ntracespanr#   r&   r$   r%   )_get_langchain_run_namer"   timerE   )r)   rS   r&   rU   rQ   r\   default_namerun_names           r*   r[   z+CallbackHandler._set_trace_or_span_metadata  sF     #0"7wV*:@@PL)499;


6r,   invocation_paramsc                    t        |fi |xs d}t        ||t        j                         d       }t        |t              r*t        |      |_        |j                  d      x}	r|	|_        t        |t              rJ|j                  d      x}
r|
|_	        |j                  d      x}r||_
        |j                  d      |_        	 |d   d   }|||_        || j                  |<   y # t        $ r Y w xY w)	N
generationr   r;   ls_model_namels_providerr<   r\   openai_api_base)r   r6   r   
isinstancedictr   r9   getr;   r8   r7   r<   r:   r   rE   )r)   rS   rU   rf   rR   r   r\   r   r   r;   r8   r7   r:   s                r*   rj   z!CallbackHandler._set_llm_metadata  s    +:@@PL'diikD

 '.&67H&IJ#)--g66u6#(
 h% _55u5#(
 #<<66x6&.
#,4LL9M,NJ)	!(+,=>H#&.
# (

6  		s   C( (	C43C4c                     t        j                          }	 | j                  j                  |      }||_        |S # t        $ r t        j                  d|        Y y w xY w)NzNo run metadata found for run )r   rE   r   r   logwarningr%   )r)   rU   r%   runs       r*   _pop_run_metadataz!CallbackHandler._pop_run_metadata  sZ    99;	**..(C  
	  	KK8AB	s   : !AAc                 L    | j                   xs | j                  |      }|s|S |S r   )rA   r   )r)   rU   rH   s      r*   _get_trace_idzCallbackHandler._get_trace_id  s(    >>@T%8%8%@Mr,   c                 *    ||| j                   vr|S |S )zr
        Replace the parent run ID with the trace ID for second level runs when a custom trace ID is set.
        r   )r)   rH   rU   rQ   s       r*   _get_parent_run_idz"CallbackHandler._get_parent_run_id  s"     $d>O>O)OOr,   c                    | j                  |      }| j                  |       | j                  |      }|sy t        |t              rt
        j                  d| d       y | j                  ||||| j                  |||             y )NRun zB is a generation, but attempted to be captured as a trace or span.)	r   r   r   r   r6   r   r   _capture_trace_or_spanr   )r)   rU   rQ   r]   rH   r   s         r*   r   z2CallbackHandler._pop_run_and_capture_trace_or_span  s     %%f-'$$V,c-.KKvh`a ####HfmD	
r,   r   c                    |dnd}|t        | j                  | j                  t        |j                              |j
                  |j                  |dd}|||d<   | j                  r|j                  | j                         t        |t              rAt        |      |d<   d|d<   t        | j                  || j                  | j                  |      }n&|$t        | j                  | j                  |      |d	<   | j                  d
|d<   | j                  j                  | j                  xs |||| j                         y )Nz	$ai_tracez$ai_span	langchain)$ai_trace_idz$ai_input_state$ai_latency$ai_span_name$ai_span_id$ai_framework$ai_parent_id	$ai_errorT$ai_is_errorz$ai_output_stateF$process_person_profilerG   eventrI   rK   )r   r?   rN   r   r&   r+   r#   rD   updater   BaseException_stringify_exception(_capture_exception_and_update_propertiesr@   rO   capture)r)   rH   rU   r   r]   rQ   r   event_propertiess           r*   r   z&CallbackHandler._capture_trace_or_span  sG    %2$9[z
$0!3!35G		5R  ;; XX!(	
 $0=_-##D$4$45g}-,@,I[)/3^,G!!    3D!3!3W4/0 $:?67))3V'<<	 	  	
r,   c                    | j                  |      }| j                  |       | j                  |      }|sy t        |t              st
        j                  d| d       y | j                  ||||| j                  |||             y )Nr   zC is not a generation, but attempted to be captured as a generation.)	r   r   r   r   r6   r   r   _capture_generationr   )r)   rU   rQ   rs   rH   r   s         r*   r   z/CallbackHandler._pop_run_and_capture_generationA  s     %%f-'$$V,#12KKvhab   ##HfmD	
r,   c                 4   |||j                   ||j                  |j                  |j                  t	        | j
                  | j                  t        |j                              d|j                  |j                  dd}t        |j                         t        |j                  t              r|j                  |j                         |j                   r|j                   |d<   | j"                  r|j                  | j"                         | j$                  d|d<   t        |t&              rPt)        |      |d<   t+        |      |d<   d	|d
<   t-        | j
                  || j$                  | j.                  |      }n]t1        ||j                  |j                        }|j2                  |d<   |j4                  |d<   |j6                  |d<   |j8                  |d<   |j:                  |d<   |j<                  d   }t        |d   t>              r1|D 	cg c]%  }	tA        tC        t>        |	      jD                        ' }
}	n|D 	cg c]  }	tG        |	       }
}	t	        | j
                  | j                  |
      |d<   |j<                  rV|j<                  d   rG|j<                  d   d   }tI        |dd       }t        |t              r|jK                  d      }|||d<   | j
                  jM                  | j$                  xs |d|| j.                         y c c}	w c c}	w )N   r   )r   r   r   r   z$ai_providerz	$ai_modelz$ai_model_parametersz	$ai_input$ai_http_statusr   z$ai_base_urlr   z	$ai_toolsFr   r   r   Tr   z$ai_input_tokensz$ai_output_tokensz$ai_cache_creation_input_tokensz$ai_cache_read_input_tokensz$ai_reasoning_tokensz$ai_output_choicesgeneration_infofinish_reasonz$ai_stop_reasonz$ai_generationr   )'r#   r7   r8   r9   r   r?   rN   r   r&   r+   r:   r   r   r<   r   r   r;   rD   r@   r   _get_http_statusr   r   rO   _parse_usageinput_tokensoutput_tokenscache_write_tokenscache_read_tokensreasoning_tokensgenerationsr   ri   r
   rl   _extract_raw_responsegetattrr   r   )r)   rH   rU   r   r}   rQ   r   usagegeneration_resultr   completionslast_gengen_infor   s                 r*   r   z#CallbackHandler._capture_generationY  s    %! XX*LL$'$4$4*!3!35G		5R  #;;LL(
" 	#3<<0c,,d3##C$:$:;99,/II[)##D$4$45$:?67fm,2B62J./,@,H[)/3^,G!!   !syyAE383E3E/0494G4G01(( >? ?D>U>U:;7<7M7M34 !' 2 22 6+B/@ '8&7
 -T.*-M-U-UV&7   '8&7
 **5&7   6G!3!3[612
 !!f&8&8&<!--b1"5"8->Eh-$,LL$AM$0>K():;))5X"'<<	 	  	
-
s   *L>Lc           
      v    t         j                  d| dt        |      d d  dt        |      d d  d|        y )NzEvent: z
, run_id:    z, parent_run_id: z
, kwargs: )r   debugr0   )r)   r   rU   rQ   r\   s        r*   rY   z CallbackHandler._log_debug_event  sK     			j\CKO+<<McR_N`acbcNdMeeopvowx	
r,   r   NN)<r-   r.   r/   __doc__r   r1   r   r	   r0   intr   r2   r   r   RunMetadataStorageboolrP   rW   r_   r   rd   r   r   rh   ro   rr   r   ru   ry   r|   r   listr   r   r   r   r   r   r   r   r   r   ra   rw   rZ   r   r   r[   rj   RunMetadatar   r   r   r   r"   r   r   r6   r   rY   r4   r,   r*   r>   r>   [   s    "5c4011>c3t3455_3-?#/$sCx.))8jtTz"" $( 8<;?/3"+/  eCdN34	
 5c5$!678 T#s(^,  c3h(D )--1
cN
 S#X

 
  ~
 4S>*
, )-
c3h
 	

  ~
 
$ )-

 	

  ~
 
& )-DcND tK()D
 D  ~D2 )-FcNF cF
 F  ~F F& )-	V	V 		V
  ~	V 	V 
	V  )-

 	

  ~
 
( )-

 	

  ~
 
& )--1
T#s(^,
 

 
  ~
 4S>*
 
 

0 )-

 	

  ~
 
 

$ )-$(

 	

  ~
 tCy!
 
 

( )--1
T#s(^,
 

 
  ~
 4S>*
 
 

, )-
H%
 	

  ~
 
$ )-$(

 	

  ~
 tCy!
 
 

& )-XX 	X
  ~X X 
X$ )-

 	

  ~
 
 

PP P 	P
 P  ~PMM M 	M
 M  ~M M6 6htn 6 T d  )-
T#s(^,
 
 	

  ~
& .26:(cN( ( T#s(^,d3i78	(
 4S>*( $DcN3(@ +1F D %):B4.

+3D>
DG
*0
0
 0
 	0

 0
  ~0
d

  ~
 	=01	
< )-\
\
 \
  	\

 i./\
  ~\
D )-		
	
 	
  ~		
r,   r>   c                     | j                   7| j                   j                         dk7  r| j                   j                         S t        | d      r| j                  j                  S y)z<Extract the response from the last response of the LLM call. rl   )textstriphasattrrl   additional_kwargs)last_responses    r*   r   r     s\     %-*<*<*B*B*D*J!!''))			*$$666 r,   
tool_callsr'   c           
          	 | D cg c]'  }d|d   |d   t        j                  |d         dd) c}S c c}w # t        $ r | cY S w xY w)Nfunctionr   r#   args)r#   	arguments)typer   r   )jsondumpsr   )r   	tool_calls     r*   _convert_lc_tool_calls_to_oair    ss     (

 (	 #o%f-!%If,=!> (

 
	
 

  s   : ,5: : AArl   c                 <   t        | t              rd| j                  d}nt        | t              r4d| j                  d}| j                  rt        | j                        |d<   nt        | t              rd| j                  d}nbt        | t              rd| j                  d}nBt        | t              rd| j                  d}n"| j                  t        | j                        d}| j                  r|j                  | j                         d|v r
|d   sd	|d<   |S )
Nuser)rolecontent	assistantr   systemtoolr   r	  r   )r   r   r	  r   r   r  r   r   r   r  r0   r   r   )rl   message_dicts     r*   ri   ri     s    '<( &7??C	GY	' +H)F""*L& 
G]	+ (W__E	G[	) &7??C	G_	- *wG 'W__9MN  G556L i)@"$Yr,   c                   ^    e Zd ZU ee   ed<   ee   ed<   ee   ed<   ee   ed<   ee   ed<   y)
ModelUsager   r   r   r   r   N)r-   r.   r/   r   r   r1   r4   r,   r*   r  r    s4    3-C=  %}$sm#r,   r  r   r7   r8   c                 <   t        | t              r| j                  } g d}i }|D ]1  \  }}|| v s| |   }t        |t              rt	        |      n|}|||<   3 d| v rAt        | d   t
              r.| d   j                  d      |d<   | d   j                  d      |d<   d| v r*t        | d   t
              r| d   j                  d      |d<   dd	d
ddd}	t        di |	j                         D 
ci c]  \  }
}||j                  |
      xs d c}}
}d}|r|j                         dk(  rd}n|rd|j                         v rd}|rP|j                  rD|j                  xs d|j                  xs dz   }|dkD  rt        |j                  |z
  d      |_
        |S c c}}
w )N))r   r&   )r   r}   cache_creation_input_tokenscache_writecache_read_input_tokens
cache_read)prompt_token_countr&   )candidates_token_countr}   )cached_content_token_countr  )thoughts_token_count	reasoning)inputTokenCountr&   )outputTokenCountr}   )cacheCreationInputTokenCountr  )cacheReadInputTokenCountr  )prompt_tokensr&   )completion_tokensr}   r  r  )input_token_countr&   )generated_token_countr}   input_token_detailscache_creationr  r  output_token_detailsr  r   r   r   r   r   )r&   r}   r  r  r  r   F	anthropicTr4   )r   r   __dict__r   sumr   r   r  itemslowerr   r   r   max)r   r7   r8   conversion_listparsed_usage	model_keytype_keycaptured_countfinal_countfield_mapping
mapped_keydataclass_keynormalized_usageis_anthropiccache_tokenss                  r*   _parse_usage_modelr9    s   
 %#O4 L.	8"9-N nd3 N##  &1L"  / %*#$d+ ',,A&B&F&FGW&X]#%*+@%A%E%El%S\" &:$%t, %**@$A$E$Ek$R[!  !+)'M "  .;-@-@-B
-B)
M <++J7<1<-B
 LHNN$3	;%++-/(55(::?a//41
 !,/ --<a-) 3
s   . Frs   c                    ddg}t        d d d d d       }| j                  >|D ]9  }| j                  j                  |      st        | j                  |   ||      } n t	        | d      r| j
                  D ]  }d|v rt        |d   ||      } |S |D ]  }|j                  r*d|j                  v rt        |j                  d   ||      } Ut        |di       }t        |di       }	t        |	t              r|	j                  dd       nd }
t        |	t              r|	j                  dd       nd }t        |dd       }|
xs |xs |}|st        |||      }   |S )	Ntoken_usager   )r   r   r   r   r   r   usage_metadatarl   response_metadataz amazon-bedrock-invocationMetrics)
r  
llm_outputr   r9  r   r   r   r   r   r   )rs   r7   r8   llm_usage_keys	llm_usagekeyr   generation_chunkmessage_chunkr=  bedrock_anthropic_usagebedrock_titan_usageollama_usagechunk_usages                 r*   r   r   g  s    $W-N&I &!C""&&s+.'',h	  " x'"..J*$.z'/BHeT	N K %/ #33$(8(H(HH 2(889IJ !I
  '(8)R H$+M;NPR$S! ""3T: &))'48 ( ""3T: &)):D  $  '!#3T 
 ,R/BRl   2;% PIG %/ /T r,   rL   	exceptionrG   rK   r   c                 V    | j                   r| j                  ||||      }|r||d<   |S )N)rG   rK   rI   z$exception_event_id)enable_exception_autocapturecapture_exception)rL   rH  rG   rK   r   exception_ids         r*   r   r     sE     **//#'	 0 
 6B23r,   rb   c           	      6    t        | dt        | dd            }|S )Nstatus_codecoder   )r   )rb   rN  s     r*   r   r     s!     %vq0IJKr,   rS   r\   c                     d|v r
|d   |d   S | y	 | d   S # t         t        f$ r Y nw xY w	 | d   d   S # t         t        f$ r Y yw xY w)aw  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#   Nr   r   )r   	TypeError)rS   r\   s     r*   r   r     s~    $ F6N6f~&!!i  $##i  s    **6 AAc                 ~    t        |       }|r| j                  j                   d| S | j                  j                  S )Nz: )r0   	__class__r-   )rH  descriptions     r*   r   r     s>    i.K%%../r+??'''r,   r   )Ilangchain_coreImportErrorModuleNotFoundErrorr  loggingr   dataclassesr   typingr   r   r   r   r   r	   r
   uuidr   langchain_core.agentsr   r   langchain_core.callbacks.baser   langchain.callbacks.baselangchain.schema.agentlangchain_core.documentsr   langchain_core.messagesr   r   r   r   r   r   r   langchain_core.outputsr   r   pydanticr   r    r   posthog.ai.gatewayr   posthog.ai.sanitizationr   posthog.ai.utilsr   r   posthog.clientr   	getLoggerr   r"   r6   r   r   r>   r   r   r   r0   r  ri   r  r9  r   r   r   r   r   r   r   r4   r,   r*   <module>ri     s      !   @>A
 .   =   9 6 @ !g	" / / /" ) ) ) L"445$+, e	
) e	
P
X	$sCx.&k d38n 8 $ $ $ #\D!\sm\ C=\ 	\@ QU@@#+C=@@H@@F %S$/0 T#s(^$	
 38n*M c c3h(47c]B(M (c (K  
T 0 	() @<??@s   E9 F
 9F
F#"F#