feat(openai): 新增 OpenAI v2 版接口客户端,并实现加解密及签名中间件

This commit is contained in:
Fu Diwei
2024-06-04 22:05:49 +08:00
parent ad9b5a1641
commit 921b968486
24 changed files with 807 additions and 14 deletions

View File

@@ -15,6 +15,26 @@ namespace SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests
// 如果 Visual Studio 遇到 “缺少 SKIT.FlurlHttpClient.Tools.CodeAnalyzer 包” 的错误,
// 请参考此 Issuehttps://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient/issues/8
Assert.Null(Record.Exception(() =>
{
var options = new TypeDeclarationAnalyzerOptions()
{
SdkAssembly = Assembly.GetAssembly(typeof(WechatOpenAIClient))!,
SdkRequestModelDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.OpenAI.Models",
SdkResponseModelDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.OpenAI.Models",
SdkExecutingExtensionDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.OpenAI",
SdkWebhookEventDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.OpenAI.Events",
IgnoreRequestModelTypes = (type) => !typeof(WechatOpenAIRequest).IsAssignableFrom(type),
IgnoreResponseModelTypes = (type) => !typeof(WechatOpenAIResponse).IsAssignableFrom(type),
IgnoreExecutingExtensionTypes = (type) => !type.Name.StartsWith(nameof(WechatOpenAIClient)),
IgnoreWebhookEventTypes = (_) => true,
ThrowOnNotFoundRequestModelTypes = true,
ThrowOnNotFoundResponseModelTypes = true,
ThrowOnNotFoundExecutingExtensionTypes = true
};
new TypeDeclarationAnalyzer(options).AssertNoIssues();
}));
Assert.Null(Record.Exception(() =>
{
var options = new TypeDeclarationAnalyzerOptions()
@@ -36,6 +56,35 @@ namespace SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests
new TypeDeclarationAnalyzer(options).AssertNoIssues();
}));
Assert.Null(Record.Exception(() =>
{
string workdir = Environment.CurrentDirectory;
string projdir = Path.Combine(workdir, "../../../../../");
var options = new SourceFileAnalyzerOptions()
{
SdkAssembly = Assembly.GetAssembly(typeof(WechatOpenAIClient))!,
SdkRequestModelDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.OpenAI.Models",
SdkResponseModelDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.OpenAI.Models",
SdkWebhookEventDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.OpenAI.Events",
ProjectSourceRootDirectory = Path.Combine(projdir, "./src/SKIT.FlurlHttpClient.Wechat.OpenAI/"),
ProjectTestRootDirectory = Path.Combine(projdir, "./test/SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests/"),
ProjectSourceRequestModelClassCodeSubDirectory = "Models/OpenAI/",
ProjectSourceResponseModelClassCodeSubDirectory = "Models/OpenAI/",
ProjectSourceWebhookEventClassCodeSubDirectory = "Events/OpenAI/",
ProjectTestRequestModelSerializationSampleSubDirectory = "ModelSamples/OpenAI/",
ProjectTestResponseModelSerializationSampleSubDirectory = "ModelSamples/OpenAI/",
ProjectTestWebhookEventSerializationSampleSubDirectory = "EventSamples/OpenAI/",
IgnoreExecutingExtensionClassCodeFiles = (file) => !file.Name.StartsWith(nameof(WechatOpenAIClient)),
ThrowOnNotFoundRequestModelClassCodeFiles = true,
ThrowOnNotFoundResponseModelClassCodeFiles = true,
ThrowOnNotFoundExecutingExtensionClassCodeFiles = true,
ThrowOnNotFoundRequestModelSerializationSampleFiles = true,
ThrowOnNotFoundResponseModelSerializationSampleFiles = true,
};
new SourceFileAnalyzer(options).AssertNoIssues();
}));
Assert.Null(Record.Exception(() =>
{
string workdir = Environment.CurrentDirectory;
@@ -55,6 +104,7 @@ namespace SKIT.FlurlHttpClient.Wechat.OpenAI.UnitTests
ProjectTestRequestModelSerializationSampleSubDirectory = "ModelSamples/Chatbot/",
ProjectTestResponseModelSerializationSampleSubDirectory = "ModelSamples/Chatbot/",
ProjectTestWebhookEventSerializationSampleSubDirectory = "EventSamples/Chatbot/",
IgnoreExecutingExtensionClassCodeFiles = (file) => !file.Name.StartsWith(nameof(WechatChatbotClient)),
ThrowOnNotFoundRequestModelClassCodeFiles = true,
ThrowOnNotFoundResponseModelClassCodeFiles = true,
ThrowOnNotFoundExecutingExtensionClassCodeFiles = true,