o
    -wi                     @   s   d dl Z d dlZd dlZd dlmZmZ d dlmZmZm	Z	m
Z
mZ d dlZd dlmZ d dlmZ eeZeG dd dZeG dd	 d	Zd
d ee D ZG dd dZdS )    N)asdict	dataclass)AnyDictListOptionalSequence)
trace_tree)Responsec                   @   s>   e Zd ZU dZeed< dZeed< dZeed< dZ	eed< dS )UsageMetricsNelapsed_timeprompt_tokenscompletion_tokenstotal_tokens)
__name__
__module____qualname__r   float__annotations__r   intr   r    r   r   ^/home/ubuntu/sommelier/.venv/lib/python3.10/site-packages/wandb/integration/openai/resolver.pyr      s
   
 r   c                   @   s6   e Zd ZU dZeed< dZejed< dZ	e
jed< dS )MetricsNusagestatstrace)r   r   r   r   r   r   r   wandbTabler   r	   WBTraceTreer   r   r   r   r      s   
 r   c                 C   s   h | ]}d | qS zusage/r   ).0kr   r   r   	<setcomp>   s    r"   c                   @   s  e Zd Zdd Zdee deeef dede	de	de
eeef  fd	d
Zedeeef dedeej de	dejf
ddZdeeef dede	deeef fddZdeeef dede	deeef fddZdeeef dede	deeef fddZdeeef dededee de	deeef fddZedede	defddZdeeef dedee de	def
ddZededeeef fddZd S )!OpenAIRequestResponseResolverc                 C   s
   d| _ d S )NF)define_metrics_called)selfr   r   r   __init__!   s   
z&OpenAIRequestResponseResolver.__init__argskwargsresponse
start_timetime_elapsedreturnc           	   
   C   s   |}| j stD ]	}tj|dd qd| _ z;|ddkr$| |||W S |ddkr3| |||W S |ddkrB| |||W S t	d|d  W d S  t
yj } ztd	|  W Y d }~d S d }~ww )
N
_timestamp)step_metricTobjectedittext_completionzchat.completionz$Unsupported OpenAI response object: z$Failed to resolve request/response: )r$   usage_metric_keysr   define_metricget_resolve_edit_resolve_completion_resolve_chat_completionloggerinfo	Exceptionwarning)	r%   r'   r(   r)   r*   r+   requestkeyer   r   r   __call__$   s*   z&OpenAIRequestResponseResolver.__call__r<   resultsc                 C   s   t t|d d }|t t|d  }tj|dd d|d  d|d t|||tjj|d}| |dd}tj||d	S )
aJ  Converts the request, response, and results into a trace tree.

        params:
            request: The request dictionary
            response: The response object
            results: A list of results object
            time_elapsed: The time elapsed in seconds
        returns:
            A wandb trace tree object.
        createdi  modelopenai_r/   )name
attributesstart_time_msend_time_ms	span_kindr@   )r<   r)   _kind)	root_span
model_dict)	r   roundr	   Spanr4   dictSpanKindLLMr   )r<   r)   r@   r+   rG   rH   span	model_objr   r   r   results_to_trace_treeD   s   $z3OpenAIRequestResponseResolver.results_to_trace_treec                 C   s@   d|d  d|d  d}dd |d D }| j |||||d	S )
z<Resolves the request and response objects for `openai.Edit`.z

**Instruction**: instructionz

**Input**: input
c                 S      g | ]
}d |d  dqS )z

**Edited**: textrW   r   r    choicer   r   r   
<listcomp>m       z?OpenAIRequestResponseResolver._resolve_edit.<locals>.<listcomp>choicesr<   r)   request_strr^   r+   _resolve_metricsr%   r<   r)   r+   r`   r^   r   r   r   r5   b   s   z+OpenAIRequestResponseResolver._resolve_editc                 C   s6   d|d  d}dd |d D }| j |||||dS )BResolves the request and response objects for `openai.Completion`.z

**Prompt**: promptrW   c                 S   rX   )z

**Completion**: rY   rW   r   rZ   r   r   r   r\      r]   zEOpenAIRequestResponseResolver._resolve_completion.<locals>.<listcomp>r^   r_   ra   rc   r   r   r   r6   y   s   z1OpenAIRequestResponseResolver._resolve_completionc                 C   sd   t  }|d D ]}|d|d  d|d  d q| }dd |d	 D }| j|||||d
S )rd   messages

**role**: contentrW   c                 S   s.   g | ]}d |d d  d|d d  dqS )rg   messagerh   ri   rj   rW   r   rZ   r   r   r   r\      s     zJOpenAIRequestResponseResolver._resolve_chat_completion.<locals>.<listcomp>r^   r_   )ioStringIOwritegetvaluerb   )r%   r<   r)   r+   re   rk   r`   r^   r   r   r   r7      s   "z6OpenAIRequestResponseResolver._resolve_chat_completionr`   r^   c                    s,    fdd|D }|  ||||}| |S )rd   c                    s"   g | ]}t jd  id|idqS )r<   r)   )inputsoutputs)r	   ResultrZ   r`   r   r   r\      s    zBOpenAIRequestResponseResolver._resolve_metrics.<locals>.<listcomp>)_get_metrics_to_log_convert_metrics_to_dict)r%   r<   r)   r`   r^   r+   r@   metricsr   rs   r   rb      s
   
	
z.OpenAIRequestResponseResolver._resolve_metricsc                 C   s.   |  drtdi | d }nt }||_|S )z.Gets the usage stats from the response object.r   Nr   )r4   r   r   )r)   r+   usage_statsr   r   r   _get_usage_metrics   s
   
z0OpenAIRequestResponseResolver._get_usage_metricsc                 C   s   | dp	| d}| ||}g }|D ]7}|jd |jd |tj|d tj|d | | dd | ddtjjd}	|		t
| ||	 qtjt|d	  d
d |D d}
| ||||}t|
||d}|S )NrB   r<   r)   rA   idapi_typerC   )r<   r)   rB   r*   end_time
request_idrz   
session_idr   c                 S   s   g | ]}|  qS r   )values)r    itemr   r   r   r\      s    zEOpenAIRequestResponseResolver._get_metrics_to_log.<locals>.<listcomp>)columnsdata)r   r   r   )r4   rx   rp   rq   datetimefromtimestampr   runry   updater   appendr   listkeysrT   r   )r%   r<   r)   r@   r+   rB   usage_metricsr   resultrowusage_tabler   rv   r   r   r   rt      s0   


z1OpenAIRequestResponseResolver._get_metrics_to_logrv   c                 C   s4   | j | jd}dd t| j D }|| |S )zConverts metrics to a dict.)r   r   c                 S   s   i | ]
\}}d | |qS r   r   )r    r!   vr   r   r   
<dictcomp>   s    zJOpenAIRequestResponseResolver._convert_metrics_to_dict.<locals>.<dictcomp>)r   r   r   r   itemsr   )rv   metrics_dictrw   r   r   r   ru      s   
z6OpenAIRequestResponseResolver._convert_metrics_to_dictN)r   r   r   r&   r   r   r   strr
   r   r   r?   staticmethodr   r	   rr   r   rT   r5   r6   r7   rb   r   rx   r   rt   ru   r   r   r   r   r#       s    

 












	

$ r#   )r   rl   loggingdataclassesr   r   typingr   r   r   r   r   r   wandb.sdk.data_typesr	   (wandb.sdk.integration_utils.auto_loggingr
   	getLoggerr   r8   r   r   r2   r#   r   r   r   r   <module>   s    
