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_async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 )AsyncOpenAIzf
    An async 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 )z
        Args:
            api_key: OpenAI API key.
            posthog_client: If provided, events will be captured via this client instance.
            **openai_config: Additional keyword args (e.g. organization="xxx").
        N )super__init__r
   WrappedChatchatWrappedEmbeddings
embeddings)selfr   kwargs	__class__r   U/var/www/visachat/venv/lib/python3.10/site-packages/posthog/ai/openai/openai_async.pyr      s   
zAsyncOpenAI.__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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                    sp   |d u r	t  }|ddr| j|||||fi |I d H S t|| jjd||| jjt j	fi |I d H }|S )NstreamFopenai)
uuiduuid4get_create_streamingr   r   r
   base_urlr   create)r   r#   r$   r%   r&   r'   r   responser   r   r   r/   .   s2   		
zWrappedCompletions.createc                    sl   t   	i 
g  dvri d< dd d< t jdi I d H  	
fdd}| S )Nstream_optionsTinclude_usagec                    s   z[2 z73 d H W  t  dr jr fdddD t  dr8 jr8t jdkr8 jd jj} | r8|   V  q6 W t }|
 }d}		||	I d H  d S t }|
 }d}		||	I d H  w )Nusagec                    s   i | ]
}|t  j|d qS )r   )getattrr3   ).0kchunkr   r   
<dictcomp>g   s    zQWrappedCompletions._create_streaming.<locals>.async_generator.<locals>.<dictcomp>)prompt_tokenscompletion_tokenstotal_tokenschoicesr    )
hasattrr3   r=   lendeltacontentappendtimejoin_capture_streaming_event)rB   end_timelatencyoutputaccumulated_contentr   r#   r'   r&   r%   r$   r0   r   
start_timeusage_statsr7   r   async_generatorb   sR   



z=WrappedCompletions._create_streaming.<locals>.async_generatorr   )rD   r   r/   )r   r#   r$   r%   r&   r'   r   rN   r   rJ   r   r-   Q   s   	 $z$WrappedCompletions._create_streamingrM   rH   rI   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 rEd|
d< t	| jjdr[| jjj
|pS|d|
|d d S d S )Nr)   modelmessages	assistant)rB   role   r:   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   rH   rI   event_propertiesr   r   r   rF      s>   




z+WrappedCompletions._capture_streaming_eventNNNFN)FN)r   r   r   r	   r   r   rc   r   r   boolr/   r-   intfloatrF   r   r   r   r   r   r    +   sl   
 (7

	
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 |I dH }t }	i }
t|dr6|jr6t|jddt|jddd}
|	| }d|dt	| j
j||d	d
|
dd||t| j
jd|}|du rcd|d< t| j
jdrw| j
jj|pq|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.
            posthog_privacy_mode: Whether to store input and output in PostHog.
            posthog_groups: Optional dictionary of groups to include in the event.
            **kwargs: Any additional parameters for the OpenAI Embeddings API.

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