@@ -75,6 +75,8 @@ def __init__(
75
75
"Big" if self .endianess == GGUFEndian .BIG else "Little" ,
76
76
))
77
77
self .state = WriterState .EMPTY
78
+ # namedobject
79
+ self .namedobject_count = 0
78
80
79
81
self .add_architecture ()
80
82
@@ -165,7 +167,33 @@ def add_array(self, key: str, val: Sequence[Any]) -> None:
165
167
self .add_key (key )
166
168
self .add_val (val , GGUFValueType .ARRAY )
167
169
168
- def add_val (self , val : Any , vtype : GGUFValueType | None = None , add_vtype : bool = True ) -> None :
170
+ def add_namedobject (self , key : str , val : bytes [Any ], name : str , array : NamedObject [Any ] | None = None ) -> None :
171
+ # array: False: add as each namedobject, True: add as each element of array of namedobject
172
+ if not name :
173
+ raise ValueError ("Need name for namedobject" )
174
+ if not val :
175
+ raise ValueError ("Need val for namedobject" )
176
+
177
+ if array is None :
178
+ self .namedobject_count += 1
179
+ key = Keys .General .NAMEDOBJECT + Keys .General .CONNECT + str (self .namedobject_count )
180
+ self .add_key (key )
181
+ self .add_val (val , GGUFValueType .NAMEDOBJECT , name = name )
182
+ else :
183
+ # if array, val and name is dammy
184
+ key = Keys .General .NAMEDOBJECT
185
+ self .add_key (key )
186
+ vtype = GGUFValueType .ARRAY
187
+ self .kv_data += self ._pack ("I" , vtype )
188
+ self .kv_data_count += 1
189
+ ltype = GGUFValueType .NAMEDOBJECT
190
+ self .kv_data += self ._pack ("I" , ltype )
191
+ self .kv_data += self ._pack ("Q" , len (array ))
192
+ for item in array :
193
+ self .add_val (item .obj , GGUFValueType .NAMEDOBJECT , add_vtype = False , name = item .name )
194
+
195
+
196
+ def add_val (self , val : Any , vtype : GGUFValueType | None = None , add_vtype : bool = True , name : str | None = None ) -> None :
169
197
if vtype is None :
170
198
vtype = GGUFValueType .get_type (val )
171
199
@@ -180,6 +208,12 @@ def add_val(self, val: Any, vtype: GGUFValueType | None = None, add_vtype: bool
180
208
encoded_val = val .encode ("utf-8" ) if isinstance (val , str ) else val
181
209
self .kv_data += self ._pack ("Q" , len (encoded_val ))
182
210
self .kv_data += encoded_val
211
+ elif vtype == GGUFValueType .NAMEDOBJECT :
212
+ encoded_name = name .encode ("utf8" ) if isinstance (name , str ) else name
213
+ self .kv_data += self ._pack ("Q" , len (encoded_name ))
214
+ self .kv_data += encoded_name
215
+ self .kv_data += self ._pack ("Q" , len (val ))
216
+ self .kv_data += val
183
217
elif vtype == GGUFValueType .ARRAY and isinstance (val , Sequence ) and val :
184
218
ltype = GGUFValueType .get_type (val [0 ])
185
219
if not all (GGUFValueType .get_type (i ) is ltype for i in val [1 :]):
0 commit comments