惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
爱范儿
爱范儿
P
Proofpoint News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
Latest news
Latest news
The Hacker News
The Hacker News
Cyberwarzone
Cyberwarzone
博客园 - 【当耐特】
Project Zero
Project Zero
小众软件
小众软件
T
Tailwind CSS Blog
量子位
博客园 - 聂微东
I
Intezer
美团技术团队
S
SegmentFault 最新的问题
T
Tor Project blog
Spread Privacy
Spread Privacy
V
Vulnerabilities – Threatpost
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Jina AI
Jina AI
罗磊的独立博客
B
Blog RSS Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
有赞技术团队
有赞技术团队
Google DeepMind News
Google DeepMind News
宝玉的分享
宝玉的分享
C
Cisco Blogs
L
LINUX DO - 热门话题
Last Week in AI
Last Week in AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
AI
AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
L
LINUX DO - 最新话题
Know Your Adversary
Know Your Adversary
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
Lohrmann on Cybersecurity
The Register - Security
The Register - Security
L
LangChain Blog
博客园 - 叶小钗
T
Tenable Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - 邓磊Lei

为什么 Go 一个 HTTP 服务可以同时处理数万连接 gin怎么处理一次http请求的 我的经验:git提交信息分别用什么icon C# 也能像 Python 一样写脚本 | .NET 10 构建基于文件的应用 .NET 10 使用 Microsoft.AspNetCore.OpenApi 实现 API 版本管理 ASP.NET Core 内存缓存实战:一篇搞懂该怎么配、怎么避坑 开发实战:asp.net core + ef core 实现动态可扩展的分页方案 聊聊 ASP.NET Core 中间件和过滤器的区别 Python 入门:从“其他语言”到 Pythonic 思维的完整迁移手册 .NET 进阶之路:异步、并发与内存管理的系统性认知 Redis:延迟双删的适用边界与落地细节 Serilog:从结构化日志认知到 .NET 工程落地 EF Core 原生 SQL 实战:FromSql、SqlQuery 与对象映射边界 EF Core 拦截器实战:SaveChangesInterceptor、CommandInterceptor 与审计落地 ASP.NET Core 外部依赖调用治理实战:HttpClientFactory、Polly 与幂等边界 .NET .Result 避坑指南:不同框架下的死锁与线程池饥饿 EF Core 慢查询排查实战:TagWith、OpenTelemetry、执行计划,30 分钟定位性能瓶颈 EF Core 并发冲突实战:乐观锁、RowVersion 与 DbUpdateConcurrencyException 怎么处理 EF Core 写入链路深拆:从 ChangeTracker 到 SQL Batch 的性能诊断与优化 ASP.NET Core 认证鉴权实战:JWT、Policy 与权限边界怎么落地 C# 异步编程深水区:Task、ValueTask、线程池饥饿与背压设计 EF Core 查询性能黑洞:Include、投影与跟踪策略的边界 从 IApplicationBuilder 到 RequestDelegate:ASP.NET Core 请求管线的性能与可观测性实战 如何在 rider 中配置 SonarQube
Microsoft Agent Framework + Kimi API 实战:控制台应用跑通单次与多轮 Agent 对话
邓磊Lei · 2026-04-06 · via 博客园 - 邓磊Lei

引言

如果你的技术栈主要是 .NET,想要快速上手 Agent 开发,那么 Microsoft Agent Framework 是一个非常不错的选择。它提供了对话管理、上下文保持、工具调用等一系列功能,让你能专注于业务逻辑实现。

这篇文章用一个最小控制台应用,通过 maf + kimi ai 合作,完成下面的目标:

  1. 使用 Microsoft Agent Framework(NuGet 包名为 Microsoft.Agents.AI 体系)
  2. 使用 Kimi 的 OpenAI 兼容接口
  3. 实现单次对话
  4. 实现多轮对话(基于 Session 保留上下文)

你把代码复制后,只要配置好 KIMI_API_KEY 就能跑起来。

环境准备

  1. .NET SDK 9.0+
  2. Kimi API Key
  3. 一个控制台项目

创建项目并安装依赖:

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

我跑了两次对话,效果如下:

4376cf246131e147a17b063031d6ba0e

建议你也在第二次对话中,验证“多轮上下文是否生效”:

  1. 第一轮:我叫小a,是.net开发
  2. 第二轮:你记得我叫什么吗?

如果第二轮能回答出“小a”,说明 Session 已承载上下文。

总结

本文我们完成了一个最小但完整的集成:

  1. 用 Microsoft Agent Framework 封装 Agent
  2. 用 Kimi API(OpenAI 兼容)提供模型能力
  3. 在控制台中实现了单次与多轮对话