@@ -59,6 +59,11 @@ public interface IModelParams
5959 /// base model path for the lora adapter (lora_base)
6060 /// </summary>
6161 string LoraBase { get ; set ; }
62+
63+ /// <summary>
64+ /// Override specific metadata items in the model
65+ /// </summary>
66+ List < MetadataOverride > MetadataOverrides { get ; }
6267 }
6368
6469 /// <summary>
@@ -186,7 +191,7 @@ public class TensorSplitsCollectionConverter
186191 : JsonConverter < TensorSplitsCollection >
187192 {
188193 /// <inheritdoc/>
189- public override TensorSplitsCollection ? Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
194+ public override TensorSplitsCollection Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
190195 {
191196 var arr = JsonSerializer . Deserialize < float [ ] > ( ref reader , options ) ?? Array . Empty < float > ( ) ;
192197 return new TensorSplitsCollection ( arr ) ;
@@ -198,4 +203,97 @@ public override void Write(Utf8JsonWriter writer, TensorSplitsCollection value,
198203 JsonSerializer . Serialize ( writer , value . Splits , options ) ;
199204 }
200205 }
206+
207+ /// <summary>
208+ /// An override for a single key/value pair in model metadata
209+ /// </summary>
210+ [ JsonConverter ( typeof ( MetadataOverrideConverter ) ) ]
211+ public abstract record MetadataOverride
212+ {
213+ /// <summary>
214+ /// Create a new override for an int key
215+ /// </summary>
216+ /// <param name="key"></param>
217+ /// <param name="value"></param>
218+ /// <returns></returns>
219+ public static MetadataOverride Create ( string key , int value )
220+ {
221+ return new IntOverride ( key , value ) ;
222+ }
223+
224+ /// <summary>
225+ /// Create a new override for a float key
226+ /// </summary>
227+ /// <param name="key"></param>
228+ /// <param name="value"></param>
229+ /// <returns></returns>
230+ public static MetadataOverride Create ( string key , float value )
231+ {
232+ return new FloatOverride ( key , value ) ;
233+ }
234+
235+ /// <summary>
236+ /// Create a new override for a boolean key
237+ /// </summary>
238+ /// <param name="key"></param>
239+ /// <param name="value"></param>
240+ /// <returns></returns>
241+ public static MetadataOverride Create ( string key , bool value )
242+ {
243+ return new BoolOverride ( key , value ) ;
244+ }
245+
246+ internal abstract void Write ( ref LLamaModelMetadataOverride dest ) ;
247+
248+ /// <summary>
249+ /// Get the key being overriden by this override
250+ /// </summary>
251+ public abstract string Key { get ; init ; }
252+
253+ private record IntOverride ( string Key , int Value ) : MetadataOverride
254+ {
255+ internal override void Write ( ref LLamaModelMetadataOverride dest )
256+ {
257+ dest . Tag = LLamaModelKvOverrideType . LLAMA_KV_OVERRIDE_INT ;
258+ dest . IntValue = Value ;
259+ }
260+ }
261+
262+ private record FloatOverride ( string Key , float Value ) : MetadataOverride
263+ {
264+ internal override void Write ( ref LLamaModelMetadataOverride dest )
265+ {
266+ dest . Tag = LLamaModelKvOverrideType . LLAMA_KV_OVERRIDE_FLOAT ;
267+ dest . FloatValue = Value ;
268+ }
269+ }
270+
271+ private record BoolOverride ( string Key , bool Value ) : MetadataOverride
272+ {
273+ internal override void Write ( ref LLamaModelMetadataOverride dest )
274+ {
275+ dest . Tag = LLamaModelKvOverrideType . LLAMA_KV_OVERRIDE_BOOL ;
276+ dest . BoolValue = Value ? - 1 : 0 ;
277+ }
278+ }
279+ }
280+
281+ public class MetadataOverrideConverter
282+ : JsonConverter < MetadataOverride >
283+ {
284+ /// <inheritdoc/>
285+ public override MetadataOverride Read ( ref Utf8JsonReader reader , Type typeToConvert , JsonSerializerOptions options )
286+ {
287+ throw new NotImplementedException ( ) ;
288+ //var arr = JsonSerializer.Deserialize<float[]>(ref reader, options) ?? Array.Empty<float>();
289+ //return new TensorSplitsCollection(arr);
290+ }
291+
292+ /// <inheritdoc/>
293+ public override void Write ( Utf8JsonWriter writer , MetadataOverride value , JsonSerializerOptions options )
294+ {
295+ throw new NotImplementedException ( ) ;
296+ //JsonSerializer.Serialize(writer, value.Splits, options);
297+ }
298+ }
201299}
0 commit comments