
    `i8*                        d dl mZ d dlmZ d dlmZ d dlZd dlZd!d
Zd"d#dZ	d$dZ
d%d&dZe G d d                      Z G d d           ZdS )'    )annotations)	dataclass)LiteralNfilenamestroutput_type
str | Nonereturnc                    ||                                 nd}||                                nd}|                     |||||          S )N )outtypeftypeOUTTYPEFTYPE)lowerupperformat)r   r   ftype_lowercaseftype_uppercases       `/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/gguf/utility.pyfill_templated_filenamer   
   sb    2=2I;,,...rO2=2I;,,...rO???#2/#2/  K K K       model_params_countint
min_digitsc           
        | dk    r| dz  }d}n#| dk    r| dz  }d}n| dk    r| dz  }d	}n| d
z  }d}t          |t          t          t          |                                        d                    z
  d          }|d| d| S )Ng   mBg-q=Tg    eAg&.>Bg    .Agư>MgMbP?K0r   .f)maxlenr   roundlstrip)r   r   scaled_model_paramsscale_suffixfixs        r   #model_weight_count_rounded_notationr,      s    D  058	c	!	!047	c	!	!047 147
j3s5)<#=#=>>EEcJJKKKQ
O
OC!9C9999<999r   total_paramsshared_paramsexpert_paramsexpert_countc                    |dk    r6t          t          |          t          |          z   d          }| d| }nt          t          |           d          }|S )Nr   r   )r   x)r,   abs)r-   r.   r/   r0   pretty_size
size_classs         r   
size_labelr6   *   sl    a9#m:L:LsS`OaOa:anoppp$44{44

8\9J9JWXYYY
r   
model_name	base_namefinetune_stringversion_stringr6   
model_typeLiteral['vocab', 'LoRA'] | Nonec                   |=|                                                     dd                              dd          }nA| =|                                                      dd                              dd          }nd}|d| nd}|+d|                                                     dd           nd}	|+d|                                                     dd           nd}
|=d|                                                     dd                                           nd}|+d|                                                     dd           nd}| | |	 |
 | | S )N -/z
ggml-modelr   )stripreplacer   )r7   r8   r9   r:   r6   r   r;   name
parametersfinetuneversionencodingkinds                r   naming_conventionrI   5   s      ((c22::3DD		!!))#s33;;CEE%/%;!Z!!!JBQB]>?((**223<<>>>ceH@N@Z<.&&((00c::<<<`bGFQF]B;$$&&..sC88>>@@BBBceH9C9O5z!!))#s33555UWDCJCC'C8CTCCCr   c                  J    e Zd ZU ded<   ded<   ded<   ded<   ded<   ddZdS )RemoteTensorr   dtypeztuple[int, ...]shaper   offset_startsizeurlr
   	bytearrayc                x    t          t                              | j        | j        | j                            }|S )N)rP   startrO   )rQ   SafetensorRemoteget_data_by_rangerP   rN   rO   )selfdatas     r   rW   zRemoteTensor.dataT   s6     );;PTPahlhq;rrssr   N)r
   rQ   )__name__
__module____qualname____annotations__rW    r   r   rK   rK   L   s]         JJJIIIHHH     r   rK   c                      e Zd ZdZdZdZedd            Zedd
            Zedd            Z	eddd            Z
edd            Zedd            ZdS )rT   a  
    Uility class to handle remote safetensor files.
    This class is designed to work with Hugging Face model repositories.

    Example (one model has single safetensor file, the other has multiple):
        for model_id in ["ngxson/TEST-Tiny-Llama4", "Qwen/Qwen2.5-7B-Instruct"]:
            tensors = SafetensorRemote.get_list_tensors_hf_model(model_id)
            print(tensors)

    Example reading tensor data:
        tensors = SafetensorRemote.get_list_tensors_hf_model(model_id)
        for name, meta in tensors.items():
            dtype, shape, offset_start, size, remote_safetensor_url = meta
            # read the tensor data
            data = SafetensorRemote.get_data_by_range(remote_safetensor_url, offset_start, size)
            print(data)
    zhttps://huggingface.co   model_idr   r
   dict[str, RemoteTensor]c                   |                      | j         d| d          }|r"| j         d| d}|                     |          S | j         d| d}|                      |          }|r|                     |d          }|                    d          }t          j        |          }|                    d          
J d            |d         }	t          t          |	
                                                    }
|
                                 i }|
D ]C}| j         d| d	| }|                     |                                          D ]
\  }}|||<   D|S t          d
| d          )z
        Get list of tensors from a Hugging Face model repository.

        Returns a dictionary of tensor names and their metadata.
        Each tensor is represented as a tuple of (dtype, shape, offset_start, size, remote_safetensor_url)
        r@   z/resolve/main/model.safetensorsz*/resolve/main/model.safetensors.index.jsonr   utf-8
weight_mapNz"weight_map not found in index filez/resolve/main/zModel z# does not have any safetensor files)check_file_existBASE_DOMAINget_list_tensorsrU   decodejsonloadsgetlistsetvaluessortitems
ValueError)clsr_   is_single_filerP   	index_urlis_multiple_files
index_data	index_str
index_jsonrc   	all_filestensorsfilekeyvals                  r   get_list_tensors_hf_modelz*SafetensorRemote.get_list_tensors_hf_modelq   s    --.l.l8.l.l.lmm 	-_PPxPPPC'',,, ]]]]]	00;; 	..y!<<J"))'22II..J>>,//;;=a;;;#L1JS!2!2!4!45566INN/1G! ' 'II8II4II # 4 4S 9 9 ? ? A A ' 'HC#&GCLL'NO(OOOPPPr   rP   c           
        |                      |          \  }}i }|                                D ]\  }}|dk    rt          |t                    st	          d| d|           	 |d         }|d         }|d         \  }	}
|
|	z
  }||	z   }t          |t          |          |||          ||<   # t          $ r}t	          d| d| d	|           d
}~ww xY w|S )z
        Get list of tensors from a remote safetensor file.

        Returns a dictionary of tensor names and their metadata.
        Each tensor is represented as a tuple of (dtype, shape, offset_start, size)
        __metadata__zInvalid metadata for tensor 'z': rL   rM   data_offsets)rL   rM   rN   rO   rP   z$Missing key in metadata for tensor 'z	, meta = N)get_metadataro   
isinstancedictrp   rK   tupleKeyError)rq   rP   metadatadata_start_offsetresrC   metarL   rM   offset_start_relativeoffset_end_relativerO   rN   es                 r   rf   z!SafetensorRemote.get_list_tensors   s:    '*&6&6s&;&;##')"..** 	e 	eJD$~%%dD)) R !P!P!P$!P!PQQQeWW=A.=Q:%':*-BB03HH(uE%LLWcjntwxxxD		 e e e !c!c!cQR!c!c]a!c!cddde 
s   &A	B00
C:CCtuple[dict, int]c                H   d}|                      |d|          }t          |          dk     rt          d          t                              |dd         d          }d|z   }t
          j        }||z  dk    r||||z  z
  z  }t          |          d|z   k     r%t          dd|z    d	t          |                     |dd|z            }|                    d
          }	 t          j	        |          }	|	|fS # t          j
        $ r}
t          d|
           d}
~
ww xY w)zz
        Get JSON metadata from a remote safetensor file.

        Returns tuple of (metadata, data_start_offset)
        i  P r   r^   z%Not enough data to read metadata sizeNlittle)	byteorderz'Could not read complete metadata. Need z bytes, got rb   z-Failed to parse safetensor metadata as JSON: )rU   r&   rp   r   
from_bytesrT   	ALIGNMENTrg   rh   ri   JSONDecodeError)rq   rP   	read_sizeraw_datametadata_lengthr   	alignmentmetadata_bytesmetadata_strr   r   s              r   r   zSafetensorRemote.get_metadata   sg    $	((a;; x==1DEEE.."1".JJ /$.	y(A--.?).K!LL x==1...wq?GZwwhklthuhuwwxxx "!A$7"78%,,W55	Rz,//H...# 	R 	R 	RPQPPQQQ	Rs   #C; ;D!
DD!rS   r   rO   bytesc                X   ddl }ddlm}  ||          }|j        r|j        st          d|           |                                 }|dk    rd| d||z    |d<   |                    |d	|
          }|                                 |j	        t          |dk    r|nd                   S )z
        Get raw byte data from a remote file by range.
        If size is not specified, it will read the entire file.
        r   NurlparseInvalid URL: r   zbytes=r?   RangeTallow_redirectsheaders)requestsurllib.parser   schemenetlocrp   _get_request_headersrj   raise_for_statuscontentslice)	rq   rP   rS   rO   r   r   
parsed_urlr   responses	            r   rU   z"SafetensorRemote.get_data_by_range   s     	))))))Xc]]
  	4
(9 	42S22333**,,"99>>>>>GG<<T7<KK!!### dRiiddT B BCCr   boolc                   ddl }ddlm}  ||          }|j        r|j        st          d|           	 |                                 }d|d<   |                    |d|          }d	|j        cxk    od
k     nc S # |j	        $ r Y dS w xY w)zt
        Check if a file exists at the given URL.
        Returns True if the file exists, False otherwise.
        r   Nr   r   z	bytes=0-0r   Tr      i  F)
r   r   r   r   r   rp   r   headstatus_codeRequestException)rq   rP   r   r   r   r   r   s          r   rd   z!SafetensorRemote.check_file_exist   s     	))))))Xc]]
  	4
(9 	42S22333	..00G*GG}}S$}PPH(.444444444( 	 	 	55	s   AA= =
B
Bdict[str, str]c                |    ddi}t           j                            d          rdt           j        d          |d<   |S )z$Prepare common headers for requests.z
User-Agentconvert_hf_to_ggufHF_TOKENzBearer Authorization)osenvironrj   )rq   r   s     r   r   z%SafetensorRemote._get_request_headers  sD      !56:>>*%% 	J'IJ1G'I'IGO$r   N)r_   r   r
   r`   )rP   r   r
   r`   )rP   r   r
   r   )r   )rP   r   rS   r   rO   r   r
   r   )rP   r   r
   r   )r
   r   )rX   rY   rZ   __doc__re   r   classmethodr}   rf   r   rU   rd   r   r\   r   r   rT   rT   [   s         $ +KI"Q "Q "Q ["QH    [6 !R !R !R [!RF D D D D [D*    [*    [  r   rT   )r   r   r   r	   r
   r   )r   )r   r   r   r   r
   r   )
r-   r   r.   r   r/   r   r0   r   r
   r   )N)r7   r	   r8   r	   r9   r	   r:   r	   r6   r	   r   r	   r;   r<   r
   r   )
__future__r   dataclassesr   typingr   r   rh   r   r,   r6   rI   rK   rT   r\   r   r   <module>r      s    " " " " " " ! ! ! ! ! !       				 K K K K: : : : :.   D D D D D.        m m m m m m m m m mr   