AutoGen.NET 0.1.0 版本解读:Azure AI Inference 新包、双 Agent 分步会话与 Claude 提示缓存
AutoGen.NET 0.1.0 版本解读Azure AI Inference 新包、双 Agent 分步会话与 Claude 提示缓存【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen本文基于 AutoGen 仓库的 .NET 侧发布说明 release_note/0.1.0.md系统梳理 AutoGen.NET 0.1.0 版本的三项新特性、三项缺陷修复与一项文档更新。读完后你将了解如何引入AutoGen.AzureAIInference包创建聊天 Agent、如何用返回IAsyncEnumerableIMessage的SendAsync逐步驱动两个 Agent 的对话以及如何为 Claude 会话开启提示缓存Prompt Caching并理解其最小可缓存 token 门槛。一、新增 NuGet 包AutoGen.AzureAIInference0.1.0 版本发布了AutoGen.AzureAIInference包其核心组件是ChatCompletionsClientAgent。该 Agent 是对Azure.AI.Inference库中ChatCompletionsClient的轻量封装实现了IStreamingAgent接口既支持一次性回复也支持流式回复输入消息MessageEnvelopeChatRequestMessage类型聊天请求消息输出消息非流式返回MessageEnvelopeChatCompletions流式返回MessageEnvelopeStreamingChatCompletionsUpdate见 ChatCompletionsClientAgent.cs 的类注释。构造函数提供了两条常用创建路径ChatCompletionsClientAgent.cs// 路径一显式参数便于快速上手 public ChatCompletionsClientAgent( ChatCompletionsClient chatCompletionsClient, string name, string modelName, // 例如 gpt-4o-mini string systemMessage You are a helpful AI assistant, float temperature 0.7f, int maxTokens 1024, int? seed null, // 设置后可获得确定性输出 ChatCompletionsResponseFormat? responseFormat null, // 设为 JSON 格式可启用 JSON 模式 IEnumerableFunctionDefinition? functions null)另一条路径直接传入ChatCompletionsOptions对象适合需要精细控制请求参数的场景注意源码在构造时会校验options.Messages不能非空消息必须通过GenerateReplyAsync的参数传入而不是预置在选项里if (options.Messages is { Count: 0 }) { throw new ArgumentException(Messages should not be provided in options); }回复与流式回复的实现分别在GenerateReplyAsync调用chatCompletionsClient.CompleteAsync和GenerateStreamingReplyAsync调用CompleteStreamingAsync并逐块 yield中ChatCompletionsClientAgent.cs。由于Azure.AI.InferenceSDK 是 Azure AI 推理端点的统一客户端这一包使得 AutoGen.NET 用户可以以与 OpenAI Agent 一致的心智模型接入 Azure AI Inference 平台上的各类模型。二、新特性 1两个 Agent 的聊天可以逐步执行0.1.0 对双 Agent 会话 API 做了重要增强AgentExtension.SendAsync现在返回IAsyncEnumerableIMessage允许调用方像消费GroupChatExtension.SendAsync一样逐步驱动两个 Agent 的对话而不是等整轮对话结束后一次性拿到结果。2.1 核心实现内部构建临时 RoundRobin 群聊从源码AgentExtension.cs可以看到该重载的工作机制非常清晰public static IAsyncEnumerableIMessage SendAsync( this IAgent agent, IAgent receiver, IEnumerableIMessage chatHistory, int maxRound 10, CancellationToken ct default) { if (receiver is GroupChatManager manager) { var gc manager.GroupChat; return gc.SendAsync(chatHistory, maxRound, ct); } var groupChat new RoundRobinGroupChat( agents: [ agent, receiver, ]); return groupChat.SendAsync(chatHistory, maxRound, cancellationToken: ct); }要点若receiver本身是GroupChatManager群聊管理器则直接把会话交给其内部的IGroupChat执行否则用发送方和接收方临时构造一个RoundRobinGroupChat轮询群聊即两个 Agent 交替发言再复用GroupChatExtension.SendAsync的异步枚举管道maxRound默认为 10控制对话最多执行的轮数与群聊 API 保持一致。还有一个字符串便捷重载AgentExtension.cs直接传string message内部会把它包装成From agent.Name的TextMessage追加到历史末尾后走同样的管道。2.2 用法示例// agentA 与 agentB 之间的分步对话 var chatHistory new ListIMessage { new TextMessage(Role.User, start chat) }; await foreach (var msg in agentA.SendAsync(agentB, chatHistory, maxRound: 5)) { // 每产生一条新消息就执行一次这里可逐条打印、落库或做终止判断 Console.WriteLine(${msg.From}: {msg.GetContent()}); }如果需要发送并等待全部结束的快捷行为仓库同时提供了InitiateChatAsync快捷 APIAgentExtension.cs它内部消费上述异步枚举并返回完整聊天历史。原来的SendMessageToGroupAsync两个重载已被标记[Obsolete]官方提示统一改用GroupChatExtension.SendAsyncAgentExtension.cs。三、新特性 2AutoGen.DotnetInteractive 支持 Python 代码执行0.1.0 中AutoGen.DotnetInteractive通过dotnet-interactive的 Jupyter 内核连接能力扩展了对 Python 代码执行的支持——此前该包只能运行 C# 代码。从项目文件AutoGen.DotnetInteractive.csproj可以看到实现方式ItemGroup Condition$(TargetFramework) net8.0 PackageReference IncludeMicrosoft.DotNet.Interactive.Jupyter / PackageReference IncludeMicrosoft.DotNet.Interactive.PackageManagement / /ItemGroup从源码结构看Jupyter 相关依赖被条件性地限定在net8.0目标框架下引入另外的dotnet-tools.json与RestoreInteractive.config作为嵌入资源随包分发用于初始化交互式内核环境这意味着 Jupyter 内核连接能力在 net8.0 构建中可用而低版本目标框架则仅保留核心的 .NET 交互式能力。这一点对需要在多目标框架下使用 AutoGen.NET 的开发者是一个明确的适用前提。四、新特性 3Claude 支持提示缓存Prompt Caching0.1.0 为 Claude 客户端加入了提示缓存支持。缓存命中时重复的上下文部分无需重新完整计费对长系统提示、长文档问答等场景的成本影响显著。仓库中的实现分布在三层4.1 客户端层请求头声明缓存特性AnthropicClient在每次请求时都会附加启用提示缓存的 beta 请求头AnthropicClient.cshttpRequestMessage.Headers.Add(anthropic-beta, prompt-caching-2024-07-31);同时在 JSON 序列化选项中注册了JsonPropertyNameEnumConverterCacheControlType转换器保证cache_control字段按 Anthropic API 约定序列化AnthropicClient.cs。4.2 DTO 层CacheControl 类型与便捷工厂方法Content.cs 中TextContent带有CacheControl属性JSON 名cache_control并提供工厂方法TextContent.CreateTextWithCacheControl(text)创建类型标记为CacheControlType.Ephemeral临时缓存的文本块ChatCompletionRequest.cs 中SystemMessage同样支持CacheControl并提供SystemMessage.CreateSystemMessageWithCacheControl(systemMessage)工厂方法工具定义 Tool.cs 也支持缓存标记说明工具 schema 这类长且稳定的前缀内容同样可以纳入缓存。4.3 实战示例带缓存的群聊翻译场景仓库自带完整示例 Anthropic_Agent_With_Prompt_Caching.cs值得注意的两点最小可缓存 token 数有硬性门槛。示例注释L13-L16明确说明对 Claude 3.5 Sonnet 与 Claude 3 Opus上下文需超过 1024 token 才可缓存Claude 3.0 Haiku 需 2048 token。短于门槛的提示即使打了cache_control标记也不会被缓存。因此示例使用了一段很长的故事文本作为可缓存上下文。缓存块的构造与群聊结合var messageEnvelope MessageEnvelope.Create( new ChatMessage(user, [TextContent.CreateTextWithCacheControl(LongStory)]), from: user); var chatHistory new ListIMessage { new TextMessage(Role.User, translate this text for me, from: userProxyAgent.Name), messageEnvelope, }; var groupChat new RoundRobinGroupChat( agents: [userProxyAgent, frenchTranslatorAgent, germanTranslatorAgent]); await groupChat.SendAsync(chatHistory).ToArrayAsync();在这个双翻译 Agent 的轮询群聊中长故事作为缓存块只会被完整计费一次后续 Agent 轮次命中缓存。五、缺陷修复Bug Fixes5.1 #3306IOrchestrator 返回 null 时群聊无法终止问题此前GroupChatExtension.SendAsync在IOrchestrator返回 null 作为下一位发言者时不会结束循环会一直空转到max_round耗尽。修复当前实现GroupChatExtension.cs在每一轮调用groupChat.CallAsync后先比较返回的消息集合与输入历史长度while (maxRound-- 0) { var messages await groupChat.CallAsync(chatHistory, maxRound: 1, cancellationToken); // if no new messages, break the loop if (messages.Count() chatHistory.Count()) { yield break; } ... }即本轮没有产生任何新消息时立即yield break终止——这覆盖了编排器无法选出下一位发言者的情形。此外若最后一条消息包含[GROUPCHAT_TERMINATE]标记同样会提前终止GroupChatExtension.cs。5.2 #3268初始化消息被重复追加问题群聊的 initialized messages 在SendAsync的每次迭代中被重复加入导致历史膨胀、上下文错乱。修复由于CallAsync返回的messages已包含完整聊天历史含初始化消息循环中只需把最后一轮新增的消息追加到历史即可。源码中保留了明确的修复注释GroupChatExtension.cs// messages will contain the complete chat history, include initalize messages // but we only need to add the last message to the chat history // fix #3268 chatHistory chatHistory.Append(lastMessage);5.3 #3273移除 AutoGen.DotnetInteractive 对 Azure.AI.OpenAI 的依赖AutoGen.DotnetInteractive原有一个与自身功能无关的Azure.AI.OpenAI依赖。当前项目文件AutoGen.DotnetInteractive.csproj中已不存在该引用包仅保留Microsoft.DotNet.Interactive及前述条件引入的 Jupyter/包管理组件依赖面更简洁也降低了版本冲突的概率。六、文档更新Python AutoGen 与 AutoGen.NET 功能对比页0.1.0 还新增了一篇跨语言功能对比文档function-comparison-page-between-python-AutoGen-and-autogen.net.md从三个维度对比两个实现Agent 模式单 Agent 聊天、双 Agent 聊天、群聊.NET 侧用 workflow 实现 FSM 群聊、用中间件模式实现嵌套聊天、工具调用在两侧均支持代码解释器方面Python 侧可在 local/docker/notebook 执行器中运行 Python.NET 侧运行 C# 代码结合 0.1.0 的 Jupyter 内核连接能力后.NET 侧也具备了执行 Python 的路径Sequential chat 目前 Python 侧支持、.NET 侧需在代码中手动创建任务。LLM 平台支持OpenAI含第三方端点、Mistral、Ollama、Claude、Gemini含 Vertex在两侧均支持文档还注明 AutoGen.NET 可通过AutoGen.SemanticKernel桥接 Semantic Kernel 支持的全部平台。社区贡献 AgentRAG Agent、Web surfer 等目前仅 Python 侧提供。这张对比表对从 Python AutoGen 迁移到 AutoGen.NET 的开发者有直接的选型参考价值。七、升级要点小结结合以上源码与发布说明使用 0.1.0 时值得记住的要点变更项影响面验证位置新增AutoGen.AzureAIInference包新增包接入 Azure AI Inference 平台ChatCompletionsClientAgent.cs双 AgentSendAsync返回IAsyncEnumerableIMessage可逐条消费对话消息maxRound默认 10AgentExtension.csDotnetInteractive 支持 PythonJupyter 内核依赖仅在 net8.0 目标下引入AutoGen.DotnetInteractive.csprojClaude 提示缓存需满足最小可缓存 token 门槛通过cache_control标记AnthropicClient.cs、示例群聊空转/重复消息修复群聊终止与历史管理行为修正GroupChatExtension.cs以上条目均以当前仓库代码为事实依据涉及具体 API 行为时建议以对应源码文件的最新内容为准。【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
