
    i                     P    d Z ddlmZmZmZ ddlmZ ddlZddlmZ  G d d      Z	y)u#   Langfuse集成 - 可观测性追踪    )OptionalDictAny)datetimeN)get_settingsc                       e Zd ZdZd Z	 ddededededee   d	ee   fd
Z		 ddedededede
dee   d	ee   fdZ	 ddedededee   fdZd	eeef   fdZy)LangfuseClientu2   Langfuse客户端 - 追踪LLM调用和任务执行c                     t               }t        |dd      | _        t        |dd      | _        t        |dd      | _        t        | j                  xr | j                        | _        y )NLANGFUSE_PUBLIC_KEY LANGFUSE_SECRET_KEYLANGFUSE_HOSTzhttps://cloud.langfuse.com)r   getattr
public_key
secret_keyhostboolenabled)selfsettingss     E/home/jang/Projects/ai-researcher/src/integrations/langfuse_client.py__init__zLangfuseClient.__init__   sU    >!(,A2F!(,A2FHo7ST	DOO?@    Ntask_iduser_idquerycomplexity_scoremetadatareturnc                 P  K   | j                   sy|d|||d|xs i t        j                         j                         d}	 t	        j
                         4 d{   }|j                  | j                   d| j                         |       d{   }|j                  dk(  r0|j                         j                  d      cddd      d{    S ddd      d{    y7 7 V7 7 # 1 d{  7  sw Y   yxY w# t        $ r}	t        d	|	        Y d}	~	yd}	~	ww xY ww)
u   追踪任务创建Nzai-researcher-task)r   r   )idnameuserIdinputr   	timestampz/api/public/tracesheadersjson   r!   zLangfuse trace error: r   r   utcnow	isoformathttpxAsyncClientpostr   _get_headersstatus_coder(   get	Exceptionprint)
r   r   r   r   r   r   
trace_dataclientresponsees
             r   
trace_taskzLangfuseClient.trace_task   s/     || ($:JK B!*446


	0((* 5 5f!'yyk!34 --/# "- " 
 ''3.#==?..t45 5 5 5 5 55 5 5 5 5   	0*1#.//	0s   >D&D C%D 3C-C'1C-D C)D D&D C+ D $D&%D 'C-)D +D -C?3C64C?;D >D&?D 	D#DD&D##D&modelprompt
completiontokens_usedcostc           
      b  K   | j                   sy|d| |i |||dz  |dz  |d|t        j                         j                         d	}	 t	        j
                         4 d{   }|j                  | j                   d| j                         |       d{   }	|	j                  dk(  r0|	j                         j                  d	      cddd      d{    S ddd      d{    y7 7 V7 7 # 1 d{  7  sw Y   yxY w# t        $ r}
t        d
|
        Y d}
~
yd}
~
ww xY ww)u   追踪LLM生成调用Nzllm-   )r$   outputtotal)	traceIdr"   r:   modelParametersr$   rA   usager>   r%   z/api/public/generationsr&   r)   r!   zLangfuse generation error: r*   )r   r   r:   r;   r<   r=   r>   generation_datar6   r7   r8   s              r   trace_generationzLangfuseClient.trace_generation5   sK     || 5'N! $)%*$
 !*446
 
	5((* 5 5f!'yyk!89 --/( "- " 
 ''3.#==?..t45 5 5 5 5 55 5 5 5 5   	5/s344	5s   AD/
D "C.#D &3C6C01C6D C2D D/D (C4)D -D/.D 0C62D 4D 6D<C?=DD D/D 	D,D'"D/'D,,D/trace_idr"   valuecommentc                 |  K   | j                   sy||||d}	 t        j                         4 d{   }|j                  | j                   d| j                         |       d{    ddd      d{    y7 L7 7 	# 1 d{  7  sw Y   yxY w# t        $ r}t        d|        Y d}~yd}~ww xY ww)u   为追踪添加评分N)rC   r"   rI   rJ   z/api/public/scoresr&   zLangfuse score error: )r   r-   r.   r/   r   r0   r3   r4   )r   rH   r"   rI   rJ   
score_datar6   r8   s           r   score_tracezLangfuseClient.score_trace`   s      ||  	

	0((*  fkkyyk!34 --/# "          	0*1#.//	0s   B<B A=B 3B'A?(B,B 7B8B <B<=B ?BB B	B
BB B<B 	B9!B4/B<4B99B<c                     ddl }|j                  | j                   d| j                   j	                               j                         }d| ddS )u   获取请求头r   N:zBasic zapplication/json)AuthorizationzContent-Type)base64	b64encoder   r   encodedecode)r   rQ   auths      r   r0   zLangfuseClient._get_headers|   sR    4??"31T__4E F M M OPWWY%dV_.
 	
r   )N)__name__
__module____qualname____doc__r   strfloatr   r   r9   intrG   rM   r0    r   r   r	   r	      s    <A $(!! ! 	!
  ! 4.! 
#!T !%)) ) 	)
 ) ) uo) 
#)` "&00 0 	0
 #08
d38n 
r   r	   )
rY   typingr   r   r   r   r-   
src.configr   r	   r]   r   r   <module>r`      s#    ) & &   #{
 {
r   