a
    f,                     @  sB  d dl mZ d dlZd dlZd dlZd dl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 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 e
d	Ze
d
eedf dZe
de	e ef dZ!e
dee dZ"e
dedef dZ#dddddZ$ddddddZ%ddd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/d0Z*d1d2d$d3d4Z+dd5d$d6d7Z,d8d9d$d:d;Z-dd<d$d=d>Z.dd?d$d@dAZ/ddBd$dCdDZ0d	d	dEdFdGZ1dHdIdJddKdKdKdLdMdNZ2dKdKdOdPdQZ3ddRdSdTdUZ4e
dVZ5e
dWZ6edXdXd$dYdZZ7ed[d\d$d]dZZ7eddd$d^dZZ7d_dd$d`dZZ7dKddadbdcZ8dKdddadedfZ9dKdgdadhdiZ:ddjdadkdlZ;ddmdadndoZ<ddpdadqdrZ=dKdKdKdsdtduZ>dKdKdKdvdwdxZ?dKdydzd{d|Z@d}dKdKd~ddZAdKdddZBdddjdRdddZCdS )    )annotationsN)	AnyTupleMappingTypeVarCallableIterableSequencecastoverload)Path)	TypeGuard   )NotGiven	FileTypes
NotGivenOrHeadersLike)
parse_dateparse_datetime_T_TupleT.)bound	_MappingT
_SequenceT	CallableTzIterable[Iterable[_T]]zlist[_T])treturnc                 C  s   dd | D S )Nc                 S  s   g | ]}|D ]}|qqS  r   ).0Zsublistitemr   r   M/var/www/ai-form-bot/venv/lib/python3.9/site-packages/openai/_utils/_utils.py
<listcomp>"       zflatten.<locals>.<listcomp>r   )r   r   r   r    flatten!   s    r#   zMapping[str, object]zSequence[Sequence[str]]zlist[tuple[str, FileTypes]])querypathsr   c             	   C  s(   g }|D ]}| t| |ddd q|S )zRecursively extract files from the given dictionary based on specified paths.

    A path may look like this ['foo', 'files', '<array>', 'data'].

    Note: this mutates the given dictionary.
    r   Nindexflattened_key)extend_extract_items)r$   r%   filespathr   r   r    extract_files%   s    r-   objectzSequence[str]intz
str | None)objr,   r'   r(   r   c                  s  z }W nX t yd   t| tr,g  Y S ddlm} ||  d  d usPJ  tt| fg Y S 0 d7 t| rz$tkr| 	|}n| | }W n t
y   g  Y S 0  d u r| n d| d7  t| dS t| r|dk rg S t fd	d
| D S g S )Nr   )assert_is_file_content)key   []r&   z<array>c                   s,   g | ]$}t | d ur  d nddqS )Nz[]r&   )r*   )r   r   r(   r'   r,   r   r    r!   j   s   z"_extract_items.<locals>.<listcomp>)
IndexError
isinstancer   _filesr1   r
   r   is_dictlenpopKeyErrorr*   is_listr#   )r0   r,   r'   r(   r2   r1   r   r   r6   r    r*   8   sF    



r*   zNotGivenOr[_T]zTypeGuard[_T])r0   r   c                 C  s   t | t S Nr8   r   r0   r   r   r    is_giveny   s    rB   zTypeGuard[tuple[object, ...]]c                 C  s
   t | tS r?   r8   tuplerA   r   r   r    is_tuple   s    rE   z_TupleT | objectzTypeGuard[_TupleT]c                 C  s
   t | tS r?   rC   rA   r   r   r    
is_tuple_t   s    rF   zTypeGuard[Sequence[object]]c                 C  s
   t | tS r?   r8   r	   rA   r   r   r    is_sequence   s    rH   z_SequenceT | objectzTypeGuard[_SequenceT]c                 C  s
   t | tS r?   rG   rA   r   r   r    is_sequence_t   s    rI   zTypeGuard[Mapping[str, object]]c                 C  s
   t | tS r?   r8   r   rA   r   r   r    
is_mapping   s    rK   z_MappingT | objectzTypeGuard[_MappingT]c                 C  s
   t | tS r?   rJ   rA   r   r   r    is_mapping_t   s    rL   zTypeGuard[dict[object, object]]c                 C  s
   t | tS r?   )r8   dictrA   r   r   r    r:      s    r:   zTypeGuard[list[object]]c                 C  s
   t | tS r?   )r8   listrA   r   r   r    r>      s    r>   zTypeGuard[Iterable[object]]c                 C  s
   t | tS r?   )r8   r   rA   r   r   r    is_iterable   s    rO   )r   r   c                 C  s@   t | r ttdd |  D S t| r<ttdd | D S | S )zMinimal reimplementation of copy.deepcopy() that will only copy certain object types:

    - mappings, e.g. `dict`
    - list

    This is done for performance reasons.
    c                 S  s   i | ]\}}|t |qS r   deepcopy_minimal)r   kvr   r   r    
<dictcomp>   r"   z$deepcopy_minimal.<locals>.<dictcomp>c                 S  s   g | ]}t |qS r   rP   )r   entryr   r   r    r!      r"   z$deepcopy_minimal.<locals>.<listcomp>)rK   r
   r   itemsr>   )r   r   r   r    rQ      s
    rQ   z, or)delimfinalstr)seqrX   rY   r   c                C  sn   t | }|dkrdS |dkr$| d S |dkrH| d  d| d| d  S || d d d| d| d   S )Nr    r3   r    )r;   join)r[   rX   rY   sizer   r   r    
human_join   s    ra   )stringr   c                 C  s   d|  dS )zOAdd single quotation marks around the given string. Does *not* do any escaping.'r   )rb   r   r   r    quote   s    rd   z Callable[[CallableT], CallableT])variantsr   c                    s   ddd fdd}|S )a4  Decorator to enforce a given set of arguments or variants of arguments are passed to the decorated function.

    Useful for enforcing runtime validation of overloaded functions.

    Example usage:
    ```py
    @overload
    def foo(*, a: str) -> str: ...


    @overload
    def foo(*, b: bool) -> str: ...


    # This enforces the same constraints that a static type checker would
    # i.e. that either a or b must be passed to the function
    @required_args(["a"], ["b"])
    def foo(*, a: str | None = None, b: bool | None = None) -> str: ...
    ```
    r   )funcr   c                   sF   t  j}dd | D t dddd fdd}|S )Nc                 S  s&   g | ]\}}|j |j|jhv r|qS r   )kindPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORD)r   nameparamr   r   r    r!      s   z0required_args.<locals>.inner.<locals>.<listcomp>r.   )argskwargsr   c            
        sF  t   t| D ]T\}}z |  W q ty`   tj dt dt|  dd Y q0 q| D ]} | qlD ]$}t fdd|D }|r q8qtdkrt	dd D }d	| d
}n^tdksJ t
t d   }	t|	dkrdt	dd |	D  }ndt|	d  }t|| i |S )Nz	() takes z argument(s) but z were givenc                 3  s   | ]}| v V  qd S r?   r   )r   rk   Zgiven_paramsr   r    	<genexpr>   r"   z@required_args.<locals>.inner.<locals>.wrapper.<locals>.<genexpr>r3   c                 S  s*   g | ]"}d t dd |D dd d qS )(c                 S  s   g | ]}t |qS r   rd   r   argr   r   r    r!     r"   zLrequired_args.<locals>.inner.<locals>.wrapper.<locals>.<listcomp>.<listcomp>and)rY   ))ra   )r   variantr   r   r    r!     r"   zArequired_args.<locals>.inner.<locals>.wrapper.<locals>.<listcomp>z,Missing required arguments; Expected either z arguments to be givenr   zMissing required arguments: c                 S  s   g | ]}t |qS r   rq   rr   r   r   r    r!     r"   zMissing required argument: )set	enumerateaddr7   	TypeError__name__r;   keysallra   rN   rd   )
rl   rm   i_r2   rv   matchesZ
variationsmsgmissing)rf   
positionalre   rn   r    wrapper   s8    
z-required_args.<locals>.inner.<locals>.wrapper)inspect	signature
parametersrV   	functoolswraps)rf   paramsr   re   )rf   r   r    inner   s    
#zrequired_args.<locals>.innerr   )re   r   r   r   r    required_args   s    2r   _K_VNonec                 C  s   d S r?   r   rA   r   r   r    strip_not_given  s    r   zMapping[_K, _V | NotGiven]zdict[_K, _V]c                 C  s   d S r?   r   rA   r   r   r    r   !  s    c                 C  s   d S r?   r   rA   r   r   r    r   %  s    zobject | Nonec                 C  s*   | du rdS t | s| S dd |  D S )zHRemove all top-level keys where their values are instances of `NotGiven`Nc                 S  s    i | ]\}}t |ts||qS r   r@   )r   r2   valuer   r   r    rT   1  r"   z#strip_not_given.<locals>.<dictcomp>)rK   rV   rA   r   r   r    r   )  s
    )valr   c                 C  s   t | ddS )N
   )base)r/   r   r   r   r    coerce_integer4  s    r   floatc                 C  s   t | S r?   )r   r   r   r   r    coerce_float8  s    r   boolc                 C  s   | dkp| dkp| dkS )Ntrue1onr   r   r   r   r    coerce_boolean<  s    r   z
int | Nonec                 C  s   | d u rd S t | S r?   )r   r   r   r   r    maybe_coerce_integer@  s    r   zfloat | Nonec                 C  s   | d u rd S t | S r?   )r   r   r   r   r    maybe_coerce_floatF  s    r   zbool | Nonec                 C  s   | d u rd S t | S r?   )r   r   r   r   r    maybe_coerce_booleanL  s    r   )rb   prefixr   c                 C  s   |  |r| t|d S | S )zXRemove a prefix from a string.

    Backport of `str.removeprefix` for Python < 3.9
    N)
startswithr;   )rb   r   r   r   r    removeprefixR  s    
r   )rb   suffixr   c                 C  s    |  |r| dt|  S | S )zXRemove a suffix from a string.

    Backport of `str.removesuffix` for Python < 3.9
    N)endswithr;   )rb   r   r   r   r    removesuffix\  s    
r   r   )r,   r   c                 C  s    t |  }tj| }||fS r?   )r   
read_bytesosr,   basename)r,   contents	file_namer   r   r    file_from_pathf  s    r   r   )headersheaderr   c                 C  s   |  }t| trB|  D ]&\}}|  |krt|tr|  S qtddd | }||| |fD ]}| 	|}|rh|  S qht
d| dd S )Nz([^\w])(\w)c                 S  s   |  d|  d  S )Nr3   r   )groupupper)patr   r   r    <lambda>t  r"   z%get_required_header.<locals>.<lambda>zCould not find z header)lowerr8   r   rV   rZ   resub
capitalizer   get
ValueError)r   r   Zlower_headerrR   rS   Zintercaps_headerZnormalized_headerr   r   r   r    get_required_headerl  s    



r   )r   c                   C  s$   z
t  W S  ty   Y dS 0 d S )Nfalse)sniffioZcurrent_async_library	Exceptionr   r   r   r    get_async_library~  s    
r      maxsize)r   r   c                 C  s   t j| d}tt|S )zmA version of functools.lru_cache that retains the type signature
    for the wrapped function arguments.
    r   )r   	lru_cacher
   r   )r   r   r   r   r    r     s    r   )D
__future__r   r   r   r   r   typingr   r   r   r   r   r   r	   r
   r   pathlibr   typing_extensionsr   r   _typesr   r   r   r   _compatr   r   r   r.   r   rZ   r   r   r   r#   r-   r*   rB   rE   rF   rH   rI   rK   rL   r:   r>   rO   rQ   ra   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    <module>   sj   ,AK

