o
    g"                     @   s   d dl Z d dlZd dlmZmZmZ z
d dlZd dlZW n ey'   e	dw d dl
mZmZmZ d dlmZ G dd dejZG dd	 d	ejjjZG d
d dejjjjZG dd dejjjZdS )    N)AnyDictOptionalzGPlease install the OpenAI SDK to use this feature: 'pip install openai')call_llm_and_track_usageget_model_paramswith_privacy_mode)Clientc                       s0   e Zd ZU dZeed< def fddZ  ZS )OpenAIz_
    A wrapper around the OpenAI SDK that automatically sends LLM usage events to PostHog.
    
_ph_clientposthog_clientc                    s0   t  jdi | || _t| | _t| | _dS )a-  
        Args:
            api_key: OpenAI API key.
            posthog_client: If provided, events will be captured via this client instead
                            of the global posthog.
            **openai_config: Any additional keyword args to set on openai (e.g. organization="xxx").
        N )super__init__r
   WrappedChatchatWrappedEmbeddings
embeddings)selfr   kwargs	__class__r   O/var/www/visachat/venv/lib/python3.10/site-packages/posthog/ai/openai/openai.pyr      s   
zOpenAI.__init__)__name__
__module____qualname____doc__PostHogClient__annotations__r   __classcell__r   r   r   r   r	      s   
 r	   c                   @   s"   e Zd ZU eed< edd ZdS )r   _clientc                 C   s
   t | jS )N)WrappedCompletionsr   )r   r   r   r   completions'   s   
zWrappedChat.completionsN)r   r   r   r	   r   propertyr!   r   r   r   r   r   $   s   
 r   c                       s  e Zd ZU eed< 					ddee dee deeeef  de	deeeef  d	ef fd
dZ
dee dee deeeef  de	deeeef  d	ef fddZdee dee deeeef  de	deeeef  d	eeef deeef dedefddZ  ZS )r    r   NFposthog_distinct_idposthog_trace_idposthog_propertiesposthog_privacy_modeposthog_groupsr   c              
      sb   |d u rt  }|ddr| j|||||fi |S t|| jjd||||| jjt j	f	i |S )NstreamFopenai)
uuiduuid4get_create_streamingr   r   r
   base_urlr   create)r   r#   r$   r%   r&   r'   r   r   r   r   r/   /   s2   		
zWrappedCompletions.createc                    sd   t   	i 
g  dvri d< dd d< t jdi  	
fdd}| S )Nstream_optionsTinclude_usagec                  3   s    zSD ]3 t  dr jr fdddD t  dr4 jr4t jdkr4 jd jj} | r4|   V  qW t }|
 }d}		||	 d S t }|
 }d}		||	 w )Nusagec                    s   i | ]
}|t  j|d qS )r   )getattrr2   ).0kchunkr   r   
<dictcomp>i   s    zKWrappedCompletions._create_streaming.<locals>.generator.<locals>.<dictcomp>)prompt_tokenscompletion_tokenstotal_tokenschoicesr    )
hasattrr2   r<   lendeltacontentappendtimejoin_capture_streaming_event)rA   end_timelatencyoutputaccumulated_contentr   r#   r'   r&   r%   r$   responser   
start_timeusage_statsr6   r   	generatorc   sR   
	


z7WrappedCompletions._create_streaming.<locals>.generatorr   )rC   r   r/   )r   r#   r$   r%   r&   r'   r   rN   r   rI   r   r-   R   s   	 &z$WrappedCompletions._create_streamingrM   rG   rH   c
                 C   s   |d u rt  }d|dt|t| jj||dt| jj||	ddgd|dd|d	d||t| jjd
|}
|d u rDd|
d< t	| jjdrZ| jjj
|pR|d|
|d d S d S )Nr)   modelmessages	assistant)rA   role   r9   r   r:   )$ai_provider	$ai_modelz$ai_model_parameters	$ai_inputz$ai_output_choices$ai_http_status$ai_input_tokensz$ai_output_tokens$ai_latency$ai_trace_id$ai_base_urlF$process_person_profilecapturez$ai_generationdistinct_idevent
propertiesgroups)r*   r+   r,   r   r   r   r
   strr.   r>   r]   )r   r#   r$   r%   r&   r'   r   rM   rG   rH   event_propertiesr   r   r   rE      s<   




z+WrappedCompletions._capture_streaming_eventNNNFN)r   r   r   r	   r   r   rc   r   r   boolr/   r-   intfloatrE   r   r   r   r   r   r    ,   sh   
 #9

	
r    c                       sl   e Zd ZU eed< 					ddee dee deeeef  de	deeeef  d	ef fd
dZ
  ZS )r   r   NFr#   r$   r%   r&   r'   r   c              	      s   |du rt  }t }t jdi |}t }	i }
t|dr2|jr2t|jddt|jddd}
|	| }d|dt	| j
j||d	d
|
dd||t| j
jd|}|du r_d|d< t| j
jdrs| j
jj|pm|d||d |S )a  
        Create an embedding using OpenAI's 'embeddings.create' method, but also track usage in PostHog.

        Args:
            posthog_distinct_id: Optional ID to associate with the usage event.
            posthog_trace_id: Optional trace UUID for linking events.
            posthog_properties: Optional dictionary of extra properties to include in the event.
            **kwargs: Any additional parameters for the OpenAI Embeddings API.

        Returns:
            The response from OpenAI's embeddings.create call.
        Nr2   r9   r   r;   )r9   r;   r)   rO   inputrS   )rT   rU   rV   rW   rX   rY   rZ   r[   Fr\   r]   z$ai_embeddingr^   r   )r*   r+   rC   r   r/   r>   r2   r3   r,   r   r   r
   rc   r.   r]   )r   r#   r$   r%   r&   r'   r   rL   rK   rF   rM   rG   rd   r   r   r   r/      s@   

	zWrappedEmbeddings.createre   )r   r   r   r	   r   r   rc   r   r   rf   r/   r   r   r   r   r   r      s(   
 r   )rC   r*   typingr   r   r   r)   openai.resourcesImportErrorModuleNotFoundErrorposthog.ai.utilsr   r   r   posthog.clientr   r   r	   	resourcesr   Chatr   r!   Completionsr    r   
Embeddingsr   r   r   r   r   <module>   s      