o
    i{1                     @  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 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+dd1d2Z,dd4d5Z-dd8d9Z.dd;d<Z/dd?d@Z0ddBdCZ1ddEdFZ2ddHdIZ3ddKdLZ4dMdNdOddTdUZ5ddWdXZ6dd[d\Z7ed]Z8ed^Z9edd`daZ:eddddaZ:eddedaZ:ddgdaZ:ddidjZ;ddldmZ<ddodpZ=ddrdsZ>ddudvZ?ddxdyZ@dd{d|ZAdd~dZBdddZCdddZDdddZEdddddZFdddZGdddZHdddZIdS )    )annotationsN)
TYPE_CHECKINGAnyTupleMappingTypeVarCallableIterableSequencecastoverload)Path)datedatetime)	TypeGuard   )OmitNotGiven	FileTypesHeadersLike_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"   ).0Zsublistitemr"   r"   N/home/kim/smarthome/.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   r5   objobjectr4   Sequence[str]r/   intr0   
str | Nonec          	   
     s^  z }W nR t yX   t| sg  Y S ddlm}  d us!J t| rHg }| D ]}|| r3 d ndd | d tt|f q)| Y S ||  d  tt| fg Y S w d7 t| rzt	krn| 
|}n| | }W n ty~   g  Y S w  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 )Nr<   r.   )r2   r#   r$   r0   r/   r4   r"   r%   r&   v   s    z"_extract_items.<locals>.<listcomp>)
IndexErroris_given_filesr;   is_listappendr   r   is_dictlenpopKeyErrorr2   r(   )	r6   r4   r/   r0   r>   r;   r3   entryr$   r"   rC   r%   r2   <   sX   r2   _T | NotGiven | OmitTypeGuard[_T]c                 C  s   t | t ot | t S N)
isinstancer   r   r6   r"   r"   r%   rE         rE   TypeGuard[tuple[object, ...]]c                 C  
   t | tS rP   rQ   tuplerR   r"   r"   r%   is_tuple      
rX   _TupleT | objectTypeGuard[_TupleT]c                 C  rU   rP   rV   rR   r"   r"   r%   
is_tuple_t   rY   r\   TypeGuard[Sequence[object]]c                 C  rU   rP   rQ   r
   rR   r"   r"   r%   is_sequence   rY   r_   _SequenceT | objectTypeGuard[_SequenceT]c                 C  rU   rP   r^   rR   r"   r"   r%   is_sequence_t   rY   rb   TypeGuard[Mapping[str, object]]c                 C  rU   rP   rQ   r   rR   r"   r"   r%   
is_mapping   rY   re   _MappingT | objectTypeGuard[_MappingT]c                 C  rU   rP   rd   rR   r"   r"   r%   is_mapping_t   rY   rh   TypeGuard[dict[object, object]]c                 C  rU   rP   )rQ   dictrR   r"   r"   r%   rI      rY   rI   TypeGuard[list[object]]c                 C  rU   rP   )rQ   listrR   r"   r"   r%   rG      rY   rG   TypeGuard[Iterable[object]]c                 C  rU   rP   )rQ   r	   rR   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#   rM   r"   r"   r%   r&          z$deepcopy_minimal.<locals>.<listcomp>)re   r   r   itemsrG   )r$   r"   r"   r%   rp      s
   rp   z, or)delimfinalseqrx   strry   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?   r    )rJ   join)rz   rx   ry   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>argsr7   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 rP   r"   )r#   r   Z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&     ru   zLrequired_args.<locals>.inner.<locals>.wrapper.<locals>.<listcomp>.<listcomp>and)ry   ))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&     ru   zMissing required argument: )set	enumerateaddrD   	TypeError__name__rJ   keysallr   rl   r   )
r   r   i_r>   r   matchesZ
variationsmsgmissing)r   
positionalr   r   r%   wrapper   s@   
z-required_args.<locals>.inner.<locals>.wrapper)r   r7   r   r7   r    r7   )inspect	signature
parametersrv   	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 rP   r"   rR   r"   r"   r%   strip_not_given)     r   Mapping[_K, _V | NotGiven]dict[_K, _V]c                 C  r   rP   r"   rR   r"   r"   r%   r   -  r   c                 C  r   rP   r"   rR   r"   r"   r%   r   1  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"   )rQ   r   r#   r>   valuer"   r"   r%   rs   =  s     z#strip_not_given.<locals>.<dictcomp>)re   rv   rR   r"   r"   r%   r   5  s
   valc                 C  s   t | ddS )N
   )base)r9   r   r"   r"   r%   coerce_integer@  s   r   floatc                 C  s   t | S rP   )r   r   r"   r"   r%   coerce_floatD  s   r   boolc                 C  s   | dkp| dkp| dkS )Ntrue1onr"   r   r"   r"   r%   coerce_booleanH  rS   r   
int | Nonec                 C     | d u rd S t | S rP   )r   r   r"   r"   r%   maybe_coerce_integerL     r   float | Nonec                 C  r   rP   )r   r   r"   r"   r%   maybe_coerce_floatR  r   r   bool | Nonec                 C  r   rP   )r   r   r"   r"   r%   maybe_coerce_booleanX  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)
startswithrJ   )r   r   r"   r"   r%   removeprefix^  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)endswithrJ   )r   r   r"   r"   r%   removesuffixh  s   
r   r   c                 C  s    t |  }tj| }||fS rP   )r   
read_bytesosr4   basename)r4   contents	file_namer"   r"   r%   file_from_pathr  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>  s    z%get_required_header.<locals>.<lambda>zCould not find z header)lowerrh   rv   rQ   r{   resub
capitalizer   get
ValueError)r   r   Zlower_headerrq   rr   Zintercaps_headerZnormalized_headerr   r"   r"   r%   get_required_headerx  s   
r   c                   C  s    zt  W S  ty   Y dS w )Nfalse)sniffioZ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   rB   r"   r"   r%   r&     ru   zjson_safe.<locals>.<listcomp>)
re   rv   rn   rQ   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   rQ   )r   r   r"   r"   r%   is_azure_client     
r   TypeGuard[AsyncAzureOpenAI]c                 C  r   )Nr   )r   )r   r   rQ   )r   r   r"   r"   r%   is_async_azure_client  r   r   )r   r   r    r!   )r)   r*   r+   r,   r    r-   )
r6   r7   r4   r8   r/   r9   r0   r:   r    r-   )r6   rN   r    rO   )r6   r7   r    rT   )r6   rZ   r    r[   )r6   r7   r    r]   )r6   r`   r    ra   )r6   r7   r    rc   )r6   rf   r    rg   )r6   r7   r    ri   )r6   r7   r    rk   )r6   r7   r    rm   )r$   r   r    r   )rz   r8   rx   r{   ry   r{   r    r{   )r   r{   r    r{   )r   r8   r    r   )r6   r   r    r   )r6   r   r    r   )r6   r7   r    r7   )r6   r   r    r7   )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{   )r4   r{   r    r   )r   r   r   r{   r    r{   )r    r{   )r   r   r    r   )r   r7   r    r7   )r   r7   r    r   )r   r7   r    r   )J
__future__r   r   r   r   r   typingr   r   r   r   r   r   r	   r
   r   r   pathlibr   r   r   Ztyping_extensionsr   r   _typesr   r   r   r   r   r7   r   r{   r   r   r   r   r   r   r(   r5   r2   rE   rX   r\   r_   rb   re   rh   rI   rG   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>   sv    0



I











K
















