o
    ]+ ibK                     @  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 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	rfd d
lmZmZ d dlmZmZmZ d dl m!Z! d dl"m#Z# ededde
f dZ$e%e&Z'ej(dWddZ)dXddZ*dXddZ+dYd d!Z,dZd$d%Z-d[d(d)Z.d\d+d,Z/	d]d^d1d2Z0d_d5d6Z1			d`dad@dAZ2		dbdcdCdDZ3dddGdHZ4G dIdJ dJedKdLZ5ddMddNdedRdSZ6dfdUdVZ7dS )g    )annotationsN)defaultdict)Mapping)TYPE_CHECKINGAnyCallableOptionalTypeVarUnion)	TypedDict)client)run_helpers)InputTokenDetailsOutputTokenDetailsUsageMetadata)AsyncOpenAIOpenAI)ChatCompletionChunkChoiceChoiceDeltaToolCall)
Completion)ResponseStreamEventCr   r   )boundreturntuple[type, ...]c                  C  sL   g } zddl m}m} | | | | W t| S  ty%   Y t| S w )z4Get NotGiven/Omit sentinel types used by OpenAI SDK.r   )NotGivenOmit)Zopenai._typesr   r   appendImportErrortuple)typesr   r    r"   f/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/langsmith/wrappers/_openai.py_get_omit_types%   s   
r$   ddictc              
     sb   zt    s	| W S  fdd|  D W S  ty0 } ztd|  | W  Y d }~S d }~ww )Nc                   s2   i | ]\}}t | s|d r|du s||qS )Zextra_N)
isinstance
startswith.0kvZ
omit_typesr"   r#   
<dictcomp>9   s    z$_strip_not_given.<locals>.<dictcomp>zError stripping NotGiven: )r$   items	Exceptionloggererror)r%   er"   r-   r#   _strip_not_given4   s   
r4   c                 C  sR   t | } d| v r'| d }t|dr'zi | d| iW S  ty&   Y | S w | S )z?Strip NotGiven values and serialize text_format to JSON schema.text_formatmodel_json_schema)r4   hasattrr6   r0   )r%   r5   r"   r"   r#   _process_inputsC   s   
r8   
model_typestrproviderkwargsc                   s~   t |}|d}|rt|tr|g}h d  fdd| D }|| |d|d|dp:|dp:|d	||d
S )Nstop>   Zparallel_tool_callsservice_tierZpresence_penalty	verbosityZtop_pZlogprobsZresponse_formatZweb_search_optionsuserZ
logit_bias	reasoningZtop_logprobsZstream_optionsZprompt_cache_keyseedZfrequency_penaltyZreasoning_effortZ
truncationZ
modalitiesZ
predictionnc                   s   i | ]\}}| v r||qS r"   r"   r)   Zallowed_invocation_keysr"   r#   r.   w   s    z,_infer_invocation_params.<locals>.<dictcomp>modelZtemperatureZ
max_tokensZmax_completion_tokensZmax_output_tokens)ls_providerZls_model_typeZls_model_nameZls_temperatureZls_max_tokensZls_stopZls_invocation_params)r4   getr'   r:   r/   )r9   r;   r<   strippedr=   Zinvocation_paramsr"   rD   r#   _infer_invocation_paramsU   s&   


rI   choiceslist[Choice]c                 C  sR  t t| }ddd}|D ]}t|dr#t|jdd r#|jj|d<  nqtt }| D ]o}t|drt|jdd rB|d  |jj7  < t|jdd r}|dsUddd|d< t|jj	d	d }|ri|d d	  |7  < t|jj	d
d }|r}|d d
  |7  < t|jdd r|jj
}|d ur|D ]
}||j | qq*|rdd tt| d D |d< | D ]]\}	}
|	tdd |
D d tdd |
D d dddd|d |	< |
D ]8}t|dd rt|jd	d }|r|d |	 d d	  |7  < t|jd
d }|r|d |	 d d
  |7  < qq| rt| d ddndtdd |D d |dS )N	assistant rolecontentdeltarO   rP   function_call)name	argumentsrS   rT   
tool_callsc                 S  s   g | ]}d qS Nr"   )r*   _r"   r"   r#   
<listcomp>   s    z#_reduce_choices.<locals>.<listcomp>   c                 s      | ]	}|j r|j V  qd S rV   )idr*   cr"   r"   r#   	<genexpr>       z"_reduce_choices.<locals>.<genexpr>c                 s  rZ   rV   )typer\   r"   r"   r#   r^      r_   )indexr[   r`   functionrb   r   ra   c                 s  s"    | ]}t |d dr|jV  qdS )finish_reasonN)getattrrc   r\   r"   r"   r#   r^      s    

)ra   rc   message)listreversedr7   rd   rQ   rO   r   rP   rG   rR   rU   ra   r   rangemaxkeysr/   nextrb   )rJ   Zreversed_choicesre   r]   rU   Zname_Z
arguments_Ztool_calls_listZ	tool_callra   Ztool_call_chunkschunkr"   r"   r#   _reduce_choices   st   

"rm   
all_chunkslist[ChatCompletionChunk]c                 C  s   t t}| D ]}|jD ]
}||j | qq| r+| d  }dd | D |d< n
dddddigi}|d	d }|rAt|nd |d
< |S )Nc                 S  s   g | ]}t |qS r"   )rm   )r*   rJ   r"   r"   r#   rX      s    z _reduce_chat.<locals>.<listcomp>rJ   re   rL   rM   rN   usageusage_metadata)	r   rf   rJ   ra   r   
model_dumpvaluespop_create_usage_metadata)rn   Zchoices_by_indexrl   choicer%   oai_token_usager"   r"   r#   _reduce_chat   s   
ry   list[Completion]c                 C  sj   g }| D ]}|j d j}|d ur|| qd|}| r,| d  }d|ig|d< |S dd|igi}|S )Nr   rM   rp   textrJ   )rJ   r{   r   joinrs   )rn   Zall_contentrl   rP   r%   r"   r"   r#   _reduce_completions   s   

r}   rx   r>   Optional[str]r   c           	      C  sn  |dv r|nd }|r| dnd}|  dp|  dpd}|  dp(|  dp(d}|  d	p1|| }d
|  dp>|  dp>i  d| d|  dpP|  dpPi  di}d
|  dpa|  dpai  d| d|  dps|  dpsi  di}|r|| | dpd ||< || | dpd ||< t|||tdi dd | D tdi dd | D dS )N)priorityZflexrW   rM   Zprompt_tokensinput_tokensr   Zcompletion_tokensoutput_tokenstotal_tokensZaudioZprompt_tokens_detailsZinput_tokens_detailsZaudio_tokensZ
cache_readZcached_tokensZcompletion_tokens_detailsZoutput_tokens_detailsrA   Zreasoning_tokensc                 S     i | ]\}}|d ur||qS rV   r"   r)   r"   r"   r#   r.   '      z*_create_usage_metadata.<locals>.<dictcomp>c                 S  r   rV   r"   r)   r"   r"   r#   r.   *  r   )r   r   r   input_token_detailsoutput_token_detailsr"   )rG   r   r   r/   r   )	rx   r>   Zrecognized_service_tierZservice_tier_prefixr   r   r   r   r   r"   r"   r#   rv      sp   




rv   outputsr   c              
   C  st   z|   }|dd }|rt||dnd |d< |W S  ty9 } ztd|  d| iW  Y d }~S d }~ww )Nrq   r>   rr   z"Error processing chat completion: output)rs   ru   rv   rG   BaseExceptionr1   debug)r   Zrdictrx   r3   r"   r"   r#   _process_chat_completion/  s   r   original_creater   rS   	reduce_fntracing_extraOptional[TracingExtra]invocation_params_fnOptional[Callable]process_outputsc                   sZ   |pi t  fdd}t  fdd}tr+|S |S )Nc               	     sB   t jdd|ddu rnd t d}|| i |S NllmstreamTrS   Zrun_typer   Zprocess_inputsZ_invocation_params_fnr   r"   r   	traceablerG   r8   argsr<   	decoratorr   rS   r   r   r   textrar"   r#   createH  s   
z_get_wrapper.<locals>.createc               	     sJ   t jdd|ddu rnd t d}|| i |I d H S r   r   r   r   r"   r#   acreateV  s   	z_get_wrapper.<locals>.acreate	functoolswrapsr   is_async)r   rS   r   r   r   r   r   r   r"   r   r#   _get_wrapper>  s   r   original_parsec                   sV   |pi t  fdd}t  fdd}tr)|S |S )Nc               	     s0   t jddd t d}|| i |S Nr   r   r"   r   r   r8   r   r   rS   r   r   r   r"   r#   parseo  s   	z!_get_parse_wrapper.<locals>.parsec               	     s8   t jddd t d}|| i |I d H S r   r   r   r   r"   r#   aparse|  s   	z"_get_parse_wrapper.<locals>.aparser   )r   rS   r   r   r   r   r   r"   r   r#   _get_parse_wrapperf  s   r   eventslist[ResponseStreamEvent]c                 C  s&   | D ]}|j dkrt|j  S qi S )Nzresponse.completed)r`   _process_responses_api_outputresponse)r   eventr"   r"   r#   _reduce_response_events  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     s   
 r   F)totalZ
ChatOpenAI)r   	chat_namecompletions_namer   r   r   c                C  s  |pi }d}zddl m}m} t| |st| |rd}d}d}W n	 ty)   Y nw 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
td|d
| jjj_t| drt| jdrt| jjdrt| jjj|t|t
td|d
| jj_t| drt| jdrt| jj|tt|t
td|d| j_t| jdrt| jj|t|t
td|d
| j_| S )a  Patch the OpenAI client to make it traceable.

    Supports:
        - Chat and Responses API's
        - Sync and async OpenAI clients
        - create() and parse() methods
        - with and without streaming

    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.

    Example:

        .. code-block:: python

            import openai
            from langsmith import wrappers

            # Use OpenAI client same as you normally would.
            client = wrappers.wrap_openai(openai.OpenAI())

            # Chat API:
            messages = [
                {"role": "system", "content": "You are a helpful assistant."},
                {
                    "role": "user",
                    "content": "What physics breakthroughs do you predict will happen by 2300?",
                },
            ]
            completion = client.chat.completions.create(
                model="gpt-4o-mini", messages=messages
            )
            print(completion.choices[0].message.content)

            # Responses API:
            response = client.responses.create(
                model="gpt-4o-mini",
                messages=messages,
            )
            print(response.output_text)

    .. versionchanged:: 0.3.16

        Support for Responses API added.
    openair   )AsyncAzureOpenAIAzureOpenAIZazureZAzureChatOpenAIr   chat)r   r   r   r   )r   r   betacompletionsr   	responsesr   )r   r   r   )r   r   r   r'   r   r   r   r   r   ry   r   partialrI   r   r}   r7   r   r   r   r   r   r   )r   r   r   r   rF   r   r   r"   r"   r#   wrap_openai  s   =








r   r   c                 C  s\   | r,z| j ddd}|dd  }rt||d|d< |W S  ty+   d| i Y S w i S )NTjson)Zexclude_nonemoderq   r>   rr   r   )rs   ru   rv   rG   r0   )r   r   rq   r"   r"   r#   r   5  s   
r   )r   r   )r%   r&   r   r&   )r9   r:   r;   r:   r<   r&   )rJ   rK   r   r&   )rn   ro   r   r&   )rn   rz   r   r&   rV   )rx   r&   r>   r~   r   r   )r   r   )NNN)r   r   rS   r:   r   r   r   r   r   r   r   r   r   r   )NN)r   r   rS   r:   r   r   r   r   r   r   r   r   )r   r   r   r&   )
r   r   r   r   r   r:   r   r:   r   r   )r   r   r   r&   )8
__future__r   r   loggingcollectionsr   collections.abcr   typingr   r   r   r   r	   r
   Ztyping_extensionsr   Z	langsmithr   Z	ls_clientr   Zlangsmith.schemasr   r   r   r   r   r   Z'openai.types.chat.chat_completion_chunkr   r   r   Zopenai.types.completionr   Zopenai.types.responsesr   r   	getLoggerr   r1   	lru_cacher$   r4   r8   rI   rm   ry   r}   rv   r   r   r   r   r   r   r   r"   r"   r"   r#   <module>   sV     	




3
>

D,
&	 