Microsoft Agent Framework + Kimi API 实战:控制台应用跑通单次与多轮 Agent 对话
·
- 使用 Kimi 的 OpenAI 兼容接口
- 实现单次对话
- 实现多轮对话(基于 Session 保留上下文)
你把代码复制后,只要配置好 KIMI_API_KEY 就能跑起来。
环境准备
- .NET SDK 9.0+
- Kimi API Key
- 一个控制台项目
创建项目并安装依赖:
dotnet new console -n AgentConsoleApp |
|
cd AgentConsoleApp |
|
dotnet add package Microsoft.Agents.AI |
|
dotnet add package Microsoft.Agents.AI.OpenAI |
|
dotnet add package OpenAI |
开发实战
一、配置 Kimi API 的访问参数
注意:在实际开发中,确保妥善保管 API 密钥,避免泄露。
我这里把密钥放在了环境变量中,代码中通过读取环境变量来获取密钥。
macOS / Linux:
export KIMI_API_KEY="你的 kimi_api_key 放这里" |
|
export KIMI_MODEL="moonshot-v1-8k" |
|
export KIMI_BASE_URL="https://api.moonshot.cn/v1" |
Windows PowerShell:
$env:KIMI_API_KEY="你的 kimi_api_key 放这里" |
|
$env:KIMI_MODEL="moonshot-v1-8k" |
|
$env:KIMI_BASE_URL="https://api.moonshot.cn/v1" |
读取环境变量的配置类:
internal sealed class KimiSettings |
|
{ |
|
public required string ApiKey { get; init; } |
|
public required string Model { get; init; } |
|
public required string BaseUrl { get; init; } |
|
public static KimiSettings FromEnvironment() |
|
{ |
|
var apiKey = Environment.GetEnvironmentVariable("KIMI_API_KEY"); |
|
var model = Environment.GetEnvironmentVariable("KIMI_MODEL") ?? "moonshot-v1-8k"; |
|
var baseUrl = Environment.GetEnvironmentVariable("KIMI_BASE_URL") ?? "https://api.moonshot.cn/v1"; |
|
if (string.IsNullOrWhiteSpace(apiKey)) |
|
{ |
|
throw new InvalidOperationException("缺少环境变量 KIMI_API_KEY。"); |
|
} |
|
return new KimiSettings |
|
{ |
|
ApiKey = apiKey, |
|
Model = model, |
|
BaseUrl = baseUrl |
|
}; |
|
} |
|
} |
二、完整 Program.cs(含单次对话 + 多轮对话)
把下面代码放到 Program.cs:
using Microsoft.Agents.AI; |
|
using OpenAI; |
|
using OpenAI.Chat; |
|
using System.ClientModel; |
|
var settings = KimiSettings.FromEnvironment(); |
|
var openAiOptions = new OpenAIClientOptions |
|
{ |
|
Endpoint = new Uri(settings.BaseUrl) |
|
}; |
|
var chatClient = new ChatClient( |
|
model: settings.Model, |
|
credential: new ApiKeyCredential(settings.ApiKey), |
|
options: openAiOptions); |
|
var agent = chatClient.AsAIAgent( |
|
name: "KimiConsoleAgent", |
|
instructions: "你是一个专业、简洁的 .NET 助手。回答优先给结论,再给关键步骤。", |
|
description: "Console demo agent with Kimi API"); |
|
Console.WriteLine("=== Microsoft Agent Framework + Kimi API Demo ==="); |
|
Console.WriteLine($"Model: {settings.Model}"); |
|
Console.WriteLine(); |
|
await RunSingleTurnAsync(agent); |
|
await RunMultiTurnAsync(agent); |
|
static async Task RunSingleTurnAsync(ChatClientAgent agent) |
|
{ |
|
Console.WriteLine("[单次对话]"); |
|
var question = "请用 3 句话解释 .NET 中 async/await 的作用。"; |
|
var response = await agent.RunAsync(question); |
|
Console.WriteLine($"你: {question}"); |
|
Console.WriteLine($"Agent: {response.Text}"); |
|
Console.WriteLine(); |
|
} |
|
static async Task RunMultiTurnAsync(ChatClientAgent agent) |
|
{ |
|
Console.WriteLine("[多轮对话]"); |
|
Console.WriteLine("输入 exit 退出。\n"); |
|
// 关键点:同一个 session 会保留上下文,实现多轮会话。 |
|
var session = await agent.CreateSessionAsync(); |
|
while (true) |
|
{ |
|
Console.Write("你: "); |
|
var input = Console.ReadLine(); |
|
if (string.IsNullOrWhiteSpace(input)) |
|
{ |
|
continue; |
|
} |
|
if (input.Equals("exit", StringComparison.OrdinalIgnoreCase)) |
|
{ |
|
Console.WriteLine("会话结束。"); |
|
break; |
|
} |
|
try |
|
{ |
|
var response = await agent.RunAsync(input, session); |
|
Console.WriteLine($"Agent: {response.Text}\n"); |
|
} |
|
catch (Exception ex) |
|
{ |
|
Console.WriteLine($"调用失败: {ex.Message}\n"); |
|
} |
|
} |
|
} |
第三方大模型服务接口可以使用 New ChatClient 直接调用,为了演示 Microsoft Agent Framework 的能力,我们通过 AsAIAgent 把它封装成一个 Agent。这样就能享受 Agent Framework 带来的对话管理、上下文保持等特性。
三、运行与验证
执行:
dotnet run |
我跑了两次对话,效果如下:

建议你也在第二次对话中,验证“多轮上下文是否生效”:
- 第一轮:
我叫小a,是.net开发 - 第二轮:
你记得我叫什么吗?
如果第二轮能回答出“小a”,说明 Session 已承载上下文。
更多推荐


所有评论(0)