C#/.net实现调用api访问kimi,豆包等大模型的通用方法

本内容仅供自己参考学习

kimi、豆包、通义千问三个大模型都是通过apikey、apiurl以及大模型应用id来进行交互

1.TyClient接口

public interface TyClient
{
    string ChatAI(string input);
}

2.TyClientBase抽象类

实现TyClient接口,增加ConfigJosn字段存储请求体

public abstract class TyClientBase : TyClient
{
    protected string ConfigJson;

    public TyClientBase(string configjson)
    {
        ConfigJson = configjson;
    }

    public abstract string ChatAI(string input);
}

3.TyModel类

public class TyModel : TyClientBase
{
    private string _apiKey;
    private string _apiUrl;
    private string _endpointId;
    private static readonly HttpClient client = new HttpClient();

    public TyModel(string configjson) : base(configjson)
    {
        // 解析configjson
        var config = JsonConvert.DeserializeObject(configjson);
        _apiKey = config.ApiKey;
        _apiUrl = config.Url;
        _endpointId = config.EndpointId;
    }

    public override string ChatAI(string input)
    {
        var requestBody = new
        {
            model = _endpointId,
            messages = new[]
            {
                new { role = "system", content = "你是一个编程高手,精通各种编程语言" },
                new { role = "user", content = input }
            },
            stream = true
        };

        var json = JsonConvert.SerializeObject(requestBody);
        var content = new StringContent(json, Encoding.UTF8, "application/json");

        var request = new HttpRequestMessage
        {
            Method = HttpMethod.Post,
            RequestUri = new Uri(_apiUrl),
            Content = content
        };

        request.Headers.Add("Authorization", $"Bearer {_apiKey}");

        var response = client.Send(request, HttpCompletionOption.ResponseHeadersRead);

        var fullResponse = new StringBuilder();

        using (var stream = response.Content.ReadAsStream())
        using (var reader = new System.IO.StreamReader(stream))
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                if (line.StartsWith("data:"))
                {
                    var jsonString = line.Substring(5).Trim();
                    if (jsonString == "[DONE]")
                    {
                        break;
                    }
                    var jsonObj = JObject.Parse(jsonString);
                    var contentDelta = jsonObj["choices"]?[0]?["delta"]?["content"]?.ToString();
                    if (contentDelta != null)
                    {
                        fullResponse.Append(contentDelta);
                    }
                }
            }
        }

        return fullResponse.ToString();
    }
}

TyModel类继承了TyClientBase,并实现了ChatAI方法:

  1. 私有字段

    • _apiKey:存储API密钥。
    • _apiUrl:存储API的URL。
    • _endpointId:存储模型的端点ID。
    • client:静态HttpClient实例,用于发送HTTP请求。
  2. 构造函数

    • 接受一个配置JSON字符串,调用基类构造函数。
    • 使用JsonConvert.DeserializeObject解析配置JSON,并提取ApiKeyUrlEndpointId
  3. ChatAI方法

    • 创建请求体,包括模型ID和消息数组。
    • 将请求体序列化为JSON,并创建StringContent
    • 创建HttpRequestMessage,设置请求方法、URI和内容。
    • 添加Authorization头。
    • 发送请求并处理响应,以流的方式逐行读取响应内容。
    • 检查每行是否以"data:"开头,解析JSON并提取内容增量,逐行构建完整响应。

 请求示例:

using System;


namespace AiTy
{
    internal class Program
    {
        private static void Main(string[] args)
        {

            

            string config = "{ \"Url\": \"https://XXXXX/v1/chat/completions\", \"ApiKey\": \"XXXXXXXXXXXXXXXX\", \"EndpointId\": \"XXXXX\" }";

            TyClient Client = new TyModel(config);
            while (true)
            {
                Console.WriteLine("请输入你的问题(输入'exit'退出):");
                string input = Console.ReadLine();

                if (input.ToLower() == "exit")
                {
                    break;
                }


                string result = Client.ChatAI(input);
                Console.WriteLine("AI 回复:");
                Console.WriteLine(result);
                Console.WriteLine();
            }
        }

    }
}

你可能感兴趣的:(C#,c#,.net)