
    gc                     N   	 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mZ d dlmZ d dlmZ d dlmZ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!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z(m)Z) d dl*m+Z+  ejX                  d      Z-e G d d             Z.e G d de.             Z/ee.e/f   Z0e	ee0f   Z1 G d de      Z2d Z3dede	e4ef   fdZ5dee$e	f   deee6df   ee6df   f   fdZ7de"fdZ8de9de6fdZ:d ee	e4ef      d!edee4   fd"Z;d#e9de4fd$Z<y# e$ r	  ed      w xY w)%    NzEPlease install LangChain to use this feature: 'pip install langchain')	dataclass)AnyDictListOptionalSequenceTupleUnioncast)UUID)BaseCallbackHandler)AgentActionAgentFinish)Document)	AIMessageBaseMessageFunctionMessageHumanMessageSystemMessageToolMessage)ChatGeneration	LLMResult)	BaseModel)default_client)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    S/var/www/openai/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    #   sF    
I7 uoC=</ / /r*   r    c                   n    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<   y)GenerationMetadataNprovidermodelmodel_paramsbase_url)r+   r,   r-   r5   r   r.   r/   r6   r7   r   r   r8   r2   r*   r(   r4   r4   5   sO    "Hhsm"0E8C=-1L(4S>*1D"Hhsm"9r*   r4   c                   8   e Zd ZU dZeed<   	 e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	<   	 	 dLd
d
d
dd
ddee   de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)dLdedee   fd;Z*defd<Z+ded&efd=Z,	 dLdeeeef      d>ededee   fd?Z-	 	 dMdeeef   ded!eeeeef      ee   f   deeeef      d@eeeef      f
dAZ.ded&ee/   fdBZ0defdCZ1dededee   fdDZ2dedee   defdEZ3dededFe4dedee   f
dGZ5dedee   d(eeef   fdHZ6	 dLdededFe7d-eeef   dee   f
dIZ8	 dLdJededee   fdKZ9y
)NCallbackHandlerzG
    The PostHog LLM observability callback handler for LangChain.
    _client_distinct_id	_trace_id_trace_input_trace_name_properties_runs_parent_treeNF)distinct_idtrace_id
propertiesprivacy_modegroupsclientrC   rD   rE   rF   rG   c                    |xs t         }|t        d      || _        || _        || _        |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.
        NzPostHog client is required)
r   
ValueErrorr;   r<   r=   r@   _privacy_mode_groupsrA   rB   )r'   rH   rC   rD   rE   rF   rG   posthog_clients           r(   __init__zCallbackHandler.__init__e   se    &  1>!9::%'!%+)|
r*   )parent_run_idmetadata
serializedinputsrun_idrO   rP   c                ~    | j                  d|||       | j                  ||        | j                  ||||fi | y )Non_chain_start)rR   _log_debug_event_set_parent_of_run_set_trace_or_span_metadata)r'   rQ   rR   rS   rO   rP   kwargss          r(   rU   zCallbackHandler.on_chain_start   sH     	.fU6(((VV]]V\]r*   )rO   outputsrZ   c                T    | j                  d|||       | j                  |||       y )Non_chain_end)r[   rW   "_pop_run_and_capture_trace_or_span)r'   r[   rS   rO   rZ   s        r(   r]   zCallbackHandler.on_chain_end   s-     	nfmWU//wOr*   errorc                T    | j                  d|||       | j                  |||       y )Non_chain_errorr`   r^   r'   r`   rS   rO   rZ   s        r(   rb   zCallbackHandler.on_chain_error   s.     	.US//uMr*   messagesc                    | j                  d|||       | j                  ||       |D cg c]  }|D ]  }t        |        }}} | j                  |||fi | y c c}}w )Non_chat_model_start)re   )rW   rX   _convert_message_to_dict_set_llm_metadata)	r'   rQ   re   rS   rO   rZ   rowmessager$   s	            r(   rg   z#CallbackHandler.on_chat_model_start   sq     	3V]U]^6>FZhsVY7)'2VY2hZz65CFC [s   Apromptsc                |    | j                  d|||       | j                  ||        | j                  |||fi | y )Non_llm_start)rl   )rW   rX   ri   )r'   rQ   rl   rS   rO   rZ   s         r(   rn   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)ro   N)rW   )r'   ro   rS   rO   rZ   s        r(   rq   z CallbackHandler.on_llm_new_token   s     	0&-uUr*   responsec                V    | j                  d||||       | j                  |||       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_end)rr   rZ   NrW   _pop_run_and_capture_generation)r'   rr   rS   rO   rZ   s        r(   rt   zCallbackHandler.on_llm_end   s0     	lFMH]cd,,V]HMr*   c                T    | j                  d|||       | j                  |||       y )Non_llm_errorrc   ru   rd   s        r(   rx   zCallbackHandler.on_llm_error   s-     	nfm5Q,,V]EJr*   	input_strc                Z    | j                  d|||        | j                  ||||fi | y )Non_tool_start)ry   rW   rY   )r'   rQ   ry   rS   rO   rP   rZ   s          r(   r{   zCallbackHandler.on_tool_start   s8     	ov}PYZ(((Y`Y_`r*   outputc                T    | j                  d|||       | j                  |||       y )Non_tool_end)r}   r^   )r'   r}   rS   rO   rZ   s        r(   r   zCallbackHandler.on_tool_end   s-     	mV]6R//vNr*   )rO   tagsr   c                T    | j                  d|||       | j                  |||       y )Non_tool_errorrc   r^   r'   r`   rS   rO   r   rZ   s         r(   r   zCallbackHandler.on_tool_error   s-     	ov}ER//uMr*   queryc                Z    | j                  d|||        | j                  ||||fi | y )Non_retriever_start)r   r|   )r'   rQ   r   rS   rO   rP   rZ   s          r(   r   z"CallbackHandler.on_retriever_start  s9     	2FMQVW(((UFM\U[\r*   	documentsc                T    | j                  d|||       | j                  |||       y )Non_retriever_end)r   r^   )r'   r   rS   rO   rZ   s        r(   r   z CallbackHandler.on_retriever_end  s/     	0&-S\]//yQr*   c                T    | j                  d|||       | j                  |||       y)zRun when Retriever errors.on_retriever_errorrc   Nr^   r   s         r(   r   z"CallbackHandler.on_retriever_error#  s/     	2FMQVW//uMr*   actionc                ~    | j                  d|||       | j                  ||        | j                  d|||fi | y)zRun on agent action.on_agent_action)r   NrV   )r'   r   rS   rO   rZ   s        r(   r   zCallbackHandler.on_agent_action0  sH     	/vV6(((vv}WPVWr*   finishc                T    | j                  d|||       | j                  |||       y )Non_agent_finish)r   r^   )r'   r   rS   rO   rZ   s        r(   r   zCallbackHandler.on_agent_finish=  s.     	/vV//vNr*   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rB   )r'   rS   rO   s      r(   rX   z"CallbackHandler._set_parent_of_runH  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)rB   popKeyError)r'   rS   s     r(   _pop_parent_of_runz"CallbackHandler._pop_parent_of_runO  s-    	!!&) 		s    	**c                 b    |}|| j                   v r| j                   |   }|| j                   v r|S )z3
        Finds the root ID of a chain run.
        r   )r'   rS   ids      r(   _find_root_runzCallbackHandler._find_root_runX  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    timerA   )r'   rQ   r$   rS   rO   rZ   default_namerun_names           r(   rY   z+CallbackHandler._set_trace_or_span_metadataa  sH     #0"7wV*:@@PL)xuQUQZQZQ\gkl

6r*   invocation_paramsc                    t        |fi |xs d}t        ||t        j                         d       }t        |t              rt        |      |_        t        |t              r4|j                  d      x}	r|	|_        |j                  d      x}
r|
|_	        	 |d   d   }|||_
        || j                  |<   y # t        $ r Y w xY w)N
generationr   ls_model_namels_providerrZ   openai_api_base)r   r4   r   
isinstancedictr   r7   getr6   r5   r8   r   rA   )r'   rQ   rS   re   rP   r   rZ   r   r   r6   r5   r8   s               r(   ri   z!CallbackHandler._set_llm_metadatam  s     +:@@PL'XXRVR[R[R]hlm
'.&67H&IJ#h% _55u5#(
 #<<66x6&.
#	!(+,=>H#&.
# (

6  		s   B8 8	CC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   rA   r   r   logwarningr#   )r'   rS   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 N)r=   r   )r'   rS   rD   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'   rD   rS   rO   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   r4   r   r   _capture_trace_or_spanr   )r'   rS   rO   r[   rD   r   s         r(   r_   z2CallbackHandler._pop_run_and_capture_trace_or_span  s    %%f-'$$V,c-.KK$vh&hij##fc7D,C,CHfVc,d	
r*   r   c                    |dnd}|t        | j                  | j                  |j                        |j                  |j
                  |d}|||d<   | j                  r|j                  | j                         t        |t              rt        |      |d<   d|d<   n&|$t        | j                  | j                  |      |d<   | j                  d	|d
<   | j                  j                  | j                  xs |||| j                         y )Nz	$ai_tracez$ai_span)$ai_trace_idz$ai_input_state$ai_latency$ai_span_name$ai_span_id$ai_parent_id	$ai_errorT$ai_is_errorz$ai_output_stateF$process_person_profilerC   eventrE   rG   )r   r;   rK   r$   r)   r!   r@   updater   BaseException_stringify_exceptionr<   capturerL   )r'   rD   rS   r   r[   rO   
event_nameevent_propertiess           r(   r   z&CallbackHandler._capture_trace_or_span  s    %2$9[z
$0t?Q?QSVS\S\];; XX!
 $0=_-##D$4$45g}-,@,I[)/3^, 3DT\\SWSeSegn3o/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   r4   r   r   _capture_generationr   )r'   rS   rO   rr   rD   r   s         r(   rv   z/CallbackHandler._pop_run_and_capture_generation  s     %%f-'$$V,#12KK$vh&ijk  fc8T-D-DXvWd-e	
r*   c                    |||j                   ||j                  |j                  |j                  t	        | j
                  | j                  |j                        d|j                  |j                  d}t        |t              r"t        |      |d<   t        |      |d<   d|d<   nt        |      \  }}||d<   ||d<   |j                  d	   }	t        |	d	   t               r1|	D 
cg c]%  }
t#        t%        t         |
      j&                        ' }}
n|	D 
cg c]  }
t)        |
       }}
t	        | j
                  | j                  |      |d
<   | j*                  r|j-                  | j*                         | j.                  d|d<   | j
                  j1                  | j.                  xs |d|| j2                         y c c}
w c c}
w )N   )r   r   r   r   z$ai_providerz	$ai_modelz$ai_model_parametersz	$ai_input$ai_http_statusr   z$ai_base_urlr   r   Tr   z$ai_input_tokensz$ai_output_tokensz$ai_output_choicesFr   z$ai_generationr   )r!   r5   r6   r7   r   r;   rK   r$   r)   r8   r   r   _get_http_statusr   _parse_usagegenerationsr   rh   r   rk   _extract_raw_esponser@   r   r<   r   rL   )r'   rD   rS   r   r}   rO   r   input_tokensoutput_tokensgeneration_resultr   completionss               r(   r   z#CallbackHandler._capture_generation  s    %! XX*LL$'$4$4*4<<9K9KSYYW";;LL
 fm,2B62J./,@,H[)/3^, +7v*>'L-3?/04A01 !' 2 22 6+B/@ '8&7
 -T.*-M-U-UV&7  
 SddRcJ3J?Rcd5Ft||UYUgUgit5u12##D$4$45$:?67))5X"'<<	 	 	

 es   $*F=Gr   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   debugr.   )r'   r   rS   rO   rZ   s        r(   rW   z CallbackHandler._log_debug_event  sK     			j\CKO+<<McR_N`acbcNdMeeopvowx	
r*   r   NN):r+   r,   r-   __doc__r   r/   r   r
   r.   intr0   r   r   r   RunMetadataStorageboolrN   rU   r]   r   rb   r   r   rg   rn   rq   r   rt   rx   r{   r   listr   r   r   r   r   r   r   r   r   r   rX   r   r   rY   ri   RunMetadatar   r   r   r_   r    r   rv   r4   r   rW   r2   r*   r(   r:   r:   E   sF    O"5c5$!6788>c3t3455_3-?#/$sCx.))8jtTz"" $( ?C;?/3"+/  eCeT$9:;	
 5c5$!678 T#s(^,  c3h(J )--1^cN^ S#X^
 ^  ~^ 4S>*^& )-	Pc3h	P 		P
  ~	P 	P  )-	N	N 		N
  ~	N 	N" )-DcND tK()D
 D  ~D( )-FcNF cF
 F  ~F F$ )-	V	V 		V
  ~	V 	V 
	V  )-NN 	N
  ~N N& )-	K	K 		K
  ~	K 	K" )--1aT#s(^,a a
 a  ~a 4S>*a a 
a$ )-	O	O 		O
  ~	O 	O 
	O  )-$(
N
N 	
N
  ~
N tCy!
N 
N 

N$ )--1]T#s(^,] ]
 ]  ~] 4S>*] ] 
]$ )-	RH%	R 		R
  ~	R 	R  )-$(NN 	N
  ~N tCy!N N 
N$ )-XX 	X
  ~X X 
X$ )-	O	O 		O
  ~	O 	O 
	O6 6htn 6 T d  )-
mT#s(^,
m 
m 	
m
  ~
m" .26:(cN( ( T#s(^,d3i78	(
 4S>*( $DcN3(4 +1F D 3  XVZ^ 
 
hW[n 
gj 
#
#
 #
 	#

 #
  ~#
J

+3D>
EJ9VcKcEd
* )-6
6
 6
  	6

 i./6
  ~6
x )-		
	
 	
  ~		
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. rk   )textstriphasattrrk   additional_kwargs)last_responses    r(   r   r   $  s\     %-*<*<*B*B*D*J!!''))			*$$666 r*   rk   r%   c                    t        | t              rd| j                  d}nt        | t              rd| 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                         |S )Nuser)rolecontent	assistantsystemtoolfunction)r   r   r   r   r   r   r   typer.   r   r   )rk   message_dicts     r(   rh   rh   1  s    '<( &7??C	GY	' +H	G]	+ (W__E	G[	) &7??C	G_	- *wG 'W__9MN  G556r*   usagec                     t        | t              r| j                  } g d}i }|D ]1  \  }}|| v s| |   }t        |t              rt	        |      n|}|||<   3 |j                  d      |j                  d      fS )N))r   r$   )r   r}   )prompt_token_countr$   )candidates_token_countr}   )inputTokenCountr$   )outputTokenCountr}   )input_token_countr$   )generated_token_countr}   r$   r}   )r   r   __dict__r   sumr   )r   conversion_listparsed_usage	model_keytype_keycaptured_countfinal_counts          r(   _parse_usage_modelr  F  s     %#O L.	8"9-N'1.$'GN#^  &1L"  / G$l&6&6x&@@@r*   rr   c                 b   ddg}d}| j                   <|D ]7  }| j                   j                  |      st        | j                   |         } n t        | d      r| j                  D ]  }|D ]  }|j
                  r(d|j
                  v rt        |j
                  d         } <t        |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   usage_metadatark   response_metadataz amazon-bedrock-invocationMetrics)	
llm_outputr   r  r   r   generation_infogetattrr   r   )rr   llm_usage_keys	llm_usagekeyr   generation_chunkmessage_chunkr  bedrock_anthropic_usagebedrock_titan_usageollama_usagechunk_usages               r(   r   r   h  sU   #W-N;GI&!C""&&s+.x/B/B3/GH	 "
 x'"..J$. #339IM]MmMm9m 23C3S3STd3e fI '(8)R H$+M;NPR$S! ""3T: &))'48 ( ""3T: &))*LdS $
  '}6FM5\9L\P\ 2; ?I/ %/ /4 r*   r`   c           	      6    t        | dt        | dd            }|S )Nstatus_codecoder   )r
  )r`   r  s     r(   r   r     s!     %vq0IJKr*   rQ   rZ   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)rQ   rZ   s     r(   r   r     s~      F6N6f~&!!i  $##i  s    **6 AA	exceptionc                 ~    t        |       }|r| j                  j                   d| S | j                  j                  S )Nz: )r.   	__class__r+   )r  descriptions     r(   r   r     s>    i.K%%../r+??'''r*   )=	langchainImportErrorModuleNotFoundErrorloggingr   dataclassesr   typingr   r   r   r   r   r	   r
   r   uuidr   langchain.callbacks.baser   langchain.schema.agentr   r   langchain_core.documentsr   langchain_core.messagesr   r   r   r   r   r   langchain_core.outputsr   r   pydanticr   r   r   posthog.ai.utilsr   r   posthog.clientr   	getLoggerr   r    r4   r   r   r:   r   r.   rh   r   r  r   r   r   r   r   r2   r*   r(   <module>r-     s  g   !	 	 	  8 ; - u u <  " @ !g	" / / /" : : : L"445$+, \
) \
~
k d38n *AD!A
5dU39--.AD%9 %PM c c3h(@ C T\]`Ta >(M (c (i  g
e
ffgs   D D$