o
    ?Hh0                     @  s  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mZ d dlmZ d dlmZ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&erddl'm(Z(m)Z) dddZ*dddZ+dd'd(Z,dd+d,Z-dd.d/Z.dd2d3Z/dd5d6Z0dd9d:Z1dd<d=Z2dd@dAZ3ddCdDZ4ddFdGZ5ddIdJZ6ddLdMZ7dNdOdPddUdVZ8ddXdYZ9dd\d]Z:ed^Z;ed_Z<eddadbZ=eddedbZ=eddfdbZ=ddhdbZ=ddjdkZ>ddmdnZ?ddpdqZ@ddsdtZAddvdwZBddydzZCdd|d}ZDdddZEdddZFdddZGdddZHdddddZIdddZJdddZKdddZLdS )    )annotationsN)
TYPE_CHECKINGAnyTupleMappingTypeVarCallableIterableSequencecastoverload)Path)datedatetime)	TypeGuard   )NotGiven	FileTypes
NotGivenOrHeadersLike)
parse_dateparse_datetime_T_TupleT.)bound	_MappingT
_SequenceT	CallableT)AzureOpenAIAsyncAzureOpenAI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$   T/home/air/sanwanet/gpt-api/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   r8   objobjectr7   Sequence[str]r2   intr3   
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   []r1   z<array>c                   s,   g | ]}t | d ur d nddqS )Nz[]r1   )r5   r%   r'   r3   r2   r7   r$   r(   r)   o   s    z"_extract_items.<locals>.<listcomp>)
IndexError
isinstancer   _filesr>   r   r   is_dictlenpopKeyErrorr5   is_listr+   )r9   r7   r2   r3   r?   r>   r'   r$   rD   r(   r5   =   sL   
r5   NotGivenOr[_T]TypeGuard[_T]c                 C  s   t | t S NrF   r   r9   r$   r$   r(   is_given~      rR   TypeGuard[tuple[object, ...]]c                 C  
   t | tS rO   rF   tuplerQ   r$   r$   r(   is_tuple      
rX   _TupleT | objectTypeGuard[_TupleT]c                 C  rU   rO   rV   rQ   r$   r$   r(   
is_tuple_t   rY   r\   TypeGuard[Sequence[object]]c                 C  rU   rO   rF   r
   rQ   r$   r$   r(   is_sequence   rY   r_   _SequenceT | objectTypeGuard[_SequenceT]c                 C  rU   rO   r^   rQ   r$   r$   r(   is_sequence_t   rY   rb   TypeGuard[Mapping[str, object]]c                 C  rU   rO   rF   r   rQ   r$   r$   r(   
is_mapping   rY   re   _MappingT | objectTypeGuard[_MappingT]c                 C  rU   rO   rd   rQ   r$   r$   r(   is_mapping_t   rY   rh   TypeGuard[dict[object, object]]c                 C  rU   rO   )rF   dictrQ   r$   r$   r(   rH      rY   rH   TypeGuard[list[object]]c                 C  rU   rO   )rF   listrQ   r$   r$   r(   rL      rY   rL   TypeGuard[Iterable[object]]c                 C  rU   rO   )rF   r	   rQ   r$   r$   r(   is_iterable   rY   rn   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$   ro   )r%   entryr$   r$   r(   r)          z$deepcopy_minimal.<locals>.<listcomp>)re   r   r   itemsrL   )r'   r$   r$   r(   rp      s
   rp   z, or)delimfinalseqry   strrz   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    )rI   join)r{   ry   rz   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>argsr:   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 rO   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  rt   r$   r   r%   argr$   r$   r(   r)   
  rv   zLrequired_args.<locals>.inner.<locals>.wrapper.<locals>.<listcomp>.<listcomp>and)rz   ))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  rt   r$   r   r   r$   r$   r(   r)     rv   zMissing required argument: )set	enumerateaddrE   	TypeError__name__rI   keysallr   rl   r   )
r   r   i_r?   r   matches
variationsmsgmissing)r   
positionalr   r   r(   wrapper   s@   
z-required_args.<locals>.inner.<locals>.wrapper)r   r:   r   r:   r"   r:   )inspect	signature
parametersrw   	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 rO   r$   rQ   r$   r$   r(   strip_not_given"     r   Mapping[_K, _V | NotGiven]dict[_K, _V]c                 C  r   rO   r$   rQ   r$   r$   r(   r   &  r   c                 C  r   rO   r$   rQ   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$   rP   r%   r?   valuer$   r$   r(   rs   6  s     z#strip_not_given.<locals>.<dictcomp>)re   rw   rQ   r$   r$   r(   r   .  s
   valc                 C  s   t | ddS )N
   )base)r<   r   r$   r$   r(   coerce_integer9  rS   r   floatc                 C  s   t | S rO   )r   r   r$   r$   r(   coerce_float=  s   r   boolc                 C  s   | dkp| dkp| dkS )Ntrue1onr$   r   r$   r$   r(   coerce_booleanA  s   r   
int | Nonec                 C     | d u rd S t | S rO   )r   r   r$   r$   r(   maybe_coerce_integerE     r   float | Nonec                 C  r   rO   )r   r   r$   r$   r(   maybe_coerce_floatK  r   r   bool | Nonec                 C  r   rO   )r   r   r$   r$   r(   maybe_coerce_booleanQ  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)
startswithrI   )r   r   r$   r$   r(   removeprefixW  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)endswithrI   )r   r   r$   r$   r(   removesuffixa  s   
r   r   c                 C  s    t |  }tj| }||fS rO   )r   
read_bytesosr7   basename)r7   contents	file_namer$   r$   r(   file_from_pathk  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>z  s    z%get_required_header.<locals>.<lambda>zCould not find z header)lowerrh   rw   rF   r|   resub
capitalizer   get
ValueError)r   r   lower_headerrq   rr   intercaps_headernormalized_headerr   r$   r$   r(   get_required_headerq  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   datac                 C  sZ   t | rdd |  D S t| r t| tttfs dd | D S t| ttfr+| 	 S | S )zvTranslates a mapping / sequence recursively in the same fashion
    as `pydantic` v2's `model_dump(mode="json")`.
    c                 S  s   i | ]\}}t |t |qS r$   	json_safer   r$   r$   r(   rs     s    zjson_safe.<locals>.<dictcomp>c                 S  rt   r$   r   rC   r$   r$   r(   r)     rv   zjson_safe.<locals>.<listcomp>)
re   rw   rn   rF   r|   bytes	bytearrayr   r   	isoformat)r   r$   r$   r(   r     s   r   clientTypeGuard[AzureOpenAI]c                 C     ddl m} t| |S )Nr   )r   )	lib.azurer   rF   )r   r   r$   r$   r(   is_azure_client     
r   TypeGuard[AsyncAzureOpenAI]c                 C  r   )Nr   )r   )r   r   rF   )r   r   r$   r$   r(   is_async_azure_client  r  r  )r    r!   r"   r#   )r,   r-   r.   r/   r"   r0   )
r9   r:   r7   r;   r2   r<   r3   r=   r"   r0   )r9   rM   r"   rN   )r9   r:   r"   rT   )r9   rZ   r"   r[   )r9   r:   r"   r]   )r9   r`   r"   ra   )r9   r:   r"   rc   )r9   rf   r"   rg   )r9   r:   r"   ri   )r9   r:   r"   rk   )r9   r:   r"   rm   )r'   r   r"   r   )r{   r;   ry   r|   rz   r|   r"   r|   )r   r|   r"   r|   )r   r;   r"   r   )r9   r   r"   r   )r9   r   r"   r   )r9   r:   r"   r:   )r9   r   r"   r:   )r   r|   r"   r<   )r   r|   r"   r   )r   r|   r"   r   )r   r=   r"   r   )r   r=   r"   r   )r   r=   r"   r   )r   r|   r   r|   r"   r|   )r   r|   r   r|   r"   r|   )r7   r|   r"   r   )r   r   r   r|   r"   r|   )r"   r|   )r   r   r"   r   )r   r:   r"   r:   )r   r:   r"   r   )r   r:   r"   r  )M
__future__r   r   r   r   r   typingr   r   r   r   r   r   r	   r
   r   r   pathlibr   r   r   typing_extensionsr   r   _typesr   r   r   r   _compatr   r   r   r:   r   r|   r   r   r   r   r   r   r+   r8   r5   rR   rX   r\   r_   rb   re   rh   rH   rL   rn   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r$   r$   r$   r(   <module>   sx    0



A











K
















