U
    Zh#                     @  s  U d dl mZ d dlZd dlmZmZmZmZ d dlm	Z	m
Z
mZ d dlZddlmZ ddlmZmZ dd	lmZmZ dd
lmZmZ ddlmZ ddlmZmZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z* ddl+m,Z, ddl-m.Z/ ddl0m1Z1 e	dddZ2dZ3de4d< efdddddZ5dddddddZ6d d!d"d#d$d%Z7d d&d'd(d)d*Z8d+d,d-d.d/d0Z9d+d1d2d3d4Z:ed5d6dd7d8d9d:Z;d+d;d2d<d=Z<d'd>d2d?d@Z=dAd7dBdCdDZ>d1d!ddEdFdGZ?dHdId2dJdKZ@dS )L    )annotationsN)TYPE_CHECKINGAnyIterablecast)TypeVar	TypeGuardassert_never   )PydanticFunctionTool   )	NOT_GIVENNotGiven)is_dictis_given)PYDANTIC_V2model_parse_json)construct_type_unchecked)is_basemodel_typeto_strict_json_schemais_dataclass_like_type)	ParsedChoiceChatCompletionParsedFunctionParsedChatCompletionChatCompletionMessageParsedFunctionToolCallChatCompletionToolParamParsedChatCompletionMessagecompletion_create_params)LengthFinishReasonErrorContentFilterFinishReasonError)FunctionDefinition)ResponseFormat)FunctionResponseFormatT)defaultNone_default_response_formatz,Iterable[ChatCompletionToolParam] | NotGiven)toolsreturnc                 C  sh   t | sd S | D ]R}|d dkr4td|d  d|d d}|dk	rtd|d d  dqd S )	NtypefunctionzECurrently only `function` tool types support auto-parsing; Received ``strictTnamez@` is not strict. Only `strict` function tools can be auto-parsed)r   
ValueErrorget)r)   Ztoolr.    r2   D/tmp/pip-unpacked-wheel-693nel7n/openai/lib/_parsing/_completions.pyvalidate_input_tools'   s    r4   zJtype[ResponseFormatT] | completion_create_params.ResponseFormat | NotGivenz-ChatCompletion | ParsedChatCompletion[object]z%ParsedChatCompletion[ResponseFormatT])response_formatinput_toolschat_completionr*   c           	      C  sJ  t |rdd |D }ng }g }|jD ]}|jdkr>t|d|jdkrNt |j}g }|jr|jD ]f}|jdkr| }|	t
|dtt|d dt||jdiitd	 qdtrt| qd|	| qd|	t
tttt|  | d
| t| |d|r|nd did q&ttt t
tttt|  | d|idS )Nc                 S  s   g | ]}|qS r2   r2   .0tr2   r2   r3   
<listcomp>A   s     z)parse_chat_completion.<locals>.<listcomp>length)
completionZcontent_filterr,   Zparsed_arguments)r6   r,   )valuetype_messager5   r@   )parsed
tool_calls)r?   r>   choices)r   rD   Zfinish_reasonr    r!   r@   rC   r+   Zto_dictappendr   r   r   parse_function_tool_argumentsr,   r   r   r	   r   solve_response_format_tmaybe_parse_contentr   r%   )	r5   r6   r7   rD   choicer@   rC   Z	tool_callZtool_call_dictr2   r2   r3   parse_chat_completion:   st    





  	
 rJ   zlist[ChatCompletionToolParam]strzChatCompletionToolParam | None)r6   r/   r*   c                   s   t  fdd| D d S )Nc                 3  s(   | ] }| d i  d kr|V  qdS )r,   r/   N)r1   r8   r/   r2   r3   	<genexpr>   s      z)get_input_tool_by_name.<locals>.<genexpr>)nextr6   r/   r2   rL   r3   get_input_tool_by_name   s    rP   zFunction | ParsedFunctionobject)r6   r,   r*   c                 C  sb   t | |jd}|sd S tt|d}t|tr>t|j|j	S tt
|}|dsVd S t|j	S )NrO   r,   r.   )rP   r/   r   rQ   r1   
isinstancer   r   model	argumentsr"   jsonloads)r6   r,   
input_toolinput_fnr2   r2   r3   rF      s    


rF   z6type[ResponseFormatT] | ResponseFormatParam | NotGivenz;ChatCompletionMessage | ParsedChatCompletionMessage[object]zResponseFormatT | None)r5   r@   r*   c                 C  s$   t | r |jr |js t| |jS d S N)has_rich_response_formatcontentZrefusal_parse_contentrA   r2   r2   r3   rH      s    rH   type[ResponseFormatT])r5   r*   c                 C  s   t | r| S tdtS )zReturn the runtime type for the given response format.

    If no response format is given, or if we won't auto-parse the response format
    then we default to `None`.
    r]   )rZ   r   r(   r5   r2   r2   r3   rG      s    rG   )r6   z%type | ResponseFormatParam | NotGivenbool)r5   r6   r*   c                 C  s,   t | rdS |pg D ]}t|r dS qdS )NTF)rZ   is_parseable_tool)r5   r6   rW   r2   r2   r3   has_parseable_input   s    ra   z TypeGuard[type[ResponseFormatT]]c                 C  s   t | sdS t| rdS dS )NFT)r   is_response_format_paramr^   r2   r2   r3   rZ      s
    rZ   zTypeGuard[ResponseFormatParam]c                 C  s   t | S rY   )r   r^   r2   r2   r3   rb      s    rb   r   )rW   r*   c                 C  s2   t t| d}t|trdS t t|dp0dS )Nr,   Tr.   F)r   rQ   r1   rR   r   r"   )rW   rX   r2   r2   r3   r`      s    
r`   )r5   r[   r*   c                 C  sT   t | rttt| |S t| rBts2td|  t| 	|S td|  d S )Nz:Non BaseModel types are only supported with Pydantic v2 - z3Unable to automatically parse response format type )
r   r   r%   r   r   r   	TypeErrorpydanticTypeAdapterZvalidate_json)r5   r[   r2   r2   r3   r\      s    r\   z9type | completion_create_params.ResponseFormat | NotGivenzResponseFormatParam | NotGivenc                 C  sx   t | stS t| r| S tt| } d }t| r:| j}| }n(t| rT| j}t	| }nt
d|  dt||dddS )Nz#Unsupported response_format type - json_schemaT)Zschemar/   r.   )r+   rf   )r   r   rb   r   r+   r   __name__r   rd   re   rc   r   )r5   Zjson_schema_typer/   r2   r2   r3   type_to_response_format_param   s&    
rh   )A
__future__r   rU   typingr   r   r   r   Ztyping_extensionsr   r   r	   rd   Z_toolsr   _typesr   r   _utilsr   r   _compatr   r   Z_modelsr   Z	_pydanticr   r   r   Z
types.chatr   r   r   r   r   r   r   r   r   _exceptionsr    r!   Ztypes.shared_paramsr"   Z#types.chat.completion_create_paramsr#   ZResponseFormatParamZ,types.chat.chat_completion_message_tool_callr$   r%   r(   __annotations__r4   rJ   rP   rF   rH   rG   ra   rZ   rb   r`   r\   rh   r2   r2   r2   r3   <module>   sF    ,J