o
    :/i;                     @   s2  d Z ddlZddlZddlZddl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 ddlmZmZmZmZ ddlmZ ddlmZmZmZmZmZ ddlZddlmZ ddlmZ dd	l m!Z" dd
l m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z* e*e+Z,erddl-m.Z. neZ.e/e. Z0ede.dZ1e%e"fd	dGddde/e1 dB dedB dede/e1 e
e/e1 ge/e1 f B fddZ2de0de3defddZ4de0de3de5fddZ6de1de1fddZ7			dHd e8d!ee3 d"edB d#e
g ef dB d$e5defd%d&Z9de/e de:e3e3f fd'd(Z;e&G d)d* d*eZ<G d+d, d,eZ=de1d-e:e3ef de1fd.d/Z>d0d1 Z?de1d2e@e3 de:e3e8f fd3d4ZAd5e:e3e8f de3fd6d7ZBeG d8d9 d9ZCde1d:e3d;e3eDe3 B d<e3ddf
d=d>ZE	dGd?e3d<e3d@e3dB de3dB fdAdBZF		dIde1d?e3d<e3d@e3dCe5dDe5ddfdEdFZGdS )Jz.Utility functions for vLLM config dataclasses.    N)CallableMappingSequenceSet)MISSINGfieldfieldsis_dataclass)pairwise)TYPE_CHECKINGAnyProtocolTypeVarcast)
ConfigDict	dataclass)Field)	FieldInfo)dataclass_transformruntime_checkable)init_logger)DataclassInstanceConfigT)bound)field_specifiers)configclsr   kwargsreturnc                   s>   t dd|dur|  fdd}| du r|S || S )a  Decorator to create a pydantic dataclass with default config. The default config
    for the dataclass forbids extra fields.

    All config classes in vLLM should use this decorator.

    Args:
        cls: The class to decorate
        config: The pydantic ConfigDict to use. If provided, it will be merged with
            the default config.
        **kwargs: Additional arguments to pass to pydantic.dataclass.forbid)extraNc                    s   t | fdi S )Nr   r   r   r   merged_config ^/lsinfo/ai/hellotax_ai/llm_service/venv_vllm/lib/python3.10/site-packages/vllm/config/utils.py	decorator=   s   zconfig.<locals>.decorator)r   update)r   r   r   r'   r%   r#   r&   r   '   s   

namec              
      s   t | stdzt fddt| D }W n ty0 } ztd  d| j d|d}~ww |j}|j}|j	}t
|tr\|j	durG|j	}|jdurYttg tf |j}t}n|j}|tu rl|tu rltd| j  t|||d	S )
zrGet the default factory field of a dataclass by name. Used for getting
    default factory fields in `EngineArgs`.z#The given class is not a dataclass.c                 3   s    | ]
}|j  kr|V  qd S Nr)   .0fr+   r%   r&   	<genexpr>M   s    zget_field.<locals>.<genexpr>zField 'z' not found in .Nz(%s.%s has no default or default factory.)defaultdefault_factoryinit)r	   	TypeErrornextr   StopIteration
ValueError__name__r1   r2   r3   
isinstancer   r   r   r   r   loggerwarning_oncer   )r   r)   named_fielder1   r2   r3   r%   r+   r&   	get_fieldG   s.   


r>   c                 C   s   t | |jS r*   )r>   r3   )r   r)   r%   r%   r&   is_init_fieldg      r?   dataclass_instancec                   s<   t |  | j} fdd| D }||  di |S )zLike [`dataclasses.replace`](https://docs.python.org/3/library/dataclasses.html#dataclasses.replace),
    but compatible with Pydantic dataclasses which use `pydantic.fields.Field` instead
    of `dataclasses.field`c                    s    i | ]\}}t  |r||qS r%   )r?   r-   kvr"   r%   r&   
<dictcomp>q   s     zreplace.<locals>.<dictcomp>Nr%   )type__dict__itemsr(   )rA   r   dataclass_dictr%   r"   r&   replacek   s
   
rJ   Fobjectnamesr1   r2   warnc                 C   sb   t |D ]#\}}t| |r'|r |dkr tdt| j||d  t| |  S q|dur/| S |S )a  
    A helper function that retrieves an attribute from an object which may
    have multiple possible names. This is useful when fetching attributes from
    arbitrary `transformers.PretrainedConfig` instances.

    In the case where the first name in `names` is the preferred name, and
    any other names are deprecated aliases, setting `warn=True` will log a
    warning when a deprecated name is used.
    r   zc%s contains a deprecated attribute name '%s'. Please use the preferred attribute name '%s' instead.N)	enumeratehasattrr:   r;   rF   r8   getattr)rK   rL   r1   r2   rM   ir)   r%   r%   r&   getattr_iterv   s   

rR   c                 C   s   t tt| jd }t|t jst	di }t
|jD ]G\}}t|t jt jfr@t|t jr@t|jt jr@t|jjtsAqt|jj}t|t jrQ|jn|jg}|D ]}t|t js`qW|||j< qWq|S )zw
    Get any docstrings placed after attribute assignments in a class body.

    https://davidism.com/mit-license/
    r   zGiven object was not a class.)astparsetextwrapdedentinspect	getsourcebodyr9   ClassDefr4   r
   Assign	AnnAssignExprvalueConstantstrcleandoctargetstargetNameid)r   cls_nodeoutabdocrb   rc   r%   r%   r&   get_attr_docs   s,   
rk   c                   @   s   e Zd ZdefddZdS )SupportsHashr   c                 C      d S r*   r%   selfr%   r%   r&   compute_hash       zSupportsHash.compute_hashN)r8   
__module____qualname__r`   rp   r%   r%   r%   r&   rl      s    rl   c                   @   s"   e Zd Zdeeef fddZdS )SupportsMetricsInfor   c                 C   rm   r*   r%   rn   r%   r%   r&   metrics_info   rq   z SupportsMetricsInfo.metrics_infoN)r8   rr   rs   dictr`   ru   r%   r%   r%   r&   rt      s    rt   	overridesc                 C   s   i }|  D ]F\}}t| |sJ t|  d| dt| |}t|rHt|sHt|tsCJ dt|  d| dt| dt| t||}|||< qt| fi |S )Nz has no field ``zOverrides to r0   z must be a dict  or z
, but got )	rH   rO   rF   rP   r	   r9   rv   update_configrJ   )r   rw   processed_overrides
field_namer^   current_valuer%   r%   r&   ry      s(   

ry   c                    s    du st  ttttfr S t  tjr' jj d jj	 }|t
 jfS t  trLt dd}t dt dd}ddd ||fD pKt S t d	r]tt d	dr]  S t retd
t  tjrot S t  ttfrz  S t  tjrz	t   W S  ty   t  Y S w t r jj d jj	 }t fddt t! dd dD }||fS t  t"rtt dd  # D S t  t$rtt dd  D S t  t%rt  tttfstdd  D S t drt j&r & S tdt j' d)zReturn a stable, JSON-serializable canonical form for hashing.
    Order: primitives, special types (Enum, callable, torch.dtype, Path), then
    generic containers (Mapping/Set/Sequence) with recursion.
    Nr0   rr    rs   r8   c                 S   s   g | ]}|r|qS r%   r%   )r-   pr%   r%   r&   
<listcomp>   s    z#normalize_value.<locals>.<listcomp>uuidz:normalize_value: function or callable instance unsupportedc                 3   s&    | ]}|j tt |j fV  qd S r*   )r)   normalize_valuerP   r,   xr%   r&   r/     s
    
z"normalize_value.<locals>.<genexpr>c                 S   s   | j S r*   r+   )r.   r%   r%   r&   <lambda>  s    z!normalize_value.<locals>.<lambda>)keyc                 s   s$    | ]\}}t |t|fV  qd S r*   )r`   r   rB   r%   r%   r&   r/     s   " c                 s   s    | ]	}t t|V  qd S r*   )reprr   r-   rD   r%   r%   r&   r/     s    c                 s   s    | ]}t |V  qd S r*   )r   r   r%   r%   r&   r/     s    to_json_stringz#normalize_value: unsupported type 'zi'. Ensure config values use supported primitives/containers or add a stable representation for this type.)(r9   boolintfloatr`   enumEnum	__class__rr   rs   r   r^   rF   rP   joinr   rO   callabler   r4   torchdtypebytes	bytearrayhexpathlibPath
expanduserresolve	Exceptionr	   tuplesortedr   r   rH   r   r   r   r8   )r   	enum_typemodulequaltype_fqnrH   r%   r   r&   r      sP   
	 

r   ignored_factorsc                 C   sx   i }t | D ]3}|j}||v rqt| |d}zt|||< W q ty9 } ztd| dt|j d|d}~ww |S )zGets the factors used for hashing a config class.
    - Includes all dataclass fields not in `ignored_factors`.
    - Errors on non-normalizable values.
    Nz,get_hash_factors: unsupported type for key 'z' ())r   r)   rP   r   r4   rF   r8   )r   r   factorsdc_fieldfactorr^   r=   r%   r%   r&   get_hash_factors0  s&   r   rH   c                 C   s   t tj| dd  S )z=Return a SHA-256 hex digest of the canonical items structure.T)	sort_keys)hashlibsha256jsondumpsencode	hexdigest)rH   r%   r%   r&   hash_factorsE     r   c                   @   s~   e Zd ZU dZeed< eed< defddZdedefdd	Zd
e	defddZ
defddZdefddZdefddZdS )RangezG
    A range of numbers.
    Inclusive of start, inclusive of end.
    startendr   c                 C   s   | j | jkS r*   r   r   rn   r%   r%   r&   is_single_sizeT  r@   zRange.is_single_sizesizec                 C   s   | j |  ko| jkS   S r*   r   )ro   r   r%   r%   r&   __contains__W  r   zRange.__contains__otherc                 C   s&   t |tsdS | j|jko| j|jkS )NF)r9   r   r   r   )ro   r   r%   r%   r&   __eq__[  s   
zRange.__eq__c                 C   s   t | j| jfS r*   )hashr   r   rn   r%   r%   r&   __hash__`  s   zRange.__hash__c                 C   s   d| j  d| j dS )N(, r   r   rn   r%   r%   r&   __str__c  s   zRange.__str__c                 C   s   |   S r*   )r   rn   r%   r%   r&   __repr__f  s   zRange.__repr__N)r8   rr   rs   __doc__r   __annotations__r   r   r   rK   r   r   r`   r   r   r%   r%   r%   r&   r   J  s   
 r   old_namenew_name_or_namesremoval_versionc                 C   sl   t | |}|d u rd S t|tr|g}n|}| d| dd| d}t| |D ]}t| || q+d S )Nz& is deprecated and will be removed in z. Use r   	 instead.)rP   r9   r`   r   r:   warningsetattr)r   r   r   r   old_val	new_namesmsgnew_namer%   r%   r&   handle_deprecatedj  s   


r   env_namer{   c                 C   sB   t | rtj| }|rd| dnd}td| || |S dS )aT  
    Get value from deprecated environment variable with warning.

    Args:
        env_name: Name of the deprecated environment variable
        removal_version: Version when it will be removed
        field_name: Name of the field to suggest as alternative

    Returns:
        The environment variable value if set, None otherwise
    z Please use r   r}   zHUsing %s environment variable is deprecated and will be removed in %s.%sN)envsis_setosenvirongetr:   r;   )r   r   r{   r^   alt_msgr%   r%   r&   get_from_deprecated_env_if_set  s   
r   to_boolto_intc                 C   sZ   |r|rt dt|||}|dur+|}|r| dv }n|r#t|}t| || dS dS )a  
    Set object field from deprecated environment variable with warning.

    Args:
        config: Config object to set the field on
        env_name: Name of the deprecated environment variable
        removal_version: Version when the env var will be removed
        field_name: Name of the field to set
        to_bool: Whether to convert the environment variable value to boolean
        to_int: Whether to convert the environment variable value to integer
    Returns:
        None
    z+Cannot convert to both boolean and integer.N)1true)r7   r   lowerr   r   )r   r   r   r{   r   r   	env_valuefield_valuer%   r%   r&   set_from_deprecated_env_if_set  s   r   r*   )NNF)FF)Hr   rS   r   r   rW   r   r   r   rU   collections.abcr   r   r   r   dataclassesr   r   r   r	   	itertoolsr
   typingr   r   r   r   r   r   pydanticr   pydantic.dataclassesr   pydantic.fieldsr   PydanticFieldr   typing_extensionsr   r   	vllm.envsr   vllm.loggerr   r8   r:   	_typeshedr   rF   
ConfigTyper   r   r`   r>   r   r?   rJ   rK   rR   rv   rk   rl   rt   ry   r   setr   r   r   listr   r   r   r%   r%   r%   r&   <module>   s   

 
)"V


"