using System; using System.ClientModel; using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; using AutoSW.Agent; using Microsoft.Extensions.AI; using OpenAI; using OpenAI.Chat; namespace AutoSW.UI.Util { internal class ChatClient { /// /// 火山方舟API Key /// private readonly string API_KEY = "58e5c6fd-a5da-400e-b889-715febce478f"; private readonly string OLLAMA_ENDPOINT = "http://localhost:11434/"; private readonly string API_ENDPOINT = "https://ark.cn-beijing.volces.com/api/v3/"; private string MODEL; private readonly IChatClient _client; private bool useOpenAIClient; private OpenAIClient _openAICLient; public ChatClient(string modelName = "deepseek-r1:1.5b", bool useOllama = true) { //MODEL = modelName; //var apiKeyCredential = new ApiKeyCredential(API_KEY); //var openAIClientOptions = new OpenAIClientOptions //{ // Endpoint = new Uri(ENDPOINT) //}; //_client = new OpenAIClient(apiKeyCredential, openAIClientOptions) // .AsChatClient(MODEL); if (useOllama) { var client = new OllamaChatClient(new Uri(OLLAMA_ENDPOINT), modelName); _client = new ChatClientBuilder(client) .UseFunctionInvocation() .Build(); } else { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; var client = new OpenAIClient(new ApiKeyCredential(API_KEY), new OpenAIClientOptions { Endpoint = new Uri(API_ENDPOINT), }); _client = client.AsChatClient(modelName); } } public IChatClient Client => _client; public async Task GetChatResponseAsync(string question) { var response = await _client.GetResponseAsync(question); return response.Message.ToString(); } public async IAsyncEnumerable GetStreamingResponseAsync(string question) { // 获取所有的工具函数 var toolsList = AgentExecutor.GetDefaultTools(); var chatOptions = new ChatOptions { Tools = toolsList, ToolMode = ChatToolMode.Auto, }; if (useOpenAIClient) { var chatClient = _openAICLient.AsChatClient("doubao-1-5-pro-32k-250115") .AsBuilder() .UseFunctionInvocation() .Build(); var response = chatClient.GetResponseAsync(question, chatOptions); yield return response.Result.Choices[0].Text; } else { await foreach (var response in _client.GetStreamingResponseAsync(question, chatOptions)) { yield return response.Text; } } } public void UseOpenAI() { useOpenAIClient = true; _openAICLient = new OpenAIClient(new ApiKeyCredential(API_KEY), new OpenAIClientOptions { Endpoint = new Uri(API_ENDPOINT) }); } } }