using System.IO;
using System;
using System.Text;
using LLama.Abstractions;
using LLama.Native;
namespace LLama.Extensions;
///
/// Extention methods to the IModelParams interface
///
public static class IModelParamsExtensions
{
///
/// Convert the given `IModelParams` into a `LLamaModelParams`
///
///
///
///
///
///
public static IDisposable ToLlamaModelParams(this IModelParams @params, out LLamaModelParams result)
{
var disposer = new GroupDisposable();
result = NativeApi.llama_model_default_params();
result.main_gpu = @params.MainGpu;
result.n_gpu_layers = @params.GpuLayerCount;
result.use_mlock = @params.UseMemoryLock;
result.use_mmap = @params.UseMemorymap;
result.vocab_only = @params.VocabOnly;
unsafe
{
result.tensor_split = (float*)disposer.Add(@params.TensorSplits.Pin()).Pointer;
}
if (@params.MetadataOverrides.Count == 0)
{
unsafe
{
result.kv_overrides = (LLamaModelMetadataOverride*)IntPtr.Zero;
}
}
else
{
// Allocate enough space for all the override items
var overrides = new LLamaModelMetadataOverride[@params.MetadataOverrides.Count + 1];
var overridesPin = overrides.AsMemory().Pin();
unsafe
{
result.kv_overrides = (LLamaModelMetadataOverride*)disposer.Add(overridesPin).Pointer;
}
// Convert each item
for (var i = 0; i < @params.MetadataOverrides.Count; i++)
{
var item = @params.MetadataOverrides[i];
var native = new LLamaModelMetadataOverride
{
Tag = item.Type
};
item.WriteValue(ref native);
// Convert key to bytes
unsafe
{
fixed (char* srcKey = item.Key)
{
Encoding.UTF8.GetBytes(srcKey, 0, native.key, 128);
}
}
overrides[i] = native;
}
}
return disposer;
}
}