o
    #`^h,                     @  sl  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#dddZ$dddZ%dd%d&Z&dd)d*Z'dd,d-Z(dd0d1Z)dd3d4Z*dd7d8Z+dd:d;Z,dd>d?Z-ddAdBZ.ddDdEZ/ddGdHZ0ddJdKZ1dLdMdNddSdTZ2ddVdWZ3ddZd[Z4e
d\Z5e
d]Z6edd_d`Z7eddcd`Z7edddd`Z7ddfd`Z7ddhdiZ8ddkdlZ9ddndoZ:ddqdrZ;ddtduZ<ddwdxZ=ddzd{Z>dd}d~Z?dddZ@dddZAdddZBddddd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	CallableTtIterable[Iterable[_T]]returnlist[_T]c                 C  s   dd | D S )Nc                 S  s   g | ]	}|D ]}|qqS  r   ).0sublistitemr   r   R/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/openai/_utils/_utils.py
<listcomp>"       zflatten.<locals>.<listcomp>r   )r   r   r   r#   flatten!   s   r&   queryMapping[str, object]pathsSequence[Sequence[str]]list[tuple[str, FileTypes]]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   r3   objobjectr2   Sequence[str]r-   intr.   
str | Nonec                  s  z }W n, t y2   t| trg  Y S ddlm} ||  d  d us(J  tt| fg Y S w d7 t| rpztkrH| 	|}n| | }W n t
yX   g  Y S w  d u r`| n d| d7  t| dS t| r|dkrzg 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,   )r0   )r    r"   r.   r-   r2   r   r#   r$   j   s    z"_extract_items.<locals>.<listcomp>)
IndexError
isinstancer   _filesr9   r
   r   is_dictlenpopKeyErrorr0   is_listr&   )r4   r2   r-   r.   r:   r9   r"   r   r>   r#   r0   8   sL   
r0   NotGivenOr[_T]TypeGuard[_T]c                 C  s   t | t S Nr@   r   r4   r   r   r#   is_giveny      rL   TypeGuard[tuple[object, ...]]c                 C  
   t | tS rI   r@   tuplerK   r   r   r#   is_tuple      
rR   _TupleT | objectTypeGuard[_TupleT]c                 C  rO   rI   rP   rK   r   r   r#   
is_tuple_t   rS   rV   TypeGuard[Sequence[object]]c                 C  rO   rI   r@   r	   rK   r   r   r#   is_sequence   rS   rY   _SequenceT | objectTypeGuard[_SequenceT]c                 C  rO   rI   rX   rK   r   r   r#   is_sequence_t   rS   r\   TypeGuard[Mapping[str, object]]c                 C  rO   rI   r@   r   rK   r   r   r#   
is_mapping   rS   r_   _MappingT | objectTypeGuard[_MappingT]c                 C  rO   rI   r^   rK   r   r   r#   is_mapping_t   rS   rb   TypeGuard[dict[object, object]]c                 C  rO   rI   )r@   dictrK   r   r   r#   rB      rS   rB   TypeGuard[list[object]]c                 C  rO   rI   )r@   listrK   r   r   r#   rF      rS   rF   TypeGuard[Iterable[object]]c                 C  rO   rI   )r@   r   rK   r   r   r#   is_iterable   rS   rh   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     g | ]}t |qS r   ri   )r    entryr   r   r#   r$          z$deepcopy_minimal.<locals>.<listcomp>)r_   r
   r   itemsrF   )r"   r   r   r#   rj      s
   rj   z, or)delimfinalseqrs   strrt   c                C  sn   t | }|dkr
dS |dkr| d S |dkr$| d  d| d| d  S || d d d| d| d   S )Nr    r;   r    )rC   join)ru   rs   rt   sizer   r   r#   
human_join   s   &r|   stringc                 C  s   d|  dS )zOAdd single quotation marks around the given string. Does *not* do any escaping.'r   )r}   r   r   r#   quote   s   r   variants Callable[[CallableT], CallableT]c                    s   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: ...
    ```
    funcr   r   c                   s>   t  j}dd | D t 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>argsr5   kwargsr   c            
        sH  t   t| D ]'\}}z	 |  W q ty.   tj dt dt|  dd w | D ]} | q3D ]}t fdd|D }|rN nOq=tdkrht	dd D }d	| d
}t|tdkspJ t
t d   }	t|	dkrdt	dd |	D  }t|dt|	d  }t|| i |S )Nz	() takes z argument(s) but z were givenc                 3  s    | ]}| v V  qd S rI   r   )r    r   given_paramsr   r#   	<genexpr>   s    z@required_args.<locals>.inner.<locals>.wrapper.<locals>.<genexpr>r;   c                 S  s*   g | ]}d t dd |D dd d qS )(c                 S  rn   r   r   r    argr   r   r#   r$     rp   zLrequired_args.<locals>.inner.<locals>.wrapper.<locals>.<listcomp>.<listcomp>and)rt   ))r|   )r    variantr   r   r#   r$     s   * 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  rn   r   r   r   r   r   r#   r$     rp   zMissing required argument: )set	enumerateaddr?   	TypeError__name__rC   keysallr|   rf   r   )
r   r   i_r:   r   matches
variationsmsgmissing)r   
positionalr   r   r#   wrapper   s@   
z-required_args.<locals>.inner.<locals>.wrapper)r   r5   r   r5   r   r5   )inspect	signature
parametersrq   	functoolswraps)r   paramsr   r   )r   r   r#   inner   s   
#zrequired_args.<locals>.innerN)r   r   r   r   r   )r   r   r   r   r#   required_args   s   2r   _K_VNonec                 C     d S rI   r   rK   r   r   r#   strip_not_given     r   Mapping[_K, _V | NotGiven]dict[_K, _V]c                 C  r   rI   r   rK   r   r   r#   r   !  r   c                 C  r   rI   r   rK   r   r   r#   r   %  r   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   rJ   )r    r:   valuer   r   r#   rm   1  s     z#strip_not_given.<locals>.<dictcomp>)r_   rq   rK   r   r   r#   r   )  s
   valc                 C  s   t | ddS )N
   )base)r7   r   r   r   r#   coerce_integer4  rM   r   floatc                 C  s   t | S rI   )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   
int | Nonec                 C     | d u rd S t | S rI   )r   r   r   r   r#   maybe_coerce_integer@     r   float | Nonec                 C  r   rI   )r   r   r   r   r#   maybe_coerce_floatF  r   r   bool | Nonec                 C  r   rI   )r   r   r   r   r#   maybe_coerce_booleanL  r   r   prefixc                 C  s   |  |r| t|d S | S )zXRemove a prefix from a string.

    Backport of `str.removeprefix` for Python < 3.9
    N)
startswithrC   )r}   r   r   r   r#   removeprefixR  s   
r   suffixc                 C  s    |  |r| dt|  S | S )zXRemove a suffix from a string.

    Backport of `str.removesuffix` for Python < 3.9
    N)endswithrC   )r}   r   r   r   r#   removesuffix\  s   
r   r   c                 C  s    t |  }tj| }||fS rI   )r   
read_bytesosr2   basename)r2   contents	file_namer   r   r#   file_from_pathf  s   r   headersr   headerc                 C  s   |  }t| r |  D ]\}}|  |krt|tr|  S qtddd | }||| |fD ]}| 	|}|r@|  S q3t
d| d)Nz([^\w])(\w)c                 S  s   |  d|  d  S )Nr;   r   )groupupper)patr   r   r#   <lambda>u  s    z%get_required_header.<locals>.<lambda>zCould not find z header)lowerrb   rq   r@   rv   resub
capitalizer   get
ValueError)r   r   lower_headerrk   rl   intercaps_headernormalized_headerr   r   r   r#   get_required_headerl  s   
r   c                   C  s    zt  W S  ty   Y dS w )Nfalse)sniffiocurrent_async_library	Exceptionr   r   r   r#   get_async_library  s
   
r      maxsizer   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   )r   r   r   r   )r'   r(   r)   r*   r   r+   )
r4   r5   r2   r6   r-   r7   r.   r8   r   r+   )r4   rG   r   rH   )r4   r5   r   rN   )r4   rT   r   rU   )r4   r5   r   rW   )r4   rZ   r   r[   )r4   r5   r   r]   )r4   r`   r   ra   )r4   r5   r   rc   )r4   r5   r   re   )r4   r5   r   rg   )r"   r   r   r   )ru   r6   rs   rv   rt   rv   r   rv   )r}   rv   r   rv   )r   r6   r   r   )r4   r   r   r   )r4   r   r   r   )r4   r5   r   r5   )r4   r   r   r5   )r   rv   r   r7   )r   rv   r   r   )r   rv   r   r   )r   r8   r   r   )r   r8   r   r   )r   r8   r   r   )r}   rv   r   rv   r   rv   )r}   rv   r   rv   r   rv   )r2   rv   r   r   )r   r   r   rv   r   rv   )r   rv   )r   r   r   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   r5   r   rv   r   r   r   r&   r3   r0   rL   rR   rV   rY   r\   r_   rb   rB   rF   rh   rj   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   <module>   sl    ,



A











K













