keras-hub-nightly 0.23.0.dev202510170417__py3-none-any.whl → 0.23.0.dev202510190425__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of keras-hub-nightly might be problematic. Click here for more details.

@@ -0,0 +1,60 @@
1
+ from keras_hub.src.api_export import keras_hub_export
2
+ from keras_hub.src.models.smollm3.smollm3_backbone import SmolLM3Backbone
3
+ from keras_hub.src.tokenizers.byte_pair_tokenizer import BytePairTokenizer
4
+
5
+
6
+ @keras_hub_export(
7
+ [
8
+ "keras_hub.tokenizers.SmolLM3Tokenizer",
9
+ "keras_hub.tokenizers.SmolLMTokenizer",
10
+ "keras_hub.models.SmolLM3Tokenizer",
11
+ "keras_hub.models.SmolLMTokenizer",
12
+ ]
13
+ )
14
+ class SmolLM3Tokenizer(BytePairTokenizer):
15
+ """Tokenizer for SmolLM3 models.
16
+
17
+ This tokenizer implements byte-pair encoding (BPE) for SmolLM3 models,
18
+ handling special tokens like BOS (beginning of sequence) and EOS (end of
19
+ sequence).
20
+
21
+ Args:
22
+ vocabulary: Dictionary mapping tokens to token IDs, or path to
23
+ vocabulary file.
24
+ merges: List of BPE merges, or path to merges file.
25
+ bos_token: Beginning of sequence token. Defaults to None.
26
+ eos_token: End of sequence token. Defaults to "<|endoftext|>".
27
+ misc_special_tokens: Set of additional special tokens. Defaults to
28
+ empty set.
29
+ """
30
+
31
+ backbone_cls = SmolLM3Backbone
32
+
33
+ def __init__(
34
+ self,
35
+ vocabulary=None,
36
+ merges=None,
37
+ **kwargs,
38
+ ):
39
+ # Add EOS token
40
+ eos_token = "<|end_of_text|>"
41
+ self._add_special_token(eos_token, "end_token")
42
+
43
+ bos_token = "<|begin_of_text|>"
44
+ self._add_special_token(bos_token, "bos_token")
45
+
46
+ start_think_token = "<think>"
47
+ self._add_special_token(start_think_token, "start_think_token")
48
+
49
+ end_think_token = "</think>"
50
+ self._add_special_token(end_think_token, "end_think_token")
51
+
52
+ self.start_token_id = None
53
+ self.start_token = None
54
+ self.pad_token_id = 0
55
+
56
+ super().__init__(
57
+ vocabulary=vocabulary,
58
+ merges=merges,
59
+ **kwargs,
60
+ )
@@ -0,0 +1,56 @@
1
+ from keras import ops
2
+
3
+
4
+ def rotate_half(x):
5
+ x1 = x[..., : ops.shape(x)[-1] // 2]
6
+ x2 = x[..., ops.shape(x)[-1] // 2 :]
7
+ return ops.concatenate((-x2, x1), axis=-1)
8
+
9
+
10
+ def apply_rotary_pos_emb(q, k, cos, sin, expansion_axis=1):
11
+ cos = ops.expand_dims(cos, expansion_axis)
12
+ sin = ops.expand_dims(sin, expansion_axis)
13
+ q_embed = (q * cos) + (rotate_half(q) * sin)
14
+ k_embed = (k * cos) + (rotate_half(k) * sin)
15
+ return q_embed, k_embed
16
+
17
+
18
+ def apply_rotary_pos_single(tensor, cos, sin, expansion_axis=1):
19
+ cos = ops.expand_dims(cos, expansion_axis)
20
+ sin = ops.expand_dims(sin, expansion_axis)
21
+ tensor_embed = (tensor * cos) + (rotate_half(tensor) * sin)
22
+ return tensor_embed
23
+
24
+
25
+ def repeat_kv(hidden_states, n_rep):
26
+ batch, num_key_value_heads, slen, head_dim = ops.shape(hidden_states)
27
+ if n_rep == 1:
28
+ return hidden_states
29
+ hidden_states = ops.expand_dims(hidden_states, axis=2)
30
+ target_shape = (batch, num_key_value_heads, n_rep, slen, head_dim)
31
+ hidden_states = ops.broadcast_to(hidden_states, target_shape)
32
+ return ops.reshape(
33
+ hidden_states, [batch, num_key_value_heads * n_rep, slen, head_dim]
34
+ )
35
+
36
+
37
+ def rope_init(rope_theta, partial_rotary_factor, head_dim):
38
+ """Initialize RoPE (Rotary Position Embedding) parameters.
39
+
40
+ Args:
41
+ rope_theta: float. The theta value for RoPE.
42
+ partial_rotary_factor: float. The factor for partial rotary embedding.
43
+ head_dim: int. The dimension of each attention head.
44
+
45
+ Returns:
46
+ A tuple of (inv_freq, attention_scaling) where inv_freq is the inverse
47
+ frequency tensor and attention_scaling is the scaling factor.
48
+ """
49
+ base = rope_theta
50
+ dim = int(head_dim * partial_rotary_factor)
51
+
52
+ inv_freq = 1.0 / (
53
+ ops.power(base, ops.arange(0, dim, 2, dtype="float32") / dim)
54
+ )
55
+ attention_scaling = 1.0
56
+ return inv_freq, attention_scaling
@@ -0,0 +1,139 @@
1
+ import numpy as np
2
+
3
+ from keras_hub.src.models.smollm3.smollm3_backbone import SmolLM3Backbone
4
+ from keras_hub.src.utils.preset_utils import load_json
5
+
6
+ backbone_cls = SmolLM3Backbone
7
+
8
+
9
+ def convert_backbone_config(transformers_config):
10
+ return {
11
+ "vocabulary_size": transformers_config["vocab_size"],
12
+ "hidden_dim": transformers_config["hidden_size"],
13
+ "num_layers": transformers_config["num_hidden_layers"],
14
+ "num_attention_heads": transformers_config["num_attention_heads"],
15
+ "num_key_value_heads": transformers_config["num_key_value_heads"],
16
+ "intermediate_dim": transformers_config["intermediate_size"],
17
+ "layer_norm_epsilon": transformers_config[
18
+ "rms_norm_eps"
19
+ ], # Using rms_norm_eps as layer_norm_epsilon
20
+ "max_position_embeddings": transformers_config[
21
+ "max_position_embeddings"
22
+ ],
23
+ "rope_theta": transformers_config["rope_theta"],
24
+ # partial_rotary_factor is not explicitly in config.json
25
+ # but is inherited from the default value in the
26
+ # `_compute_default_rope_parameters()` function
27
+ "partial_rotary_factor": 1.0,
28
+ "attention_bias": transformers_config["attention_bias"],
29
+ "attention_dropout": transformers_config["attention_dropout"],
30
+ # Despite the name, no_rope_layers: 1 = HAS RoPE, 0 = NO RoPE
31
+ "rope_layer_enabled_list": [
32
+ bool(x) for x in transformers_config["no_rope_layers"]
33
+ ],
34
+ "layer_types": transformers_config["layer_types"],
35
+ "mlp_bias": transformers_config["mlp_bias"],
36
+ }
37
+
38
+
39
+ def convert_weights(backbone, loader, transformers_config):
40
+ loader.port_weight(
41
+ keras_variable=backbone.get_layer("token_embedding").embeddings,
42
+ hf_weight_key="model.embed_tokens.weight",
43
+ )
44
+
45
+ def transpose_and_reshape(x, shape):
46
+ return np.reshape(np.transpose(x), shape)
47
+
48
+ for i in range(backbone.num_layers):
49
+ decoder_layer = backbone.get_layer(f"transformer_layer_{i}")
50
+
51
+ # Input layernorm
52
+ loader.port_weight(
53
+ keras_variable=decoder_layer.input_layernorm.scale,
54
+ hf_weight_key=f"model.layers.{i}.input_layernorm.weight",
55
+ )
56
+
57
+ # Attention layers
58
+ ## Query
59
+ loader.port_weight(
60
+ keras_variable=decoder_layer.self_attn.q_proj.kernel,
61
+ hf_weight_key=f"model.layers.{i}.self_attn.q_proj.weight",
62
+ hook_fn=transpose_and_reshape,
63
+ )
64
+ ## Key
65
+ loader.port_weight(
66
+ keras_variable=decoder_layer.self_attn.k_proj.kernel,
67
+ hf_weight_key=f"model.layers.{i}.self_attn.k_proj.weight",
68
+ hook_fn=transpose_and_reshape,
69
+ )
70
+ ## Value
71
+ loader.port_weight(
72
+ keras_variable=decoder_layer.self_attn.v_proj.kernel,
73
+ hf_weight_key=f"model.layers.{i}.self_attn.v_proj.weight",
74
+ hook_fn=transpose_and_reshape,
75
+ )
76
+ ## Output
77
+ loader.port_weight(
78
+ keras_variable=decoder_layer.self_attn.o_proj.kernel,
79
+ hf_weight_key=f"model.layers.{i}.self_attn.o_proj.weight",
80
+ hook_fn=transpose_and_reshape,
81
+ )
82
+
83
+ # MLP layers
84
+ loader.port_weight(
85
+ keras_variable=decoder_layer.mlp.up_proj.kernel,
86
+ hf_weight_key=f"model.layers.{i}.mlp.up_proj.weight",
87
+ # rearrange_patterns="b a -> a b",
88
+ hook_fn=lambda hf_tensor, _: np.transpose(hf_tensor, axes=(1, 0)),
89
+ )
90
+ loader.port_weight(
91
+ keras_variable=decoder_layer.mlp.down_proj.kernel,
92
+ hf_weight_key=f"model.layers.{i}.mlp.down_proj.weight",
93
+ # rearrange_patterns="b a -> a b",
94
+ hook_fn=lambda hf_tensor, _: np.transpose(hf_tensor, axes=(1, 0)),
95
+ )
96
+ loader.port_weight(
97
+ keras_variable=decoder_layer.mlp.gate_proj.kernel,
98
+ hf_weight_key=f"model.layers.{i}.mlp.gate_proj.weight",
99
+ # rearrange_patterns="b a -> a b",
100
+ hook_fn=lambda hf_tensor, _: np.transpose(hf_tensor, axes=(1, 0)),
101
+ )
102
+
103
+ # Feedforward layernorm
104
+ loader.port_weight(
105
+ keras_variable=decoder_layer.post_attention_layernorm.scale,
106
+ hf_weight_key=f"model.layers.{i}.post_attention_layernorm.weight",
107
+ )
108
+
109
+ # Final normalization layer
110
+ loader.port_weight(
111
+ keras_variable=backbone.get_layer("sequence_output_layernorm").scale,
112
+ hf_weight_key="model.norm.weight",
113
+ )
114
+
115
+ backbone.training = False
116
+
117
+ return backbone
118
+
119
+
120
+ def convert_tokenizer(cls, preset, **kwargs):
121
+ tokenizer_config = load_json(preset, "tokenizer.json")
122
+ vocab = tokenizer_config["model"]["vocab"]
123
+ merges = tokenizer_config["model"]["merges"]
124
+ merges = [" ".join(item) for item in merges]
125
+
126
+ # Load all special tokens with the exception of "reserved" ones.
127
+ special_tokens = set()
128
+ for token in tokenizer_config["added_tokens"]:
129
+ if not token["content"].startswith("<|reserved_special_token_"):
130
+ vocab[token["content"]] = token["id"]
131
+ special_tokens.add(token["content"])
132
+
133
+ kwargs.update(
134
+ {
135
+ "unsplittable_tokens": list(special_tokens),
136
+ }
137
+ )
138
+
139
+ return cls(vocabulary=vocab, merges=merges, **kwargs)
@@ -20,6 +20,7 @@ from keras_hub.src.utils.transformers import convert_qwen
20
20
  from keras_hub.src.utils.transformers import convert_qwen3
21
21
  from keras_hub.src.utils.transformers import convert_qwen3_moe
22
22
  from keras_hub.src.utils.transformers import convert_qwen_moe
23
+ from keras_hub.src.utils.transformers import convert_smollm3
23
24
  from keras_hub.src.utils.transformers import convert_t5gemma
24
25
  from keras_hub.src.utils.transformers import convert_vit
25
26
  from keras_hub.src.utils.transformers.safetensor_utils import SafetensorLoader
@@ -66,6 +67,8 @@ class TransformersPresetLoader(PresetLoader):
66
67
  self.converter = convert_qwen3_moe
67
68
  elif model_type == "qwen3":
68
69
  self.converter = convert_qwen3
70
+ elif model_type == "smollm3":
71
+ self.converter = convert_smollm3
69
72
  elif model_type == "t5gemma":
70
73
  self.converter = convert_t5gemma
71
74
  else:
keras_hub/src/version.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from keras_hub.src.api_export import keras_hub_export
2
2
 
3
3
  # Unique source of truth for the version number.
4
- __version__ = "0.23.0.dev202510170417"
4
+ __version__ = "0.23.0.dev202510190425"
5
5
 
6
6
 
7
7
  @keras_hub_export("keras_hub.version")
@@ -93,6 +93,12 @@ from keras_hub.src.models.roformer_v2.roformer_v2_tokenizer import (
93
93
  from keras_hub.src.models.siglip.siglip_tokenizer import (
94
94
  SigLIPTokenizer as SigLIPTokenizer,
95
95
  )
96
+ from keras_hub.src.models.smollm3.smollm3_tokenizer import (
97
+ SmolLM3Tokenizer as SmolLM3Tokenizer,
98
+ )
99
+ from keras_hub.src.models.smollm3.smollm3_tokenizer import (
100
+ SmolLM3Tokenizer as SmolLMTokenizer,
101
+ )
96
102
  from keras_hub.src.models.t5.t5_tokenizer import T5Tokenizer as T5Tokenizer
97
103
  from keras_hub.src.models.t5gemma.t5gemma_tokenizer import (
98
104
  T5GemmaTokenizer as T5GemmaTokenizer,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: keras-hub-nightly
3
- Version: 0.23.0.dev202510170417
3
+ Version: 0.23.0.dev202510190425
4
4
  Summary: Pretrained models for Keras.
5
5
  Author-email: Keras team <keras-users@googlegroups.com>
6
6
  License-Expression: Apache-2.0
@@ -1,11 +1,11 @@
1
1
  keras_hub/__init__.py,sha256=bJbUZkqwhZvTb1Tqx1fbkq6mzBYiEyq-Hin3oQIkhdE,558
2
2
  keras_hub/layers/__init__.py,sha256=ufJKHxMTFhwp--E3ixfGCZqq89pZOUOxCQYgI5pEUA8,5944
3
3
  keras_hub/metrics/__init__.py,sha256=KYalsMPBnfwim9BdGHFfJ5WxUKFXOQ1QoKIMT_0lwlM,439
4
- keras_hub/models/__init__.py,sha256=E9_kQFlM75iKRiSUFEF7F8e9aqMo89-88XSSLy2sbtY,31172
4
+ keras_hub/models/__init__.py,sha256=yazrEg57HafE6Fgr-bfDXR3iFrArx6RytOEnV1CJJS8,32068
5
5
  keras_hub/samplers/__init__.py,sha256=aFQIkiqbZpi8vjrPp2MVII4QUfE-eQjra5fMeHsoy7k,886
6
6
  keras_hub/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  keras_hub/src/api_export.py,sha256=9pQZK27JObxWZ96QPLBp1OBsjWigh1iuV6RglPGMRk0,1499
8
- keras_hub/src/version.py,sha256=QhHRETV8gMH-iFFSUoHNFk78w1l9wnlAvjWBJYCdzaU,222
8
+ keras_hub/src/version.py,sha256=prwvwrYrxmvIFIyWOgIskLKJZj33Mluw4iVKP1XNOcM,222
9
9
  keras_hub/src/layers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  keras_hub/src/layers/modeling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  keras_hub/src/layers/modeling/alibi_bias.py,sha256=1XBTHI52L_iJDhN_w5ydu_iMhCuTgQAxEPwcLA6BPuk,4411
@@ -236,7 +236,7 @@ keras_hub/src/models/gemma/gemma_backbone.py,sha256=pAAVaVKB6nlA0PncVnFXvNgJV7Se
236
236
  keras_hub/src/models/gemma/gemma_causal_lm.py,sha256=3OXaIXlrKqMIuUnBk-bUz-0SYFL-XkkQTWm8qRY2YII,16770
237
237
  keras_hub/src/models/gemma/gemma_causal_lm_preprocessor.py,sha256=bpKkEurWIfa6Kp9s4pz84-sBDSA6ZFNHP8nXG1fFQrg,2912
238
238
  keras_hub/src/models/gemma/gemma_decoder_block.py,sha256=f5UsRO-VNsKJfm_WHVJWK4UahhzYm3sKprJ8jjr-zm4,7628
239
- keras_hub/src/models/gemma/gemma_presets.py,sha256=6Okl8USxHhp8EvVebNgo7JDkO527fx0aHdcRy9WNm9k,7467
239
+ keras_hub/src/models/gemma/gemma_presets.py,sha256=wAH7mjz9tbQqqdwajU2dilGytnWK1qc-aTIVLtjpTWg,8263
240
240
  keras_hub/src/models/gemma/gemma_tokenizer.py,sha256=FhcyNL4lo63MqOhTQPFr07-u3BddL0fVM4TmOm8ku-I,2622
241
241
  keras_hub/src/models/gemma/rms_normalization.py,sha256=fku-JEo2sNy-ytX7ySD1sRzdhRAPmYex_z8oFk1NiG8,833
242
242
  keras_hub/src/models/gemma3/__init__.py,sha256=oPFadkdK5DRLD6sYx83iTetY5daWuSzmJilLjokHcbU,257
@@ -469,6 +469,12 @@ keras_hub/src/models/siglip/siglip_presets.py,sha256=gOzSVhLskAthfzq8jWOtQWv14eu
469
469
  keras_hub/src/models/siglip/siglip_text_encoder.py,sha256=xOVvzyQHLX9ne30y4ussar99gNMXPXHYKlkbCX_On2Y,5380
470
470
  keras_hub/src/models/siglip/siglip_tokenizer.py,sha256=j_67JbIHJDRk-CbiemG2dgAO6lp3_0_JdnfroZ90G18,2579
471
471
  keras_hub/src/models/siglip/siglip_vision_encoder.py,sha256=CaNaFq5thBC3TUXXOf2qknk5vWsauM20ZoaDPYRnXcs,5927
472
+ keras_hub/src/models/smollm3/smollm3_backbone.py,sha256=9e8ydwy7X0stVEWgIJYt69vt6JYSCiYpM73w6oLxyoQ,7949
473
+ keras_hub/src/models/smollm3/smollm3_causal_lm.py,sha256=PWn2zPu0YS3uRvmjksmXKXpxehl8lvEHAXaO0u7nweM,12641
474
+ keras_hub/src/models/smollm3/smollm3_causal_lm_preprocessor.py,sha256=gbj7IhDbgA30AM80uG6BeI1yZmGd5yQ2VEaPWWyS9M4,3121
475
+ keras_hub/src/models/smollm3/smollm3_layers.py,sha256=lR33IynX-1G42L3hNzOBnnIx-INOzJguSQDAwIPaSIQ,26632
476
+ keras_hub/src/models/smollm3/smollm3_tokenizer.py,sha256=evOVM8pgZUkWLoXAwWiYRSNNFZ7KBv1WtFdLqpHdCQU,1877
477
+ keras_hub/src/models/smollm3/smollm3_utils.py,sha256=zAqtZTv1G--k-Dbjvk886OcmsuIxyYicRiUQXcpyud0,1904
472
478
  keras_hub/src/models/stable_diffusion_3/__init__.py,sha256=ZKYQuaRObyhKq8GVAHmoRvlXp6FpU8ChvutVCHyXKuc,343
473
479
  keras_hub/src/models/stable_diffusion_3/flow_match_euler_discrete_scheduler.py,sha256=1K_B3d3fNn50eY84OgxVHyIHHZhmlJY03b71pMSmE9s,3246
474
480
  keras_hub/src/models/stable_diffusion_3/mmdit.py,sha256=emyDmtpJiFU_9crSDBC5CaXoZnM1Eti8uAQtwv2v8B0,42794
@@ -602,15 +608,16 @@ keras_hub/src/utils/transformers/convert_qwen.py,sha256=WUxMAEFVqRs7TRw7QU5TH3_e
602
608
  keras_hub/src/utils/transformers/convert_qwen3.py,sha256=LIormvCMWPq6X9Wo2eNbADjtFZ0nI7tFGZFBxmo4GKw,5700
603
609
  keras_hub/src/utils/transformers/convert_qwen3_moe.py,sha256=4Cr2haS20VNHF1iqKRpKeZ47baV0TAXg87zkCfl-JTg,8876
604
610
  keras_hub/src/utils/transformers/convert_qwen_moe.py,sha256=a7R28aln-PdAcNuKAXdrtzvslho2Co6GypChxLMKPpc,10618
611
+ keras_hub/src/utils/transformers/convert_smollm3.py,sha256=V2vWES85YSNXNx39I8OwAcOvSpb9KxUscrDr7ra-LPA,5281
605
612
  keras_hub/src/utils/transformers/convert_t5gemma.py,sha256=DPOwd61UhjspKuCsk3_EaNvSADGP_f8KLcZARHYVk5Y,9490
606
613
  keras_hub/src/utils/transformers/convert_vit.py,sha256=YAmXh519ecSgEO5B4g-aEQg1Bb_6ifFafLMqDTfLn_c,5259
607
- keras_hub/src/utils/transformers/preset_loader.py,sha256=_NX7T6ecEQ8I01FkaZApJf-u8JUymNplixR8vcriRlQ,5075
614
+ keras_hub/src/utils/transformers/preset_loader.py,sha256=PmB4wcPaMlqMhrhk2bYt74TvRHRsZgpodfKlzixfr-Q,5219
608
615
  keras_hub/src/utils/transformers/safetensor_utils.py,sha256=CYUHyA4y-B61r7NDnCsFb4t_UmSwZ1k9L-8gzEd6KRg,3339
609
616
  keras_hub/src/utils/transformers/export/gemma.py,sha256=xX_vfQwvFZ_-lQX4kgMNOGKL7fL_1yk7QyGYV2Qyly4,4699
610
617
  keras_hub/src/utils/transformers/export/hf_exporter.py,sha256=Qk52c6LIA2eMHUNY9Vy4STJSpnhLMdJ_t-3ljqhSr4k,5081
611
- keras_hub/tokenizers/__init__.py,sha256=kyFWYm4mb--U4xYU-2Gb1COM8xEFWNK6LcKxr8h9Ivc,4561
618
+ keras_hub/tokenizers/__init__.py,sha256=XFOxDmM1Mz9TxiE8ICZK_-yTTyRFywUUiVwRIzz2QZ8,4770
612
619
  keras_hub/utils/__init__.py,sha256=jXPqVGBpJr_PpYmqD8aDG-fRMlxH-ulqCR2SZMn288Y,646
613
- keras_hub_nightly-0.23.0.dev202510170417.dist-info/METADATA,sha256=7uTd-YS4ylZmQT0k7rfgGYmhJcoHSw56H1T923OsH6I,7395
614
- keras_hub_nightly-0.23.0.dev202510170417.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
615
- keras_hub_nightly-0.23.0.dev202510170417.dist-info/top_level.txt,sha256=N4J6piIWBKa38A4uV-CnIopnOEf8mHAbkNXafXm_CuA,10
616
- keras_hub_nightly-0.23.0.dev202510170417.dist-info/RECORD,,
620
+ keras_hub_nightly-0.23.0.dev202510190425.dist-info/METADATA,sha256=eK6H5tWE7LC1HvLcbo59rJMB8xdUJ29yHGP2MYHm_B4,7395
621
+ keras_hub_nightly-0.23.0.dev202510190425.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
622
+ keras_hub_nightly-0.23.0.dev202510190425.dist-info/top_level.txt,sha256=N4J6piIWBKa38A4uV-CnIopnOEf8mHAbkNXafXm_CuA,10
623
+ keras_hub_nightly-0.23.0.dev202510190425.dist-info/RECORD,,