diff --git a/LLama.Examples/ExampleRunner.cs b/LLama.Examples/ExampleRunner.cs index 23f07c6a1..3e8682b06 100644 --- a/LLama.Examples/ExampleRunner.cs +++ b/LLama.Examples/ExampleRunner.cs @@ -23,12 +23,6 @@ public class ExampleRunner { "LLama Model: Get embeddings", GetEmbeddings.Run }, { "LLama Model: Quantize", QuantizeModel.Run }, { "Grammar: Constrain response to json format", GrammarJsonResponse.Run }, - { "Kernel Memory: Document Q&A", KernelMemory.Run }, - { "Kernel Memory: Save and Load", KernelMemorySaveAndLoad.Run }, - { "Semantic Kernel: HomeAutomation", SemanticKernelHomeAutomation.Run }, - { "Semantic Kernel: Prompt", SemanticKernelPrompt.Run }, - { "Semantic Kernel: Chat", SemanticKernelChat.Run }, - { "Semantic Kernel: Store", SemanticKernelMemory.Run }, { "Batched Executor: Simple", BatchedExecutorSimple.Run }, { "Batched Executor: Save/Load", BatchedExecutorSaveAndLoad.Run }, { "Batched Executor: Fork", BatchedExecutorFork.Run }, diff --git a/LLama.Examples/Examples/KernelMemory.cs b/LLama.Examples/Examples/KernelMemory.cs deleted file mode 100644 index 37e77d584..000000000 --- a/LLama.Examples/Examples/KernelMemory.cs +++ /dev/null @@ -1,109 +0,0 @@ -using LLamaSharp.KernelMemory; -using Microsoft.KernelMemory; -using Microsoft.KernelMemory.Configuration; -using System.Diagnostics; - -namespace LLama.Examples.Examples -{ - // This example is from Microsoft's official kernel memory "custom prompts" example: - // https://github.com/microsoft/kernel-memory/blob/6d516d70a23d50c6cb982e822e6a3a9b2e899cfa/examples/101-dotnet-custom-Prompts/Program.cs#L1-L86 - - // Microsoft.KernelMemory has more features than Microsoft.SemanticKernel. - // See https://microsoft.github.io/kernel-memory/ for details. - - public class KernelMemory - { - public static async Task Run() - { - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine( - """ - - This program uses the Microsoft.KernelMemory package to ingest documents - and answer questions about them in an interactive chat prompt. - - """); - - // Setup the kernel memory with the LLM model - string modelPath = UserSettings.GetModelPath(); - IKernelMemory memory = CreateMemory(modelPath); - - // Ingest documents (format is automatically detected from the filename) - string[] filesToIngest = [ - Path.GetFullPath(@"./Assets/sample-SK-Readme.pdf"), - Path.GetFullPath(@"./Assets/sample-KM-Readme.pdf"), - ]; - - for (int i = 0; i < filesToIngest.Length; i++) - { - string path = filesToIngest[i]; - Stopwatch sw = Stopwatch.StartNew(); - Console.ForegroundColor = ConsoleColor.Blue; - Console.WriteLine($"Importing {i + 1} of {filesToIngest.Length}: {path}"); - await memory.ImportDocumentAsync(path, steps: Constants.PipelineWithoutSummary); - Console.WriteLine($"Completed in {sw.Elapsed}\n"); - } - - // Ask a predefined question - Console.ForegroundColor = ConsoleColor.Green; - string question1 = "What is Kernel Memory"; - Console.WriteLine($"Question: {question1}"); - await AnswerQuestion(memory, question1); - - // Let the user ask additional questions - while (true) - { - Console.ForegroundColor = ConsoleColor.Green; - Console.Write("Question: "); - string question = Console.ReadLine()!; - if (string.IsNullOrEmpty(question)) - return; - - await AnswerQuestion(memory, question); - } - } - - private static IKernelMemory CreateMemory(string modelPath) - { - Common.InferenceParams infParams = new() { AntiPrompts = ["\n\n"] }; - - LLamaSharpConfig lsConfig = new(modelPath) { DefaultInferenceParams = infParams }; - - SearchClientConfig searchClientConfig = new() - { - MaxMatchesCount = 1, - AnswerTokens = 100, - }; - - TextPartitioningOptions parseOptions = new() - { - MaxTokensPerParagraph = 300, - OverlappingTokens = 30 - }; - - return new KernelMemoryBuilder() - .WithLLamaSharpDefaults(lsConfig) - .WithSearchClientConfig(searchClientConfig) - .With(parseOptions) - .Build(); - } - - private static async Task AnswerQuestion(IKernelMemory memory, string question) - { - Stopwatch sw = Stopwatch.StartNew(); - Console.ForegroundColor = ConsoleColor.DarkGray; - Console.WriteLine($"Generating answer..."); - - MemoryAnswer answer = await memory.AskAsync(question); - Console.WriteLine($"Answer generated in {sw.Elapsed}"); - - Console.ForegroundColor = ConsoleColor.Gray; - Console.WriteLine($"Answer: {answer.Result}"); - foreach (var source in answer.RelevantSources) - { - Console.WriteLine($"Source: {source.SourceName}"); - } - Console.WriteLine(); - } - } -} \ No newline at end of file diff --git a/LLama.Examples/Examples/KernelMemorySaveAndLoad.cs b/LLama.Examples/Examples/KernelMemorySaveAndLoad.cs deleted file mode 100644 index b953ccff3..000000000 --- a/LLama.Examples/Examples/KernelMemorySaveAndLoad.cs +++ /dev/null @@ -1,160 +0,0 @@ -using LLamaSharp.KernelMemory; -using Microsoft.KernelMemory; -using Microsoft.KernelMemory.Configuration; -using Microsoft.KernelMemory.FileSystem.DevTools; -using Microsoft.KernelMemory.MemoryStorage.DevTools; -using System.Diagnostics; -using Microsoft.KernelMemory.DocumentStorage.DevTools; - -namespace LLama.Examples.Examples; - -public class KernelMemorySaveAndLoad -{ - static string StorageFolder => Path.GetFullPath($"./storage-{nameof(KernelMemorySaveAndLoad)}"); - static bool StorageExists => Directory.Exists(StorageFolder) && Directory.GetDirectories(StorageFolder).Length > 0; - - public static async Task Run() - { - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine( - """ - - This program uses the Microsoft.KernelMemory package to ingest documents - and store the embeddings as local files so they can be quickly recalled - when this application is launched again. - - """); - - string modelPath = UserSettings.GetModelPath(); - IKernelMemory memory = CreateMemoryWithLocalStorage(modelPath); - - Console.ForegroundColor = ConsoleColor.Yellow; - if (StorageExists) - { - Console.WriteLine( - """ - - Kernel memory files have been located! - Information about previously analyzed documents has been loaded. - - """); - } - else - { - Console.WriteLine( - $""" - - Existing kernel memory was not found. - Documents will be analyzed (slow) and information saved to disk. - Analysis will not be required the next time this program is run. - Press ENTER to proceed... - - """); - Console.ReadLine(); - await IngestDocuments(memory); - } - - await AskSingleQuestion(memory, "What is Kernel Memory"); - await StartUserChatSession(memory); - } - - private static IKernelMemory CreateMemoryWithLocalStorage(string modelPath) - { - Common.InferenceParams infParams = new() { AntiPrompts = ["\n\n"] }; - - LLamaSharpConfig lsConfig = new(modelPath) { DefaultInferenceParams = infParams }; - - SearchClientConfig searchClientConfig = new() - { - MaxMatchesCount = 1, - AnswerTokens = 100, - }; - - TextPartitioningOptions parseOptions = new() - { - MaxTokensPerParagraph = 300, - OverlappingTokens = 30 - }; - - SimpleFileStorageConfig storageConfig = new() - { - Directory = StorageFolder, - StorageType = FileSystemTypes.Disk, - }; - - SimpleVectorDbConfig vectorDbConfig = new() - { - Directory = StorageFolder, - StorageType = FileSystemTypes.Disk, - }; - - Console.ForegroundColor = ConsoleColor.Blue; - Console.WriteLine($"Kernel memory folder: {StorageFolder}"); - - Console.ForegroundColor = ConsoleColor.DarkGray; - return new KernelMemoryBuilder() - .WithSimpleFileStorage(storageConfig) - .WithSimpleVectorDb(vectorDbConfig) - .WithLLamaSharpDefaults(lsConfig) - .WithSearchClientConfig(searchClientConfig) - .With(parseOptions) - .Build(); - } - - private static async Task AskSingleQuestion(IKernelMemory memory, string question) - { - Console.ForegroundColor = ConsoleColor.Green; - Console.WriteLine($"Question: {question}"); - await ShowAnswer(memory, question); - } - - private static async Task StartUserChatSession(IKernelMemory memory) - { - while (true) - { - Console.ForegroundColor = ConsoleColor.Green; - Console.Write("Question: "); - string question = Console.ReadLine()!; - if (string.IsNullOrEmpty(question)) - return; - - await ShowAnswer(memory, question); - } - } - - private static async Task IngestDocuments(IKernelMemory memory) - { - string[] filesToIngest = [ - Path.GetFullPath(@"./Assets/sample-SK-Readme.pdf"), - Path.GetFullPath(@"./Assets/sample-KM-Readme.pdf"), - ]; - - for (int i = 0; i < filesToIngest.Length; i++) - { - string path = filesToIngest[i]; - Stopwatch sw = Stopwatch.StartNew(); - Console.ForegroundColor = ConsoleColor.Blue; - Console.WriteLine($"Importing {i + 1} of {filesToIngest.Length}: {path}"); - await memory.ImportDocumentAsync(path, steps: Constants.PipelineWithoutSummary); - Console.WriteLine($"Completed in {sw.Elapsed}\n"); - } - } - - private static async Task ShowAnswer(IKernelMemory memory, string question) - { - Stopwatch sw = Stopwatch.StartNew(); - Console.ForegroundColor = ConsoleColor.DarkGray; - Console.WriteLine($"Generating answer..."); - - MemoryAnswer answer = await memory.AskAsync(question); - Console.WriteLine($"Answer generated in {sw.Elapsed}"); - - Console.ForegroundColor = ConsoleColor.Gray; - Console.WriteLine($"Answer: {answer.Result}"); - foreach (var source in answer.RelevantSources) - { - Console.WriteLine($"Source: {source.SourceName}"); - } - Console.WriteLine(); - } -} \ No newline at end of file diff --git a/LLama.Examples/Examples/SemanticKernelChat.cs b/LLama.Examples/Examples/SemanticKernelChat.cs deleted file mode 100644 index 2631cc9b9..000000000 --- a/LLama.Examples/Examples/SemanticKernelChat.cs +++ /dev/null @@ -1,62 +0,0 @@ -using LLama.Common; -using LLamaSharp.SemanticKernel.ChatCompletion; -using Microsoft.SemanticKernel.ChatCompletion; - -namespace LLama.Examples.Examples -{ - public class SemanticKernelChat - { - public static async Task Run() - { - string modelPath = UserSettings.GetModelPath(); - - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine("This example is from: \n" + - "https://github.com/microsoft/semantic-kernel/blob/main/dotnet/samples/KernelSyntaxExamples/Example17_ChatGPT.cs"); - - // Load weights into memory - var parameters = new ModelParams(modelPath); - using var model = await LLamaWeights.LoadFromFileAsync(parameters); - var ex = new StatelessExecutor(model, parameters); - - var chatGPT = new LLamaSharpChatCompletion(ex); - - var chatHistory = chatGPT.CreateNewChat("This is a conversation between the " + - "assistant and the user. \n\n You are a librarian, expert about books. "); - - Console.WriteLine("Chat content:"); - Console.WriteLine("------------------------"); - - chatHistory.AddUserMessage("Hi, I'm looking for book suggestions"); - await MessageOutputAsync(chatHistory); - - // First bot assistant message - var reply = await chatGPT.GetChatMessageContentAsync(chatHistory); - chatHistory.AddAssistantMessage(reply.Content); - await MessageOutputAsync(chatHistory); - - // Second user message - chatHistory.AddUserMessage("I love history and philosophy, I'd like to learn " + - "something new about Greece, any suggestion"); - await MessageOutputAsync(chatHistory); - - // Second bot assistant message - reply = await chatGPT.GetChatMessageContentAsync(chatHistory); - chatHistory.AddAssistantMessage(reply.Content); - await MessageOutputAsync(chatHistory); - } - - /// - /// Outputs the last message of the chat history - /// - private static Task MessageOutputAsync(Microsoft.SemanticKernel.ChatCompletion.ChatHistory chatHistory) - { - var message = chatHistory.Last(); - - Console.WriteLine($"{message.Role}: {message.Content}"); - Console.WriteLine("------------------------"); - - return Task.CompletedTask; - } - } -} diff --git a/LLama.Examples/Examples/SemanticKernelHomeAutomation.cs b/LLama.Examples/Examples/SemanticKernelHomeAutomation.cs deleted file mode 100644 index 07e1a5591..000000000 --- a/LLama.Examples/Examples/SemanticKernelHomeAutomation.cs +++ /dev/null @@ -1,170 +0,0 @@ -using LLama.Common; -using LLamaSharp.SemanticKernel; -using LLamaSharp.SemanticKernel.ChatCompletion; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.ChatCompletion; -using System.ComponentModel; -using AuthorRole = Microsoft.SemanticKernel.ChatCompletion.AuthorRole; -using ChatHistory = Microsoft.SemanticKernel.ChatCompletion.ChatHistory; - -namespace LLama.Examples.Examples -{ - public class SemanticKernelHomeAutomation - { - public static async Task Run() - { - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine("This example was inspired by the HomeAutomation example in SemanticKernel."); - Console.ForegroundColor = ConsoleColor.White; - - string modelPath = UserSettings.GetModelPath(); - - // Load weights into memory - var parameters = new ModelParams(modelPath); - using var model = await LLamaWeights.LoadFromFileAsync(parameters); - var slex = new StatelessExecutor(model, parameters); - - HostApplicationBuilder builder = Host.CreateApplicationBuilder(); - - // Actual code to execute is found in Worker class - builder.Services.AddHostedService(); - - builder.Services.AddSingleton(sp => - { - return new LLamaSharpChatCompletion(slex, - new LLamaSharpPromptExecutionSettings() - { - MaxTokens = -1, - Temperature = 0, - TopP = 0.1, - }); - }); - - // Add plugins that can be used by kernels - // The plugins are added as singletons so that they can be used by multiple kernels - builder.Services.AddKeyedSingleton("OfficeLight"); - - // Add a home automation kernel to the dependency injection container - builder.Services.AddKeyedTransient("HomeAutomationKernel", (sp, key) => - { - // Create a collection of plugins that the kernel will use - KernelPluginCollection pluginCollection = []; - pluginCollection.AddFromObject(sp.GetRequiredKeyedService("OfficeLight"), "OfficeLight"); - - // When created by the dependency injection container, Semantic Kernel logging is included by default - return new Kernel(sp, pluginCollection); - }); - - //remove logging - builder.Services.AddSingleton(sp => { return NullLoggerFactory.Instance; }); - - using IHost host = builder.Build(); - - await host.RunAsync(); - } - } - - internal class Worker( - IHostApplicationLifetime hostApplicationLifetime, - [FromKeyedServices("HomeAutomationKernel")] Kernel kernel) : BackgroundService - { - private readonly IHostApplicationLifetime _hostApplicationLifetime = hostApplicationLifetime; - private readonly Kernel _kernel = kernel; - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - // Get chat completion service - var chatCompletionService = _kernel.GetRequiredService(); - - Console.WriteLine("Ask questions or give instructions to the copilot such as:\n" + - "- Turn on the light.\n" + - "- Which light is currently on?\n"); - - Console.Write("> "); - - LLamaSharpPromptExecutionSettings llamaSharpPromptExecutionSettings = new() - { - Temperature = 0.0f, - TopP = 0.1f - }; - - string? input; - - while ((input = Console.ReadLine()) != null) - { - ChatHistory chatHistory = new ChatHistory(); - chatHistory.Add(new ChatMessageContent(AuthorRole.System, - """ - You are an assistant who determines the user's intent. Here are the possible intents: - - If the user wants to turn the light ON, then answer with the following: - ´´´answer - [TURN ON THE LIGHT] - ´´´ - - If the user wants to turn the light OFF, then answer with the following: - ´´´answer - [TURN OFF THE LIGHT] - ´´´ - - If the user wants to know which light is on currently, then answer with the following: - ´´´answer - [WHICH LIGHT IS ON] - ´´´ - IMPORTANT: only return the answer without further comments with the format ´´´answer{intent}´´´, where {intent} is the user's intent. - """ - )); - - Console.WriteLine(); - - chatHistory.Add(new ChatMessageContent(AuthorRole.User, input)); - - ChatMessageContent chatResult = await chatCompletionService.GetChatMessageContentAsync(chatHistory, llamaSharpPromptExecutionSettings, _kernel, stoppingToken); - - FunctionResult? fres = null; - if (chatResult.Content!.Contains("[TURN ON THE LIGHT]")) - { - fres = await _kernel.InvokeAsync("OfficeLight", "TurnOn", cancellationToken: stoppingToken); - } - else if (chatResult.Content.Contains("[TURN OFF THE LIGHT]")) - { - fres = await _kernel.InvokeAsync("OfficeLight", "TurnOff", cancellationToken: stoppingToken); - } - - Console.ForegroundColor = ConsoleColor.Green; - if (fres != null || chatResult.Content.Contains("[WHICH LIGHT IS ON]")) - { - fres = await _kernel.InvokeAsync("OfficeLight", "IsTurnedOn", cancellationToken: stoppingToken); - Console.Write($">>> Result:\n {(fres.GetValue()==true?"The light is ON.": "The light is OFF.")}\n\n> "); - } - else - { - Console.Write($">>> Result: {chatResult}\n\n> "); - } - Console.ForegroundColor = ConsoleColor.White; - } - - _hostApplicationLifetime.StopApplication(); - } - - } - - /// - /// Class that represents a controllable light. - /// - [Description("Represents a light")] - internal class MyLightPlugin(bool turnedOn = false) - { - private bool _turnedOn = turnedOn; - - [KernelFunction, Description("Returns whether this light is on")] - public bool IsTurnedOn() => _turnedOn; - - [KernelFunction, Description("Turn on this light")] - public void TurnOn() => _turnedOn = true; - - [KernelFunction, Description("Turn off this light")] - public void TurnOff() => _turnedOn = false; - } -} diff --git a/LLama.Examples/Examples/SemanticKernelMemory.cs b/LLama.Examples/Examples/SemanticKernelMemory.cs deleted file mode 100644 index d2f817983..000000000 --- a/LLama.Examples/Examples/SemanticKernelMemory.cs +++ /dev/null @@ -1,162 +0,0 @@ -using LLama.Common; -using Microsoft.SemanticKernel.Memory; -using LLamaSharp.SemanticKernel.TextEmbedding; - -namespace LLama.Examples.Examples -{ - public class SemanticKernelMemory - { - private const string MemoryCollectionName = "SKGitHub"; - - public static async Task Run() - { - string modelPath = UserSettings.GetModelPath(); - - Console.WriteLine("This example is from: \n" + - "https://github.com/microsoft/semantic-kernel/blob/main/dotnet/samples/KernelSyntaxExamples/Example14_SemanticMemory.cs"); - - // Load weights into memory - var parameters = new ModelParams(modelPath) - { - Embeddings = true - }; - - using var model = await LLamaWeights.LoadFromFileAsync(parameters); - var embedding = new LLamaEmbedder(model, parameters); - - Console.WriteLine("===================================================="); - Console.WriteLine("======== Semantic Memory (volatile, in RAM) ========"); - Console.WriteLine("===================================================="); - - /* You can build your own semantic memory combining an Embedding Generator - * with a Memory storage that supports search by similarity (ie semantic search). - * - * In this example we use a volatile memory, a local simulation of a vector DB. - * - * You can replace VolatileMemoryStore with Qdrant (see QdrantMemoryStore connector) - * or implement your connectors for Pinecone, Vespa, Postgres + pgvector, SQLite VSS, etc. - */ - - var memory = new MemoryBuilder() - .WithTextEmbeddingGeneration(new LLamaSharpEmbeddingGeneration(embedding)) - .WithMemoryStore(new VolatileMemoryStore()) - .Build(); - - await RunExampleAsync(memory); - } - - private static async Task RunExampleAsync(ISemanticTextMemory memory) - { - await StoreMemoryAsync(memory); - - await SearchMemoryAsync(memory, "How do I get started?"); - - /* - Output: - - Query: How do I get started? - - Result 1: - URL: : https://github.com/microsoft/semantic-kernel/blob/main/README.md - Title : README: Installation, getting started, and how to contribute - - Result 2: - URL: : https://github.com/microsoft/semantic-kernel/blob/main/samples/dotnet-jupyter-notebooks/00-getting-started.ipynb - Title : Jupyter notebook describing how to get started with the Semantic Kernel - - */ - - await SearchMemoryAsync(memory, "Can I build a chat with SK?"); - - /* - Output: - - Query: Can I build a chat with SK? - - Result 1: - URL: : https://github.com/microsoft/semantic-kernel/tree/main/samples/skills/ChatSkill/ChatGPT - Title : Sample demonstrating how to create a chat skill interfacing with ChatGPT - - Result 2: - URL: : https://github.com/microsoft/semantic-kernel/blob/main/samples/apps/chat-summary-webapp-react/README.md - Title : README: README associated with a sample chat summary react-based webapp - - */ - - await SearchMemoryAsync(memory, "Jupyter notebook"); - - await SearchMemoryAsync(memory, "README: README associated with a sample chat summary react-based webapp"); - - await SearchMemoryAsync(memory, "Jupyter notebook describing how to pass prompts from a file to a semantic skill or function"); - } - - private static async Task SearchMemoryAsync(ISemanticTextMemory memory, string query) - { - Console.WriteLine("\nQuery: " + query + "\n"); - - var memories = memory.SearchAsync(MemoryCollectionName, query, limit: 10, minRelevanceScore: 0.5); - - int i = 0; - await foreach (MemoryQueryResult result in memories) - { - Console.WriteLine($"Result {++i}:"); - Console.WriteLine(" URL: : " + result.Metadata.Id); - Console.WriteLine(" Title : " + result.Metadata.Description); - Console.WriteLine(" Relevance: " + result.Relevance); - Console.WriteLine(); - } - - Console.WriteLine("----------------------"); - } - - private static async Task StoreMemoryAsync(ISemanticTextMemory memory) - { - /* Store some data in the semantic memory. - * - * When using Azure Cognitive Search the data is automatically indexed on write. - * - * When using the combination of VolatileStore and Embedding generation, SK takes - * care of creating and storing the index - */ - - Console.WriteLine("\nAdding some GitHub file URLs and their descriptions to the semantic memory."); - var githubFiles = SampleData(); - var i = 0; - foreach (var entry in githubFiles) - { - var result = await memory.SaveReferenceAsync( - collection: MemoryCollectionName, - externalSourceName: "GitHub", - externalId: entry.Key, - description: entry.Value, - text: entry.Value); - - Console.WriteLine($"#{++i} saved."); - Console.WriteLine(result); - } - - Console.WriteLine("\n----------------------"); - } - - private static Dictionary SampleData() - { - return new Dictionary - { - ["https://github.com/microsoft/semantic-kernel/blob/main/README.md"] - = "README: Installation, getting started, and how to contribute", - ["https://github.com/microsoft/semantic-kernel/blob/main/dotnet/notebooks/02-running-prompts-from-file.ipynb"] - = "Jupyter notebook describing how to pass prompts from a file to a semantic skill or function", - ["https://github.com/microsoft/semantic-kernel/blob/main/dotnet/notebooks//00-getting-started.ipynb"] - = "Jupyter notebook describing how to get started with the Semantic Kernel", - ["https://github.com/microsoft/semantic-kernel/tree/main/samples/skills/ChatSkill/ChatGPT"] - = "Sample demonstrating how to create a chat skill interfacing with ChatGPT", - ["https://github.com/microsoft/semantic-kernel/blob/main/dotnet/src/SemanticKernel/Memory/VolatileMemoryStore.cs"] - = "C# class that defines a volatile embedding store", - ["https://github.com/microsoft/semantic-kernel/blob/main/samples/dotnet/KernelHttpServer/README.md"] - = "README: How to set up a Semantic Kernel Service API using Azure Function Runtime v4", - ["https://github.com/microsoft/semantic-kernel/blob/main/samples/apps/chat-summary-webapp-react/README.md"] - = "README: README associated with a sample chat summary react-based webapp", - }; - } - } -} diff --git a/LLama.Examples/Examples/SemanticKernelPrompt.cs b/LLama.Examples/Examples/SemanticKernelPrompt.cs deleted file mode 100644 index 0d62e0b3f..000000000 --- a/LLama.Examples/Examples/SemanticKernelPrompt.cs +++ /dev/null @@ -1,52 +0,0 @@ -using LLama.Common; -using Microsoft.SemanticKernel; -using LLamaSharp.SemanticKernel.TextCompletion; -using Microsoft.SemanticKernel.TextGeneration; -using Microsoft.Extensions.DependencyInjection; -using LLamaSharp.SemanticKernel; - -namespace LLama.Examples.Examples -{ - public class SemanticKernelPrompt - { - public static async Task Run() - { - string modelPath = UserSettings.GetModelPath(); - - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine("This example is from: " + - "https://github.com/microsoft/semantic-kernel/blob/main/dotnet/README.md"); - - // Load weights into memory - var parameters = new ModelParams(modelPath); - using var model = await LLamaWeights.LoadFromFileAsync(parameters); - var ex = new StatelessExecutor(model, parameters); - - var builder = Kernel.CreateBuilder(); - builder.Services.AddKeyedSingleton("local-llama", new LLamaSharpTextCompletion(ex)); - - var kernel = builder.Build(); - - var prompt = @"{{$input}} - -One line TLDR with the fewest words."; - - LLamaSharpPromptExecutionSettings settings = new() { MaxTokens = 100 }; - var summarize = kernel.CreateFunctionFromPrompt(prompt, settings); - - string text1 = @" -1st Law of Thermodynamics - Energy cannot be created or destroyed. -2nd Law of Thermodynamics - For a spontaneous process, the entropy of the universe increases. -3rd Law of Thermodynamics - A perfect crystal at zero Kelvin has zero entropy."; - - string text2 = @" -1. An object at rest remains at rest, and an object in motion remains in motion at constant speed and in a straight line unless acted on by an unbalanced force. -2. The acceleration of an object depends on the mass of the object and the amount of force applied. -3. Whenever one object exerts a force on another object, the second object exerts an equal and opposite on the first."; - - Console.WriteLine((await kernel.InvokeAsync(summarize, new() { ["input"] = text1 })).GetValue()); - - Console.WriteLine((await kernel.InvokeAsync(summarize, new() { ["input"] = text2 })).GetValue()); - } - } -} diff --git a/LLama.Examples/LLama.Examples.csproj b/LLama.Examples/LLama.Examples.csproj index c108a2ef2..803d9b8be 100644 --- a/LLama.Examples/LLama.Examples.csproj +++ b/LLama.Examples/LLama.Examples.csproj @@ -15,9 +15,6 @@ - - - @@ -30,8 +27,6 @@ - - diff --git a/LLama.SemanticKernel/LLamaSharp.SemanticKernel.csproj b/LLama.SemanticKernel/LLamaSharp.SemanticKernel.csproj index 81fdbce8c..e3629cc6e 100644 --- a/LLama.SemanticKernel/LLamaSharp.SemanticKernel.csproj +++ b/LLama.SemanticKernel/LLamaSharp.SemanticKernel.csproj @@ -33,10 +33,6 @@ SKEXP0001,SKEXP0052 - - - - diff --git a/LLama.Unittest/LLama.Unittest.csproj b/LLama.Unittest/LLama.Unittest.csproj index 80d1a3b88..700ba51c6 100644 --- a/LLama.Unittest/LLama.Unittest.csproj +++ b/LLama.Unittest/LLama.Unittest.csproj @@ -124,7 +124,6 @@ - diff --git a/LLama.Unittest/SemanticKernel/ChatRequestSettingsConverterTests.cs b/LLama.Unittest/SemanticKernel/ChatRequestSettingsConverterTests.cs deleted file mode 100644 index 42274e2a6..000000000 --- a/LLama.Unittest/SemanticKernel/ChatRequestSettingsConverterTests.cs +++ /dev/null @@ -1,107 +0,0 @@ -using LLamaSharp.SemanticKernel; -using System.Text.Json; - -namespace LLama.Unittest.SemanticKernel -{ - public class ChatRequestSettingsConverterTests - { - [Fact] - public void ChatRequestSettingsConverter_DeserializeWithDefaults() - { - // Arrange - var options = new JsonSerializerOptions(); - options.Converters.Add(new LLamaSharpPromptExecutionSettingsConverter()); - var json = "{}"; - - // Act - var requestSettings = JsonSerializer.Deserialize(json, options); - - // Assert - Assert.NotNull(requestSettings); - Assert.Equal(0, requestSettings.FrequencyPenalty); - Assert.Null(requestSettings.MaxTokens); - Assert.Equal(0, requestSettings.PresencePenalty); - Assert.Equal(1, requestSettings.ResultsPerPrompt); - Assert.NotNull(requestSettings.StopSequences); - Assert.Empty(requestSettings.StopSequences); - Assert.Equal(0, requestSettings.Temperature); - Assert.NotNull(requestSettings.TokenSelectionBiases); - Assert.Empty(requestSettings.TokenSelectionBiases); - Assert.Equal(0, requestSettings.TopP); - } - - [Fact] - public void ChatRequestSettingsConverter_DeserializeWithSnakeCase() - { - // Arrange - var options = new JsonSerializerOptions(); - options.AllowTrailingCommas = true; - options.Converters.Add(new LLamaSharpPromptExecutionSettingsConverter()); - var json = @"{ - ""frequency_penalty"": 0.5, - ""max_tokens"": 250, - ""presence_penalty"": 0.5, - ""results_per_prompt"": -1, - ""stop_sequences"": [ ""foo"", ""bar"" ], - ""temperature"": 0.5, - ""token_selection_biases"": { ""1"": 2, ""3"": 4 }, - ""top_p"": 0.5, -}"; - - // Act - var requestSettings = JsonSerializer.Deserialize(json, options); - - // Assert - Assert.NotNull(requestSettings); - Assert.Equal(0.5, requestSettings.FrequencyPenalty); - Assert.Equal(250, requestSettings.MaxTokens); - Assert.Equal(0.5, requestSettings.PresencePenalty); - Assert.Equal(-1, requestSettings.ResultsPerPrompt); - Assert.NotNull(requestSettings.StopSequences); - Assert.Contains("foo", requestSettings.StopSequences); - Assert.Contains("bar", requestSettings.StopSequences); - Assert.Equal(0.5, requestSettings.Temperature); - Assert.NotNull(requestSettings.TokenSelectionBiases); - Assert.Equal(2, requestSettings.TokenSelectionBiases[1]); - Assert.Equal(4, requestSettings.TokenSelectionBiases[3]); - Assert.Equal(0.5, requestSettings.TopP); - } - - [Fact] - public void ChatRequestSettingsConverter_DeserializeWithPascalCase() - { - // Arrange - var options = new JsonSerializerOptions(); - options.AllowTrailingCommas = true; - options.Converters.Add(new LLamaSharpPromptExecutionSettingsConverter()); - var json = @"{ - ""FrequencyPenalty"": 0.5, - ""MaxTokens"": 250, - ""PresencePenalty"": 0.5, - ""ResultsPerPrompt"": -1, - ""StopSequences"": [ ""foo"", ""bar"" ], - ""Temperature"": 0.5, - ""TokenSelectionBiases"": { ""1"": 2, ""3"": 4 }, - ""TopP"": 0.5, -}"; - - // Act - var requestSettings = JsonSerializer.Deserialize(json, options); - - // Assert - Assert.NotNull(requestSettings); - Assert.Equal(0.5, requestSettings.FrequencyPenalty); - Assert.Equal(250, requestSettings.MaxTokens); - Assert.Equal(0.5, requestSettings.PresencePenalty); - Assert.Equal(-1, requestSettings.ResultsPerPrompt); - Assert.NotNull(requestSettings.StopSequences); - Assert.Contains("foo", requestSettings.StopSequences); - Assert.Contains("bar", requestSettings.StopSequences); - Assert.Equal(0.5, requestSettings.Temperature); - Assert.NotNull(requestSettings.TokenSelectionBiases); - Assert.Equal(2, requestSettings.TokenSelectionBiases[1]); - Assert.Equal(4, requestSettings.TokenSelectionBiases[3]); - Assert.Equal(0.5, requestSettings.TopP); - } - } -} diff --git a/LLama.Unittest/SemanticKernel/ChatRequestSettingsTests.cs b/LLama.Unittest/SemanticKernel/ChatRequestSettingsTests.cs deleted file mode 100644 index d75a8d4b4..000000000 --- a/LLama.Unittest/SemanticKernel/ChatRequestSettingsTests.cs +++ /dev/null @@ -1,169 +0,0 @@ -using LLamaSharp.SemanticKernel; -using Microsoft.SemanticKernel; - -namespace LLama.Unittest.SemanticKernel -{ - public class ChatRequestSettingsTests - { - [Fact] - public void ChatRequestSettings_FromRequestSettingsNull() - { - // Arrange - // Act - var requestSettings = LLamaSharpPromptExecutionSettings.FromRequestSettings(null, null); - - // Assert - Assert.NotNull(requestSettings); - Assert.Equal(0, requestSettings.FrequencyPenalty); - Assert.Null(requestSettings.MaxTokens); - Assert.Equal(0, requestSettings.PresencePenalty); - Assert.Equal(1, requestSettings.ResultsPerPrompt); - Assert.NotNull(requestSettings.StopSequences); - Assert.Empty(requestSettings.StopSequences); - Assert.Equal(0, requestSettings.Temperature); - Assert.NotNull(requestSettings.TokenSelectionBiases); - Assert.Empty(requestSettings.TokenSelectionBiases); - Assert.Equal(0, requestSettings.TopP); - } - - [Fact] - public void ChatRequestSettings_FromRequestSettingsNullWithMaxTokens() - { - // Arrange - // Act - var requestSettings = LLamaSharpPromptExecutionSettings.FromRequestSettings(null, 200); - - // Assert - Assert.NotNull(requestSettings); - Assert.Equal(0, requestSettings.FrequencyPenalty); - Assert.Equal(200, requestSettings.MaxTokens); - Assert.Equal(0, requestSettings.PresencePenalty); - Assert.Equal(1, requestSettings.ResultsPerPrompt); - Assert.NotNull(requestSettings.StopSequences); - Assert.Empty(requestSettings.StopSequences); - Assert.Equal(0, requestSettings.Temperature); - Assert.NotNull(requestSettings.TokenSelectionBiases); - Assert.Empty(requestSettings.TokenSelectionBiases); - Assert.Equal(0, requestSettings.TopP); - } - - [Fact] - public void ChatRequestSettings_FromExistingRequestSettings() - { - // Arrange - var originalRequestSettings = new LLamaSharpPromptExecutionSettings() - { - FrequencyPenalty = 0.5, - MaxTokens = 100, - PresencePenalty = 0.5, - ResultsPerPrompt = -1, - StopSequences = new[] { "foo", "bar" }, - Temperature = 0.5, - TokenSelectionBiases = new Dictionary() { { 1, 2 }, { 3, 4 } }, - TopP = 0.5, - }; - - // Act - var requestSettings = LLamaSharpPromptExecutionSettings.FromRequestSettings(originalRequestSettings); - - // Assert - Assert.NotNull(requestSettings); - Assert.Equal(originalRequestSettings, requestSettings); - } - - [Fact] - public void ChatRequestSettings_FromAIRequestSettings() - { - // Arrange - var originalRequestSettings = new PromptExecutionSettings() - { - ModelId = "test", - }; - - // Act - var requestSettings = LLamaSharpPromptExecutionSettings.FromRequestSettings(originalRequestSettings); - - // Assert - Assert.NotNull(requestSettings); - Assert.Equal(originalRequestSettings.ModelId, requestSettings.ModelId); - } - - [Fact] - public void ChatRequestSettings_FromAIRequestSettingsWithExtraPropertiesInSnakeCase() - { - // Arrange - var originalRequestSettings = new PromptExecutionSettings() - { - ModelId = "test", - ExtensionData = new Dictionary - { - { "frequency_penalty", 0.5 }, - { "max_tokens", 250 }, - { "presence_penalty", 0.5 }, - { "results_per_prompt", -1 }, - { "stop_sequences", new [] { "foo", "bar" } }, - { "temperature", 0.5 }, - { "token_selection_biases", new Dictionary() { { 1, 2 }, { 3, 4 } } }, - { "top_p", 0.5 }, - } - }; - - // Act - var requestSettings = LLamaSharpPromptExecutionSettings.FromRequestSettings(originalRequestSettings); - - // Assert - Assert.NotNull(requestSettings); - Assert.Equal(0.5, requestSettings.FrequencyPenalty); - Assert.Equal(250, requestSettings.MaxTokens); - Assert.Equal(0.5, requestSettings.PresencePenalty); - Assert.Equal(-1, requestSettings.ResultsPerPrompt); - Assert.NotNull(requestSettings.StopSequences); - Assert.Contains("foo", requestSettings.StopSequences); - Assert.Contains("bar", requestSettings.StopSequences); - Assert.Equal(0.5, requestSettings.Temperature); - Assert.NotNull(requestSettings.TokenSelectionBiases); - Assert.Equal(2, requestSettings.TokenSelectionBiases[1]); - Assert.Equal(4, requestSettings.TokenSelectionBiases[3]); - Assert.Equal(0.5, requestSettings.TopP); - } - - [Fact] - public void ChatRequestSettings_FromAIRequestSettingsWithExtraPropertiesInPascalCase() - { - // Arrange - var originalRequestSettings = new PromptExecutionSettings() - { - ModelId = "test", - ExtensionData = new Dictionary - { - { "FrequencyPenalty", 0.5 }, - { "MaxTokens", 250 }, - { "PresencePenalty", 0.5 }, - { "ResultsPerPrompt", -1 }, - { "StopSequences", new [] { "foo", "bar" } }, - { "Temperature", 0.5 }, - { "TokenSelectionBiases", new Dictionary() { { 1, 2 }, { 3, 4 } } }, - { "TopP", 0.5 }, - } - }; - - // Act - var requestSettings = LLamaSharpPromptExecutionSettings.FromRequestSettings(originalRequestSettings); - - // Assert - Assert.NotNull(requestSettings); - Assert.Equal(0.5, requestSettings.FrequencyPenalty); - Assert.Equal(250, requestSettings.MaxTokens); - Assert.Equal(0.5, requestSettings.PresencePenalty); - Assert.Equal(-1, requestSettings.ResultsPerPrompt); - Assert.NotNull(requestSettings.StopSequences); - Assert.Contains("foo", requestSettings.StopSequences); - Assert.Contains("bar", requestSettings.StopSequences); - Assert.Equal(0.5, requestSettings.Temperature); - Assert.NotNull(requestSettings.TokenSelectionBiases); - Assert.Equal(2, requestSettings.TokenSelectionBiases[1]); - Assert.Equal(4, requestSettings.TokenSelectionBiases[3]); - Assert.Equal(0.5, requestSettings.TopP); - } - } -} diff --git a/LLama.Unittest/SemanticKernel/ExtensionMethodsTests.cs b/LLama.Unittest/SemanticKernel/ExtensionMethodsTests.cs deleted file mode 100644 index 41e842737..000000000 --- a/LLama.Unittest/SemanticKernel/ExtensionMethodsTests.cs +++ /dev/null @@ -1,37 +0,0 @@ -using LLamaSharp.SemanticKernel; - -namespace LLama.Unittest.SemanticKernel -{ - public class ExtensionMethodsTests - { - [Fact] - public void ToLLamaSharpChatHistory_StateUnderTest_ExpectedBehavior() - { - // Arrange - var chatHistory = new Microsoft.SemanticKernel.ChatCompletion.ChatHistory(); - bool ignoreCase = true; - - // Act - var result = ExtensionMethods.ToLLamaSharpChatHistory( - chatHistory, - ignoreCase); - - // Assert - Assert.NotNull(result); - } - - [Fact] - public void ToLLamaSharpInferenceParams_StateUnderTest_ExpectedBehavior() - { - // Arrange - var requestSettings = new LLamaSharpPromptExecutionSettings(); - - // Act - var result = ExtensionMethods.ToLLamaSharpInferenceParams( - requestSettings); - - // Assert - Assert.NotNull(result); - } - } -} diff --git a/LLama.Unittest/SemanticKernel/LLamaSharpChatCompletionTests.cs b/LLama.Unittest/SemanticKernel/LLamaSharpChatCompletionTests.cs deleted file mode 100644 index 0ac1beca0..000000000 --- a/LLama.Unittest/SemanticKernel/LLamaSharpChatCompletionTests.cs +++ /dev/null @@ -1,75 +0,0 @@ -using LLama.Abstractions; -using LLamaSharp.SemanticKernel.ChatCompletion; -using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.ChatCompletion; -using Moq; - -namespace LLama.Unittest.SemanticKernel -{ - public class LLamaSharpChatCompletionTests - { - private Mock mockStatelessExecutor; - - public LLamaSharpChatCompletionTests() - { - mockStatelessExecutor = new Mock(); - } - - private LLamaSharpChatCompletion CreateLLamaSharpChatCompletion() - { - return new LLamaSharpChatCompletion( - mockStatelessExecutor.Object, - null, - null, - null); - } - - [Fact] - public async Task GetChatMessageContentsAsync_StateUnderTest_ExpectedBehavior() - { - // Arrange - var unitUnderTest = CreateLLamaSharpChatCompletion(); - ChatHistory chatHistory = new ChatHistory(); - PromptExecutionSettings? executionSettings = null; - Kernel? kernel = null; - CancellationToken cancellationToken = default; - mockStatelessExecutor.Setup(e => e.InferAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(new List { "test" }.ToAsyncEnumerable()); - - // Act - var result = await unitUnderTest.GetChatMessageContentsAsync( - chatHistory, - executionSettings, - kernel, - cancellationToken); - - // Assert - Assert.True(result.Count > 0); - } - - [Fact] - public async Task GetStreamingChatMessageContentsAsync_StateUnderTest_ExpectedBehavior() - { - // Arrange - var unitUnderTest = CreateLLamaSharpChatCompletion(); - ChatHistory chatHistory = new ChatHistory(); - PromptExecutionSettings? executionSettings = null; - Kernel? kernel = null; - CancellationToken cancellationToken = default; - - mockStatelessExecutor.Setup(e => e.InferAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(new List { "test" }.ToAsyncEnumerable()); - - // Act - await foreach (var result in unitUnderTest.GetStreamingChatMessageContentsAsync( - chatHistory, - executionSettings, - kernel, - cancellationToken)) - { - // Assert - Assert.NotNull(result); - } - } - } -} diff --git a/LLama.Unittest/SemanticKernel/LLamaSharpTextCompletionTests.cs b/LLama.Unittest/SemanticKernel/LLamaSharpTextCompletionTests.cs deleted file mode 100644 index 0ba916a47..000000000 --- a/LLama.Unittest/SemanticKernel/LLamaSharpTextCompletionTests.cs +++ /dev/null @@ -1,78 +0,0 @@ -using LLama.Abstractions; -using LLamaSharp.SemanticKernel.TextCompletion; -using Microsoft.SemanticKernel; -using Moq; - -namespace LLama.Unittest.SemanticKernel -{ - public sealed class LLamaSharpTextCompletionTests - : IDisposable - { - private MockRepository mockRepository; - private Mock mockExecutor; - - public LLamaSharpTextCompletionTests() - { - mockRepository = new MockRepository(MockBehavior.Strict); - mockExecutor = mockRepository.Create(); - } - - public void Dispose() - { - mockRepository.VerifyAll(); - } - - private LLamaSharpTextCompletion CreateLLamaSharpTextCompletion() - { - return new LLamaSharpTextCompletion( - mockExecutor.Object); - } - - [Fact] - public async Task GetTextContentsAsync_StateUnderTest_ExpectedBehavior() - { - // Arrange - var unitUnderTest = CreateLLamaSharpTextCompletion(); - string prompt = "Test"; - PromptExecutionSettings? executionSettings = null; - Kernel? kernel = null; - CancellationToken cancellationToken = default; - mockExecutor.Setup(e => e.InferAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(new List { "test" }.ToAsyncEnumerable()); - - // Act - var result = await unitUnderTest.GetTextContentsAsync( - prompt, - executionSettings, - kernel, - cancellationToken); - - // Assert - Assert.True(result.Count > 0); - } - - [Fact] - public async Task GetStreamingTextContentsAsync_StateUnderTest_ExpectedBehavior() - { - // Arrange - var unitUnderTest = CreateLLamaSharpTextCompletion(); - string prompt = "Test"; - PromptExecutionSettings? executionSettings = null; - Kernel? kernel = null; - CancellationToken cancellationToken = default; - mockExecutor.Setup(e => e.InferAsync(It.IsAny(), It.IsAny(), It.IsAny())) - .Returns(new List { "test" }.ToAsyncEnumerable()); - - // Act - await foreach (var result in unitUnderTest.GetStreamingTextContentsAsync( - prompt, - executionSettings, - kernel, - cancellationToken)) - { - // Assert - Assert.NotNull(result); - } - } - } -} diff --git a/LLamaSharp.sln b/LLamaSharp.sln index 5b8aaaef9..820c804b8 100644 --- a/LLamaSharp.sln +++ b/LLamaSharp.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 -VisualStudioVersion = 18.9.12112.369 stable +VisualStudioVersion = 18.9.12112.369 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLama.Unittest", "LLama.Unittest\LLama.Unittest.csproj", "{BAC1CFA9-E6AC-4BD0-A548-A8066D3C467E}" EndProject @@ -13,10 +13,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLama.WebAPI", "LLama.WebAP EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLama.Web", "LLama.Web\LLama.Web.csproj", "{C3531DB2-1B2B-433C-8DE6-3541E3620DB1}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLamaSharp.SemanticKernel", "LLama.SemanticKernel\LLamaSharp.SemanticKernel.csproj", "{D98F93E3-B344-4F9D-86BB-FDBF6768B587}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLamaSharp.KernelMemory", "LLama.KernelMemory\LLamaSharp.KernelMemory.csproj", "{E5589AE7-B86F-4343-A1CC-8E5D34596E52}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LLama.Benchmark", "LLama.Benchmark\LLama.Benchmark.csproj", "{90D38FEE-68EA-459E-A4EE-268B9DFA1CD5}" EndProject Global @@ -122,42 +118,6 @@ Global {C3531DB2-1B2B-433C-8DE6-3541E3620DB1}.Release|Arm64.Build.0 = Release|Any CPU {C3531DB2-1B2B-433C-8DE6-3541E3620DB1}.Release|x64.ActiveCfg = Release|Any CPU {C3531DB2-1B2B-433C-8DE6-3541E3620DB1}.Release|x64.Build.0 = Release|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Debug|Arm64.ActiveCfg = Debug|Arm64 - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Debug|Arm64.Build.0 = Debug|Arm64 - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Debug|x64.ActiveCfg = Debug|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Debug|x64.Build.0 = Debug|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.GPU|Any CPU.ActiveCfg = Debug|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.GPU|Any CPU.Build.0 = Debug|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.GPU|Arm64.ActiveCfg = GPU|Arm64 - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.GPU|Arm64.Build.0 = GPU|Arm64 - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.GPU|x64.ActiveCfg = Debug|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.GPU|x64.Build.0 = Debug|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Release|Any CPU.Build.0 = Release|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Release|Arm64.ActiveCfg = Release|Arm64 - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Release|Arm64.Build.0 = Release|Arm64 - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Release|x64.ActiveCfg = Release|Any CPU - {D98F93E3-B344-4F9D-86BB-FDBF6768B587}.Release|x64.Build.0 = Release|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Debug|Arm64.ActiveCfg = Debug|Arm64 - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Debug|Arm64.Build.0 = Debug|Arm64 - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Debug|x64.ActiveCfg = Debug|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Debug|x64.Build.0 = Debug|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.GPU|Any CPU.ActiveCfg = Debug|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.GPU|Any CPU.Build.0 = Debug|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.GPU|Arm64.ActiveCfg = GPU|Arm64 - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.GPU|Arm64.Build.0 = GPU|Arm64 - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.GPU|x64.ActiveCfg = Debug|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.GPU|x64.Build.0 = Debug|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Release|Any CPU.Build.0 = Release|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Release|Arm64.ActiveCfg = Release|Arm64 - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Release|Arm64.Build.0 = Release|Arm64 - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Release|x64.ActiveCfg = Release|Any CPU - {E5589AE7-B86F-4343-A1CC-8E5D34596E52}.Release|x64.Build.0 = Release|Any CPU {90D38FEE-68EA-459E-A4EE-268B9DFA1CD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {90D38FEE-68EA-459E-A4EE-268B9DFA1CD5}.Debug|Any CPU.Build.0 = Debug|Any CPU {90D38FEE-68EA-459E-A4EE-268B9DFA1CD5}.Debug|Arm64.ActiveCfg = Debug|Any CPU