Make DashScope work with Semantic Kernel and Kernel Memory.
Add the NuGet package to your project.
dotnet add package Cnblogs.SemanticKernel.Connectors.DashScopeusing Microsoft.SemanticKernel;
var builder = Kernel.CreateBuilder();
builder.Services.AddDashScopeChatCompletion("your-api-key", "qwen-max");
var kernel = builder.Build();
var prompt = "<message role=\"user\">Tell me about the Cnblogs</message>";
var response = await kernel.InvokePromptAsync(prompt);
Console.WriteLine(response);Install Nuget package Cnblogs.KernelMemory.AI.DashScope
Install Nuget package Microsoft.KernelMemory.Core
Install Nuget package Microsoft.KernelMemory.SemanticKernelPlugin
appsettings.json
{
  "dashScope": {
    "apiKey": "your-key",
    "chatCompletionModelId": "qwen-max",
    "textEmbeddingModelId": "text-embedding-v3"
  }
}Program.cs
// Kernel Memory stuff
var memory = new KernelMemoryBuilder(builder.Services).WithDashScope(builder.Configuration).Build();
builder.Services.AddSingleton(memory);
// SK stuff
builder.Services.AddDashScopeChatCompletion(builder.Configuration);
builder.Services.AddSingleton(
    sp =>
    {
        var plugins = new KernelPluginCollection();
        plugins.AddFromObject(
            new MemoryPlugin(sp.GetRequiredService<IKernelMemory>(), waitForIngestionToComplete: true),
            "memory");
        return new Kernel(sp, plugins);
    });Services
public class YourService(Kernel kernel, IKernelMemory memory)
{
    public async Task<string> GetCompletionAsync(string prompt)
    {
        var chatResult = await kernel.InvokePromptAsync(prompt);
        return chatResult.ToString();
    }
    public async Task ImportDocumentAsync(string filePath, string documentId)
    {
        await memory.ImportDocumentAsync(filePath, documentId);
    }
    public async Task<string> AskMemoryAsync(string question)
    {
        // use memory.ask to query kernel memory
        var skPrompt = """
                       Question to Kernel Memory: {{$input}}
                       Kernel Memory Answer: {{memory.ask $input}}
                       If the answer is empty say 'I don't know' otherwise reply with a preview of the answer, truncated to 15 words.
                       """;
        // you can bundle created functions into a singleton service to reuse them
        var myFunction = kernel.CreateFunctionFromPrompt(skPrompt);
        var result = await myFunction.InvokeAsync(question);
        return result.ToString();
    }
}