a
    f!                     @  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 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$ ddl%m&Z&m'Z' ddl(m)Z) ddl*m+Z, ddl-m.Z. e	dddZ/dZ0de1d< efdddddZ2dddddddZ3d d!d"d#d$d%Z4d d&d'd(d)d*Z5d+d,d-d.d/d0Z6d+d1d2d3d4Z7ed5d6dd7d8d9d:Z8d+d;d2d<d=Z9d'd>d2d?d@Z:dAd7dBdCdDZ;dEdFdGdHdIZ<d1d!ddJdKdLZ=dMdNd2dOdPZ>dS )Q    )annotationsN)TYPE_CHECKINGAnyIterablecast)TypeVar	TypeGuardassert_never   )PydanticFunctionTool   )	NOT_GIVENNotGiven)is_dictis_given)model_parse_json)construct_type_unchecked)to_strict_json_schema)	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u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+    r/   Y/var/www/ai-form-bot/venv/lib/python3.9/site-packages/openai/lib/_parsing/_completions.pyvalidate_input_tools'   s    r1   zJtype[ResponseFormatT] | completion_create_params.ResponseFormat | NotGivenz-ChatCompletion | ParsedChatCompletion[object]z%ParsedChatCompletion[ResponseFormatT])response_formatinput_toolschat_completionr'   c           	      C  sP  t |rdd |D }ng }g }|jD ]}|jdkr:t |jdkrJt |j}g }|jr|jD ]n}|jdkr| }|	t
i |di tt|d dt||jdiitd q`trt| q`|	| q`|	t
tttt|  i | d	i | t| |d
|did q&ttt t
tttt|  i | d|idS )Nc                 S  s   g | ]}|qS r/   r/   .0tr/   r/   r0   
<listcomp>A       z)parse_chat_completion.<locals>.<listcomp>lengthZcontent_filterr)   Zparsed_arguments)r3   r)   )valuetype_messager2   r=   )parsed
tool_calls)r<   r;   choices)r   rA   Zfinish_reasonr   r   r=   r@   r(   to_dictappendr   r   r   parse_function_tool_argumentsr)   r   r   r	   r   solve_response_format_tmaybe_parse_contentr   r"   )	r2   r3   r4   rA   choicer=   r@   Z	tool_callZtool_call_dictr/   r/   r0   parse_chat_completion:   s~    




	
rH   zlist[ChatCompletionToolParam]strzChatCompletionToolParam | None)r3   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)r.   r5   r,   r/   r0   	<genexpr>   r9   z)get_input_tool_by_name.<locals>.<genexpr>)nextr3   r,   r/   rJ   r0   get_input_tool_by_name   s    rN   zFunction | ParsedFunctionobject)r3   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 )NrM   r)   r+   )rN   r,   r   rO   r.   
isinstancer   r   model	argumentsr   jsonloads)r3   r)   
input_toolinput_fnr/   r/   r0   rD      s    


rD   z6type[ResponseFormatT] | ResponseFormatParam | NotGivenz;ChatCompletionMessage | ParsedChatCompletionMessage[object]zResponseFormatT | None)r2   r=   r'   c                 C  s(   t | r$|jd ur$|js$t| |jS d S N)has_rich_response_formatcontentZrefusal_parse_contentr>   r/   r/   r0   rF      s    rF   type[ResponseFormatT])r2   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[   )rX   r   r%   r2   r/   r/   r0   rE      s    rE   )r3   z%type | ResponseFormatParam | NotGivenbool)r2   r3   r'   c                 C  s,   t | rdS |pg D ]}t|r dS qdS )NTF)rX   is_parseable_tool)r2   r3   rU   r/   r/   r0   has_parseable_input   s    r_   z TypeGuard[type[ResponseFormatT]]c                 C  s   t | sdS t| rdS dS )NFT)r   is_response_format_paramr\   r/   r/   r0   rX      s
    rX   zTypeGuard[ResponseFormatParam]c                 C  s   t | S rW   )r   r\   r/   r/   r0   r`      s    r`   r   )rU   r'   c                 C  s2   t t| d}t|trdS t t|dp0dS )Nr)   Tr+   F)r   rO   r.   rP   r   r   )rU   rV   r/   r/   r0   r^      s    
r^   r(   z#TypeGuard[type[pydantic.BaseModel]])typr'   c                 C  s   t | tjS rW   )
issubclasspydanticZ	BaseModel)ra   r/   r/   r0   is_basemodel_type   s    rd   )r2   rY   r'   c                 C  s*   t | rttt| |S td|  d S )Nz3Unable to automatically parse response format type )rd   r   r"   r   	TypeError)r2   rY   r/   r/   r0   rZ      s    rZ   z9type | completion_create_params.ResponseFormat | NotGivenzResponseFormatParam | NotGivenc                 C  sP   t | stS t| r| S tt| } t| s8td|  dt| | jdddS )Nz#Unsupported response_format type - json_schemaT)Zschemar,   r+   )r(   rf   )	r   r   r`   r   r(   rd   re   r   __name__r\   r/   r/   r0   type_to_response_format_param   s    
rh   )?
__future__r   rS   typingr   r   r   r   typing_extensionsr   r   r	   rc   Z_toolsr   _typesr   r   Z_utilsr   r   _compatr   Z_modelsr   Z	_pydanticr   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__r1   rH   rN   rD   rF   rE   r_   rX   r`   r^   rd   rZ   rh   r/   r/   r/   r0   <module>   sF   ,J