diff --git a/BotSharp.sln b/BotSharp.sln
index 964017ae..e04762ba 100644
--- a/BotSharp.sln
+++ b/BotSharp.sln
@@ -19,15 +19,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Messages", "Messages", "{64
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{D5293208-2BEF-42FC-A64C-5954F61720BA}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.AzureOpenAI", "src\Plugins\Platforms\BotSharp.Plugin.AureOpenAI\BotSharp.Plugin.AzureOpenAI.csproj", "{A8DF9393-9D67-460C-86F3-1D3C65A80D0A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.FacebookMessenger", "src\Plugins\BotSharp.Channel.FacebookMessenger\BotSharp.Plugin.FacebookMessenger.csproj", "{FF9B429F-972E-47CE-80A6-5339E6119EE6}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.FacebookMessenger", "src\Plugins\Messages\BotSharp.Channel.FacebookMessenger\BotSharp.Plugin.FacebookMessenger.csproj", "{ACAB7D42-CCB3-4559-9DB7-B969C52A833D}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.WeChat", "src\Plugins\BotSharp.Channel.WeChat\BotSharp.Plugin.WeChat.csproj", "{8014739C-1B56-4859-A5A5-CA2EF9C58833}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.Weixin", "src\Plugins\Messages\BotSharp.Channel.Weixin\BotSharp.Plugin.Weixin.csproj", "{4DA3E063-9F5A-4361-8EFE-8727409B238D}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.AzureOpenAI", "src\Plugins\BotSharp.Plugin.AzureOpenAI\BotSharp.Plugin.AzureOpenAI.csproj", "{3EAB9CF3-0F47-4BFB-8BAC-8ADFF24AD899}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.ChatbotUI", "src\Plugins\UIs\BotSharp.Plugin.ChatbotUI\BotSharp.Plugin.ChatbotUI.csproj", "{BDCE7250-A5B0-4AA6-BEB6-B799C12990EF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.HuggingFace", "src\Plugins\BotSharp.Plugin.HuggingFace\BotSharp.Plugin.HuggingFace.csproj", "{57806BAF-7736-425A-B499-13A2A2DF1E63}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.HuggingFace", "src\Plugins\Platforms\BotSharp.Plugin.HuggingFace\BotSharp.Plugin.HuggingFace.csproj", "{48889657-1BFF-4FDD-B702-CFA5F866BC20}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.Plugin.ChatbotUI", "src\Plugins\BotSharp.Plugin.ChatbotUI\BotSharp.Plugin.ChatbotUI.csproj", "{68C7C9E9-496B-4004-A1F8-75FFB8C06C76}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -61,46 +61,46 @@ Global
{07AD18C5-CE7B-495A-815F-170E93CCC42A}.Release|Any CPU.Build.0 = Release|Any CPU
{07AD18C5-CE7B-495A-815F-170E93CCC42A}.Release|x64.ActiveCfg = Release|Any CPU
{07AD18C5-CE7B-495A-815F-170E93CCC42A}.Release|x64.Build.0 = Release|Any CPU
- {A8DF9393-9D67-460C-86F3-1D3C65A80D0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A8DF9393-9D67-460C-86F3-1D3C65A80D0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A8DF9393-9D67-460C-86F3-1D3C65A80D0A}.Debug|x64.ActiveCfg = Debug|Any CPU
- {A8DF9393-9D67-460C-86F3-1D3C65A80D0A}.Debug|x64.Build.0 = Debug|Any CPU
- {A8DF9393-9D67-460C-86F3-1D3C65A80D0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A8DF9393-9D67-460C-86F3-1D3C65A80D0A}.Release|Any CPU.Build.0 = Release|Any CPU
- {A8DF9393-9D67-460C-86F3-1D3C65A80D0A}.Release|x64.ActiveCfg = Release|Any CPU
- {A8DF9393-9D67-460C-86F3-1D3C65A80D0A}.Release|x64.Build.0 = Release|Any CPU
- {ACAB7D42-CCB3-4559-9DB7-B969C52A833D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {ACAB7D42-CCB3-4559-9DB7-B969C52A833D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {ACAB7D42-CCB3-4559-9DB7-B969C52A833D}.Debug|x64.ActiveCfg = Debug|Any CPU
- {ACAB7D42-CCB3-4559-9DB7-B969C52A833D}.Debug|x64.Build.0 = Debug|Any CPU
- {ACAB7D42-CCB3-4559-9DB7-B969C52A833D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {ACAB7D42-CCB3-4559-9DB7-B969C52A833D}.Release|Any CPU.Build.0 = Release|Any CPU
- {ACAB7D42-CCB3-4559-9DB7-B969C52A833D}.Release|x64.ActiveCfg = Release|Any CPU
- {ACAB7D42-CCB3-4559-9DB7-B969C52A833D}.Release|x64.Build.0 = Release|Any CPU
- {4DA3E063-9F5A-4361-8EFE-8727409B238D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4DA3E063-9F5A-4361-8EFE-8727409B238D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4DA3E063-9F5A-4361-8EFE-8727409B238D}.Debug|x64.ActiveCfg = Debug|Any CPU
- {4DA3E063-9F5A-4361-8EFE-8727409B238D}.Debug|x64.Build.0 = Debug|Any CPU
- {4DA3E063-9F5A-4361-8EFE-8727409B238D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4DA3E063-9F5A-4361-8EFE-8727409B238D}.Release|Any CPU.Build.0 = Release|Any CPU
- {4DA3E063-9F5A-4361-8EFE-8727409B238D}.Release|x64.ActiveCfg = Release|Any CPU
- {4DA3E063-9F5A-4361-8EFE-8727409B238D}.Release|x64.Build.0 = Release|Any CPU
- {BDCE7250-A5B0-4AA6-BEB6-B799C12990EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {BDCE7250-A5B0-4AA6-BEB6-B799C12990EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {BDCE7250-A5B0-4AA6-BEB6-B799C12990EF}.Debug|x64.ActiveCfg = Debug|Any CPU
- {BDCE7250-A5B0-4AA6-BEB6-B799C12990EF}.Debug|x64.Build.0 = Debug|Any CPU
- {BDCE7250-A5B0-4AA6-BEB6-B799C12990EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {BDCE7250-A5B0-4AA6-BEB6-B799C12990EF}.Release|Any CPU.Build.0 = Release|Any CPU
- {BDCE7250-A5B0-4AA6-BEB6-B799C12990EF}.Release|x64.ActiveCfg = Release|Any CPU
- {BDCE7250-A5B0-4AA6-BEB6-B799C12990EF}.Release|x64.Build.0 = Release|Any CPU
- {48889657-1BFF-4FDD-B702-CFA5F866BC20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {48889657-1BFF-4FDD-B702-CFA5F866BC20}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {48889657-1BFF-4FDD-B702-CFA5F866BC20}.Debug|x64.ActiveCfg = Debug|Any CPU
- {48889657-1BFF-4FDD-B702-CFA5F866BC20}.Debug|x64.Build.0 = Debug|Any CPU
- {48889657-1BFF-4FDD-B702-CFA5F866BC20}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {48889657-1BFF-4FDD-B702-CFA5F866BC20}.Release|Any CPU.Build.0 = Release|Any CPU
- {48889657-1BFF-4FDD-B702-CFA5F866BC20}.Release|x64.ActiveCfg = Release|Any CPU
- {48889657-1BFF-4FDD-B702-CFA5F866BC20}.Release|x64.Build.0 = Release|Any CPU
+ {FF9B429F-972E-47CE-80A6-5339E6119EE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FF9B429F-972E-47CE-80A6-5339E6119EE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FF9B429F-972E-47CE-80A6-5339E6119EE6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FF9B429F-972E-47CE-80A6-5339E6119EE6}.Debug|x64.Build.0 = Debug|Any CPU
+ {FF9B429F-972E-47CE-80A6-5339E6119EE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FF9B429F-972E-47CE-80A6-5339E6119EE6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FF9B429F-972E-47CE-80A6-5339E6119EE6}.Release|x64.ActiveCfg = Release|Any CPU
+ {FF9B429F-972E-47CE-80A6-5339E6119EE6}.Release|x64.Build.0 = Release|Any CPU
+ {8014739C-1B56-4859-A5A5-CA2EF9C58833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8014739C-1B56-4859-A5A5-CA2EF9C58833}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8014739C-1B56-4859-A5A5-CA2EF9C58833}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8014739C-1B56-4859-A5A5-CA2EF9C58833}.Debug|x64.Build.0 = Debug|Any CPU
+ {8014739C-1B56-4859-A5A5-CA2EF9C58833}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8014739C-1B56-4859-A5A5-CA2EF9C58833}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8014739C-1B56-4859-A5A5-CA2EF9C58833}.Release|x64.ActiveCfg = Release|Any CPU
+ {8014739C-1B56-4859-A5A5-CA2EF9C58833}.Release|x64.Build.0 = Release|Any CPU
+ {3EAB9CF3-0F47-4BFB-8BAC-8ADFF24AD899}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3EAB9CF3-0F47-4BFB-8BAC-8ADFF24AD899}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3EAB9CF3-0F47-4BFB-8BAC-8ADFF24AD899}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3EAB9CF3-0F47-4BFB-8BAC-8ADFF24AD899}.Debug|x64.Build.0 = Debug|Any CPU
+ {3EAB9CF3-0F47-4BFB-8BAC-8ADFF24AD899}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3EAB9CF3-0F47-4BFB-8BAC-8ADFF24AD899}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3EAB9CF3-0F47-4BFB-8BAC-8ADFF24AD899}.Release|x64.ActiveCfg = Release|Any CPU
+ {3EAB9CF3-0F47-4BFB-8BAC-8ADFF24AD899}.Release|x64.Build.0 = Release|Any CPU
+ {57806BAF-7736-425A-B499-13A2A2DF1E63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {57806BAF-7736-425A-B499-13A2A2DF1E63}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {57806BAF-7736-425A-B499-13A2A2DF1E63}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {57806BAF-7736-425A-B499-13A2A2DF1E63}.Debug|x64.Build.0 = Debug|Any CPU
+ {57806BAF-7736-425A-B499-13A2A2DF1E63}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {57806BAF-7736-425A-B499-13A2A2DF1E63}.Release|Any CPU.Build.0 = Release|Any CPU
+ {57806BAF-7736-425A-B499-13A2A2DF1E63}.Release|x64.ActiveCfg = Release|Any CPU
+ {57806BAF-7736-425A-B499-13A2A2DF1E63}.Release|x64.Build.0 = Release|Any CPU
+ {68C7C9E9-496B-4004-A1F8-75FFB8C06C76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {68C7C9E9-496B-4004-A1F8-75FFB8C06C76}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {68C7C9E9-496B-4004-A1F8-75FFB8C06C76}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {68C7C9E9-496B-4004-A1F8-75FFB8C06C76}.Debug|x64.Build.0 = Debug|Any CPU
+ {68C7C9E9-496B-4004-A1F8-75FFB8C06C76}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {68C7C9E9-496B-4004-A1F8-75FFB8C06C76}.Release|Any CPU.Build.0 = Release|Any CPU
+ {68C7C9E9-496B-4004-A1F8-75FFB8C06C76}.Release|x64.ActiveCfg = Release|Any CPU
+ {68C7C9E9-496B-4004-A1F8-75FFB8C06C76}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -111,11 +111,11 @@ Global
{42226933-0A0D-48E8-85EC-AFE773A1F841} = {2635EC9B-2E5F-4313-AC21-0B847F31F36C}
{64264688-0F5C-4AB0-8F2B-B59B717CCE00} = {2635EC9B-2E5F-4313-AC21-0B847F31F36C}
{D5293208-2BEF-42FC-A64C-5954F61720BA} = {2635EC9B-2E5F-4313-AC21-0B847F31F36C}
- {A8DF9393-9D67-460C-86F3-1D3C65A80D0A} = {D5293208-2BEF-42FC-A64C-5954F61720BA}
- {ACAB7D42-CCB3-4559-9DB7-B969C52A833D} = {64264688-0F5C-4AB0-8F2B-B59B717CCE00}
- {4DA3E063-9F5A-4361-8EFE-8727409B238D} = {64264688-0F5C-4AB0-8F2B-B59B717CCE00}
- {BDCE7250-A5B0-4AA6-BEB6-B799C12990EF} = {42226933-0A0D-48E8-85EC-AFE773A1F841}
- {48889657-1BFF-4FDD-B702-CFA5F866BC20} = {D5293208-2BEF-42FC-A64C-5954F61720BA}
+ {FF9B429F-972E-47CE-80A6-5339E6119EE6} = {64264688-0F5C-4AB0-8F2B-B59B717CCE00}
+ {8014739C-1B56-4859-A5A5-CA2EF9C58833} = {64264688-0F5C-4AB0-8F2B-B59B717CCE00}
+ {3EAB9CF3-0F47-4BFB-8BAC-8ADFF24AD899} = {D5293208-2BEF-42FC-A64C-5954F61720BA}
+ {57806BAF-7736-425A-B499-13A2A2DF1E63} = {D5293208-2BEF-42FC-A64C-5954F61720BA}
+ {68C7C9E9-496B-4004-A1F8-75FFB8C06C76} = {42226933-0A0D-48E8-85EC-AFE773A1F841}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A9969D89-C98B-40A5-A12B-FC87E55B3A19}
diff --git a/README.md b/README.md
index eb5e1a8a..d570afc6 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,7 @@ BotSharp is in accordance with components principle strictly, decouples every pa
* Built-in multi-agents and conversation management.
* Support multiple LLM platforms.
* Support export/ import agent from other bot platforms directly.
-* Support different open source UI [Chatbot UI](src\BotUIs\ChatbotUI\Chatbot-UI.md).
+* Support different open source UI [Chatbot UI](src\Plugins\BotSharp.Plugin.ChatbotUI\Chatbot-UI.md), [HuggingChat UI](src\Plugins\BotSharp.Plugin.HuggingFace\HuggingChat-UI.md).
* Integrate with popular message channels like Facebook Messenger, Slack and Telegram.
### Quick Started
diff --git a/src/Plugins/Messages/BotSharp.Channel.FacebookMessenger/BotSharp.Plugin.FacebookMessenger.csproj b/src/Plugins/BotSharp.Channel.FacebookMessenger/BotSharp.Plugin.FacebookMessenger.csproj
similarity index 50%
rename from src/Plugins/Messages/BotSharp.Channel.FacebookMessenger/BotSharp.Plugin.FacebookMessenger.csproj
rename to src/Plugins/BotSharp.Channel.FacebookMessenger/BotSharp.Plugin.FacebookMessenger.csproj
index 3590be46..d4c395e8 100644
--- a/src/Plugins/Messages/BotSharp.Channel.FacebookMessenger/BotSharp.Plugin.FacebookMessenger.csproj
+++ b/src/Plugins/BotSharp.Channel.FacebookMessenger/BotSharp.Plugin.FacebookMessenger.csproj
@@ -4,8 +4,4 @@
netstandard2.1
-
-
-
-
diff --git a/src/Plugins/Messages/BotSharp.Channel.Weixin/BotSharp.Plugin.Weixin.csproj b/src/Plugins/BotSharp.Channel.WeChat/BotSharp.Plugin.WeChat.csproj
similarity index 86%
rename from src/Plugins/Messages/BotSharp.Channel.Weixin/BotSharp.Plugin.Weixin.csproj
rename to src/Plugins/BotSharp.Channel.WeChat/BotSharp.Plugin.WeChat.csproj
index dfc83769..d1ee4dc0 100644
--- a/src/Plugins/Messages/BotSharp.Channel.Weixin/BotSharp.Plugin.Weixin.csproj
+++ b/src/Plugins/BotSharp.Channel.WeChat/BotSharp.Plugin.WeChat.csproj
@@ -23,8 +23,4 @@
-
-
-
-
diff --git a/src/Plugins/Messages/BotSharp.Channel.Weixin/README.md b/src/Plugins/BotSharp.Channel.WeChat/README.md
similarity index 100%
rename from src/Plugins/Messages/BotSharp.Channel.Weixin/README.md
rename to src/Plugins/BotSharp.Channel.WeChat/README.md
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.AureOpenAI/AzureOpenAiServiceCollectionExtensions.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/AzureOpenAiServiceCollectionExtensions.cs
similarity index 100%
rename from src/Plugins/Platforms/BotSharp.Plugin.AureOpenAI/AzureOpenAiServiceCollectionExtensions.cs
rename to src/Plugins/BotSharp.Plugin.AzureOpenAI/AzureOpenAiServiceCollectionExtensions.cs
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.AureOpenAI/AzureOpenAiSettings.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/AzureOpenAiSettings.cs
similarity index 100%
rename from src/Plugins/Platforms/BotSharp.Plugin.AureOpenAI/AzureOpenAiSettings.cs
rename to src/Plugins/BotSharp.Plugin.AzureOpenAI/AzureOpenAiSettings.cs
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.AureOpenAI/BotSharp.Plugin.AzureOpenAI.csproj b/src/Plugins/BotSharp.Plugin.AzureOpenAI/BotSharp.Plugin.AzureOpenAI.csproj
similarity index 75%
rename from src/Plugins/Platforms/BotSharp.Plugin.AureOpenAI/BotSharp.Plugin.AzureOpenAI.csproj
rename to src/Plugins/BotSharp.Plugin.AzureOpenAI/BotSharp.Plugin.AzureOpenAI.csproj
index 7e954f29..867e58c3 100644
--- a/src/Plugins/Platforms/BotSharp.Plugin.AureOpenAI/BotSharp.Plugin.AzureOpenAI.csproj
+++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/BotSharp.Plugin.AzureOpenAI.csproj
@@ -11,7 +11,7 @@
-
+
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.AureOpenAI/TextGeneratives/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/TextGeneratives/ChatCompletionProvider.cs
similarity index 100%
rename from src/Plugins/Platforms/BotSharp.Plugin.AureOpenAI/TextGeneratives/ChatCompletionProvider.cs
rename to src/Plugins/BotSharp.Plugin.AzureOpenAI/TextGeneratives/ChatCompletionProvider.cs
diff --git a/src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/BotSharp.Plugin.ChatbotUI.csproj b/src/Plugins/BotSharp.Plugin.ChatbotUI/BotSharp.Plugin.ChatbotUI.csproj
similarity index 71%
rename from src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/BotSharp.Plugin.ChatbotUI.csproj
rename to src/Plugins/BotSharp.Plugin.ChatbotUI/BotSharp.Plugin.ChatbotUI.csproj
index 4301521d..f01a29ba 100644
--- a/src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/BotSharp.Plugin.ChatbotUI.csproj
+++ b/src/Plugins/BotSharp.Plugin.ChatbotUI/BotSharp.Plugin.ChatbotUI.csproj
@@ -9,11 +9,11 @@
-
+
-
+
diff --git a/src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/Chatbot-UI.md b/src/Plugins/BotSharp.Plugin.ChatbotUI/Chatbot-UI.md
similarity index 100%
rename from src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/Chatbot-UI.md
rename to src/Plugins/BotSharp.Plugin.ChatbotUI/Chatbot-UI.md
diff --git a/src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs b/src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs
similarity index 100%
rename from src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs
rename to src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs
diff --git a/src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiChatOutput.cs b/src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiChatOutput.cs
similarity index 100%
rename from src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiChatOutput.cs
rename to src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiChatOutput.cs
diff --git a/src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiChoice.cs b/src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiChoice.cs
similarity index 82%
rename from src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiChoice.cs
rename to src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiChoice.cs
index 21c2597e..a72510df 100644
--- a/src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiChoice.cs
+++ b/src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiChoice.cs
@@ -1,4 +1,5 @@
using Azure.AI.OpenAI;
+using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace BotSharp.Plugin.ChatbotUI.ViewModels;
@@ -6,6 +7,7 @@ namespace BotSharp.Plugin.ChatbotUI.ViewModels;
public class OpenAiChoice
{
[JsonPropertyName("finish_reason")]
+ [JsonProperty("finish_reason")]
public string FinishReason { get; set; }
public ChatMessage Delta { get; set; }
}
diff --git a/src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiMessageBody.cs b/src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiMessageBody.cs
similarity index 100%
rename from src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiMessageBody.cs
rename to src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiMessageBody.cs
diff --git a/src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiMessageInput.cs b/src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiMessageInput.cs
similarity index 100%
rename from src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiMessageInput.cs
rename to src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiMessageInput.cs
diff --git a/src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiModels.cs b/src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiModels.cs
similarity index 100%
rename from src/Plugins/UIs/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiModels.cs
rename to src/Plugins/BotSharp.Plugin.ChatbotUI/ViewModels/OpenAiModels.cs
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/BotSharp.Plugin.HuggingFace.csproj b/src/Plugins/BotSharp.Plugin.HuggingFace/BotSharp.Plugin.HuggingFace.csproj
similarity index 66%
rename from src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/BotSharp.Plugin.HuggingFace.csproj
rename to src/Plugins/BotSharp.Plugin.HuggingFace/BotSharp.Plugin.HuggingFace.csproj
index 877bb599..a27882a7 100644
--- a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/BotSharp.Plugin.HuggingFace.csproj
+++ b/src/Plugins/BotSharp.Plugin.HuggingFace/BotSharp.Plugin.HuggingFace.csproj
@@ -8,11 +8,11 @@
-
+
-
+
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat-UI.md b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat-UI.md
similarity index 100%
rename from src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat-UI.md
rename to src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat-UI.md
diff --git a/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/HuggingChatController.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/HuggingChatController.cs
new file mode 100644
index 00000000..3a9b6aa2
--- /dev/null
+++ b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/HuggingChatController.cs
@@ -0,0 +1,130 @@
+using BotSharp.Abstraction;
+using BotSharp.Abstraction.ApiAdapters;
+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;
+using System.Threading;
+
+namespace BotSharp.Plugin.HuggingFace.HuggingChat;
+
+public class HuggingChatController : ControllerBase, IApiAdapter
+{
+ private readonly IPlatformMidware _platform;
+ public HuggingChatController(IPlatformMidware platform)
+ {
+ _platform = platform;
+ }
+
+ [HttpPost("/conversation")]
+ public async Task NewSession([FromBody] ConversationCreationModel conversationCreationModel)
+ {
+ var session = await _platform.SessionService.NewSession("anonymous");
+ return new ConversationViewModel
+ {
+ ConversationId = session.SessionId
+ };
+ }
+
+ [HttpPost("/conversation/{id}/summarize")]
+ public string SummarizeTitle([FromRoute] string id)
+ {
+ return "SummarizeTitle";
+ }
+
+ [HttpPost("/models/OpenAssistant/{model}")]
+ public async Task SendMessage([FromRoute] string model, [FromBody] ChatInput message)
+ {
+ if (message.Stream)
+ {
+ Response.StatusCode = 200;
+ Response.Headers.Add(HeaderNames.ContentType, "text/event-stream");
+ Response.Headers.Add(HeaderNames.CacheControl, "no-cache");
+ Response.Headers.Add(HeaderNames.Connection, "keep-alive");
+ var outputStream = Response.Body;
+
+ var response = new ChatResponse
+ {
+ Token = new TextToken
+ {
+ Id = 12092,
+ Text = "Hello"
+ }
+ };
+
+ var json = JsonConvert.SerializeObject(response, new JsonSerializerSettings
+ {
+ Formatting = Formatting.None,
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
+ });
+
+ var buffer = Encoding.UTF8.GetBytes($"data:{json}\n");
+ await outputStream.WriteAsync(buffer, 0, buffer.Length);
+
+ await Task.Delay(100);
+
+ buffer = Encoding.UTF8.GetBytes("\n");
+ await outputStream.WriteAsync(buffer, 0, buffer.Length);
+
+ response = new ChatResponse
+ {
+ Token = new TextToken
+ {
+ Text = "<|endoftext|>",
+ Special = true
+ },
+ GeneratedText = "Hello there! How can I assist you today?"
+ };
+
+ json = JsonConvert.SerializeObject(response, new JsonSerializerSettings
+ {
+ Formatting = Formatting.None,
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
+ });
+
+ buffer = Encoding.UTF8.GetBytes($"data:{json}\n");
+ await outputStream.WriteAsync(buffer, 0, buffer.Length);
+
+ await Task.Delay(100);
+
+ buffer = Encoding.UTF8.GetBytes("\n");
+ await outputStream.WriteAsync(buffer, 0, buffer.Length);
+ }
+ else
+ {
+ Response.StatusCode = 200;
+ Response.Headers.Add(HeaderNames.ContentType, "application/json");
+ Response.Headers.Add(HeaderNames.CacheControl, "no-cache");
+ Response.Headers.Add(HeaderNames.Connection, "keep-alive");
+ var outputStream = Response.Body;
+
+ var response = new ChatResponse
+ {
+ Token = new TextToken
+ {
+ Text = "<|endoftext|>",
+ Special = true
+ },
+ GeneratedText = "Hello there! How can I assist you today?"
+ };
+
+ var json = JsonConvert.SerializeObject(new List
+ {
+ response
+ }, new JsonSerializerSettings
+ {
+ Formatting = Formatting.None,
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
+ });
+
+ var buffer = Encoding.UTF8.GetBytes(json);
+ await outputStream.WriteAsync(buffer, 0, buffer.Length);
+ }
+ }
+}
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatInput.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatInput.cs
similarity index 77%
rename from src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatInput.cs
rename to src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatInput.cs
index ec4be48b..79f792d6 100644
--- a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatInput.cs
+++ b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatInput.cs
@@ -3,4 +3,5 @@ namespace BotSharp.Plugin.HuggingFace.HuggingChat.ViewModels;
public class ChatInput
{
public string Inputs { get; set; }
+ public bool Stream { get; set; }
}
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatResponse.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatResponse.cs
similarity index 85%
rename from src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatResponse.cs
rename to src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatResponse.cs
index 97291918..852041a2 100644
--- a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatResponse.cs
+++ b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ChatResponse.cs
@@ -1,4 +1,5 @@
using BotSharp.Abstraction.TextGeneratives;
+using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace BotSharp.Plugin.HuggingFace.HuggingChat.ViewModels;
@@ -7,6 +8,7 @@ public class ChatResponse
{
public TextToken Token { get; set; }
[JsonPropertyName("generated_text")]
+ [JsonProperty("generated_text")]
public string GeneratedText { get; set; }
public string Details { get; set; }
}
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ConversationCreationModel.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ConversationCreationModel.cs
similarity index 100%
rename from src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ConversationCreationModel.cs
rename to src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ConversationCreationModel.cs
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ConversationViewModel.cs b/src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ConversationViewModel.cs
similarity index 100%
rename from src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ConversationViewModel.cs
rename to src/Plugins/BotSharp.Plugin.HuggingFace/HuggingChat/ViewModels/ConversationViewModel.cs
diff --git a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/HuggingChatController.cs b/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/HuggingChatController.cs
deleted file mode 100644
index b77e429a..00000000
--- a/src/Plugins/Platforms/BotSharp.Plugin.HuggingFace/HuggingChat/HuggingChatController.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using BotSharp.Abstraction;
-using BotSharp.Abstraction.ApiAdapters;
-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;
-
-namespace BotSharp.Plugin.HuggingFace.HuggingChat;
-
-public class HuggingChatController : ControllerBase, IApiAdapter
-{
- private readonly IPlatformMidware _platform;
- public HuggingChatController(IPlatformMidware platform)
- {
- _platform = platform;
- }
-
- [HttpPost("/conversation")]
- public async Task NewSession([FromBody] ConversationCreationModel conversationCreationModel)
- {
- var session = await _platform.SessionService.NewSession("anonymous");
- return new ConversationViewModel
- {
- ConversationId = session.SessionId
- };
- }
-
- [HttpPost("/conversation/{id}/summarize")]
- public string SummarizeTitle([FromRoute] string id)
- {
- return "SummarizeTitle";
- }
-
- [HttpPost("/models/OpenAssistant/{model}")]
- public async Task SendMessage([FromRoute] string model, [FromBody] ChatInput message)
- {
- Response.StatusCode = 200;
- Response.Headers.Add(HeaderNames.ContentType, "text/event-stream");
- Response.Headers.Add(HeaderNames.CacheControl, "no-cache");
- Response.Headers.Add(HeaderNames.Connection, "keep-alive");
- var outputStream = Response.Body;
-
- var response = new ChatResponse
- {
-
- };
-
- var json = JsonConvert.SerializeObject(response, new JsonSerializerSettings
- {
- Formatting = Formatting.None,
- ContractResolver = new CamelCasePropertyNamesContractResolver()
- });
-
- var buffer = Encoding.UTF8.GetBytes(json);
- await outputStream.WriteAsync(buffer, 0, buffer.Length);
- }
-}
diff --git a/src/WebStarter/WebStarter.csproj b/src/WebStarter/WebStarter.csproj
index cdbe052c..fd6006b0 100644
--- a/src/WebStarter/WebStarter.csproj
+++ b/src/WebStarter/WebStarter.csproj
@@ -27,11 +27,9 @@
-
-
-
-
-
+
+
+