using LLama.Native;
using LLama.Experimental.Native;
namespace LLama.Native
{
#if NET6_0_OR_GREATER
public static class NativeLibraryAutoDownloadExtension
{
///
/// Set whether to download the best-matched native library file automatically if there's no backend or specified file to load.
/// You could add a setting here to customize the behavior of the download.
///
/// * If auto-download is enabled, please call after you have finished setting your configurations.
///
///
///
///
///
///
public static NativeLibraryConfig WithAutoDownload(this NativeLibraryConfig config, bool enable = true, NativeLibraryDownloadSettings? settings = null)
{
if (config.LibraryHasLoaded)
{
throw new Exception("The library has already loaded, you can't change the configurations. " +
"Please finish the configuration setting before any call to LLamaSharp native APIs." +
"Please use NativeLibraryConfig.DryRun if you want to see whether it's loaded successfully " +
"but still have chance to modify the configurations.");
}
if (enable)
{
if(settings is null)
{
settings = NativeLibraryDownloadSettings.Create();
}
// Don't modify and pass the original object to `Description`, create a new one instead.
// Also, we need to set the default local directory if the user does not.
if (string.IsNullOrEmpty(settings.Tag))
{
settings = settings.WithTag(GetCommitHash(NativeLibraryConfig.CurrentVersion));
}
var defaultLocalDir = NativeLibraryDownloadSettings.GetDefaultLocalDir(settings.Tag);
settings = settings.WithLocalDir(settings.LocalDir ?? defaultLocalDir);
// When using auto-download, this should be the only search directory.
List searchDirectoriesForDownload = [settings.LocalDir!];
// unless extra search paths are added by the user.
searchDirectoriesForDownload.AddRange(settings.ExtraSearchDirectories ?? []);
config.WithSearchDirectories(searchDirectoriesForDownload);
config.WithSelectingPolicy(new SelectingPolicyWithAutoDownload(settings));
}
return config;
}
private static string GetCommitHash(string version)
{
if (NativeLibraryConfig.VersionMap.TryGetValue(version, out var hash))
{
return hash;
}
else
{
return version;
}
}
///
/// Set whether to download the best-matched native library file automatically if there's no backend or specified file to load.
/// You could add a setting here to customize the behavior of the download.
///
/// If auto-download is enabled, please call after you have finished setting your configurations.
///
///
///
///
///
public static NativeLibraryConfigContainer WithAutoDownload(this NativeLibraryConfigContainer container,
bool enable = true, NativeLibraryDownloadSettings? settings = null)
{
foreach(var config in container.Configs)
{
config.WithAutoDownload(enable, settings);
}
return container;
}
}
#endif
}