
    g                        d dl Z d dlZd dl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Zdedeeef   fd	Zdefd
Zd Zd Zdeeef   def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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ZdededefdZy)    N)AnyCallableDictOptional)URL)Clientkwargsreturnc                 >    i }dD ]  }|| v s| |   | |   ||<    |S )z?
    Extracts model parameters from the kwargs dictionary.
    )
temperature
max_tokensmax_completion_tokenstop_pfrequency_penaltypresence_penaltynstopstream	streaming )r	   model_paramsparams      E/var/www/openai/venv/lib/python3.12/site-packages/posthog/ai/utils.pyget_model_paramsr   
   s=     L F?ve}8"(-L     providerc                     |dk(  r-| j                   j                  | j                   j                  dS |dk(  r-| j                   j                  | j                   j                  dS dddS )N	anthropic)input_tokensoutput_tokensopenair   )usager   r    prompt_tokenscompletion_tokens)responser   s     r   	get_usager&       sn    ;$NN77%^^99
 	
 
X	$NN88%^^==
 	

  r   c                 R    g }| |S |dk(  rt        |       S |dk(  rt        |       S |S )z4
    Format a regular (non-streaming) response.
    r   r!   )format_response_anthropicformat_response_openai)r%   r   outputs      r   format_responser+   1   s?     F;(22	X	%h//Mr   c                     g }| j                   D ]-  }|j                  s|j                  d|j                  d       / |S )N	assistantrolecontent)r0   textappendr%   r*   choices      r   r(   r(   ?   s@    F"";;MM'%{{ # Mr   c                     g }| j                   D ]U  }|j                  j                  s|j                  |j                  j                  |j                  j                  d       W |S )N)r0   r/   )choicesmessager0   r2   r/   r3   s      r   r)   r)   L   sV    F"">>!!MM%~~55"NN// # Mr   c                     |dk7  r| j                  d      S | j                  d      xs g }| j                  d      |S d| j                  d      dg|z   S )Nr   messagessystemr.   )get)r	   r   r9   s      r   merge_system_promptr<   Y   s\    ;zz*%%zz*%+Hzz(#&**X*>?@8KKr   posthog_distinct_id	ph_clientposthog_trace_idposthog_propertiesposthog_privacy_modeposthog_groupsbase_urlcall_method.c	                 "   t        j                          }
d}d}d}i }i }	  |di |	}t        j                          }||
z
  }|t	        j
                         }|rt        |d      rt        ||      }t        |	|      }||	j                  d      t        |	      t        |||      t        ||t        ||            ||j                  d	d      |j                  d
d      ||t        |      d|xs i |xs i }| d|d<   t        |d      r/t        |j                        r|j                  | xs |d||       	 |r||S # t        $ r-}|}t        |dd      }d|j                         d}Y d}~Id}~ww xY w# t        j                          }||
z
  }|t	        j
                         }|rt        |d      rt        ||      }t        |	|      }||	j                  d      t        |	      t        |||      t        ||t        ||            ||j                  d	d      |j                  d
d      ||t        |      d|xs i |xs i }| d|d<   t        |d      r0t        |j                        r|j                  | xs |d||       w w w xY w)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"   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_urlF$process_person_profilecapture$ai_generationdistinct_idevent
propertiesgroupsr   time	Exceptiongetattr__str__uuiduuid4hasattrr&   r<   r;   r   with_privacy_moder+   strcallablerL   )r=   r>   r   r?   r@   rA   rB   rC   rD   r	   
start_timer%   errorhttp_statusr"   error_paramsexcend_timelatencyr9   event_propertiess                        r   call_llm_and_track_usagerf   b   s     JHEKE#%L1(( 99;Z'##zz|'2h1E&vx8 %G,$4V$<*96JHU"3/81T#  + %		.! <!&?A!>",M
 "'R
 !r
$ &:?67 9i(Xi6G6G-H/C3C&+%	   Oi  
c=!4 

 99;Z'##zz|'2h1E&vx8 %G,$4V$<*96JHU"3/81T#  + %		.! <!&?A!>",M
 "'R
 !r
$ &:?67 9i(Xi6G6G-H/C3C&+%	   .I(s*   E   	E6	"E1+E9 1E66E9 9DJcall_async_methodc	                 @  K   t        j                          }
d }d }d}i }i }	  |di |	 d {   }t        j                          }||
z
  }|t	        j
                         }|rt        |d      rt        ||      }t        |	|      }||	j                  d      t        |	      t        |||      t        ||t        ||            ||j                  dd      |j                  d	d      ||t        |      d
|xs i |xs i }| d|d<   t        |d      r/t        |j                        r|j                  | xs |d||       	 |r||S 7 # t        $ r-}|}t        |dd      }d|j                         d}Y d }~Ld }~ww xY w# t        j                          }||
z
  }|t	        j
                         }|rt        |d      rt        ||      }t        |	|      }||	j                  d      t        |	      t        |||      t        ||t        ||            ||j                  dd      |j                  d	d      ||t        |      d
|xs i |xs i }| d|d<   t        |d      r0t        |j                        r|j                  | xs |d||       w w w xY ww)NrF   rG   r   TrH   r"   rI   r   r    rJ   FrK   rL   rM   rN   r   rS   )r=   r>   r   r?   r@   rA   rB   rC   rg   r	   r^   r%   r_   r`   r"   ra   rb   rc   rd   r9   re   s                        r   call_llm_and_track_usage_asyncri      s     JHEKE#%L1*4V44 99;Z'##zz|'2h1E&vx8 %G,$4V$<*96JHU"3/81T#  + %		.! <!&?A!>",M
 "'R
 !r
$ &:?67 9i(Xi6G6G-H/C3C&+%	   Ok 5 
c=!4 

 99;Z'##zz|'2h1E&vx8 %G,$4V$<*96JHU"3/81T#  + %		.! <!&?A!>",M
 "'R
 !r
$ &:?67 9i(Xi6G6G-H/C3C&+%	   .I(sK   JE E
E DJ
E 	F"E>8F >FF DJJprivacy_modevaluec                 $    | j                   s|ry |S )N)rj   )r>   rj   rk   s      r   r[   r[      s    Lr   )rT   rX   typingr   r   r   r   httpxr   posthog.clientr   PostHogClientr\   r   r&   r+   r(   r)   r<   boolrf   ri   r[   r   r   r   <module>rr      s     0 0  2T#s(^ S#X ,# $sCx. " 

LS#X L# LM!#MM M sm	M
 !c3h0M M T#s(^,M M #s(#M M 	M`I!#II I sm	I
 !c3h0I I T#s(^,I I  S)I I 	IX d 3 r   