diff --git a/Samples/Senparc.AI.Samples.Consoles/Samples/PlanSample.cs b/Samples/Senparc.AI.Samples.Consoles/Samples/PlanSample.cs index 40f2b90..3279dc9 100644 --- a/Samples/Senparc.AI.Samples.Consoles/Samples/PlanSample.cs +++ b/Samples/Senparc.AI.Samples.Consoles/Samples/PlanSample.cs @@ -34,7 +34,7 @@ public async Task RunAsync() var planner = iWantToRun.ImportSkill(new PlannerSkill(iWantToRun.Kernel)).skillList; var dir = System.IO.Directory.GetCurrentDirectory(); - Console.WriteLine("dir:" + dir); + //Console.WriteLine("dir:" + dir); var skillsDirectory = Path.Combine(dir, "..", "..", "..", "skills"); //Console.WriteLine("skillsDirectory:" + skillsDirectory); diff --git a/Samples/Senparc.AI.Samples.Consoles/appsettings.json b/Samples/Senparc.AI.Samples.Consoles/appsettings.json index e526088..806caee 100644 --- a/Samples/Senparc.AI.Samples.Consoles/appsettings.json +++ b/Samples/Senparc.AI.Samples.Consoles/appsettings.json @@ -13,7 +13,11 @@ //Senparc.AI 设置 "SenparcAiSetting": { "IsDebug": true, - "AiPlatform": "AzureOpenAI", + "AiPlatform": "NeuCharOpenAI", + "NeuCharOpenAIKeys": { + "ApiKey": "", //在 https://www.neuchar.com/Developer/AiApp 申请 + "NeuCharEndpoint": "https://www.neuchar.com//" //查看 ApiKey 时可看到 DeveloperId + }, "AzureOpenAIKeys": { "ApiKey": "YourAzureApiKey", //TODO:加密 "AzureEndpoint": "https://xxxx.openai.azure.com/", diff --git a/Samples/Senparc.AI.Samples.Consoles/readme.md b/Samples/Senparc.AI.Samples.Consoles/readme.md index 4b62fe3..bf94eba 100644 --- a/Samples/Senparc.AI.Samples.Consoles/readme.md +++ b/Samples/Senparc.AI.Samples.Consoles/readme.md @@ -42,6 +42,11 @@ > 注意:接口返回的 URL 是一个暂存地址,不可用于持久化的展示,需要及时保存, +#### 2.4 Planner + +在第一步中根据已有的 Skill 进行提供,如 SummarizeSkill,WriterSkill 等等。 + +第二步中直接提供 Plan 的目标。 ## Embedding 测试素材 @@ -64,4 +69,3 @@ https://github.com/NeuCharFramework/NcfDocs/blob/main/start/home/index.md:::READ https://github.com/NeuCharFramework/NcfDocs/blob/main/start/start-develop/get-docs.md:::获取文档,在线阅读官方文档,在 NCF 站点中进入官方文档,下载源码后使用 npm 本地运行,下载文档源码,运行 npm 命令 https://github.com/NeuCharFramework/NcfDocs/blob/main/start/start-develop/run-ncf.md:::使用 Visual Studio 运行 NCF ``` - diff --git a/src/Senparc.AI.Kernel.Tests/RegisterTest.cs b/src/Senparc.AI.Kernel.Tests/RegisterTest.cs index 80e4556..8e38928 100644 --- a/src/Senparc.AI.Kernel.Tests/RegisterTest.cs +++ b/src/Senparc.AI.Kernel.Tests/RegisterTest.cs @@ -15,8 +15,9 @@ public void KernelRegisterTest() Assert.IsInstanceOfType(settings, typeof(SenparcAiSetting)); Assert.AreEqual(settings,Senparc.AI.Kernel.Config.SenparcAiSetting); - Assert.AreEqual(AiPlatform.AzureOpenAI, settings.AiPlatform); - Assert.AreEqual(true, settings.UseAzureOpenAI); + Assert.AreEqual(AiPlatform.NeuCharOpenAI, settings.AiPlatform); + Assert.AreEqual(false, settings.UseAzureOpenAI); + Assert.AreEqual(true, settings.UseNeuCharOpenAI); } } } \ No newline at end of file diff --git a/src/Senparc.AI.Kernel/Helpers/SemanticKernelHelper.cs b/src/Senparc.AI.Kernel/Helpers/SemanticKernelHelper.cs index 943c0ec..ce7a228 100644 --- a/src/Senparc.AI.Kernel/Helpers/SemanticKernelHelper.cs +++ b/src/Senparc.AI.Kernel/Helpers/SemanticKernelHelper.cs @@ -132,6 +132,8 @@ public KernelBuilder ConfigTextCompletion(string userId, string modelName, Kerne AiPlatform.AzureOpenAI => new AzureTextCompletion(modelName, AiSetting.AzureEndpoint, AiSetting.ApiKey, AiSetting.AzureOpenAIApiVersion), + AiPlatform.NeuCharOpenAI => new AzureTextCompletion(modelName, AiSetting.NeuCharEndpoint, AiSetting.ApiKey, AiSetting.AzureOpenAIApiVersion), + _ => throw new SenparcAiException($"没有处理当前 {nameof(AiPlatform)} 类型:{aiPlatForm}") }); }); @@ -169,6 +171,8 @@ public KernelBuilder ConfigTextEmbeddingGeneration(string userId, string modelNa { AiPlatform.OpenAI => new OpenAITextEmbeddingGeneration(modelName, AiSetting.ApiKey, AiSetting.OrgaizationId), + AiPlatform.NeuCharOpenAI => new AzureTextEmbeddingGeneration(modelName, AiSetting.AzureEndpoint, AiSetting.ApiKey, AiSetting.NeuCharOpenAIApiVersion), + AiPlatform.AzureOpenAI => new AzureTextEmbeddingGeneration(modelName, AiSetting.AzureEndpoint, AiSetting.ApiKey, AiSetting.AzureOpenAIApiVersion), _ => throw new SenparcAiException($"没有处理当前 {nameof(AiPlatform)} 类型:{aiPlatForm}") diff --git a/src/Senparc.AI.Kernel/Senparc.AI.Kernel.csproj b/src/Senparc.AI.Kernel/Senparc.AI.Kernel.csproj index e1bddfb..1861b3c 100644 --- a/src/Senparc.AI.Kernel/Senparc.AI.Kernel.csproj +++ b/src/Senparc.AI.Kernel/Senparc.AI.Kernel.csproj @@ -1,7 +1,7 @@ netstandard2.1 - 0.1.4.2-beta1 + 0.2.0-beta1 enable 10.0 Senparc.AI.Kernel @@ -25,7 +25,7 @@ icon.jpg v0.1.0 创世 - + v0.2.0 添加 NeuChar OpenAI https://github.com/Senparc/Senparc.AI.Kernel Debug;Release;Test diff --git a/src/Senparc.AI.Tests/RegisterTest.cs b/src/Senparc.AI.Tests/RegisterTest.cs index be85099..f556051 100644 --- a/src/Senparc.AI.Tests/RegisterTest.cs +++ b/src/Senparc.AI.Tests/RegisterTest.cs @@ -13,9 +13,9 @@ public void GlobalRegisterTest() //本地变量测试 var senparcAiSetting = BaseTest._senparcAiSetting; // Senparc.AI.Config.SenparcAiSettings; Assert.IsNotNull(senparcAiSetting); - Assert.AreEqual(AiPlatform.AzureOpenAI, senparcAiSetting.AiPlatform); - Assert.AreEqual(true, senparcAiSetting.UseAzureOpenAI); - Assert.IsFalse(senparcAiSetting.AzureEndpoint.IsNullOrEmpty()); + Assert.AreEqual(AiPlatform.NeuCharOpenAI, senparcAiSetting.AiPlatform); + Assert.AreEqual(true, senparcAiSetting.UseNeuCharOpenAI); + Assert.IsFalse(senparcAiSetting.NeuCharEndpoint.IsNullOrEmpty()); Assert.IsFalse(senparcAiSetting.ApiKey.IsNullOrEmpty()); Assert.IsFalse(senparcAiSetting.OrgaizationId.IsNullOrEmpty()); diff --git a/src/Senparc.AI.Tests/appsettings.json b/src/Senparc.AI.Tests/appsettings.json index e526088..806caee 100644 --- a/src/Senparc.AI.Tests/appsettings.json +++ b/src/Senparc.AI.Tests/appsettings.json @@ -13,7 +13,11 @@ //Senparc.AI 设置 "SenparcAiSetting": { "IsDebug": true, - "AiPlatform": "AzureOpenAI", + "AiPlatform": "NeuCharOpenAI", + "NeuCharOpenAIKeys": { + "ApiKey": "", //在 https://www.neuchar.com/Developer/AiApp 申请 + "NeuCharEndpoint": "https://www.neuchar.com//" //查看 ApiKey 时可看到 DeveloperId + }, "AzureOpenAIKeys": { "ApiKey": "YourAzureApiKey", //TODO:加密 "AzureEndpoint": "https://xxxx.openai.azure.com/", diff --git a/src/Senparc.AI/Entities/OpenAIKeys.cs b/src/Senparc.AI/Entities/OpenAIKeys.cs index 23e7368..bda73b6 100644 --- a/src/Senparc.AI/Entities/OpenAIKeys.cs +++ b/src/Senparc.AI/Entities/OpenAIKeys.cs @@ -14,4 +14,14 @@ public class AzureOpenAIKeys /// public string AzureOpenAIApiVersion { get; set; } = "2022-12-01"; } + + public class NeuCharOpenAIKeys + { + public string ApiKey { get; set; } + public string NeuCharEndpoint { get; set; } + /// + /// NeuCharOpenAIApiVersion,固定值 + /// + public string NeuCharOpenAIApiVersion { get; set; } = "2022-12-01"; + } } diff --git a/src/Senparc.AI/Entities/SenparcAiSettingBase.cs b/src/Senparc.AI/Entities/SenparcAiSettingBase.cs index 1542540..d30428f 100644 --- a/src/Senparc.AI/Entities/SenparcAiSettingBase.cs +++ b/src/Senparc.AI/Entities/SenparcAiSettingBase.cs @@ -21,21 +21,28 @@ public class SenparcAiSettingBase : ISenparcAiSetting /// public virtual bool UseAzureOpenAI => AiPlatform == AiPlatform.AzureOpenAI; + /// + /// 是否使用 Azure OpenAI + /// + public virtual bool UseNeuCharOpenAI => AiPlatform == AiPlatform.NeuCharOpenAI; + /// /// AI 平台类型 /// public virtual AiPlatform AiPlatform { get; set; } - public virtual AzureOpenAIKeys AzureOpenAIKeys { get; set; } public virtual OpenAIKeys OpenAIKeys { get; set; } + public virtual NeuCharOpenAIKeys NeuCharOpenAIKeys { get; set; } + public virtual AzureOpenAIKeys AzureOpenAIKeys { get; set; } /// /// Azure OpenAI 或 OpenAI API Key /// public virtual string ApiKey => AiPlatform switch { - AiPlatform.AzureOpenAI => AzureOpenAIKeys.ApiKey, AiPlatform.OpenAI => OpenAIKeys.ApiKey, + AiPlatform.NeuCharOpenAI => NeuCharOpenAIKeys.ApiKey, + AiPlatform.AzureOpenAI => AzureOpenAIKeys.ApiKey }; /// @@ -56,6 +63,21 @@ public class SenparcAiSettingBase : ISenparcAiSetting #endregion + + #region Azure OpenAI + + /// + /// Azure OpenAI Endpoint + /// + public virtual string NeuCharEndpoint => NeuCharOpenAIKeys.NeuCharEndpoint; + /// + /// Azure OpenAI 版本号 + /// + public virtual string NeuCharOpenAIApiVersion => NeuCharOpenAIKeys.NeuCharOpenAIApiVersion; + + #endregion + + public virtual bool IsOpenAiKeysSetted => OpenAIKeys != null && !OpenAIKeys.ApiKey.IsNullOrEmpty(); } diff --git a/src/Senparc.AI/Enums.cs b/src/Senparc.AI/Enums.cs index e7646de..e8edb42 100644 --- a/src/Senparc.AI/Enums.cs +++ b/src/Senparc.AI/Enums.cs @@ -12,7 +12,8 @@ public enum AiPlatform UnSet = 0, None = 1, OpenAI = 2, - AzureOpenAI = 4 + NeuCharOpenAI = 4, + AzureOpenAI = 8, } /// diff --git a/src/Senparc.AI/Interfaces/ISenparcAiSetting.cs b/src/Senparc.AI/Interfaces/ISenparcAiSetting.cs index 1a0727d..56ddb79 100644 --- a/src/Senparc.AI/Interfaces/ISenparcAiSetting.cs +++ b/src/Senparc.AI/Interfaces/ISenparcAiSetting.cs @@ -22,6 +22,10 @@ public interface ISenparcAiSetting /// bool UseAzureOpenAI => AiPlatform == AiPlatform.AzureOpenAI; + /// + /// 是否使用 NeuChar OpenAI + /// + bool UseNeuCharOpenAI => AiPlatform == AiPlatform.NeuCharOpenAI; /// /// AI 平台类型 /// @@ -31,7 +35,7 @@ public interface ISenparcAiSetting OpenAIKeys OpenAIKeys { get; set; } /// - /// Azure OpenAI 或 OpenAI API Key + /// Neuchar OpenAI 或 Azure OpenAI 或 OpenAI API Key /// string ApiKey { get; } @@ -53,6 +57,19 @@ public interface ISenparcAiSetting #endregion + #region Azure OpenAI + + /// + /// NeuChar OpenAI Endpoint + /// + string NeuCharEndpoint { get; } + /// + /// Azure OpenAI 版本号 + /// + string NeuCharOpenAIApiVersion { get; } + + #endregion + /// /// OpenAIKeys 是否已经设置 /// diff --git a/src/Senparc.AI/Senparc.AI.csproj b/src/Senparc.AI/Senparc.AI.csproj index c1905ad..dbe7be1 100644 --- a/src/Senparc.AI/Senparc.AI.csproj +++ b/src/Senparc.AI/Senparc.AI.csproj @@ -1,7 +1,7 @@ netstandard2.1 - 0.1.4.2-beta1 + 0.2.0-beta1 enable 10.0 Senparc.AI @@ -25,7 +25,7 @@ icon.jpg v0.1.0 创世 - + v0.2.0 添加 NeuChar OpenAI https://github.com/Senparc/Senparc.AI Debug;Release;Test