
    i^v              	          d dl Z d dlmZ d dlmZ d dlZd dlmZ d dlm	Z	m
Z
mZmZ d dlmZmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZmZ d dlmZ er 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* d dl+m,Z,m-Z-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3 	 d dl5m6Z6 ejn                  ejp                  ejr                  ejt                  ejv                  ejp                  ejx                  ejz                  dZ> G d de      Z? G d d      Z@ G d de,      ZAd ZBd ZCd ZDd ZEd  ZFd! ZGd" ZHd# ZId$ ZJd% ZKy# e4$ r	  ed      w xY w# e4$ r dZ6Y w xY w)&    N)OrderedDictwraps)set_ai_pipeline_name)GEN_AI_ALLOWED_MESSAGE_ROLESnormalize_message_rolesset_data_normalizedget_start_span_function)OPSPANDATA)DidNotEnableIntegration)should_send_default_pii)
_get_valueset_span_errored)loggercapture_internal_exceptions)TYPE_CHECKING)AnyAsyncIteratorCallableDictIteratorListOptionalUnion)UUID)Span)AgentFinish)BaseCallbackHandlerBaseCallbackManager	Callbacksmanager)BaseMessage)	LLMResultzlangchain not installed)AgentExecutor)frequency_penaltyfunction_call
max_tokenspresence_penaltytemperature
tool_callstop_ktop_pc                   6    e Zd ZdZde ZdZddZed        Zy)LangchainIntegration	langchainzauto.ai.   c                      || _         || _        y N)include_prompts	max_spans)selfr5   r6   s      /var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/venv/lib/python3.12/site-packages/sentry_sdk/integrations/langchain.py__init__zLangchainIntegration.__init__K   s    ."    c                      t        t        j                        t        _        t        Et	        t        j
                        t        _        t        t        j                        t        _        y y r4   )_wrap_configurer#   
_configurer&   _wrap_agent_executor_invokeinvoke_wrap_agent_executor_streamstream r:   r8   
setup_oncezLangchainIntegration.setup_onceP   sH     -W-?-?@$#>}?S?S#TM #>}?S?S#TM  %r:   N)Tr2   )	__name__
__module____qualname__
identifieroriginr6   r9   staticmethodrC   rB   r:   r8   r0   r0   D   s5    J
|$F I#
 U Ur:   r0   c                       e Zd ZdZg ZdZd Zy)WatchedSpanNFc                     || _         y r4   )span)r7   rM   s     r8   r9   zWatchedSpan.__init___   s	    	r:   )rD   rE   rF   rM   childrenis_pipeliner9   rB   r:   r8   rK   rK   Z   s    DHKr:   rK   c                   z    e Zd ZdZd Zd Zd Zd Zd Zd Z	dddd	d
Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zy)SentryLangchainCallbackz+Callback handler that creates Sentry spans.c                 >    t               | _        || _        || _        y r4   )r   span_mapmax_span_map_sizer5   )r7   rT   r5   s      r8   r9   z SentryLangchainCallback.__init__g   s    #!2.r:   c                     t        | j                        | j                  kD  rU| j                  j                  d      \  }}| j	                  ||       t        | j                        | j                  kD  rTy y )NF)last)lenrS   rT   popitem
_exit_span)r7   run_idwatched_spans      r8   gc_span_mapz#SentryLangchainCallback.gc_span_mapm   s^     $-- 4#9#99#'==#8#8e#8#D FLOOL&1 $-- 4#9#99r:   c                 B   t               5  |r|| j                  vr
	 d d d        y | j                  |   }|j                  }t        |       t	        j
                  ||j                         |j                  d d d        | j                  |= d d d        y # 1 sw Y   y xY wr4   )r   rS   rM   r   
sentry_sdkcapture_exceptionscope__exit__)r7   rZ   error	span_datarM   s        r8   _handle_errorz%SentryLangchainCallback._handle_errort   s    (* 	&V4==8	& 	& f-I>>DT"((

;MM$d+f%	& 	& 	&s   BA&BBc                 n    |j                   |j                  d}|j                  |j                         |S )Nrolecontent)typerh   updateadditional_kwargs)r7   messageparseds      r8   _normalize_langchain_messagez4SentryLangchainCallback._normalize_langchain_message   s+    !,,7??Cg//0r:   c                 z   d }|r]| j                   j                  |      }|r@t         |j                  j                  di |      }|j
                  j                  |       |t        t        j                  di |      }|j                  j                          || j                   |<   | j                          |S )NrB   )rS   getrK   rM   start_childrN   appendr^   
start_span	__enter__r\   )r7   rZ   	parent_idkwargsr[   parent_spans         r8   _create_spanz$SentryLangchainCallback._create_span   s    --++I6K*+G;+;+;+G+G+Q&+QR$$++L9&z'<'<'Fv'FGL##% ,fr:   c                     |j                   rt        d        |j                  j                  d d d        | j                  |= y r4   )rO   r   rM   ra   rS   )r7   rc   rZ   s      r8   rY   z"SentryLangchainCallback._exit_span   s5       &dD1MM&!r:   N)tagsparent_run_idmetadatac          	      0   t               5  |s
	 ddd       y|j                  di       }|j                  |j                  di              |j                  d      xs( |j                  d      xs |j                  d      xs d}	| j                  ||t        j
                  |j                  d      xs d	t        j                  
      }
|
j                  }|	r |j                  t        j                  |	       |j                  dd      }d|v r!|j                  t        j                  d       n$d|v r |j                  t        j                  d       t        j                         D ]"  \  }}||v s||   t        ||||   d       $ t!        ||j                  d             t#               rL| j$                  r@|D cg c]  }t&        j(                  d|dd }}t        |t        j*                  |d       ddd       yc c}w # 1 sw Y   yxY w)zRun when LLM starts running.Ninvocation_paramsrv   model
model_namemodel_id namezLangchain LLM callopr   rH   _type	anthropicopenaiFunpacktoolstext)ri   r   rf   )r   rp   rj   rx   r   GEN_AI_PIPELINEr0   rH   rM   set_datar   GEN_AI_REQUEST_MODELGEN_AI_SYSTEMDATA_FIELDSitemsr	   _set_tools_on_spanr   r5   r   USERGEN_AI_REQUEST_MESSAGES)r7   
serializedpromptsrZ   rz   r{   r|   rv   
all_paramsr   r[   rM   ai_typekey	attributepromptnormalized_messagess                    r8   on_llm_startz$SentryLangchainCallback.on_llm_start   s    )* 6	6	 6	  $7<JjnnXr:; w' >>,/>>*- 	   ,,%%ZZ'?+?+22 - L  $$D11
 !nnWb1Gg%h44kBW$h44h?"-"3"3"5 XY*$C)D'iCQVWX tZ^^G%<=&(T-A-A #*'
  != A A,2F#C'# ' $44' 	c6	 6	T'U6	 6	s0   HEH3H9A	HHHHHc                   t               5  |s
	 ddd       y|j                  di       }|j                  |j                  di              |j                  d      xs( |j                  d      xs |j                  d      xs d}| j                  ||j                  d      t        j
                  d	| j                         t        j                  
      }|j                  }|j                  t        j                  d       |r |j                  t        j                  |       |j                  dd      }	d|	v r!|j                  t        j                  d       n$d|	v r |j                  t        j                  d       t        j!                         D ]"  \  }
}|
|v s||
   t#        ||||
   d       $ t%        ||j                  d             t'               rd| j(                  rXg }|D ])  }|D ]"  }|j+                  | j-                  |             $ + t/        |      }t#        |t        j0                  |d       ddd       y# 1 sw Y   yxY w)z#Run when Chat Model starts running.Nr~   rv   r   r   r   r   r{   zchat r   chatr   r   r   Fr   r   )r   rp   rj   rx   r   GEN_AI_CHATstripr0   rH   rM   r   r   GEN_AI_OPERATION_NAMEr   r   r   r   r	   r   r   r5   rr   rn   r   r   )r7   r   messagesrZ   rv   r   r   r[   rM   r   r   r   r   list_rl   s                  r8   on_chat_model_startz+SentryLangchainCallback.on_chat_model_start   s0    )* 5	5	 5	  $7<JjnnXr:; w' >>,/>>*- 	   ,,

?+>>UG_**,+22 - L  $$DMM(88&Ah;;UC nnWb1Gg%h44kBW$h44h?"-"3"3"5 XY*$C)D'iCQVWX tZ^^G%<=&(T-A-A&(#% E#( +22 ==gF
 '>>Q&R##44' 	a5	 5	 5	s   IFI I&BIIc                   t               5  |r|| j                  vr
	 ddd       y| j                  |   }|j                  }t               rY| j                  rMt        |t        j                  |j                  D cg c]  }|D cg c]  }|j                   c} c}}       t        ||       | j                  ||       ddd       yc c}w c c}}w # 1 sw Y   yxY w)z!Run when Chat Model ends running.N)r   rS   rM   r   r5   r	   r   GEN_AI_RESPONSE_TEXTgenerationsr   _record_token_usagerY   )r7   responserZ   rv   rc   rM   r   xs           r8   on_chat_model_endz)SentryLangchainCallback.on_chat_model_end!  s     )* 	/V4==8	/ 	/ f-I>>D&(T-A-A#11:B:N:NOe,aff,O  h/OOIv.	/ 	/ -O	/ 	/s5   CAC;	CCC&CCCCc                   t               5  |r|| j                  vr
	 ddd       y| j                  |   }|j                  }	 |j                  d   d   }|	 |j
                  j                  d      }| |j                  t        j                  |       	 |j
                  j                  d      }| |j                  t        j                  |       	 t               rG| j                  r;t        |j                  dd      }	|	"|	g k7  rt!        |t        j"                  |	d       t               rY| j                  rMt!        |t        j$                  |j                  D 
cg c]  }
|
D cg c]  }|j&                   c} c}}
       t)        ||       | j+                  ||       ddd       y# t        $ r d}Y hw xY w# t        $ r Y 8w xY w# t        $ r Y 
w xY w# t        $ r Y w xY wc c}w c c}}
w # 1 sw Y   yxY w)zRun when LLM ends running.Nr   r   finish_reasonr,   Fr   )r   rS   rM   r   
IndexErrorgeneration_inforp   r   r   GEN_AI_RESPONSE_MODELAttributeErrorGEN_AI_RESPONSE_FINISH_REASONSr   r5   getattrrl   r	   GEN_AI_RESPONSE_TOOL_CALLSr   r   r   rY   )r7   r   rZ   rv   rc   rM   
generationresponse_modelr   r,   r   r   s               r8   
on_llm_endz"SentryLangchainCallback.on_llm_end5  s    )* 2	/V4==82	/ 2	/ f-I>>D"%11!4Q7
 %%/%?%?%C%CL%QN%1h&D&DnU$.$>$>$B$B?$SM$0$CC].0T5I5I%,Z-?-?t%T
%1jB6F/ $ ( C C *',	 '(T-A-A#11:B:N:NOe,aff,O  h/OOIv.e2	/ 2	/  "!
" &  &  &  -O]2	/ 2	/s   G:G:F.G:=G =GAG $:G:	G4'G/:G4?&G:.F=9G:<F==G: 	G	G:GG:	GG:GG: 	G,)G:+G,,G:/G44G::Hc                (    | j                  ||       y)zRun when LLM errors.Nrd   r7   rb   rZ   rv   s       r8   on_llm_errorz$SentryLangchainCallback.on_llm_errorl       	65)r:   c                (    | j                  ||       y)zRun when Chat Model errors.Nr   r   s       r8   on_chat_model_errorz+SentryLangchainCallback.on_chat_model_errorq  r   r:   c                b   t               5  |r|| j                  vr
	 d d d        y | j                  |   }|j                  }t               r?| j                  r3t        |t        j                  |j                  j                                | j                  ||       d d d        y # 1 sw Y   y xY wr4   )r   rS   rM   r   r5   r	   r   r   return_valuesr   rY   )r7   finishrZ   rv   rc   rM   s         r8   on_agent_finishz'SentryLangchainCallback.on_agent_finishv  s    (* 	/V4==8	/ 	/ f-I>>D&(T-A-A#(779M9M9S9S9U OOIv.	/ 	/ 	/s   B%A6B%%B.c          	         t               5  |s
	 ddd       y|j                  d      xs |j                  d      xs d}| j                  ||j                  d      t        j                  d| j                         t        j                        }|j                  }|j                  t        j                  d       |j                  t        j                  |       |j                  d      }| |j                  t        j                  |       t               r8| j                  r,t!        |t        j"                  |j                  d	|g             ddd       y# 1 sw Y   yxY w)
zRun when tool starts running.Nr   r   r{   zexecute_tool r   execute_tooldescriptioninputs)r   rp   rx   r   GEN_AI_EXECUTE_TOOLr   r0   rH   rM   r   r   r   GEN_AI_TOOL_NAMEGEN_AI_TOOL_DESCRIPTIONr   r5   r	   GEN_AI_TOOL_INPUT)	r7   r   	input_strrZ   rv   	tool_namer[   rM   tool_descriptions	            r8   on_tool_startz%SentryLangchainCallback.on_tool_start  s,    )* 		 	 #v.J&**V2DJI,,

?+))$YK0668+22 - L  $$DMM(88.IMM(33Y?)~~m<+h>>@PQ&(T-A-A#..JJx)5/	 	 	s   ED;EE%c                2   t               5  |r|| j                  vr
	 ddd       y| j                  |   }|j                  }t               r'| j                  rt        |t        j                  |       | j                  ||       ddd       y# 1 sw Y   yxY w)zRun when tool ends running.N)	r   rS   rM   r   r5   r	   r   GEN_AI_TOOL_OUTPUTrY   )r7   outputrZ   rv   rc   rM   s         r8   on_tool_endz#SentryLangchainCallback.on_tool_end  s     )* 
	/V4==8
	/ 
	/ f-I>>D&(T-A-A#D(*E*EvNOOIv.
	/ 
	/ 
	/s   BABBc                (    | j                  ||       y)zRun when tool errors.Nr   )r7   rb   rZ   argsrv   s        r8   on_tool_errorz%SentryLangchainCallback.on_tool_error  r   r:   )rD   rE   rF   __doc__r9   r\   rd   rn   rx   rY   r   r   r   r   r   r   r   r   r   r   rB   r:   r8   rQ   rQ   d   se    5/2&"" CJ8t/(5/n*
*
/ @/*r:   rQ   c                     | syt        | d      xs t        | d      }t        | d      xs t        | d      }t        | d      }|||fS )NNNNprompt_tokensinput_tokenscompletion_tokensoutput_tokenstotal_tokensr   )token_usager   r   r   s       r8   _extract_tokensr     sb    k?; z^@L {,?@ J_EM k>:L44r:   c                     | syd}d}d}| D ]>  }|D ]7  }t        |      }t        |      \  }}}	|||ndz  }|||ndz  }||	|	ndz  }9 @ |dkD  r|nd|dkD  r|nd|dkD  r|fS dfS )z8Extract token usage from response.generations structure.r   r   N)_get_token_usager   )
r   total_inputtotal_outputtotal_totalgen_listgenr   r   r   r   s
             r8    _extract_tokens_from_generationsr     s     KLK K 	KC*3/K8G8T5L-<+C<JK]-FMAML<+C<JK	KK #QD$q(d"Q  -1 r:   c                     d}t        | d      }||D ]  }t        ||      }||c S  t        | d      }||D ]  }t        ||      }||c S  |D ]  }t        | |      }||c S  y)zM
    Check multiple paths to extract token usage from different objects.
    )usager   usage_metadatarl   N
llm_outputr   )objpossible_namesrl   r   r   r   s         r8   r   r     s    
 @Ni(G" 	Dw-E 	
 C.J" 	Dz40E 	
  3%L
 r:   c                 >   t        |      }|rt        |      \  }}}nt        |j                        \  }}}| | j	                  t
        j                  |       | | j	                  t
        j                  |       |!| j	                  t
        j                  |       y y r4   )	r   r   r   r   r   r   GEN_AI_USAGE_INPUT_TOKENSGEN_AI_USAGE_OUTPUT_TOKENSGEN_AI_USAGE_TOTAL_TOKENS)rM   r   r   r   r   r   s         r8   r   r     s    "8,K4CK4P1m\4T  5
1m\ h88,G h99=Ih88,G  r:   c                    t        | dd      }t        |dd      }t        |di       }t        | dd      xs3 t        |dd      xs$ |j                  d      xs |j                  d      }|rt        |      dkD  r|nd}	 d}t        |      dkD  r|d   j                  d	      }||j                  d	      }||fS # t        $ r Y |fS w xY w)
z?
    Get the agent name and available tools for the agent.
    agentNrunnableconfigr   available_toolsr      run_name)r   rp   rW   	Exception)r   r   rv   r   r   runnable_configr   
agent_names           r8   _get_request_datar     s    
 C$'Euj$/Hh"5OWd# 	25'4(	2w'	2 01	 
 s5zA~E4E
t9q=aZ0J(,,Z8J   s   ?7B: :	C	C	c           	         | syt        | t        t        f      syg }| D ]  }	 t        |t              rd|v rTt        |d   t              rA|d   }|j	                  d      |j	                  d      d}|d   rf|j                  |       nSd|v r6|j	                  d      |j	                  d      d}|j                  |       n|j	                  d      xs$ |j	                  d      xs |j	                  d      }|r|j                  ||j	                  d      xs |j	                  d      d       nt        |d      rAt        |dd      t        |dd      xs t        |dd      d}|d   rn|j                  |       n\t        |d	      r*|j                  |j                  t        |d
d      d       n&t        |      }|r|dk7  r|j                  |dd        |r|S dS # t        $ r Y w xY w)z/Parse and simplify tools into a cleaner format.Nfunctionr   r   )r   r   r   function_namedescrD   r   r   )
isinstancelisttupledictrp   rr   hasattrr   rD   strr   )r   simplified_toolstoolfuncsimplified_toolr   tool_strs          r8   _simplify_langchain_toolsr  1  s    edE]+ 32	$%%*T*5Et*L
+D $ 0'+xx'>'O 'v.(//@t^ $ 0'+xx'>'O %++O< ( 588K0588O4 
 (//(,/3xx/F 04#'88F#3 v&#D&$7#*4#E $3tVT2#
 #6*$++O<z* '' $'.tY'E t9B$++Xd,STc3j  09T9  		s   F<G))	G65G6c                 `    |,t        |      }|rt        | t        j                  |d       yyy)z9Set available tools data on a span if tools are provided.NFr   )r  r	   r   GEN_AI_REQUEST_AVAILABLE_TOOLS)rM   r   r
  s      r8   r   r   s  s<     4U;77 	  r:   c                 4     t               	 	 d fd	       }|S )Nc                    t        j                         j                  t              }| 	| ||g|i |S |xs g }t	        |t
              r|j                  }nKt	        |t              r|g}n7t	        |t              r|}n$t        j                  d|        	| ||g|i |S t	        |t
              r|j                  }nt	        |t              r|}ng }t        d t        j                  ||      D              sqt        |j                  |j                         }t	        |t
              r&|j#                         }g |j                  ||_        nt	        |t              r||g}ng ||} 	| ||g|i |S )NzUnknown callback type: %sc              3   <   K   | ]  }t        |t                y wr4   )r  rQ   ).0cbs     r8   	<genexpr>z9_wrap_configure.<locals>.new_configure.<locals>.<genexpr>  s       
 r23
s   )r^   
get_clientget_integrationr0   r  r!   handlersr    r  r   debugany	itertoolschainrQ   r6   r5   copy)
callback_manager_clsinheritable_callbackslocal_callbacksr   rv   integrationcallbacks_listinheritable_callbacks_listsentry_handlerfs
            r8   new_configurez&_wrap_configure.<locals>.new_configure  s    !++-==>RS$% 	
   */R o':;,55N)<=-.N.,NLL4oF$% 	
   +-@A)>)G)G&-t4)>&)+& 
oon6PQ
 
 5%%++N /+>?"1"6"6"8,$--,",( O-@A#2N"C"DO"D^"D !
 	

 
 	
r:   )NNr   )r'  r(  s   ` r8   r<   r<     s.     1X #K
 K
Z r:   c                 .     t                fd       }|S )Nc                 N   t        j                         j                  t              }| | g|i |S t	        | ||      \  }}t               } |t        j                  |rd| ndt        j                        5 }|r |j                  t        j                  |       |j                  t        j                  d       |j                  t        j                  d       t        ||        | g|i |}|j                  d      }	|	?t!               r5|j"                  r)t%        |	g      }
t'        |t        j(                  |
d       |j                  d      }|1t!               r'|j"                  rt'        |t        j*                  |       |cd d d        S # 1 sw Y   y xY w)Ninvoke_agent invoke_agentr   Finputr   r   )r^   r  r  r0   r   r
   r   GEN_AI_INVOKE_AGENTrH   r   r   GEN_AI_AGENT_NAMEr   GEN_AI_RESPONSE_STREAMINGr   rp   r   r5   r   r	   r   r   )r7   r   rv   r#  r   r   start_span_functionrM   resultr-  r   r   r'  s               r8   
new_invokez/_wrap_agent_executor_invoke.<locals>.new_invoke  s|    !++-==>RST+D+F++-dD&A
E57 %%1;=-'..
 &	 h88*EMM(88.IMM(<<eDtU+ t-d-f-FJJw'E!+-//&=ug&F##44' 	 ZZ)F"+-//#D(*G*GPM&	 &	 &	s   ?DFF$r   )r'  r3  s   ` r8   r>   r>     s$     1X/ /b r:   c                 .     t                fd       }|S )Nc                 h   t        j                         j                  t               | g|i |S t	        | ||      \  }}t               } |t        j                  d| j                         t        j                        j                          |r j                  t        j                  |       j                  t        j                  d       j                  t        j                  d       t!        |       t#        |      dk\  r|d   j%                  d      nd }|?t'               r5j(                  r)t+        |g      }t-        t        j.                  |d	        | g|i |}|fd
}	fd}
t1        t3        |            dk(  r	 |
       }|S  |	       }|S )Nr+  r   r,  Tr   r   r-  Fr   c               3      K   D ]  } |   	  j                  d      }|1t               r'j                  rt	        t
        j                  |       j                  d d d        y # t        $ r d }Y Tw xY wwNr   rp   r   r   r5   r	   r   r   ra   eventr   r#  old_iteratorrM   s     r8   new_iteratorzE_wrap_agent_executor_stream.<locals>.new_stream.<locals>.new_iterator<  s|     % 8,
 "+-//#D(*G*GPMM$d+  s(   A9A( AA9(A63A95A66A9c                 
  K   2 3 d {   } |  7 
6 	  j                  d      }n# t        $ r d }Y nw xY w|1t               r'j                  rt	        t
        j                  |       j                  d d d        y wr7  r8  r9  s     r8   new_iterator_asynczK_wrap_agent_executor_stream.<locals>.new_stream.<locals>.new_iterator_asyncO  s     +  e|8,  "+-//#D(*G*GPMM$d+s;   BBB+ B9B9A
Bz<class 'async_generator'>)r^   r  r  r0   r   r
   r   r.  r   rH   rt   r   r   r/  r   r0  r   rW   rp   r   r5   r   r	   r   r	  ri   )r7   r   rv   r   r   r1  r-  r   r2  r<  r>  r#  r;  rM   r'  s              @@@r8   
new_streamz/_wrap_agent_executor_stream.<locals>.new_stream  s    !++-==>RST+D+F++-dD&A
E57"%% -335'..

 	MM(44jAh44nEh88$?4'(+D	QQG$D')++"95'"B00#	 4)$)&)	,&	,& tF| ;;')F  "^Fr:   r   )r'  r?  s   ` r8   r@   r@     s&     1XV Vp r:   )Lr  collectionsr   	functoolsr   r^   sentry_sdk.ai.monitoringr   sentry_sdk.ai.utilsr   r   r	   r
   sentry_sdk.constsr   r   sentry_sdk.integrationsr   r   sentry_sdk.scoper   sentry_sdk.tracing_utilsr   r   sentry_sdk.utilsr   r   typingr   r   r   r   r   r   r   r   r   uuidr   sentry_sdk.tracingr   langchain_core.agentsr   langchain_core.callbacksr    r!   r"   r#   langchain_core.messagesr$   langchain_core.outputsr%   ImportErrorlangchain.agentsr&    GEN_AI_REQUEST_FREQUENCY_PENALTYr   GEN_AI_REQUEST_MAX_TOKENSGEN_AI_REQUEST_PRESENCE_PENALTYGEN_AI_REQUEST_TEMPERATUREGEN_AI_REQUEST_TOP_KGEN_AI_REQUEST_TOP_Pr   r0   rK   rQ   r   r   r   r   r   r  r   r<   r>   r@   rB   r:   r8   <module>rX     sR    #   9  + = 4 A @  	 	 	 '21  40.
 "BB8844 @@6655****	U; U, T*1 T*n
5 2:H(8?:DQh5p\}  2
0
112  Ms   6D5 E 5EEE