
    3j4                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKrS SK	r	S SK
rSS jrSSS jjrSS jrSSS	 jjr\ " S
 S5      5       r " S S5      r\ " S S5      5       r\ " S S5      5       r " S S5      rg)    )annotations)	dataclass)Path)LiteralNc                x    Ub  UR                  5       OSnUb  UR                  5       OSnU R                  UX"X3S9$ )N )outtypeftypeOUTTYPEFTYPE)lowerupperformat)filenameoutput_typeftype_lowercaseftype_uppercases       F/home/wildlama/miniconda3/lib/python3.13/site-packages/gguf/utility.pyfill_templated_filenamer      sL    2=2I;,,.rO2=2I;,,.rO???#2#2  K K    c           
         U S:  a  U S-  nSnO#U S:  a  U S-  nSnOU S:  a  U S-  nS	nOU S
-  nSn[        U[        [        [        U5      5      R	                  S5      5      -
  S5      nUSU S3 U 3$ )Ng   mBg-q=Tg    eAg&.>Bg    .Agư>MgMbP?K0r   .f)maxlenstrroundlstrip)model_params_count
min_digits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KKQ
OC!!C5*<.99r   c                    US:  a(  [        [        U5      [        U5      -   SS9nU SU 3nU$ [        [        U 5      SS9nU$ )Nr      )r%   x)r)   abs)total_paramsshared_paramsexpert_paramsexpert_countpretty_size
size_classs         r   
size_labelr4   ,   sY    a9#m:LsS`Oa:anop$~Q{m4
  9\9JWXY
r   c                b   Ub1  UR                  5       R                  SS5      R                  SS5      nO6U b1  U R                  5       R                  SS5      R                  SS5      nOSnUb  SU 3OSnUb#  SUR                  5       R                  SS5       3OSn	Ub#  SUR                  5       R                  SS5       3OSn
Ub1  SUR                  5       R                  SS5      R                  5        3OSnUb#  SUR                  5       R                  SS5       3OSnU U U	 U
 U U 3$ )N -/z
ggml-modelr   )stripreplacer   )
model_name	base_namefinetune_stringversion_stringr4   r   
model_typename
parametersfinetuneversionencodingkinds                r   naming_conventionrF   7   sJ     ((c2::3D		!))#s3;;CE%/%;1ZL!JBQB]?((*223<=>ceH@N@Z.&&(00c:;<`bGFQF];$$&..sC8>>@ABceH9C9OQz!))#s345UWDVJ<z'8*TFCCr   c                  R    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S	'   SS
 jrSrg)RemoteTensorN   r!   dtypetuple[int, ...]shapeintoffset_startsizeurlc                ~    [        [        R                  U R                  U R                  U R
                  S95      nU$ )N)rP   startrO   )	bytearraySafetensorRemoteget_data_by_rangerP   rN   rO   )selfdatas     r   rW   RemoteTensor.dataV   s8     );;PTPaPahlhqhq;rsr    N)returnrS   )__name__
__module____qualname____firstlineno____annotations__rW   __static_attributes__rY   r   r   rH   rH   N   s"    J
I	Hr   rH   c                      \ rS rSrSrSr\SS j5       r\SS j5       r\SS j5       r	\SSS jj5       r
\SS j5       r\SS	 j5       rS
rg)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.coc                   U R                  U R                   SU S35      nU(       a#  U R                   SU S3nU R                  U5      $ U R                   SU S3nU R                  U5      nU(       a  U R                  US5      nUR	                  S5      n[
        R                  " U5      nUR                  S5      c   S5       eUS   n	[        [        U	R                  5       5      5      n
U
R                  5         0 nU
 HC  nU R                   SU SU 3nU R                  U5      R                  5        H	  u  pXU'   M     ME     U$ [        S	U S
35      e)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)
r8   z/resolve/main/model.safetensorsz*/resolve/main/model.safetensors.index.jsonr   utf-8
weight_mapz"weight_map not found in index filez/resolve/main/z,No safetensor file has been found for model z.If the repo has safetensor files, make sure the model is public or you have a valid Hugging Face token set in the environment variable HF_TOKEN.)check_file_existBASE_DOMAINget_list_tensorsrU   decodejsonloadsgetlistsetvaluessortitems
ValueError)clsmodel_idis_single_filerP   	index_urlis_multiple_files
index_data	index_str
index_jsonre   	all_filestensorsfilekeyvals                  r   get_list_tensors_hf_model*SafetensorRemote.get_list_tensors_hf_modelr   sr    --0A8*Lk.lm__%Qxj0OPC'',, 'q
2\]	00;..y!<J"))'2II.J>>,/;a=aa;#L1JS!2!2!456INN/1G!)8*N4&I # 4 4S 9 ? ? AHC#&CL !B " N:8* EQ Q
 	
r   c           
        U R                  U5      u  p#0 nUR                  5        Hd  u  pVUS:X  a  M  [        U[        5      (       d  [	        SU SU 35      e US   nUS   nUS   u  pX-
  nX9-   n[        U[        U5      XUS9XE'   Mf     [        [        UR                  5       S S95      nU$ ! [         a  n[	        SU SU S	U 35      eS
nAff = f)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': rJ   rL   data_offsets)rJ   rL   rN   rO   rP   z$Missing key in metadata for tensor 'z	, meta = Nc                    U S   $ Nr   rY   ts    r   <lambda>3SafetensorRemote.get_list_tensors.<locals>.<lambda>   s    QqTr   r~   )	get_metadatarq   
isinstancedictrr   rH   tupleKeyErrorsorted)rs   rP   metadatadata_start_offsetresr@   metarJ   rL   offset_start_relativeoffset_end_relativerO   rN   es                 r   rh   !SafetensorRemote.get_list_tensors   s    '*&6&6s&;#')"..*JD~%dD)) #@c$!PQQeWW=A.=Q:%*B0H(uE%LWctwx	 +" 6#))+>:;
  e #GvSQRPSS\]a\b!cddes   0B22
C<CCc                   SnU R                  USU5      n[        U5      S:  a  [        S5      e[        R	                  USS SS9nSU-   n[        U5      SU-   :  a  [        SSU-    S	[        U5       35      eUSSU-    nUR                  S
5      n [        R                  " U5      nX4$ ! [        R                   a  n	[        SU	 35      eSn	A	ff = f)zb
Get JSON metadata from a remote safetensor file.

Returns tuple of (metadata, data_start_offset)
i  P r      z%Not enough data to read metadata sizeNlittle	byteorder'Could not read complete metadata. Need  bytes, got rd   z-Failed to parse safetensor metadata as JSON: )	rU   r    rr   rM   
from_bytesri   rj   rk   JSONDecodeError)
rs   rP   	read_sizeraw_datametadata_lengthr   metadata_bytesmetadata_strr   r   s
             r   r   SafetensorRemote.get_metadata   s    $	((a; x=1DEE.."1.J / x=1..Fq?GZF[[ghklthugvwxx "!A$78%,,W5	Rzz,/H..## 	RLQCPQQ	Rs   B. .CCCc                Z   SSK nSSKJn  U" U5      nUR                  (       a  UR                  (       d  [        SU 35      eU R                  5       nUS:  a  SU SX#-    3US'   UR                  US	US
9nUR                  5         UR                  [        US:  a  U5         $ S5         $ )zh
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: zbytes=r7   RangeTallow_redirectsheaders)requestsurllib.parser   schemenetlocrr   _get_request_headersrl   raise_for_statuscontentslice)	rs   rP   rR   rO   r   r   
parsed_urlr   responses	            r   rU   "SafetensorRemote.get_data_by_range   s     	)c]
  
(9(9}SE233**,"9!'wa~>GG<<T7<K!!# dRid BCCT BCCr   c                >   SSK nSSKJn  U" U5      nUR                  (       a  UR                  (       d  [        SU 35      e U R                  5       nSUS'   UR                  USUS9nS	UR                  s=:*  =(       a    S
:  $ s  $ ! UR                   a     gf = f)z\
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   rr   r   headstatus_codeRequestException)rs   rP   r   r   r   r   r   s          r   rf   !SafetensorRemote.check_file_exist   s     	)c]
  
(9(9}SE233	..0G*GG}}S$}PH(..444444(( 		s   AB	 B	 	BBc                    SS0n[         R                  R                  S5      (       a  S[         R                  S    3US'   U$ )z$Prepare common headers for requests.z
User-Agentconvert_hf_to_ggufHF_TOKENzBearer Authorization)osenvironrl   )rs   r   s     r   r   %SafetensorRemote._get_request_headers  sB      !56::>>*%%)0J1G0H'IGO$r   rY   N)rt   r!   rZ   dict[str, RemoteTensor])rP   r!   rZ   r   )rP   r!   rZ   ztuple[dict, int])r   )rP   r!   rR   rM   rO   rM   rZ   bytes)rP   r!   rZ   bool)rZ   zdict[str, str])r[   r\   r]   r^   __doc__rg   classmethodr   rh   r   rU   rf   r   r`   rY   r   r   rT   rT   ]   s    $ +K&
 &
P  > R R@ D D*  *  r   rT   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg)	LocalTensorRangei  r   r   rM   offsetrO   rY   N)r[   r\   r]   r^   r_   r`   rY   r   r   r   r     s    NK
Ir   r   c                  >    \ rS rSr% S\S'   S\S'   S\S'   SS jrS	rg
)LocalTensori  r!   rJ   rK   rL   r   
data_rangec                    [         R                  " U R                  R                  SU R                  R                  U R                  R
                  S9$ )Nc)moder   rL   )npmemmapr   r   r   rO   )rV   s    r   
mmap_bytesLocalTensor.mmap_bytes  s8    yy11DOODZDZbfbqbqbvbvwwr   rY   N)rZ   z
np.ndarray)r[   r\   r]   r^   r_   r   r`   rY   r   r   r   r     s    J  xr   r   c                  :    \ rS rSr% SrS\S'   S
S jrS rS rSr	g	)SafetensorsLocali"  z
Read a safetensors file from the local filesystem.

Custom parsing gives a bit more control over the memory usage.
The official safetensors library doesn't expose file ranges.
zdict[str, LocalTensor]r|   c                   [        US5       n[        R                  UR                  S5      SS9n[        R
                  " U5      R                  nUSU-   :  a  [        SSU-    SU 35      eUR                  U5      R                  S5      n [        R                  " U5      nUR                  5       n0 n	UR                  5        HK  u  pU
S	:X  a  M  [        US
   [        US   5      [!        UXS   S   -   US   S   US   S   -
  5      S9X'   MM     [#        [%        U	R                  5       S S95      U l        S S S 5        g ! [        R                   a  n[        SU 35      eS nAff = f! , (       d  f       g = f)Nrbr   r   r   r   r   rd   z.Failed to parse safetensors metadata as JSON: r   rJ   rL   r   r      )rJ   rL   r   c                    U S   $ r   rY   r   s    r   r   +SafetensorsLocal.__init__.<locals>.<lambda>M  s    adr   r   )openrM   r   readr   statst_sizerr   ri   rj   rk   r   tellrq   r   r   r   r   r   r|   )rV   r   r   r   	file_sizer   r   r   r   r|   r@   r   s               r   __init__SafetensorsLocal.__init__,  s{   (D!Q!nnQVVAY(nKO)11I1.. #J1K^J__klukv!wxx66/299'BLW::l3 !".0G&nn.
>) +w-W./ ),@,CC^,Q/$~2Fq2II ! /"  w}}N KLDLA "! '' W #QRSQT!UVVW "!s1   BE0E%BE0E-E((E--E00
E>c                    AAU R                   $ Nr|   rV   argskwargss      r   	__enter__SafetensorsLocal.__enter__O  s    &||r   c                    AAg r   rY   r   s      r   __exit__SafetensorsLocal.__exit__S  s    &r   r   N)r   r   )
r[   r\   r]   r^   r   r_   r   r   r   r`   rY   r   r   r   r   "  s      $#!MFr   r   )r   r!   r   
str | NonerZ   r!   )r+   )r$   rM   r%   rM   rZ   r!   )
r.   rM   r/   rM   r0   rM   r1   rM   rZ   r!   r   )r;   r   r<   r   r=   r   r>   r   r4   r   r   r   r?   zLiteral['vocab', 'LoRA'] | NonerZ   r!   )
__future__r   dataclassesr   pathlibr   typingr   r   rj   numpyr   r   r)   r4   rF   rH   rT   r   r   r   rY   r   r   <module>r      s    " !   	  K:.D.   q qh    x x x2 2r   