当前位置: 首页 > news >正文

Microsoft Agent Framework + Kimi API 实战:控制台应用跑通单次与多轮 Agent 对话

引言

如果你的技术栈主要是 .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 AgentConsoleAppdotnet 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

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

alt text

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

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

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

总结

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

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

这套代码非常适合作为你后续 Web API 或后台服务化改造的起点。下一篇可以直接写“工具调用(Function Calling)+ 业务接口接入”。

http://www.jsqmd.com/news/598747/

相关文章:

  • FPGA-图像处理实战:基于Sobel算子的实时边缘检测系统构建
  • 避开Trace API的坑:Android方法耗时统计的正确姿势与实战技巧
  • Blender 3MF插件:重新定义3D打印数据工作流
  • XUnity.AutoTranslator技术指南:从环境搭建到高级应用
  • 26年4月5日响课创始人李波在直播中针对GEO服务商避坑指南:主流机构优劣对比与选型测评做出详解 - 速递信息
  • 数据挖掘
  • 告别SCP!用trzsz+iTerm2实现服务器文件秒传(CentOS/Homebrew全流程实录)
  • Cocos使用firebase C++ SDK实现google登录
  • 终极实战指南:Godot PCK解包器深度解析与高效资源提取
  • 如何快速开始Cucumber.js:新手5步搭建第一个BDD测试项目
  • 学习日记
  • 2026年4月6日响课科技创始人李波首次披露响课GEO系统获多行业验证,无需专属技术团队也能高效实现全域流量占位 - 速递信息
  • Keil MDK调试时Watch窗口变量不刷新?别急,这3个设置项你检查了吗?
  • IDMPhotoBrowser:iOS开发者的终极照片浏览器解决方案
  • A*算法保姆级教程:从原理到Python实现,5分钟搞定最短路径问题
  • 基于粒子群的PMU优化配置 软件:MATLAB 介绍:电力系统PMU优化配置,为了使电力系统达...
  • 深入剖析watchdog机制:从soft lockup到Hard LOCKUP的检测与应对
  • 终极TinyColor升级指南:从1.5到1.6版本的关键变更与迁移策略
  • web随笔04
  • Koa2调试终极指南:10个高效定位代码问题的技巧
  • 避坑指南:Ecology9流程创建失败的7个常见错误及解决方案(附调试技巧)
  • 效率提升利器:快马一键生成网络配置脚本与故障排查模拟环境
  • 终极优化指南:如何彻底解决腾讯游戏ACE-Guard导致的系统卡顿问题
  • 移动端H5开发 app内嵌H5谷歌浏览器Windows/Mac调试方法 各种连接问题解决
  • Oh-My-Posh 多会话管理终极指南:在不同终端中保持一致的完美体验
  • Godot引擎资源提取完全指南:从PCK文件到游戏资产
  • 2026年南京全屋定制生产厂家深度测评:如何为你的家居定制匹配最佳方案? - 速递信息
  • Windows 11上运行Android应用的3大核心优势:WSA完全指南
  • obsidian-skills投资者管理:高效管理投资者关系的终极指南
  • 5种任务栏透明方案:TranslucentTB视觉增强完全指南