a
    `g0                  	   @  s  d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZ e	rd d
lmZmZ d dl m!Z!m"Z"m#Z# d dl$m%Z% ededde
f dZ&e'e(Z)ej*ddddZ+dddddZ,dddddZ-ddddd Z.d!dd"d#d$Z/d%dd"d&d'Z0dd(d)d*d+Z1d,d-d.d/Z2dBd0dd0d1d2d2d0d3d4d5Z3dCd0dd1d2d0d6d7d8Z4G d9d: d:ed;d<Z5dd=dd>dd1dddd?d@dAZ6dS )D    )annotationsN)defaultdict)Mapping)
TYPE_CHECKINGAnyCallableDefaultDictDictListOptionalTypeTypeVarUnion)	TypedDict)client)run_helpers)InputTokenDetailsOutputTokenDetailsUsageMetadata)AsyncOpenAIOpenAI)ChatCompletionChunkChoiceChoiceDeltaToolCall)
CompletionCr   r   )boundzOptional[Type])returnc                  C  s,   zddl m}  | W S  ty&   Y d S 0 d S )Nr   NotGiven)Zopenai._typesr   ImportErrorr    r!   h/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langsmith/wrappers/_openai.py_get_not_given(   s
    r#   dict)dr   c              
     sj   z,t    d u r| W S  fdd|  D W S  tyd } z td|  | W  Y d }~S d }~0 0 d S )Nc                   s    i | ]\}}t | s||qS r!   )
isinstance.0kvZ	not_givenr!   r"   
<dictcomp>7       z$_strip_not_given.<locals>.<dictcomp>zError stripping NotGiven: )r#   items	Exceptionloggererror)r%   er!   r+   r"   _strip_not_given2   s    r3   str)
model_typekwargsc                 C  sP   t |}|d}|r&t|tr&|g}d| |dd |dd |dd |dS )NstopopenaimodelZtemperatureZ
max_tokens)Zls_providerZls_model_typeZls_model_nameZls_temperatureZls_max_tokensZls_stop)r3   getr&   r4   )r5   r6   strippedr7   r!   r!   r"   _infer_invocation_params=   s    



r<   zList[Choice])choicesr   c                 C  s  t t| }ddd}|D ],}t|drt|jdd r|jj|d<  qHqtt }| D ]}t|drTt|jdd rTt|jdd r|d  |jj7  < t|jdd r|dsddd|d< t|jj	d	d }|r|d d	  |7  < t|jj	d
d }|r|d d
  |7  < t|jdd rT|jj
}|d urT|D ]}||j | q.qT|rXdd | D |d< | D ]\}	}
|	tdd |
D d tdd |
D d d|d |	< |
D ]}t|dd r|d |	 dsddd|d |	 d< t|jd	d }|r|d |	 d }|d	  |7  < t|jd
d }|r|d |	 d }|d
  |7  < qql| rnt| d ddndtdd |D d |dS )N	assistant rolecontentdeltarA   rB   function_call)name	argumentsrE   rF   
tool_callsc                 S  s   g | ]}d qS Nr!   )r(   _r!   r!   r"   
<listcomp>l   r-   z#_reduce_choices.<locals>.<listcomp>c                 s  s   | ]}|j r|j V  qd S rH   )idr(   cr!   r!   r"   	<genexpr>p   r-   z"_reduce_choices.<locals>.<genexpr>c                 s  s   | ]}|j r|j V  qd S rH   )typerL   r!   r!   r"   rN   q   r-   )indexrK   rO   functionr   rP   c                 s  s    | ]}t |d dr|jV  qdS )finish_reasonN)getattrrR   rL   r!   r!   r"   rN      s   )rP   rR   message)listreversedhasattrrS   rC   rA   r   rB   r:   rD   rG   rP   appendkeysr.   nextrQ   )r=   Zreversed_choicesrT   rM   rG   Zname_Z
arguments_Ztool_calls_listZ	tool_callrP   Ztool_call_chunkschunkZfn_r!   r!   r"   _reduce_choicesN   sr    
r\   zList[ChatCompletionChunk])
all_chunksr   c                 C  s   t t}| D ] }|jD ]}||j | qq| rV| d  }dd | D |d< ndddddigi}|d	d }|rt|nd |d
< |S )Nc                 S  s   g | ]}t |qS r!   )r\   )r(   r=   r!   r!   r"   rJ      s   z _reduce_chat.<locals>.<listcomp>r=   rT   r>   r?   r@   usageusage_metadata)	r   rU   r=   rP   rX   
model_dumpvaluespop_create_usage_metadata)r]   Zchoices_by_indexr[   choicer%   oai_token_usager!   r!   r"   _reduce_chat   s    
rg   zList[Completion]c                 C  sh   g }| D ]"}|j d j}|d ur|| qd|}| rV| d  }d|ig|d< ndd|igi}|S )Nr   r?   r^   textr=   )r=   rh   rX   joinra   )r]   Zall_contentr[   rB   r%   r!   r!   r"   _reduce_completions   s    
rj   r   )rf   r   c                 C  s   |  dpd}|  dpd}|  dp,|| }|  dp:i  d|  dpLi  dd}|  d	pdi  d|  d	pvi  d
d}t|||tf i dd | D tf i dd | D dS )NZprompt_tokensr   Zcompletion_tokenstotal_tokensZprompt_tokens_detailsZaudio_tokensZcached_tokens)audioZ
cache_readZcompletion_tokens_detailsZreasoning_tokens)rl   Z	reasoningc                 S  s   i | ]\}}|d ur||qS rH   r!   r'   r!   r!   r"   r,      r-   z*_create_usage_metadata.<locals>.<dictcomp>c                 S  s   i | ]\}}|d ur||qS rH   r!   r'   r!   r!   r"   r,      r-   )input_tokensoutput_tokensrk   input_token_detailsoutput_token_details)r:   r   r   r.   r   )rf   rm   rn   rk   ro   rp   r!   r!   r"   rd      s8    	rd   r   )outputsc              
   C  sp   z.|   }|dd }|r"t|nd |d< |W S  tyj } z$td|  d| iW  Y d }~S d }~0 0 d S )Nr_   r`   z"Error processing chat completion: output)ra   rc   rd   BaseExceptionr0   debug)rq   Zrdictrf   r2   r!   r!   r"   _process_chat_completion   s    ru   r   zOptional[TracingExtra]zOptional[Callable])original_createrE   	reduce_fntracing_extrainvocation_params_fnprocess_outputsr   c              	     sr   |pi t dddd fdd}t dddd fdd}trn|S |S )NF)streamboolc              	     s<   t jf d| rnd t d}||d| i|S NllmrE   Zrun_typerw   Zprocess_inputsZ_invocation_params_fnrz   r{   )r   	traceabler3   r{   argsr6   	decoratorry   rE   rv   rz   rw   textrar!   r"   create   s    

z_get_wrapper.<locals>.createc              	     sJ   t |}tjf d| rnd t  d}||d| i|I d H S r}   )r3   r   r   r   r   r!   r"   acreate   s    
	z_get_wrapper.<locals>.acreate	functoolswrapsr   is_async)rv   rE   rw   rx   ry   rz   r   r   r!   r   r"   _get_wrapper   s    $$r   )original_parserE   rx   ry   r   c                   sR   |pi t  fdd}t  fdd}trN|S |S )Nc               	     s0   t jf dd t td}|| i |S Nr~   r   )r   r   r3   ru   r   r6   r   ry   rE   r   r   r!   r"   parse  s    	z!_get_parse_wrapper.<locals>.parsec               	     s>   t |}tjf dd t  td}|| i |I d H S r   )r3   r   r   ru   r   r   r!   r"   aparse!  s    	z"_get_parse_wrapper.<locals>.aparser   )r   rE   rx   ry   r   r   r!   r   r"   _get_parse_wrapper  s    r   c                   @  s&   e Zd ZU ded< ded< ded< dS )TracingExtrazOptional[Mapping[str, Any]]metadatazOptional[List[str]]tagszOptional[ls_client.Client]r   N)__name__
__module____qualname____annotations__r!   r!   r!   r"   r   2  s   
r   F)totalZ
ChatOpenAI)rx   	chat_namecompletions_name)r   rx   r   r   r   c             	   C  s   t | jjj|t|ttdtd| jj_t | jj|t	|ttdd| j_t
| drt
| jdrt
| jjdrt
| jjjdrt| jjjj||ttdd| jjj_| S )a)  Patch the OpenAI client to make it traceable.

    Args:
        client (Union[OpenAI, AsyncOpenAI]): The client to patch.
        tracing_extra (Optional[TracingExtra], optional): Extra tracing information.
            Defaults to None.
        chat_name (str, optional): The run name for the chat completions endpoint.
            Defaults to "ChatOpenAI".
        completions_name (str, optional): The run name for the completions endpoint.
            Defaults to "OpenAI".

    Returns:
        Union[OpenAI, AsyncOpenAI]: The patched client.

    chat)rx   ry   rz   r~   )rx   ry   betacompletionsr   )r   r   r   r   rg   r   partialr<   ru   rj   rW   r   r   r   )r   rx   r   r   r!   r!   r"   wrap_openai8  s<    






r   )NNN)NN)7
__future__r   r   loggingcollectionsr   collections.abcr   typingr   r   r   r   r	   r
   r   r   r   r   Ztyping_extensionsr   Z	langsmithr   Z	ls_clientr   Zlangsmith.schemasr   r   r   r8   r   r   Z'openai.types.chat.chat_completion_chunkr   r   r   Zopenai.types.completionr   r   	getLoggerr   r0   	lru_cacher#   r3   r<   r\   rg   rj   rd   ru   r   r   r   r   r!   r!   r!   r"   <module>   sH   0
	B!   ,  &	