o
    #i)                     @  s  U d dl mZ d dl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(m)Z) ddl*m+Z+m,Z, ddl-m.Z. ddl/m0Z1 ddl2m3Z3 e
dddZ4dZ5de6d< e7dZ8de6d< dXddZ9efdYd"d#Z:efdYd$d%Z;dZd,d-Z<d[d2d3Z=d\d7d8Z>d]d=d>Z?d^d@dAZ@edBd_dEdFZAd`dHdIZBdadLdMZCdbdOdPZDdcdRdSZEdddVdWZFdS )e    )annotationsN)TYPE_CHECKINGAnyIterablecast)TypeVar	TypeGuardassert_never   )PydanticFunctionTool   )Omitomit)is_dictis_given)PYDANTIC_V1model_parse_json)construct_type_unchecked)is_basemodel_typeto_strict_json_schemais_dataclass_like_type)
ParsedChoiceChatCompletionParsedFunctionParsedChatCompletionChatCompletionMessageParsedFunctionToolCallParsedChatCompletionMessageChatCompletionToolUnionParamChatCompletionFunctionToolParamcompletion_create_params)LengthFinishReasonErrorContentFilterFinishReasonError)FunctionDefinition)ResponseFormat)FunctionResponseFormatT)defaultNone_default_response_formatzopenai.lib.parsingzlogging.Loggerlogtoolr   return*TypeGuard[ChatCompletionFunctionToolParam]c                 C  s*   | d dksdS | d  ddurdS dS )zDCheck if the given tool is a strict ChatCompletionFunctionToolParam.typefunctionFstrictTget)r+    r3   `/var/www/html/flask_server/venv/lib/python3.10/site-packages/openai/lib/_parsing/_completions.py$is_strict_chat_completion_tool_param+   s
   r5   tools-Iterable[ChatCompletionToolUnionParam] | Omit0Iterable[ChatCompletionFunctionToolParam] | Omitc                 C  s   t | stS dd | D S )zMSelect only the strict ChatCompletionFunctionToolParams from the given tools.c                 S  s   g | ]}t |r|qS r3   )r5   .0tr3   r3   r4   
<listcomp>>   s    z7select_strict_chat_completion_tools.<locals>.<listcomp>)r   r   )r6   r3   r3   r4   #select_strict_chat_completion_tools7   s   r=   c                 C  sr   t | stS | D ])}|d dkrtd|d  d|d d}|dur1td|d d  dqttt | S )	Nr.   r/   zECurrently only `function` tool types support auto-parsing; Received ``r0   Tnamez@` is not strict. Only `strict` function tools can be auto-parsed)r   r   
ValueErrorr2   r   r   r   )r6   r+   r0   r3   r3   r4   validate_input_toolsA   s   rA   response_formatFtype[ResponseFormatT] | completion_create_params.ResponseFormat | Omitinput_toolschat_completion-ChatCompletion | ParsedChatCompletion[object]%ParsedChatCompletion[ResponseFormatT]c           	      C  s  t |rdd |D }ng }g }|jD ]}|jdkrt|d|jdkr't |j}g }|jr||jD ]I}|jdkr]| }|	t
i |di tt|d dt||jdiitd	 q2|jd
krotjd|j|jjdd q2trvt| q2|	| q2|	t
tttt|  i | di | t| |d|r|nd did qttt t
tttt|  i | d|idS )Nc                 S  s   g | ]}|qS r3   r3   r9   r3   r3   r4   r<   ]   s    z)parse_chat_completion.<locals>.<listcomp>length)
completioncontent_filterr/   parsed_arguments)rD   r/   )valuetype_customz?Custom tool calls are not callable. Ignoring tool call: %s - %sr
   )
stacklevelmessagerB   rP   )parsed
tool_calls)rM   rL   choices)r   rT   finish_reasonr!   r"   rP   rS   r.   to_dictappendr   r   r   parse_function_tool_argumentsr/   r   r*   warningidrN   r?   r   r	   r   solve_response_format_tmaybe_parse_contentr   r&   )	rB   rD   rE   rT   choicerP   rS   	tool_calltool_call_dictr3   r3   r4   parse_chat_completionV   s   





	


r`   "list[ChatCompletionToolUnionParam]r?   str&ChatCompletionFunctionToolParam | Nonec                   s   t  fdd| D d S )Nc                 3  s6    | ]}|d  dkr| di  d kr|V  qdS )r.   r/   r?   Nr1   r9   r?   r3   r4   	<genexpr>   s   4 z)get_input_tool_by_name.<locals>.<genexpr>)nextrD   r?   r3   rd   r4   get_input_tool_by_name   s   rh   r/   Function | ParsedFunctionobject | Nonec                 C  sb   t | |jd}|sd S tt|d}t|trt|j|j	S tt
|}|ds+d S t|j	S )Nrg   r/   r0   )rh   r?   r   objectr2   
isinstancer   r   model	argumentsr#   jsonloads)rD   r/   
input_toolinput_fnr3   r3   r4   rX      s   


rX   2type[ResponseFormatT] | ResponseFormatParam | OmitrP   ;ChatCompletionMessage | ParsedChatCompletionMessage[object]ResponseFormatT | Nonec                 C  s$   t | r|jr|jst| |jS d S N)has_rich_response_formatcontentrefusal_parse_contentrQ   r3   r3   r4   r\      s   r\   type[ResponseFormatT]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{   )rw   r   r)   rB   r3   r3   r4   r[      s   
r[   )rD   !type | ResponseFormatParam | Omitboolc                 C  s,   t | rdS |p	g D ]	}t|r dS q
dS )NTF)rw   is_parseable_tool)rB   rD   rq   r3   r3   r4   has_parseable_input   s   r    TypeGuard[type[ResponseFormatT]]c                 C  s   t | sdS t| rdS dS )NFT)r   is_response_format_paramr|   r3   r3   r4   rw      s
   rw   rk   TypeGuard[ResponseFormatParam]c                 C  s   t | S rv   )r   r|   r3   r3   r4   r      s   r   rq   c                 C  sB   | d dkrdS t t| d}t|trdS t t|dp dS )Nr.   r/   FTr0   )r   rk   r2   rl   r   r#   )rq   rr   r3   r3   r4   r      s   
r   rx   c                 C  sP   t | rttt| |S t| r!trtd|  t| 	|S td|  )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TypeAdaptervalidate_json)rB   rx   r3   r3   r4   rz     s   rz   5type | completion_create_params.ResponseFormat | OmitResponseFormatParam | Omitc                 C  sx   t | stS t| r| S tt| } d }t| r| j}| }nt| r*| j}t	| }nt
d|  dt||dddS )Nz#Unsupported response_format type - json_schemaT)schemar?   r0   )r.   r   )r   r   r   r   r.   r   __name__r   r   r   r   r   )rB   json_schema_typer?   r3   r3   r4   type_to_response_format_param  s&   
r   )r+   r   r,   r-   )r6   r7   r,   r8   )rB   rC   rD   r7   rE   rF   r,   rG   )rD   ra   r?   rb   r,   rc   )rD   ra   r/   ri   r,   rj   )rB   rs   rP   rt   r,   ru   )rB   rs   r,   r{   )rB   r}   rD   r7   r,   r~   )rB   rs   r,   r   )rB   rk   r,   r   )rq   r   r,   r~   )rB   r{   rx   rb   r,   r&   )rB   r   r,   r   )G
__future__r   ro   loggingtypingr   r   r   r   typing_extensionsr   r   r	   r   _toolsr   _typesr   r   _utilsr   r   _compatr   r   _modelsr   	_pydanticr   r   r   
types.chatr   r   r   r   r   r   r   r   r   r    _exceptionsr!   r"   types.shared_paramsr#   #types.chat.completion_create_paramsr$   ResponseFormatParam5types.chat.chat_completion_message_function_tool_callr%   r&   r)   __annotations__	getLoggerr*   r5   r=   rA   r`   rh   rX   r\   r[   r   rw   r   r   rz   r   r3   r3   r3   r4   <module>   sP    0


R






