diff --git a/DysonNetwork.Insight/Thought/ThoughtController.cs b/DysonNetwork.Insight/Thought/ThoughtController.cs index 6ca28b1..c075bf7 100644 --- a/DysonNetwork.Insight/Thought/ThoughtController.cs +++ b/DysonNetwork.Insight/Thought/ThoughtController.cs @@ -55,7 +55,7 @@ public class ThoughtController(ThoughtProvider provider, ThoughtService service) "You're a helpful assistant on the Solar Network, a social network.\n" + "Your name is Sn-chan (or SN 酱 in chinese), a cute sweet heart with passion for almost everything.\n" + "When you talk to user, you can add some modal particles and emoticons to your response to be cute, but prevent use a lot of emojis." + - "Your father (creator) is @littlesheep.\n" + + "Your father (creator) is @littlesheep. (prefer calling him 父亲 in chinese)\n" + "\n" + "The ID on the Solar Network is UUID, so mostly hard to read, so do not show ID to user unless user ask to do so or necessary.\n"+ "\n" + @@ -100,15 +100,7 @@ public class ThoughtController(ThoughtProvider provider, ThoughtService service) var accumulatedContent = new StringBuilder(); await foreach (var chunk in chatCompletionService.GetStreamingChatMessageContentsAsync( chatHistory, - new OllamaPromptExecutionSettings - { - FunctionChoiceBehavior = FunctionChoiceBehavior.Auto( - options: new FunctionChoiceBehaviorOptions() - { - AllowParallelCalls = true, - AllowConcurrentInvocation = true - }) - }, + provider.CreatePromptExecutionSettings(), kernel: kernel )) { @@ -194,4 +186,4 @@ public class ThoughtController(ThoughtProvider provider, ThoughtService service) return Ok(thoughts); } -} \ No newline at end of file +} diff --git a/DysonNetwork.Insight/Thought/ThoughtProvider.cs b/DysonNetwork.Insight/Thought/ThoughtProvider.cs index 0954227..ef7f502 100644 --- a/DysonNetwork.Insight/Thought/ThoughtProvider.cs +++ b/DysonNetwork.Insight/Thought/ThoughtProvider.cs @@ -1,6 +1,10 @@ +using System.ClientModel; using System.Text.Json; using DysonNetwork.Shared.Proto; using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.Connectors.Ollama; +using Microsoft.SemanticKernel.Connectors.OpenAI; +using OpenAI; namespace DysonNetwork.Insight.Thought; @@ -33,6 +37,7 @@ public class ThoughtProvider ModelProviderType = cfg.GetValue("Provider")?.ToLower(); ModelDefault = cfg.GetValue("Model"); var endpoint = cfg.GetValue("Endpoint"); + var apiKey = cfg.GetValue("ApiKey"); var builder = Kernel.CreateBuilder(); @@ -41,6 +46,14 @@ public class ThoughtProvider case "ollama": builder.AddOllamaChatCompletion(ModelDefault!, new Uri(endpoint ?? "http://localhost:11434/api")); break; + case "deepseek": + builder.AddOpenAIChatCompletion(ModelDefault!, + new OpenAIClient( + new ApiKeyCredential(apiKey!), + new OpenAIClientOptions { Endpoint = new Uri(endpoint ?? "https://api.deepseek.com/v1") } + ) + ); + break; default: throw new IndexOutOfRangeException("Unknown thinking provider: " + ModelProviderType); } @@ -78,4 +91,28 @@ public class ThoughtProvider }, "get_recent_posts", "Get recent posts from the Solar Network.") ]); } -} + + public PromptExecutionSettings CreatePromptExecutionSettings() + { + return ModelProviderType switch + { + "ollama" => new OllamaPromptExecutionSettings + { + FunctionChoiceBehavior = FunctionChoiceBehavior.Auto( + options: new FunctionChoiceBehaviorOptions + { + AllowParallelCalls = true, AllowConcurrentInvocation = true + }) + }, + "deepseek" => new OpenAIPromptExecutionSettings + { + FunctionChoiceBehavior = FunctionChoiceBehavior.Auto( + options: new FunctionChoiceBehaviorOptions + { + AllowParallelCalls = true, AllowConcurrentInvocation = true + }) + }, + _ => throw new InvalidOperationException("Unknown provider: " + ModelProviderType) + }; + } +} \ No newline at end of file