0i ddlZddlZddlZddlmZddlmZddlZddlZddl m Z ddl m Z m Z mZmZmZddlmZmZddlmZmZddlmZdd lmZmZdd lmZmZdd lm Z e r dd lm!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(dd l)m*Z*ddl+m,Z, ddl-m.Z.ddl/m0Z0m1Z1m2Z2m3Z3ddl4m5Z5ddl6m7Z7 ddl9m:Z: ddlZ> ddl?m@Z@ ddlAmBZB ddlCmDZD ddlEmFZF ddlGmHZH ddlImJZJejejejejejejejejdZRejddZTd ZUd!ZVd"ZWGd#d$eZXGd%d&ZYGd'd(e0ZZd)Z[d*Z\d+Z]d,Z^d-Z_d.Z`d/Zad0Zbd1Zcd2Zdd3Zed4Zfd5Zgy#e8$r edwxYw#e8$r ddl;m:Z:n #e8$rdZ:YnwxYwY&wxYw#e8$rdZ=Y-wxYw#e8$rdZ>Y4wxYw#e8$rdZ@Y;wxYw#e8$rdZBYBwxYw#e8$rdZDYIwxYw#e8$rdZFYPwxYw#e8$rdZHYWwxYw#e8$rdZJY^wxYw)6N) OrderedDictwraps)set_ai_pipeline_name)GEN_AI_ALLOWED_MESSAGE_ROLESnormalize_message_rolesset_data_normalizedget_start_span_functiontruncate_and_annotate_messages)OPSPANDATA) DidNotEnable Integration)should_send_default_pii) _get_valueset_span_errored)loggercapture_internal_exceptions) TYPE_CHECKING)Any AsyncIteratorCallableDictIteratorListOptionalUnion)UUID)Span) AgentFinish)BaseCallbackHandlerBaseCallbackManager Callbacksmanager) BaseMessage) LLMResultzlangchain not installed) AgentExecutor)OpenAIEmbeddings)AzureOpenAIEmbeddings)VertexAIEmbeddings)BedrockEmbeddings)CohereEmbeddings)MistralAIEmbeddings)HuggingFaceEmbeddings)OllamaEmbeddings)frequency_penalty function_call max_tokenspresence_penalty temperature tool_callstop_ktop_plangchain_agent_stack)defaultctj}|g}n|j}|j|tj |y)z"Push an agent name onto the stack.N) _agent_stackgetcopyappendset) agent_namestacks P/opt/hc_python/lib/python3.12/site-packages/sentry_sdk/integrations/langchain.py _push_agentrC|sC    E }  LLUctj}|r7|j}|j}tj ||Sy)z/Pop an agent name from the stack and return it.N)r;r<r=popr?)rAr@s rB _pop_agentrGsB    E  YY[  rDc:tj}|r|dSy)z>Get the current agent name (top of stack) without removing it.N)r;r<)rAs rB_get_current_agentrJs"    E Ry rDc2eZdZdZdeZddZedZy)LangchainIntegration langchainzauto.ai.Nc^||_||_|tjdtdyy)NzsThe `max_spans` parameter of `LangchainIntegration` is deprecated and will be removed in version 3.0 of sentry-sdk.) stacklevel)include_prompts max_spanswarningswarnDeprecationWarning)selfrQrRs rB__init__zLangchainIntegration.__init__s4."  MMO"   !rDcttjt_tDt tj t_t tjt_tttttttttttttttt yN)_wrap_configurer$ _configurer'_wrap_agent_executor_invokeinvoke_wrap_agent_executor_streamstream_patch_embeddings_providerr(r)r*r+r,r-r.r/rDrB setup_oncezLangchainIntegration.setup_onces-W-?-?@  $#>}?S?S#TM #>}?S?S#TM  ##34"#89"#56"#45"#34"#67"#89"#34rD)TN)__name__ __module__ __qualname__ identifieroriginrW staticmethodrbrarDrBrLrLs,J | $F 55rDrLceZdZdZgZdZdZy) WatchedSpanNFc||_yrY)span)rVrls rBrWzWatchedSpan.__init__s  rD)rcrdrerlchildren is_pipelinerWrarDrBrjrjs DHKrDrjczeZdZdZdZdZdZdZdZdZ dddd d Z d Z d Z d Z dZdZdZdZdZdZy)SentryLangchainCallbackz+Callback handler that creates Sentry spans.c>t|_||_||_yrY)rspan_mapmax_span_map_sizerQ)rVrsrQs rBrWz SentryLangchainCallback.__init__s#  !2.rDc |jxt|j|jkDrU|jjd\}}|j ||t|j|jkDrTyyy)NF)last)rslenrrpopitem _exit_span)rVrun_id watched_spans rB gc_span_mapz#SentryLangchainCallback.gc_span_mapso  ! ! -dmm$t'='=='+}}'<'<%'<'H$  f5dmm$t'='== .rDcBt5|r||jvr dddy|j|}|j}t|t j ||j |jddd|j|=dddy#1swYyxYwrY)rrrrlr sentry_sdkcapture_exceptionscope__exit__)rVryerror span_datarls rB _handle_errorz%SentryLangchainCallback._handle_errors~ ( *V4==8+ * f-I>>D T "  ( ( ; MM$d + f%+ * *sBA&BBcn|j|jd}|j|j|S)Nrolecontent)typerupdateadditional_kwargs)rVmessageparseds rB_normalize_langchain_messagez4SentryLangchainCallback._normalize_langchain_messages+!,,7??C g//0 rDc zd}|r]|jj|}|r@t|jjdi|}|j j ||ttjdi|}|jj||j|<|j|S)Nra) rrr<rjrl start_childrmr>r} start_span __enter__r{)rVry parent_idkwargsrz parent_spans rB _create_spanz$SentryLangchainCallback._create_spans --++I6K*+G;+;+;+G+G+Q&+QR $$++L9  &z'<'<'Fv'FGL##% , f rDc|jr td|jjddd|j|=yrY)rnrrlrrr)rVrrys rBrxz"SentryLangchainCallback._exit_spans5   &dD1 MM& !rDN)tags parent_run_idmetadatac vt5|s dddy|jdi}|j|jdi|jdxs(|jdxs|jdxsd} |j||tj |jdxsd t j } | j} | r | jtj| |jd d} d | vr!| jtjd n$d | vr | jtjd tjD]"\} }| |vs || t| ||| d$t!| |jdt#ro|j$rc|Dcgc]}t&j(d|dd}}t+j,}t/|| |}|t| tj0|ddddycc}w#1swYyxYw)zRun when LLM starts running.Ninvocation_paramsrmodel model_namemodel_idnamezLangchain LLM calloprrg_type anthropicopenaiFunpacktoolstext)rrr)rr<rrr GEN_AI_PIPELINErLrgrlset_datar GEN_AI_REQUEST_MODEL GEN_AI_SYSTEM DATA_FIELDSitemsr _set_tools_on_spanrrQrUSERr}get_current_scoper GEN_AI_REQUEST_MESSAGES)rV serializedpromptsryrrrr all_paramsrrzrlai_typekey attributepromptnormalized_messagesr messages_datas rB on_llm_startz$SentryLangchainCallback.on_llm_start s)) *+ * $7>,/>>*-  ,,%%ZZ'?+?+22 -L $$D 11 !nnWb1Gg% h44kBW$ h44h?"-"3"3"5Y*$C)D'iCQVW#6 tZ^^G%< =&(T-A-A #* ' #*!= A A,2F#C#* $'#446 >'u! !,' 88%$ m+ *T'U+ *s1H/EH/3H/9A H/H*AH/*H//H8c Nt5|s dddy|jdi}|j|jdi|jdxs(|jdxs|jdxsd}|j||jdtj d |j tj }|j}|jtjd |r |jtj||jd d} d | vr!|jtjd n$d| vr |jtjdt} | r |jtj | t"j%D]"\} } | |vs || t'|| || d$t)||jdt+r|j,r{g} |D])}|D]"}| j/|j1|$+t3| } t5j6}t9| ||}|t'|tj:|ddddy#1swYyxYw)z#Run when Chat Model starts running.Nrrrrrrrzchat rchatrrrFrr)rr<rrr GEN_AI_CHATstriprLrgrlrr GEN_AI_OPERATION_NAMErrrJGEN_AI_AGENT_NAMErrr rrrQr>rrr}rr r)rVrmessagesryrrrrzrlrr@rrrlist_rrrs rBon_chat_model_startz+SentryLangchainCallback.on_chat_model_startWsZ) *+ * $7>,/>>*-  ,, ?+>>UG_**,+22 -L $$D MM(88& A h;;UC nnWb1Gg% h44kBW$ h44h?+-J h88*E"-"3"3"5Y*$C)D'iCQVW#6 tZ^^G%< =&(T-A-A&(#%E#(+22 ==gF$)& '>>Q&R#"446 >'u! !,' 88%$ q+ * *sJF3J JCJJ$c t5|r||jvr dddy|j|}|j}trY|jrMt |t j|jDcgc]}|Dcgc]}|jc}c}}t|||j||dddycc}wcc}}w#1swYyxYw)z!Run when Chat Model ends running.N) rrrrlrrQr r GEN_AI_RESPONSE_TEXT generationsr_record_token_usagerx)rVresponseryrrrlrxs rBon_chat_model_endz)SentryLangchainCallback.on_chat_model_ends) *V4==8+ * f-I>>D&(T-A-A#11:B:N:NO:Ne,eaffe,:NO h / OOIv .+ *-O+ *s5CAC; CC C&C CCCc t5|r||jvr dddy|j|}|j} |jdd}| |j j d}| |jtj| |j j d}| |jtj| trG|jr;t|jdd} | "| gk7rt!|tj"| dtrY|jrMt!|tj$|jD cgc]} | D cgc]} | j&c} c} } t)|||j+||dddy#t$rd}YhwxYw#t$rY8wxYw#t$rY wxYw#t$rYwxYwcc} wcc} } w#1swYyxYw)zRun when LLM ends running.Nrr finish_reasonr5Fr)rrrrlr IndexErrorgeneration_infor<rr GEN_AI_RESPONSE_MODELAttributeErrorGEN_AI_RESPONSE_FINISH_REASONSrrQgetattrrr GEN_AI_RESPONSE_TOOL_CALLSrrrrx) rVrryrrrl generationresponse_modelrr5rrs rB on_llm_endz"SentryLangchainCallback.on_llm_ends) *V4==8+ * f-I>>D "%11!4Q7 %%/%?%?%C%CL%QN%1 h&D&DnU$.$>$>$B$B?$SM$0 $CC] .0T5I5I%,Z-?-?t%T %1jB6F/ $ ( C C *', '(T-A-A#11:B:N:NO:Ne,eaffe,:NO h / OOIv .e+ * "!  "&&&-O]+ *sG:G:F.G:=G=GAG $:G: G4'G/:G4?&G:. F=9G:<F==G: G  G: G  G: GG:GG: G,)G:+G,,G:/G44G::Hc (|j||y)zRun when LLM errors.NrrVrryrs rB on_llm_errorz$SentryLangchainCallback.on_llm_error 65)rDc (|j||y)zRun when Chat Model errors.Nrrs rBon_chat_model_errorz+SentryLangchainCallback.on_chat_model_errorrrDc bt5|r||jvr dddy|j|}|j}tr?|jr3t |t j|jj|j||dddy#1swYyxYwrY) rrrrlrrQr r r return_valuesrrx)rVfinishryrrrls rBon_agent_finishz'SentryLangchainCallback.on_agent_finishs ( *V4==8+ * f-I>>D&(T-A-A#(779M9M9S9S9U OOIv .+ * *sB%A6B%%B.c (t5|s dddy|jdxs|jdxsd}|j||jdtjd|j t j}|j}|jtjd|jtj||jd}| |jtj|t} | r |jtj| t!r8|j"r,t%|tj&|jd |gdddy#1swYyxYw) zRun when tool starts running.Nrrrz execute_tool r execute_tool descriptioninputs)rr<rr GEN_AI_EXECUTE_TOOLrrLrgrlrr rGEN_AI_TOOL_NAMEGEN_AI_TOOL_DESCRIPTIONrJrrrQr GEN_AI_TOOL_INPUT) rVr input_strryr tool_namerzrltool_descriptionr@s rB on_tool_startz%SentryLangchainCallback.on_tool_starts@) *+ *#v.J&**V2DJI,, ?+))$YK0668+22 -L $$D MM(88. I MM(33Y ?)~~m< + h>>@PQ+-J h88*E&(T-A-A#..JJx)57+ * *sFE'FFc 2t5|r||jvr dddy|j|}|j}tr'|jrt |t j||j||dddy#1swYyxYw)zRun when tool ends running.N) rrrrlrrQr r GEN_AI_TOOL_OUTPUTrx)rVoutputryrrrls rB on_tool_endz#SentryLangchainCallback.on_tool_end"sv) *V4==8+ * f-I>>D&(T-A-A#D(*E*EvN OOIv .+ * *sB AB  Bc(|j||y)zRun when tool errors.Nr)rVrryargsrs rB on_tool_errorz%SentryLangchainCallback.on_tool_error1rrD)rcrdre__doc__rWr{rrrrxrrrrrrrrrrrarDrBrprpsf5/ 6 & ""HT@D/(5/n* * / "H /*rDrpc|syt|dxs t|d}t|dxs t|d}t|d}|||fS)NNNN prompt_tokens input_tokenscompletion_tokens output_tokens total_tokensr) token_usagerrrs rB_extract_tokensr7sb k?;z^@L{,?@J_EMk>:L  44rDc|syd}d}d}|D]>}|D]7}t|}t|\}}} |||ndz }|||ndz }|| | ndz }9@|dkDr|nd|dkDr|nd|dkDr|fSdfS)z8Extract token usage from response.generations structure.rrN)_get_token_usager) r total_input total_output total_totalgen_listgenrrrrs rB _extract_tokens_from_generationsr Gs KLKC*3/K8G 8T 5L- <+C< JK ]-FMA ML <+C< JK  #Q D$q( d"Q  -1 rDcd}t|d}||D]}t||}||cSt|d}||D]}t||}||cS|D]}t||}||cSy)zM Check multiple paths to extract token usage from different objects. )usagerusage_metadatarN llm_outputr)objpossible_namesrrr rs rBrr`s @Ni(G"Dw-E  # C.J"Dz40E  # 3%  L rDc>t|}|rt|\}}}nt|j\}}}| |j t j || |j t j||!|j t j|yyrY) rrr rrr GEN_AI_USAGE_INPUT_TOKENSGEN_AI_USAGE_OUTPUT_TOKENSGEN_AI_USAGE_TOTAL_TOKENS)rlrrrrrs rBrr}s"8,K4CK4P1 m\4T  5 1 m\ h88,G  h99=I h88,G rDct|dd}t|dd}t|di}t|ddxs3t|ddxs$|jdxs|jd}|rt|dkDr|nd} d}t|dkDr|djd }||jd }||fS#t$rY|fSwxYw) z? Get the agent name and available tools for the agent. agentNrunnableconfigravailable_toolsrrun_name)rr<rv Exception)rrrrrrunnable_configrr@s rB_get_request_datars C$ 'Euj$/Hh"5OWd# 2 5'4 ( 2   w ' 2   0 1  s5zA~E4E  t9q=aZ0J  (,,Z8J       s?7B:: C C c |syt|ttfsyg}|D]} t|trd|vrTt|dtrA|d}|j d|j dd}|drf|j |nSd|vr6|j d|j dd}|j |n|j dxs$|j dxs|j d}|r|j ||j dxs|j ddnt |drAt|ddt|ddxs t|ddd}|drn|j |n\t |d r*|j |jt|d ddn&t|}|r|d k7r|j |dd|r|SdS#t$rYwxYw) z/Parse and simplify tools into a cleaner format.Nfunctionrr)rrr function_namedescrcrr) isinstancelisttupledictr<r>hasattrrrcstrr)rsimplified_toolstoolfuncsimplified_toolrtool_strs rB_simplify_langchain_toolsr.s  edE] +2 $%%*T*5Et*L +D $ 0'+xx '>'O'v.(//@t^ $ 0'+xx '>'O%++O<(588K0588O4 (//(,/3xx /F04#'88F#3v&#D&$7#*4#E$3tVT2# #6*$++O<z* '' $ '.tY'Et9B$++Xd,STcj 0 9T9   sFz9_wrap_configure..new_configure..3s  Q r2 3Qs)r} get_clientget_integrationrLr#r"handlersr!r$rdebugany itertoolschainrprRrQr=) callback_manager_clsinheritable_callbackslocal_callbacksrr integrationcallbacks_listinheritable_callbacks_listsentry_handlerfs rB new_configurez&_wrap_configure..new_configures!++-==>RS  $%    */R o': ;,55N )< =-.N  .,N LL4o F$%     +-@ A)>)G)G & -t 4)> &)+ & oon6PQ  5%%++N/+>?"1"6"6"8,$--,",(O-@A#2N"C"DO"D^"D !       rD)NNr)rErFs` rBrZrZs. 1X#K K Z rDc.tfd}|S)Nctjjt}| |g|i|St |||\}}t }|t j|rd|ndtj5}t| |r |jtj||jtjd|jtjdt|||g|i|}|j!d} | bt#rX|j$rLt'| g} tj(} t+| || } | t-|tj.| d|j!d} | 1t#r'|j$rt-|tj0| |t3cdddS#t3wxYw#1swYyxYw)N invoke_agent invoke_agentrFinputrr)r}r7r8rLrr r GEN_AI_INVOKE_AGENTrgrCrr rrGEN_AI_RESPONSE_STREAMINGrr<rrQrrr r rrrG)rVrrrAr@rstart_span_functionrlresultrKrrrrrEs rB new_invokez/_wrap_agent_executor_invoke..new_invokeTs!++-==>RS  T+D+F+ +-dD&A E57 %%1;= -'..   #* MM("<".new_stream..new_iterators)H ))EK*""YYx0F &/1#33'h.K.KVT  x(!!"!F" <<> &    x(sJC  BA13BC 1 A?<B>A??B*B,,B//C  C cKd} 23d{}|7 6 jd}n#t$rd}YnwxYw|1tr'jrt t j |n-#t$r!tj}twxYwtj|y#tj|wxYwwrTrUrXs rBnew_iterator_asynczK_wrap_agent_executor_stream..new_stream..new_iterator_asyncs)H )#/ %K <""YYx0F "!F"&/1#33'h.K.KVT <<> &    x(  x(scCA3A3A3.A3 <A3<6A32B:3*BB: C:CCz)r}r7r8rLrr r rLrgrrCrr rrrMrrvr<rrQrrr r rr(r)rVrrr@rrNrKrrrrOr[r]rArZrlrEs @@@rB new_streamz/_wrap_agent_executor_stream..new_streams!++-==>RS  T+D+F+ +-dD&A E57"%%1;= -'..  J  MM(44j A h44nE h88$?4'(+D QQ G$D  ')++"95'"B 002E:#T5M(#44! 4)$)&)  )6 )6 tF|  ; ;')F "^F rDr)rEr^s` rBr^r^s& 1Xmm^ rDc<|yt|drt|j|_t|drt|j|_t|drt |j |_t|drt |j |_yy)zWrap sync embedding methods (embed_documents and embed_query).ctjjt}|  |g|i|St |ddxs t |dd}tj t j|rd|ndtj5}|jtjd|r |jtj|trQ|jrEt|dkDr7|d}t!|t"r|n|g}t%|tj&|d |g|i|}|cdddS#1swYyxYw Nrrz embeddings embeddingsrrFrr}r7r8rLrrr GEN_AI_EMBEDDINGSrgrr rrrrQrvr#r$r GEN_AI_EMBEDDINGS_INPUT rVrrrArrl input_datatextsrOrEs rBnew_embedding_methodz4_wrap_embedding_method..new_embedding_method#s,!++-==>RS  T+D+F+ +T7D1VWT.new_async_embedding_methodKsF!++-==>RS  41$1&11 1T7D1VWTrs# 9+=4A@    ' 21 40 61!6</17!;1 "BB8844 @@6655  * *  * *  &{%%&=tL   "5;"5Jf*1f*R 5 2:H(8?:D Qh?Dsl ,% P%&i 2 0 1122    ! !     ! ! sF!#F2*G1G!8G/?G=H HH'H5!F/2G8F?>G?G GG  GGGG!G,+G,/G:9G:=HH HHH$#H$'H21H25I?I