From ab09f1fcaec17c1f252d04baa64c7d45c5149263 Mon Sep 17 00:00:00 2001 From: Haiping Chen Date: Mon, 18 Sep 2023 03:35:02 -0500 Subject: [PATCH] Support HuggingFace Inference API. --- Directory.Build.props | 2 +- docs/architecture/assets/overview.drawio | 8 +- docs/conf.py | 6 +- docs/index.rst | 10 +-- docs/quick-start/assets/overview.png | Bin 0 -> 120936 bytes docs/quick-start/overview.md | 8 +- .../IConversationStateService.cs | 2 +- .../Models/IncomingMessageModel.cs | 8 +- .../MLTasks/IChatCompletion.cs | 2 +- .../Utilities/StringExtensions.cs | 1 - ...vice.GetChatCompletionsAsyncRecursively.cs | 1 - .../ConversationService.SendMessage.cs | 2 +- .../Services/ConversationStateService.cs | 11 ++- .../Infrastructures/CompletionProvider.cs | 8 +- .../BotSharp.Core/Routing/Simulator.cs | 4 +- .../Controllers/ConversationController.cs | 7 +- .../Providers/ChatCompletionProvider.cs | 2 +- .../Providers/GPT4CompletionProvider.cs | 2 +- .../ChatbotUiController.cs | 9 ++- .../BotSharp.Plugin.HuggingFace.csproj | 1 + .../DataModels/FalconLlmResponse.cs | 7 ++ .../DataModels/InferenceInput.cs | 15 ++++ .../DataModels/InferenceInputOptions.cs | 10 +++ .../DataModels/InferenceInputParameters.cs | 16 ++++ .../HuggingChat/HuggingChatController.cs | 4 - .../HuggingFacePlugin.cs | 29 +++++++ .../Providers/ChatCompletionProvider.cs | 72 ++++++++++++++++++ .../Services/AuthHeaderHandler.cs | 22 ++++++ .../Services/IInferenceApi.cs | 12 +++ .../Settings/HuggingFaceSettings.cs | 8 ++ .../BotSharp.Plugin.HuggingFace/Using.cs | 14 ++++ .../LlamaAiModel.cs | 17 +++-- .../Providers/ChatCompletionProvider.cs | 45 +++++++---- .../Providers/TextCompletionProvider.cs | 12 ++- .../Providers/TextEmbeddingProvider.cs | 4 +- .../Settings/LlamaSharpSettings.cs | 3 +- src/WebStarter/appsettings.json | 26 ++++--- .../agent.json | 7 -- .../instruction.txt | 1 - .../samples.txt | 0 .../agents.json | 30 +++++++- .../Functions/GetBakingTimeFn.cs | 2 +- 42 files changed, 361 insertions(+), 89 deletions(-) create mode 100644 docs/quick-start/assets/overview.png create mode 100644 src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/FalconLlmResponse.cs create mode 100644 src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInput.cs create mode 100644 src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInputOptions.cs create mode 100644 src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInputParameters.cs create mode 100644 src/Plugins/BotSharp.Plugin.HuggingFace/HuggingFacePlugin.cs create mode 100644 src/Plugins/BotSharp.Plugin.HuggingFace/Providers/ChatCompletionProvider.cs create mode 100644 src/Plugins/BotSharp.Plugin.HuggingFace/Services/AuthHeaderHandler.cs create mode 100644 src/Plugins/BotSharp.Plugin.HuggingFace/Services/IInferenceApi.cs create mode 100644 src/Plugins/BotSharp.Plugin.HuggingFace/Settings/HuggingFaceSettings.cs create mode 100644 src/Plugins/BotSharp.Plugin.HuggingFace/Using.cs delete mode 100644 src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json delete mode 100644 src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/instruction.txt delete mode 100644 src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/samples.txt diff --git a/Directory.Build.props b/Directory.Build.props index a61058f4..249103d7 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,7 +2,7 @@ 10.0 ..\..\..\packages - 0.12.1 + 0.12.3 true \ No newline at end of file diff --git a/docs/architecture/assets/overview.drawio b/docs/architecture/assets/overview.drawio index bfb06fbf..5915ea63 100644 --- a/docs/architecture/assets/overview.drawio +++ b/docs/architecture/assets/overview.drawio @@ -1,11 +1,11 @@ - + - + - - + + diff --git a/docs/conf.py b/docs/conf.py index 666719bf..0f57d91c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -64,9 +64,9 @@ author = 'Haiping Chen' # built documents. # # The short X.Y version. -version = '0.9' +version = '0.12' # The full version, including alpha/beta/rc tags. -release = '0.9.0' +release = '0.12.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -170,7 +170,7 @@ man_pages = [ # dir menu entry, description, category) texinfo_documents = [ (master_doc, 'BotSharp', 'BotSharp Documentation', - author, 'BotSharp', 'The LLM powered Chatbot framework.', + author, 'BotSharp', 'The LLM application framework.', 'Miscellaneous'), ] diff --git a/docs/index.rst b/docs/index.rst index 0c1f23f8..6d710b2d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,23 +3,23 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -The Open Source AI Bot Platform Builder +The Open Source LLM Application Framework ====================================================== .. image:: https://img.shields.io/discord/1106946823282761851?label=Discord :target: `discord`_ -**Build the AI chatbot platform from scratch with .NET** +**Build the AI bot from scratch with .NET** -> The LLM powered Conversational Service framework +> The LLM powered Conversational Service building blocks and best practice *"Conversation as a platform (CaaP) is the future, so it's perfect that we're already offering the whole toolkits to .NET developers using BotSharp the Bot Platform Builder to build a CaaP. It opens up as much learning power as possible for your robots and precisely control every step of the AI processing pipeline."* -**BotSharp** is an open source bot framework for AI Bot platform builders. This project involves natural language understanding, computer vision and audio processing technologies, and aims to promote the development and application of intelligent robot assistants in information systems. Out-of-the-box machine learning algorithms allow ordinary programmers to develop artificial intelligence applications faster and easier. +**BotSharp** is an open source AI framework for your enterprise-grade LLM applications. This project involves natural language understanding, computer vision and audio processing technologies, and aims to promote the development and application of intelligent robot assistants in business oriented systems. Out-of-the-box machine learning algorithms allow ordinary programmers to develop artificial intelligence applications faster and easier. It's witten in C# running on .NET which is a full cross-platform framework. C# is an enterprise-grade programming language which is widely used to code business logic in information management related system. More friendly to corporate developers. BotSharp adopts machine learning algrithm in C/C++ interfaces directly which skips the python interfaces. That will facilitate the feature of the typed language C#, and be easier when refactoring code in system scope. -BotSharp is strictly in accordance with the components principle and decouples every part that is needed in the platform builder. So you can choose different UI/UX, or pick up a different NLP Tagger, or select a more advanced algorithm to do NER tasks. They are all modularized based on unified interfaces. +BotSharp is strictly in accordance with the components principle and decouples every part that is needed in the platform builder. So you can choose different UI/UX, or pick up a different Vector Storage, or select a more advanced algorithm to do NLU tasks. They are all modularized based on unified interfaces. .. image:: static/logos/BotSharp.png :height: 64px diff --git a/docs/quick-start/assets/overview.png b/docs/quick-start/assets/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..774112722af1bd5fbea473c4b6d7ffa1dacf77eb GIT binary patch literal 120936 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

G-F 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 Z|Bu?VG&13RB^dBeR_cRfxwv8A{{!*tD&7D9 literal 0 HcmV?d00001 diff --git a/docs/quick-start/overview.md b/docs/quick-start/overview.md index f6cebe09..12146ba3 100644 --- a/docs/quick-start/overview.md +++ b/docs/quick-start/overview.md @@ -1,10 +1,10 @@ # Overview -BotSharp is an open source machine learning framework for AI Bot platform builder. This project involves natural language understanding and audio processing technologies, and aims to promote the development and application of intelligent robot assistants in information systems. Out of the box machine learning algorithms allow ordinary programmers to develop artificial intelligence applications faster and easier. +BotSharp is an open source application framework to speed up integrate LLMs into your current business system. This project involves natural language understanding and audio processing technologies, and aims to promote the development and application of intelligent robot assistants in information systems. Out of the box machine learning algorithms allow ordinary programmers to develop artificial intelligence applications faster and easier. BotSharp is an high compatible and high scalable platform builder. It is in accordance with components princple strictly, decouples every part that needed in the platform builder. So you can choose different UI/UX, or pick up a different NLP Tagger, or select a more advanced algrithm to do NER task. They are all modulized based on unfied interfaces. -![ ](../static/screenshots/BotSharp_arch.png "BotSharp Architecture Chart") +![ ](./assets/overview.png "BotSharp Architecture Chart") From the chart ahead we can see that based on botsharp you can launch your own chatbot platform with 3 components: - Storage module: Botsharp supports memory and redis DB 2 methods. @@ -21,7 +21,7 @@ Even with this simple question, you can see conversational experience are hard t Your code would have to handle all these different types of requests ro carry out the same logic: looking up some forecast information for a feature. For this reason, a traditional computer interface would tend to force users to input a well-known, standard request at the detriment of the user experience, because it's just easier. -However, BotSharp lets you easily achieve a conversational user experience by handling the natural language understanding (NLU) for you.When you use BotSharp, you can create agents that can understand the meaning of natural language and the nuances and trainslate that to structured meaning your software can understand. +However, BotSharp lets you easily achieve a conversational user experience by handling the natural language understanding (NLU) for you. When you use BotSharp, you can create agents that can understand the meaning of natural language and the nuances and trainslate that to structured meaning your software can understand. Features ------------- @@ -30,6 +30,6 @@ Features * Integrate with multiple LLMs like ChatGPT and LLaMA. * Using plug-in design, it is easy to expand functions. * Working with multiple Vector Stores for senmatic search. -* Supporting different UI providers like [Chatbot UI](https://github.com/mckaywrigley/chatbot-ui) and [HuggingChat UI](https://github.com/huggingface/chat-ui). +* Supporting different UI providers like [Chatbot UI](https://github.com/SciSharp/chatbot-ui) and [HuggingChat UI](https://github.com/huggingface/chat-ui). * Integrated with popular social platforms like Facebook Messenger, Slack and Telegram. * Providing REST APIs to work with your own UI. \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationStateService.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationStateService.cs index 8818eb03..4a39c144 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationStateService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationStateService.cs @@ -8,7 +8,7 @@ public interface IConversationStateService ConversationState Load(string conversationId); string GetState(string name, string defaultValue = ""); ConversationState GetStates(); - IConversationStateService SetState(string name, string value); + IConversationStateService SetState(string name, T value); void CleanState(); void Save(); } diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/IncomingMessageModel.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/IncomingMessageModel.cs index b0186d8a..e69d94bc 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/IncomingMessageModel.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/IncomingMessageModel.cs @@ -8,11 +8,17 @@ public class IncomingMessageModel public virtual string Channel { get; set; } = string.Empty; + ///

+ /// Completion Provider + /// + [JsonPropertyName("provider")] + public virtual string? Provider { get; set; } = null; + /// /// Model name /// [JsonPropertyName("model")] - public virtual string? ModelName { get; set; } = null; + public virtual string? Model { get; set; } = null; /// /// The sampling temperature to use that controls the apparent creativity of generated completions. diff --git a/src/Infrastructure/BotSharp.Abstraction/MLTasks/IChatCompletion.cs b/src/Infrastructure/BotSharp.Abstraction/MLTasks/IChatCompletion.cs index f347a8a7..15ad54aa 100644 --- a/src/Infrastructure/BotSharp.Abstraction/MLTasks/IChatCompletion.cs +++ b/src/Infrastructure/BotSharp.Abstraction/MLTasks/IChatCompletion.cs @@ -2,7 +2,7 @@ namespace BotSharp.Abstraction.MLTasks; public interface IChatCompletion { - string ModelName { get; } + string Provider { get; } Task GetChatCompletionsAsync(Agent agent, List conversations, Func onMessageReceived, diff --git a/src/Infrastructure/BotSharp.Abstraction/Utilities/StringExtensions.cs b/src/Infrastructure/BotSharp.Abstraction/Utilities/StringExtensions.cs index 107461cb..c51f59e6 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Utilities/StringExtensions.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Utilities/StringExtensions.cs @@ -1,4 +1,3 @@ -using System.Linq; using System.Text.RegularExpressions; namespace BotSharp.Abstraction.Utilities; diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.GetChatCompletionsAsyncRecursively.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.GetChatCompletionsAsyncRecursively.cs index f125149d..9ba5e4a5 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.GetChatCompletionsAsyncRecursively.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.GetChatCompletionsAsyncRecursively.cs @@ -1,4 +1,3 @@ -using BotSharp.Abstraction.Agents.Enums; using BotSharp.Abstraction.Agents.Models; using BotSharp.Abstraction.Templating; diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs index 9ed62d0f..47b144f7 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs @@ -131,7 +131,7 @@ public partial class ConversationService { if (!string.IsNullOrEmpty(property.Value.ToString())) { - stateService.SetState(property.Name, property.Value.ToString()); + stateService.SetState(property.Name, property.Value); } } } diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs index cfbf1bf6..913bf88f 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs @@ -29,13 +29,18 @@ public class ConversationStateService : IConversationStateService, IDisposable _states = new ConversationState(); } - public IConversationStateService SetState(string name, string value) + public IConversationStateService SetState(string name, T value) { + if (value == null) + { + return this; + } + + var currentValue = value.ToString(); var hooks = _services.GetServices(); string preValue = _states.ContainsKey(name) ? _states[name] : ""; - if (!_states.ContainsKey(name) || _states[name] != value) + if (!_states.ContainsKey(name) || _states[name] != currentValue) { - var currentValue = value; _states[name] = currentValue; _logger.LogInformation($"Set state: {name} = {value}"); foreach (var hook in hooks) diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/CompletionProvider.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/CompletionProvider.cs index f5dd62db..9534581e 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/CompletionProvider.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/CompletionProvider.cs @@ -4,16 +4,16 @@ namespace BotSharp.Core.Infrastructures; public class CompletionProvider { - public static IChatCompletion GetChatCompletion(IServiceProvider services, string? model = null) + public static IChatCompletion GetChatCompletion(IServiceProvider services, string? provider = null) { var completions = services.GetServices(); var state = services.GetRequiredService(); - if (model == null) + if (provider == null) { - model = state.GetState("model", "gpt-3.5-turbo"); + provider = state.GetState("provider", "azure-gpt-3.5"); } - return completions.FirstOrDefault(x => x.ModelName == model); + return completions.FirstOrDefault(x => x.Provider == provider); } } diff --git a/src/Infrastructure/BotSharp.Core/Routing/Simulator.cs b/src/Infrastructure/BotSharp.Core/Routing/Simulator.cs index 77905af2..8bcad2f7 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/Simulator.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/Simulator.cs @@ -61,7 +61,7 @@ public class Simulator { var wholeDialogs = new List { - new RoleDialogModel(AgentRole.User, @"What's the next step, your response must be in JSON format with ""function"" and ""parameters"". ") + new RoleDialogModel(AgentRole.User, @"What's the next step? Response in JSON format with ""function"" and ""parameters"".") }; var chatCompletion = CompletionProvider.GetChatCompletion(_services); @@ -146,7 +146,7 @@ public class Simulator { if (!string.IsNullOrEmpty(property.Value.ToString())) { - stateService.SetState(property.Name, property.Value.ToString()); + stateService.SetState(property.Name, property.Value); } } } diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs index ac64b87a..3df4a110 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs @@ -45,9 +45,10 @@ public class ConversationController : ControllerBase, IApiAdapter var conv = _services.GetRequiredService(); conv.SetConversationId(conversationId, input.States); conv.States.SetState("channel", input.Channel) - .SetState("model", input.ModelName) - .SetState("temperature", input.Temperature.ToString()) - .SetState("sampling_factor", input.SamplingFactor.ToString()); + .SetState("provider", input.Provider) + .SetState("model", input.Model) + .SetState("temperature", input.Temperature) + .SetState("sampling_factor", input.SamplingFactor); var response = new MessageResponseModel(); var stackMsg = new List(); diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs index 65604967..ad792f7f 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs @@ -24,7 +24,7 @@ public class ChatCompletionProvider : IChatCompletion protected readonly IServiceProvider _services; protected readonly ILogger _logger; - public virtual string ModelName => "gpt-3.5-turbo"; + public virtual string Provider => "azure-gpt-3.5"; public ChatCompletionProvider(AzureOpenAiSettings settings, ILogger logger, diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/GPT4CompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/GPT4CompletionProvider.cs index bb9dd480..63c0da53 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/GPT4CompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/GPT4CompletionProvider.cs @@ -8,7 +8,7 @@ namespace BotSharp.Plugin.AzureOpenAI.Providers; public class GPT4CompletionProvider : ChatCompletionProvider { - public override string ModelName => "gpt-4"; + public override string Provider => "azure-gpt-4"; public GPT4CompletionProvider(AzureOpenAiSettings settings, ILogger logger, diff --git a/src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs b/src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs index ea784148..2aa4787a 100644 --- a/src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs +++ b/src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs @@ -76,10 +76,11 @@ public class ChatbotUiController : ControllerBase, IApiAdapter var conv = _services.GetRequiredService(); conv.SetConversationId(input.ConversationId, input.States); - conv.States.SetState("model", input.ModelName); - conv.States.SetState("channel", "webchat"); - conv.States.SetState("temperature", input.Temperature.ToString()); - conv.States.SetState("sampling_factor", input.SamplingFactor.ToString()); + conv.States.SetState("provider", input.Provider) + .SetState("model", input.Model) + .SetState("channel", "webchat") + .SetState("temperature", input.Temperature) + .SetState("sampling_factor", input.SamplingFactor); var result = await conv.SendMessage(input.AgentId, message, diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/BotSharp.Plugin.HuggingFace.csproj b/src/Plugins/BotSharp.Plugin.HuggingFace/BotSharp.Plugin.HuggingFace.csproj index c76256da..7c6b51fe 100644 --- a/src/Plugins/BotSharp.Plugin.HuggingFace/BotSharp.Plugin.HuggingFace.csproj +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/BotSharp.Plugin.HuggingFace.csproj @@ -10,6 +10,7 @@ + diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/FalconLlmResponse.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/FalconLlmResponse.cs new file mode 100644 index 00000000..a44a1f76 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/FalconLlmResponse.cs @@ -0,0 +1,7 @@ +namespace BotSharp.Plugin.HuggingFace.DataModels; + +public class FalconLlmResponse +{ + [JsonPropertyName("generated_text")] + public string GeneratedText { get; set; } +} diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInput.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInput.cs new file mode 100644 index 00000000..d432590f --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInput.cs @@ -0,0 +1,15 @@ +namespace BotSharp.Plugin.HuggingFace.DataModels; + +public class InferenceInput +{ + [JsonPropertyName("inputs")] + public string Inputs { get; set; } = string.Empty; + + [JsonPropertyName("parameters")] + public InferenceInputParameters Parameters { get; set; } + = new InferenceInputParameters(); + + [JsonPropertyName("options")] + public InferenceInputOptions Options { get; set; } + = new InferenceInputOptions(); +} diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInputOptions.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInputOptions.cs new file mode 100644 index 00000000..960ca8a2 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInputOptions.cs @@ -0,0 +1,10 @@ +namespace BotSharp.Plugin.HuggingFace.DataModels; + +public class InferenceInputOptions +{ + [JsonPropertyName("use_cache")] + public bool UseCache { get; set; } = true; + + [JsonPropertyName("wait_for_model")] + public bool WaitForModel { get; set; } = false; +} diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInputParameters.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInputParameters.cs new file mode 100644 index 00000000..13ec492c --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/DataModels/InferenceInputParameters.cs @@ -0,0 +1,16 @@ +namespace BotSharp.Plugin.HuggingFace.DataModels; + +public class InferenceInputParameters +{ + [JsonPropertyName("temperature")] + public float Temperature { get; set; } = 1.0f; + + [JsonPropertyName("max_new_tokens")] + public int MaxNewTokens { get; set; } = 250; + + [JsonPropertyName("return_full_text")] + public bool ReturnFullText { get; set; } = false; + + [JsonPropertyName("num_return_sequences")] + public int NumReturnSequences { get; set; } = 1; +} diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/HuggingChatController.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/HuggingChatController.cs index 3944ef6f..46acb00d 100644 --- a/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/HuggingChatController.cs +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/HuggingChatController.cs @@ -3,12 +3,8 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Net.Http.Headers; using Newtonsoft.Json.Serialization; using Newtonsoft.Json; -using System; -using System.Text; -using System.Threading.Tasks; using BotSharp.Plugin.HuggingFace.HuggingChat.ViewModels; using BotSharp.Abstraction.TextGeneratives; -using System.Collections.Generic; namespace BotSharp.Plugin.HuggingFace.HuggingChat; diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingFacePlugin.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingFacePlugin.cs new file mode 100644 index 00000000..87098557 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingFacePlugin.cs @@ -0,0 +1,29 @@ +using BotSharp.Abstraction.Plugins; +using BotSharp.Plugin.HuggingFace.Providers; +using BotSharp.Plugin.HuggingFace.Services; +using BotSharp.Plugin.HuggingFace.Settings; +using Refit; + +namespace BotSharp.Plugin.HuggingFace; + +public class HuggingFacePlugin : IBotSharpPlugin +{ + public void RegisterDI(IServiceCollection services, IConfiguration config) + { + var settings = new HuggingFaceSettings(); + config.Bind("HuggingFace", settings); + services.AddSingleton(x => + { + Console.WriteLine($"Loaded HuggingFace settings: {settings.EndPoint} ({settings.Model}) {settings.Token.SubstringMax(4)}"); + return settings; + }); + + services + .AddRefitClient() + .AddHttpMessageHandler() + .ConfigureHttpClient(c => c.BaseAddress = new Uri(settings.EndPoint)); + + services.AddTransient(); + services.AddScoped(); + } +} diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/Providers/ChatCompletionProvider.cs new file mode 100644 index 00000000..ceac5320 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/Providers/ChatCompletionProvider.cs @@ -0,0 +1,72 @@ +using BotSharp.Abstraction.Agents.Enums; +using BotSharp.Abstraction.Conversations.Settings; +using BotSharp.Plugin.HuggingFace.Services; +using BotSharp.Plugin.HuggingFace.Settings; +using Microsoft.Extensions.Logging; + +namespace BotSharp.Plugin.HuggingFace.Providers; + +public class ChatCompletionProvider : IChatCompletion +{ + public string Provider => "huggingface"; + + private readonly IServiceProvider _services; + private readonly HuggingFaceSettings _settings; + private readonly ILogger _logger; + + public ChatCompletionProvider(IServiceProvider services, + HuggingFaceSettings settings, + ILogger logger) + { + _services = services; + _settings = settings; + _logger = logger; + } + + public async Task GetChatCompletionsAsync(Agent agent, List conversations, Func onMessageReceived, Func onFunctionExecuting) + { + var content = string.Join("\r\n", conversations.Select(x => $"{AgentRole.System}: {x.Content}")).Trim(); + content += $"\r\n{AgentRole.Assistant}: "; + + var prompt = agent.Instruction + "\r\n" + content; + + var convSetting = _services.GetRequiredService(); + if (convSetting.ShowVerboseLog) + { + _logger.LogInformation(prompt); + } + + var api = _services.GetRequiredService(); + + if (_settings.Model.Contains('/')) + { + var space = _settings.Model.Split('/')[0]; + var model = _settings.Model.Split("/")[1]; + + var response = await api.Post(space, model, new InferenceInput + { + Inputs = prompt + }); + + var falcon = JsonSerializer.Deserialize>(response); + + var message = falcon[0].GeneratedText.Trim(); + _logger.LogInformation($"[{agent.Name}] {AgentRole.Assistant}: {message}"); + + var msg = new RoleDialogModel(AgentRole.Assistant, message) + { + CurrentAgentId = agent.Id + }; + + // Text response received + await onMessageReceived(msg); + } + + return true; + } + + public async Task GetChatCompletionsStreamingAsync(Agent agent, List conversations, Func onMessageReceived) + { + return true; + } +} diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/Services/AuthHeaderHandler.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/Services/AuthHeaderHandler.cs new file mode 100644 index 00000000..c350f98e --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/Services/AuthHeaderHandler.cs @@ -0,0 +1,22 @@ +using BotSharp.Plugin.HuggingFace.Settings; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; + +namespace BotSharp.Plugin.HuggingFace.Services; + +public class AuthHeaderHandler : DelegatingHandler +{ + private readonly HuggingFaceSettings _settings; + public AuthHeaderHandler(HuggingFaceSettings settings) + { + _settings = settings; + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _settings.Token); + + return await base.SendAsync(request, cancellationToken).ConfigureAwait(false); + } +} diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/Services/IInferenceApi.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/Services/IInferenceApi.cs new file mode 100644 index 00000000..49b93249 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/Services/IInferenceApi.cs @@ -0,0 +1,12 @@ +using Refit; + +namespace BotSharp.Plugin.HuggingFace.Services; + +/// +/// https://huggingface.co/docs/api-inference/quicktour +/// +public interface IInferenceApi +{ + [Post("/models/{space}/{model}")] + Task Post(string space, string model, [Body] InferenceInput input); +} diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/Settings/HuggingFaceSettings.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/Settings/HuggingFaceSettings.cs new file mode 100644 index 00000000..cc8a42ba --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/Settings/HuggingFaceSettings.cs @@ -0,0 +1,8 @@ +namespace BotSharp.Plugin.HuggingFace.Settings; + +public class HuggingFaceSettings +{ + public string EndPoint { get; set; } + public string Model { get; set; } + public string Token { get; set; } +} diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/Using.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/Using.cs new file mode 100644 index 00000000..3f378dea --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.HuggingFace/Using.cs @@ -0,0 +1,14 @@ +global using System; +global using System.Collections.Generic; +global using System.Text; +global using System.Threading.Tasks; +global using System.Linq; +global using System.Text.Json; +global using BotSharp.Abstraction.Conversations.Models; +global using BotSharp.Abstraction.Agents.Models; +global using BotSharp.Abstraction.MLTasks; +global using Microsoft.Extensions.Configuration; +global using Microsoft.Extensions.DependencyInjection; +global using System.Text.Json.Serialization; +global using BotSharp.Plugin.HuggingFace.DataModels; +global using BotSharp.Abstraction.Utilities; \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/LlamaAiModel.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/LlamaAiModel.cs index 6f3e840c..7f9a7748 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/LlamaAiModel.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/LlamaAiModel.cs @@ -2,6 +2,7 @@ using BotSharp.Plugin.LLamaSharp.Settings; using LLama; using LLama.Abstractions; using LLama.Common; +using System.IO; namespace BotSharp.Plugins.LLamaSharp; @@ -22,23 +23,23 @@ public class LlamaAiModel public LlamaAiModel(LlamaSharpSettings settings) { _settings = settings; - - _params = new ModelParams(_settings.ModelPath) - { - ContextSize = _settings.MaxContextLength, - Seed = 1337, - GpuLayerCount = _settings.NumberOfGpuLayer - }; } - public void LoadModel() + public void LoadModel(string model) { if (_model != null) { return; } + _params = new ModelParams(Path.Combine(_settings.ModelDir, model)) + { + ContextSize = _settings.MaxContextLength, + Seed = 1337, + GpuLayerCount = _settings.NumberOfGpuLayer + }; + _model = LLamaWeights.LoadFromFile(_params); } diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/ChatCompletionProvider.cs index c40bf189..191d087f 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/ChatCompletionProvider.cs @@ -1,8 +1,10 @@ using BotSharp.Abstraction.Agents.Enums; using BotSharp.Abstraction.Agents.Models; +using BotSharp.Abstraction.Conversations; using BotSharp.Abstraction.Conversations.Models; using BotSharp.Abstraction.Conversations.Settings; using BotSharp.Abstraction.MLTasks; +using BotSharp.Plugin.LLamaSharp.Settings; using BotSharp.Plugins.LLamaSharp; using LLama; using LLama.Common; @@ -19,39 +21,44 @@ public class ChatCompletionProvider : IChatCompletion { private readonly IServiceProvider _services; private readonly ILogger _logger; + private readonly LlamaSharpSettings _settings; public ChatCompletionProvider(IServiceProvider services, - ILogger logger) + ILogger logger, + LlamaSharpSettings settings) { _services = services; _logger = logger; + _settings = settings; } - public string ModelName => "llama-2"; - + public string Provider => "llama-sharp"; public async Task GetChatCompletionsAsync(Agent agent, List conversations, Func onMessageReceived, Func onFunctionExecuting) { - var content = string.Join("\n", conversations.Select(x => $"{x.Role}: {x.Content}")).Trim(); - content += $"\n{AgentRole.Assistant}: "; + var content = string.Join("\r\n", conversations.Select(x => $"{x.Role}: {x.Content}")).Trim(); + content += $"\r\n{AgentRole.Assistant}: "; + + var state = _services.GetRequiredService(); + var model = state.GetState("model", _settings.DefaultModel); var llama = _services.GetRequiredService(); - llama.LoadModel(); + llama.LoadModel(model); var executor = llama.GetStatelessExecutor(); var inferenceParams = new InferenceParams() { - Temperature = 1.0f, - AntiPrompts = new List { $"{AgentRole.User}:", "\n", "?" }, + Temperature = 0.9f, + AntiPrompts = new List { $"{AgentRole.User}:" }, MaxTokens = 256 }; string totalResponse = ""; - var prompt = agent.Instruction + content; + var prompt = agent.Instruction + "\r\n" + content; var convSetting = _services.GetRequiredService(); if (convSetting.ShowVerboseLog) @@ -70,7 +77,15 @@ public class ChatCompletionProvider : IChatCompletion totalResponse = totalResponse.Replace(anti, "").Trim(); } - await onMessageReceived(new RoleDialogModel(AgentRole.Assistant, totalResponse)); + _logger.LogInformation($"[{agent.Name}] {AgentRole.Assistant}: {totalResponse}"); + + var msg = new RoleDialogModel(AgentRole.Assistant, totalResponse) + { + CurrentAgentId = agent.Id + }; + + // Text response received + await onMessageReceived(msg); return true; } @@ -78,11 +93,15 @@ public class ChatCompletionProvider : IChatCompletion public async Task GetChatCompletionsStreamingAsync(Agent agent, List conversations, Func onMessageReceived) { string totalResponse = ""; - var content = string.Join("\n", conversations.Select(x => $"{x.Role}: {x.Content}")).Trim(); - content += $"\n{AgentRole.Assistant}: "; + var content = string.Join("\r\n", conversations.Select(x => $"{x.Role}: {x.Content}")).Trim(); + content += $"\r\n{AgentRole.Assistant}: "; + + var state = _services.GetRequiredService(); + var model = state.GetState("model", "llama-2-7b-chat.Q8_0"); var llama = _services.GetRequiredService(); - llama.LoadModel(); + llama.LoadModel(model); + var executor = new StatelessExecutor(llama.Model, llama.Params); var inferenceParams = new InferenceParams() { Temperature = 1.0f, AntiPrompts = new List { $"{AgentRole.User}:" }, MaxTokens = 64 }; diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextCompletionProvider.cs index 62009ef7..aa42b7e2 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextCompletionProvider.cs @@ -1,4 +1,6 @@ +using BotSharp.Abstraction.Conversations; using BotSharp.Abstraction.MLTasks; +using BotSharp.Plugin.LLamaSharp.Settings; using BotSharp.Plugins.LLamaSharp; using LLama; using LLama.Common; @@ -11,16 +13,22 @@ namespace BotSharp.Plugin.LLamaSharp.Providers; public class TextCompletionProvider : ITextCompletion { private readonly IServiceProvider _services; + private readonly LlamaSharpSettings _settings; - public TextCompletionProvider(IServiceProvider services) + public TextCompletionProvider(IServiceProvider services, + LlamaSharpSettings settings) { _services = services; + _settings = settings; } public Task GetCompletion(string text) { + var state = _services.GetRequiredService(); + var model = state.GetState("model", _settings.DefaultModel); + var llama = _services.GetRequiredService(); - llama.LoadModel(); + llama.LoadModel(model); var executor = new InstructExecutor(llama.Model.CreateContext(llama.Params)); var inferenceParams = new InferenceParams() { Temperature = 0.5f, MaxTokens = 128 }; diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs index 0738c1a4..d5774735 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs @@ -4,6 +4,7 @@ using LLama; using LLama.Common; using System; using System.Collections.Generic; +using System.IO; namespace BotSharp.Plugin.LLamaSharp.Providers; @@ -24,7 +25,8 @@ public class TextEmbeddingProvider : ITextEmbedding { if (_embedder == null) { - _embedder = new LLamaEmbedder(new ModelParams(_settings.ModelPath)); + var path = Path.Combine(_settings.ModelDir, _settings.DefaultModel); + _embedder = new LLamaEmbedder(new ModelParams(path)); } return _embedder.GetEmbeddings(text); diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/Settings/LlamaSharpSettings.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/Settings/LlamaSharpSettings.cs index fc5d7d44..f2a204e2 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/Settings/LlamaSharpSettings.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/Settings/LlamaSharpSettings.cs @@ -2,7 +2,8 @@ namespace BotSharp.Plugin.LLamaSharp.Settings; public class LlamaSharpSettings { - public string ModelPath { get; set; } = string.Empty; + public string ModelDir { get; set; } = string.Empty; + public string DefaultModel { get; set; } = "llama-2-7b-chat.Q8_0.gguf"; public int MaxContextLength { get; set; } = 512; public float RepeatPenalty { get; set; } = 1.0f; public bool VerbosePrompt { get; set; } diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index dd96fd71..23c898a7 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -31,9 +31,10 @@ "LlamaSharp": { "Interactive": true, - "ModelPath": "C:/Users/haipi/Downloads/llama-2-7b-guanaco-qlora.Q4_K_S.gguf", + "ModelDir": "C:/Users/haipi/Downloads", + "DefaultModel": "llama-2-7b-chat.Q8_0.gguf", "MaxContextLength": 1024, - "NumberOfGpuLayer": 15 + "NumberOfGpuLayer": 10 }, "AzureOpenAi": { @@ -45,6 +46,12 @@ } }, + "HuggingFace": { + "Endpoint": "https://api-inference.huggingface.co", + "Model": "tiiuae/falcon-180B-chat", + "Token": "" + }, + "MetaAi": { "fastText": { "ModelPath": "dbpedia.ftz" @@ -88,13 +95,13 @@ }, "KnowledgeBase": { - "VectorDb": "MemVectorDatabase", - // "VectorDb": "QdrantDb", - "TextEmbedding": "fastTextEmbeddingProvider", - // "TextEmbedding": "LLamaSharp.TextEmbeddingProvider", - "TextCompletion": "AzureOpenAI.Providers.TextCompletionProvider", - // "TextCompletion": "LLamaSharp.TextCompletionProvider", - "Pdf2TextConverter": "PaddleSharp.Providers.Pdf2TextConverter" + "VectorDb": "MemVectorDatabase", + // "VectorDb": "QdrantDb", + "TextEmbedding": "fastTextEmbeddingProvider", + // "TextEmbedding": "LLamaSharp.TextEmbeddingProvider", + "TextCompletion": "AzureOpenAI.Providers.TextCompletionProvider", + // "TextCompletion": "LLamaSharp.TextCompletionProvider", + "Pdf2TextConverter": "PaddleSharp.Providers.Pdf2TextConverter" }, "PluginLoader": { @@ -103,6 +110,7 @@ "BotSharp.Core", "BotSharp.Plugin.AzureOpenAI", "BotSharp.Plugin.MetaAI", + "BotSharp.Plugin.HuggingFace", "BotSharp.Plugin.LLamaSharp", "BotSharp.Plugin.KnowledgeBase", "BotSharp.Plugin.Qdrant", diff --git a/src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json b/src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json deleted file mode 100644 index 96367116..00000000 --- a/src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/agent.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "Pizza Ordering Bot", - "description": "Pizza restaurant ordering AI Chatbot.", - "createdDateTime": "2023-08-14T18:14:11.6748378Z", - "updatedDateTime": "2023-08-14T18:14:11.6756088Z", - "id": "91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a" -} \ No newline at end of file diff --git a/src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/instruction.txt b/src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/instruction.txt deleted file mode 100644 index 890e61f7..00000000 --- a/src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/instruction.txt +++ /dev/null @@ -1 +0,0 @@ -You are now a pizza ordering chatbot, and you can help customers order a pizza according to the user's preferences. \ No newline at end of file diff --git a/src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/samples.txt b/src/WebStarter/data/agents/91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a/samples.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/src/WebStarter/data/users/456e35c5-caf0-4d45-9084-b44a8ca717e4/agents.json b/src/WebStarter/data/users/456e35c5-caf0-4d45-9084-b44a8ca717e4/agents.json index 18aee784..3bb0ecf7 100644 --- a/src/WebStarter/data/users/456e35c5-caf0-4d45-9084-b44a8ca717e4/agents.json +++ b/src/WebStarter/data/users/456e35c5-caf0-4d45-9084-b44a8ca717e4/agents.json @@ -1,9 +1,37 @@ [ { "userId": "456e35c5-caf0-4d45-9084-b44a8ca717e4", - "agentId": "91fcc3e5-9af7-49e6-ad7a-a760bd12dc4a", + "agentId": "01fcc3e5-9af7-49e6-ad7a-a760bd12dc4a", "updatedTime": "2023-08-14T18:14:11.6833783Z", "createdTime": "2023-08-14T18:14:11.6829767Z", "id": "1273379c-4419-460a-b0a2-5695afd097f5" + }, + { + "userId": "456e35c5-caf0-4d45-9084-b44a8ca717e4", + "agentId": "ff431273-0c28-4647-88bf-86d82443c579", + "updatedTime": "2023-08-14T18:14:11.6833783Z", + "createdTime": "2023-08-14T18:14:11.6829767Z", + "id": "5ed47062-3dba-4b96-a7d7-5dbab48b71ad" + }, + { + "userId": "456e35c5-caf0-4d45-9084-b44a8ca717e4", + "agentId": "c2b57a74-ae4e-4c81-b3ad-9ac5bff982bd", + "updatedTime": "2023-08-14T18:14:11.6833783Z", + "createdTime": "2023-08-14T18:14:11.6829767Z", + "id": "91ec91bc-2854-4c21-be7e-4a6806406d56" + }, + { + "userId": "456e35c5-caf0-4d45-9084-b44a8ca717e4", + "agentId": "b284db86-e9c2-4c25-a59e-4649797dd130", + "updatedTime": "2023-08-14T18:14:11.6833783Z", + "createdTime": "2023-08-14T18:14:11.6829767Z", + "id": "1d6e86ee-1f72-4ac3-93bc-549a65855dc6" + }, + { + "userId": "456e35c5-caf0-4d45-9084-b44a8ca717e4", + "agentId": "03d3fb55-9ada-423b-a6b4-f9ecddf4b26e", + "updatedTime": "2023-08-14T18:14:11.6833783Z", + "createdTime": "2023-08-14T18:14:11.6829767Z", + "id": "b10c3209-6fd6-41d1-afd9-ea9543be286d" } ] \ No newline at end of file diff --git a/tests/BotSharp.Plugin.PizzaBot/Functions/GetBakingTimeFn.cs b/tests/BotSharp.Plugin.PizzaBot/Functions/GetBakingTimeFn.cs index 1d72dfbb..0ebc56e7 100644 --- a/tests/BotSharp.Plugin.PizzaBot/Functions/GetBakingTimeFn.cs +++ b/tests/BotSharp.Plugin.PizzaBot/Functions/GetBakingTimeFn.cs @@ -4,7 +4,7 @@ namespace BotSharp.Plugin.PizzaBot.Functions; public class GetBakingTimeFn : IFunctionCallback { - public string Name => "get_cooking_remaing_time"; + public string Name => "get_cooking_remaining_time"; public async Task Execute(RoleDialogModel message) {