o
    xi
                      @  s   d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	 d dl
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 )    )annotationsN)Sequence)asdict	dataclass)Any)
trace_tree)Responsec                   @  s>   e Zd ZU dZded< dZded< dZded< dZded< dS )UsageMetricsNfloatelapsed_timeintprompt_tokenscompletion_tokenstotal_tokens)__name__
__module____qualname__r   __annotations__r   r   r    r   r   U/home/ubuntu/.local/lib/python3.10/site-packages/wandb/integration/openai/resolver.pyr	      s
   
 r	   c                   @  s2   e Zd ZU dZded< dZded< dZded< dS )MetricsNr	   usagezwandb.Tablestatstrace_tree.WBTraceTreetrace)r   r   r   r   r   r   r   r   r   r   r   r      s   
 r   c                 C  s   h | ]}d | qS zusage/r   ).0kr   r   r   	<setcomp>    s    r   c                   @  sz   e Zd Zdd Zd-ddZed.ddZd/ddZd/ddZd/ddZ	d0d d!Z
ed1d#d$Zd2d'd(Zed3d*d+Zd,S )4OpenAIRequestResponseResolverc                 C  s
   d| _ d S )NF)define_metrics_called)selfr   r   r   __init__$   s   
z&OpenAIRequestResponseResolver.__init__argsSequence[Any]kwargsdict[str, Any]responser   
start_timer
   time_elapsedreturndict[str, Any] | Nonec           	   
   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_keyswandb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<   resultslist[trace_tree.Result]r   c                 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LLMWBTraceTree)r<   r'   r@   r)   rH   rI   span	model_objr   r   r   results_to_trace_treeG   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**: textrY   r   r   choicer   r   r   
<listcomp>p       z?OpenAIRequestResponseResolver._resolve_edit.<locals>.<listcomp>choicesr<   r'   request_strr`   r)   _resolve_metricsr!   r<   r'   r)   rb   r`   r   r   r   r5   e   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**: promptrY   c                 S  rZ   )z

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

**role**: contentrY   c                 S  s.   g | ]}d |d d  d|d d  dqS )ri   messagerj   rk   rl   rY   r   r\   r   r   r   r^      s     zJOpenAIRequestResponseResolver._resolve_chat_completion.<locals>.<listcomp>r`   ra   )ioStringIOwritegetvaluerd   )r!   r<   r'   r)   rg   rm   rb   r`   r   r   r   r7      s   "z6OpenAIRequestResponseResolver._resolve_chat_completionrb   strr`   	list[str]c                   s,    fdd|D }|  ||||}| |S )rf   c                   s"   g | ]}t jd  id|idqS )r<   r'   )inputsoutputs)r   Resultr\   rb   r   r   r^      s    zBOpenAIRequestResponseResolver._resolve_metrics.<locals>.<listcomp>)_get_metrics_to_log_convert_metrics_to_dict)r!   r<   r'   rb   r`   r)   r@   metricsr   rw   r   rd      s
   
	
z.OpenAIRequestResponseResolver._resolve_metricsr	   c                 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_metrics	list[Any]r   c                 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 )NrC   r<   r'   rB   idapi_typerD   )r<   r'   rC   r(   end_time
request_idr   
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   r|   rt   ru   datetimefromtimestampr2   runr~   updater   appendTablelistkeysrV   r   )r!   r<   r'   r@   r)   rC   usage_metricsr   resultrowusage_tabler   rz   r   r   r   rx      s0   


z1OpenAIRequestResponseResolver._get_metrics_to_logrz   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   )rz   metrics_dictr{   r   r   r   ry      s   
z6OpenAIRequestResponseResolver._convert_metrics_to_dictN)r#   r$   r%   r&   r'   r   r(   r
   r)   r
   r*   r+   )
r<   r&   r'   r   r@   rA   r)   r
   r*   r   )r<   r&   r'   r   r)   r
   r*   r&   )r<   r&   r'   r   rb   rr   r`   rs   r)   r
   r*   r&   )r'   r   r)   r
   r*   r	   )
r<   r&   r'   r   r@   r}   r)   r
   r*   r   )rz   r   r*   r&   )r   r   r   r"   r?   staticmethodrV   r5   r6   r7   rd   r|   rx   ry   r   r   r   r   r   #   s    
 




	$r   )
__future__r   r   rn   loggingcollections.abcr   dataclassesr   r   typingr   r2   wandb.sdk.data_typesr   (wandb.sdk.integration_utils.auto_loggingr   	getLoggerr   r8   r	   r   r1   r   r   r   r   r   <module>   s"    
