
    .`i%                        U d Z ddlmZ ddlmZmZ ddlmZmZ ddl	m
Z
 ddlmZ erddlmZ  e
e          Z G d d	e          Z G d
 dee          Z G d dee          Zej        j        ej        j        ej        j        ej        j        ej        j        ej        j        dZi Zeeef         ed<   i Z eeef         ed<   	 	 ddeez  dedz  de!dee"ge"f         fdZ#dS )zAttention backend registry    )Callable)EnumEnumMeta)TYPE_CHECKINGcast)init_logger)resolve_obj_by_qualname)AttentionBackendc                   (     e Zd ZdZdef fdZ xZS )_AttentionBackendEnumMetazDMetaclass for AttentionBackendEnum to provide better error messages.namec                    	 t                                          |          S # t          $ rS t          d| j                                                  }d                    |          }t          d| d|           dw xY w)z0Get backend by name with helpful error messages.zdict[str, Enum]z, zUnknown attention backend: 'z'. Valid options are: N)super__getitem__KeyErrorr   __members__keysjoin
ValueError)clsr   membersvalid_backends	__class__s       w/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/vllm/v1/attention/backends/registry.pyr   z%_AttentionBackendEnumMeta.__getitem__   s    	77&&t,,, 	 	 	,co>>CCEEG!YYw//N7t 7 7&47 7  	s
    $ AB)__name__
__module____qualname____doc__strr   __classcell__)r   s   @r   r   r      sJ        NN
s 
 
 
 
 
 
 
 
 
 
    r   c                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd!dedefdZd"dZdefdZd#d Z dS )$AttentionBackendEnuma  Enumeration of all supported attention backends.

    The enum value is the default class path, but this can be overridden
    at runtime using register_backend().

    To get the actual backend class (respecting overrides), use:
        backend.get_class()
    z;vllm.v1.attention.backends.flash_attn.FlashAttentionBackendzHvllm.v1.attention.backends.flash_attn_diffkv.FlashAttentionDiffKVBackendz=vllm.v1.attention.backends.triton_attn.TritonAttentionBackendz9vllm.v1.attention.backends.rocm_attn.RocmAttentionBackendz=vllm.v1.attention.backends.mla.rocm_aiter_mla.AiterMLABackendzEvllm.v1.attention.backends.mla.aiter_triton_mla.AiterTritonMLABackendzCvllm.v1.attention.backends.rocm_aiter_fa.AiterFlashAttentionBackendzNvllm.v1.attention.backends.mla.rocm_aiter_mla_sparse.ROCMAiterMLASparseBackend z7vllm.v1.attention.backends.flashinfer.FlashInferBackendzBvllm.v1.attention.backends.mla.flashinfer_mla.FlashInferMLABackendz:vllm.v1.attention.backends.mla.triton_mla.TritonMLABackendz<vllm.v1.attention.backends.mla.cutlass_mla.CutlassMLABackendz7vllm.v1.attention.backends.mla.flashmla.FlashMLABackendzDvllm.v1.attention.backends.mla.flashmla_sparse.FlashMLASparseBackendz@vllm.v1.attention.backends.mla.flashattn_mla.FlashAttnMLABackendz4vllm.v1.attention.backends.ipex.IpexAttentionBackendz:vllm.v1.attention.backends.no_attention.NoAttentionBackendz>vllm.v1.attention.backends.flex_attention.FlexAttentionBackendz9vllm.v1.attention.backends.tree_attn.TreeAttentionBackendzSvllm.v1.attention.backends.rocm_aiter_unified_attn.RocmAiterUnifiedAttentionBackendz7vllm.v1.attention.backends.cpu_attn.CPUAttentionBackendNTinclude_classnamereturnc                     t                               | | j                  }|s t          d| j         d| j         d          |s|                    dd          d         }|S zGet the class path for this backend (respects overrides).

        Returns:
            The fully qualified class path string

        Raises:
            ValueError: If Backend.CUSTOM is used without being registered
        zBackend z= must be registered before use. Use register_backend(Backend.z, 'your.module.YourClass').   r   )_ATTN_OVERRIDESgetvaluer   r   rsplitselfr%   paths      r   get_pathzAttentionBackendEnum.get_pathU   s     ""444 	V49 V V04	V V V   ! 	*;;sA&&q)Dr!   type[AttentionBackend]c                 D    t          |                                           S a  Get the backend class (respects overrides).

        Returns:
            The backend class

        Raises:
            ImportError: If the backend class cannot be imported
            ValueError: If Backend.CUSTOM is used without being registered
        r	   r2   r0   s    r   	get_classzAttentionBackendEnum.get_classh        't}}777r!   c                     | t           v S zCheck if this backend has been overridden.

        Returns:
            True if the backend has a registered override
        )r+   r7   s    r   is_overriddenz"AttentionBackendEnum.is_overriddent   s     &&r!   c                 <    t                               | d           dS z>Clear any override for this backend, reverting to the default.N)r+   popr7   s    r   clear_overridez#AttentionBackendEnum.clear_override|   s    D$'''''r!   Tr&   r3   r&   N)!r   r   r   r   
FLASH_ATTNFLASH_ATTN_DIFFKVTRITON_ATTN	ROCM_ATTNROCM_AITER_MLAROCM_AITER_TRITON_MLAROCM_AITER_FAROCM_AITER_MLA_SPARSE
TORCH_SDPA
FLASHINFERFLASHINFER_MLA
TRITON_MLACUTLASS_MLAFLASHMLAFLASHMLA_SPARSEFLASH_ATTN_MLAIPEXNO_ATTENTIONFLEX_ATTENTION	TREE_ATTNROCM_AITER_UNIFIED_ATTNCPU_ATTNCUSTOMboolr   r2   r8   r<   r@    r!   r   r#   r#   "   s+         OJR  RKKITNO  	N  	Y  JJJL  NJPKHHN  XNADOLUNKI	+  IH F $ #    &
8 
8 
8 
8't ' ' ' '( ( ( ( ( (r!   r#   )	metaclassc                   X    e Zd ZdZdZdZdZdZdZdZ	dd	e
d
efdZddZd
e
fdZddZdS )MambaAttentionBackendEnuma  Enumeration of all supported mamba attention backends.

    The enum value is the default class path, but this can be overridden
    at runtime using register_backend().

    To get the actual backend class (respecting overrides), use:
        backend.get_class()
    z=vllm.v1.attention.backends.mamba1_attn.Mamba1AttentionBackendz=vllm.v1.attention.backends.mamba2_attn.Mamba2AttentionBackendzDvllm.v1.attention.backends.short_conv_attn.ShortConvAttentionBackendz=vllm.v1.attention.backends.linear_attn.LinearAttentionBackendz7vllm.v1.attention.backends.gdn_attn.GDNAttentionBackendNTr%   r&   c                     t                               | | j                  }|s t          d| j         d| j         d          |s|                    dd          d         }|S r(   )_MAMBA_ATTN_OVERRIDESr,   r-   r   r   r.   r/   s      r   r2   z"MambaAttentionBackendEnum.get_path   s     %((tz:: 	V49 V V04	V V V   ! 	*;;sA&&q)Dr!   r3   c                 D    t          |                                           S r5   r6   r7   s    r   r8   z#MambaAttentionBackendEnum.get_class   r9   r!   c                     | t           v S r;   )ra   r7   s    r   r<   z'MambaAttentionBackendEnum.is_overridden   s     ,,,r!   c                 <    t                               | d           dS r>   )ra   r?   r7   s    r   r@   z(MambaAttentionBackendEnum.clear_override   s    !!$-----r!   rA   rB   rC   )r   r   r   r   MAMBA1MAMBA2
SHORT_CONVLINEARGDN_ATTNrZ   r[   r   r2   r8   r<   r@   r\   r!   r   r_   r_      s          MFLFWJLFHH F $ #    &
8 
8 
8 
8-t - - - -. . . . . .r!   r_   )mamba1mamba2
short_convlinear_attentiongdn_attentioncustomr+   ra   NFbackend
class_pathis_mambar&   c                 l     dt           dt           f fd}|r|t           <   n
|t           <   d S |S )a  Register or override a backend implementation.

    Args:
        backend: The AttentionBackendEnum member to register
        class_path: Optional class path. If not provided and used as
            decorator, will be auto-generated from the class.

    Returns:
        Decorator function if class_path is None, otherwise a no-op

    Examples:
        # Override an existing attention backend
        @register_backend(AttentionBackendEnum.FLASH_ATTN)
        class MyCustomFlashAttn:
            ...

        # Override an existing mamba attention backend
        @register_backend(MambaAttentionBackendEnum.LINEAR, is_mamba=True)
        class MyCustomMambaAttn:
            ...

        # Register a custom third-party attention backend
        @register_backend(AttentionBackendEnum.CUSTOM)
        class MyCustomBackend:
            ...

        # Direct registration
        register_backend(
            AttentionBackendEnum.CUSTOM,
            "my.module.MyCustomBackend"
        )
    r   r&   c                 r    r| j          d| j         t          <   n| j          d| j         t          <   | S )Nr)   )r   r   ra   r+   )r   rp   rr   s    r   	decoratorz#register_backend.<locals>.decorator   sO     	N03-S-SAQ-S-S!'***-.'M'M3;K'M'MOG$
r!   Nc                     | S )Nr\   )xs    r   <lambda>z"register_backend.<locals>.<lambda>   s     r!   )typera   r+   )rp   rq   rr   ru   s   ` ` r   register_backendrz      sl    Lt          	2-7!'**'1OG${r!   )NF)$r   collections.abcr   enumr   r   typingr   r   vllm.loggerr   vllm.utils.import_utilsr	   vllm.v1.attention.backendr
   r   loggerr   r#   r_   re   r   rf   rg   rh   ri   rZ   MAMBA_TYPE_TO_BACKEND_MAPr+   dictr   __annotations__ra   r[   ry   rz   r\   r!   r   <module>r      s   !     $ $ $ $ $ $         & & & & & & & & # # # # # # ; ; ; ; ; ; ;::::::	X		        \( \( \( \( \(4+D \( \( \( \(~<. <. <. <. <.0I <. <. <. <.@ (.3'.3+6;18=.7<'.3   46*C/0 5 5 5>@ t5s:; @ @ @
 "4 4!$==4d
4 4 tfdl	4 4 4 4 4 4r!   