本内容仅供自己参考学习
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<dynamic>(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
方法:
-
私有字段:
_apiKey
:存储API密钥。_apiUrl
:存储API的URL。_endpointId
:存储模型的端点ID。client
:静态HttpClient实例,用于发送HTTP请求。
-
构造函数:
- 接受一个配置JSON字符串,调用基类构造函数。
- 使用
JsonConvert.DeserializeObject<dynamic>
解析配置JSON,并提取ApiKey
、Url
和EndpointId
。
-
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();
}
}
}
}