o
    Rh@L                     @   s  d dl Z d dlZd dlmZmZmZmZmZ d dlm	Z	 d dl
mZ deeef deeef fddZd	edeeef fd
dZd	efddZdd Zdd Zdd Zd	efddZdeeef d	efddZdee ded	edee deeeef  dedeeeef  de	ded ef dedefd!d"Zdee ded	edee deeeef  dedeeeef  de	d#ed ef dedefd$d%Zded&ed'efd(d)ZdS )*    N)AnyCallableDictListOptional)URL)Clientkwargsreturnc                 C   s2   i }dD ]}|| v r| | dur| | ||< q|S )z?
    Extracts model parameters from the kwargs dictionary.
    )
temperature
max_tokensmax_completion_tokenstop_pfrequency_penaltypresence_penaltynstopstream	streamingN )r	   model_paramsparamr   r   R/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/posthog/ai/utils.pyget_model_params
   s   r   providerc                 C   sd  |dkr| j j| j j| j j| j jdS |dkrd}d}d}d}t| j dr)| j j}t| j dr3| j j}t| j drEt| j jdrE| j jj}t| j d	rWt| j jd
rW| j jj	}t| j dra| j j
}t| j drk| j j}t| j dr}t| j jdr}| j jj}||||dS |dkrd}d}t| dr| jrt| jdd}t| jdd}||ddddS ddddddS )N	anthropic)input_tokensoutput_tokenscache_read_input_tokenscache_creation_input_tokensopenair   r   r   input_tokens_detailscached_tokensoutput_tokens_detailsreasoning_tokensprompt_tokenscompletion_tokensprompt_tokens_details)r   r   r   r$   geminiusage_metadataprompt_token_countcandidates_token_count)r   r   r   r   r$   )usager   r   r   r   hasattrr!   r"   r#   r$   r%   r&   r'   r)   getattr)responser   r"   r   r   r$   r   r   r   	get_usage    sp   


r0   c                 C   sD   g }| du r|S |dkrt | S |dkrt| S |dkr t| S |S )z4
    Format a regular (non-streaming) response.
    Nr   r    r(   )format_response_anthropicformat_response_openaiformat_response_gemini)r/   r   outputr   r   r   format_responsef   s   r5   c                 C   s,   g }| j D ]}|jr|d|jd q|S )N	assistantrolecontent)r9   textappend)r/   r4   choicer   r   r   r1   v   s   
r1   c                 C   s2  g }t | dr%| jD ]}t |dr$|jr$|jjr$||jj|jjd q
t | dr| jD ]i}|jdkrt |drt|jt	r|jD ]H}t |dr^|jdkr^t |dr^||j
|jd qBt |drn||j
|jd qBt |dr|jd	krt |d
r|d|jd|jd qBq-||j|jd q-|S )Nchoicesmessage)r9   r8   r4   r9   typeoutput_textr:   input_image	image_urlimage)r?   rC   )r-   r=   r>   r9   r;   r8   r4   r?   
isinstancelistr:   rB   )r/   r4   r<   itemcontent_itemr   r   r   r2      sh   








"r2   c                 C   s   g }t | drV| jrV| jD ]F}t |drB|jrBd}t |jdr7|jjr7|jjD ]}t |dr6|jr6||j7 }q'|rA|d|d qt |drS|jrS|d|jd q|S t | drg| jrg|d| jd |S )N
candidatesr9    partsr:   r6   r7   )r-   rH   r9   rJ   r:   r;   )r/   r4   	candidatecontent_textpartr   r   r   r3      s@   

r3   c                 C   s   |dkrt | dr| jrt| jdkr| jS d S |dkrWt | drW| jrWt | jd drCt | jd jdrC| jd jjrC| jd jjS t | jd drW| jd jrW| jd jS d S )Nr   toolsr   r    r=   r>   
tool_calls)r-   rN   lenr=   r>   rO   )r/   r   r   r   r   format_tool_calls   s&   
rQ   c           
      C   s  g }|dkr!|  dpg }|  dd u r|S d|  ddg| S |dkrs|  dg }t|tr6d|dgS t|trkg }|D ])}t|trO|d|d q?t|dr^|d|jd q?|dt|d q?|S dt|dgS |  dd urt|  dg }|  d	d ur|  d	}t|tr|| n|d|d |  dd urtd
d |D }|sd|  ddg| }|  dd urt	dd t
|D d }|d ur||  dd}	|	 d|  d || d< |S d|  ddg| }|S )Nr   messagessystemr7   r(   contentsuserr:   inputc                 s   s    | ]
}| d dkV  qdS r8   rS   Nget).0msgr   r   r   	<genexpr>  s    z&merge_system_prompt.<locals>.<genexpr>instructionsc                 s   s&    | ]\}}| d dkr|V  qdS rW   rX   )rZ   ir[   r   r   r   r\   '  s   $ r9   rI   z

)rY   rD   strrE   r;   r-   r:   extendanynext	enumerate)
r	   r   rR   rT   	formattedrF   
input_data
has_system
system_idxsystem_contentr   r   r   merge_system_prompt   sZ   






	ri   posthog_distinct_id	ph_clientposthog_trace_idposthog_propertiesposthog_privacy_modeposthog_groupsbase_urlcall_method.c	                 K   sL  t   }
d}d}d}i }i }zz	|di |	}W n! ty: } z|}t|dd}d| d}W Y d}~nd}~ww W t   }||
 }|du rNtt }|rct|ds^|dkrct|d	rct||}t	|	|}||	
d
t|	t|||t||t||||
dd|
dd||t|d|pi |pi }t||}|rt||||d< |
ddur|
dddkr|
dd|d< |
ddur|
dddkr|
dd|d< |
ddur|
dddkr|
dd|d< | du rd|d< |dkr|	
ddurt|||	
d|d< t|dr$t|jr$|j| p|d||d nt   }||
 }|du r8tt }|rQt|dsL|dkrQt|d	rQt||}t	|	|}||	
d
t|	t|||t||t||||
dd|
dd||t|d|pi |pi }t||}|rt||||d< |
ddur|
dddkr|
dd|d< |
ddur|
dddkr|
dd|d< |
ddur|
dddkr|
dd|d< | du rd|d< |dkr|	
ddurt|||	
d|d< t|drt|jr|j| p|d||d w w w |r$||S )z
    Common usage-tracking logic for both sync and async calls.
    call_method: the llm call method (e.g. openai.chat.completions.create)
    N   status_coder   Tz$ai_is_errorz	$ai_errorr,   r(   r)   modelr   r   z$ai_providerz	$ai_modelz$ai_model_parametersz	$ai_inputz$ai_output_choicesz$ai_http_statusz$ai_input_tokensz$ai_output_tokensz$ai_latencyz$ai_trace_idz$ai_base_url	$ai_toolsr   $ai_cache_read_input_tokensr   $ai_cache_creation_input_tokensr$   z$ai_reasoning_tokensF$process_person_profiler    r]   $ai_instructionscapture$ai_generationdistinct_idevent
propertiesgroupsr   time	Exceptionr.   __str__r_   uuiduuid4r-   r0   ri   rY   r   with_privacy_moder5   rQ   callabler|   )rj   rk   r   rl   rm   rn   ro   rp   rq   r	   
start_timer/   errorhttp_statusr,   error_paramsexcend_timelatencyrR   event_propertiesrO   r   r   r   call_llm_and_track_usage9  s  














r   call_async_methodc	                    s  t   }
d }d }d}i }i }zz|di |	I d H }W n! ty= } z|}t|dd}d| d}W Y d }~nd }~ww W t   }||
 }|d u rQtt }|rft|dsa|dkrft|drft||}t	|	|}||	
d	t|	t|||t||t||||
d
d|
dd||t|d|pi |pi }t||}|rt||||d< |
dd ur|
dddkr|
dd|d< |
dd ur|
dddkr|
dd|d< | d u rd|d< |dkr|	
dd urt|||	
d|d< t|drt|jr|j| p|d||d nt   }||
 }|d u r"tt }|r;t|ds6|dkr;t|dr;t||}t	|	|}||	
d	t|	t|||t||t||||
d
d|
dd||t|d|pki |ppi }t||}|rt||||d< |
dd ur|
dddkr|
dd|d< |
dd ur|
dddkr|
dd|d< | d u rd|d< |dkr|	
dd urt|||	
d|d< t|drt|jr|j| p|d||d w w w |r||S )Nrr   rs   r   Trt   r,   r(   r)   ru   r   r   rv   rw   r   rx   r   ry   Frz   r    r]   r{   r|   r}   r~   r   r   )rj   rk   r   rl   rm   rn   ro   rp   r   r	   r   r/   r   r   r,   r   r   r   r   rR   r   rO   r   r   r   call_llm_and_track_usage_async  s  














r   privacy_modevaluec                 C   s   | j s|rd S |S )N)r   )rk   r   r   r   r   r   r     s   
r   )r   r   typingr   r   r   r   r   httpxr   posthog.clientr   PostHogClientr_   r   r0   r5   r1   r2   r3   rQ   ri   boolr   r   r   r   r   r   r   <module>   sx    "F="?
	

w
	

m