
AutoGen.Net v0.2.1 实战用 OpenAIChatAgent 接入 OpenAI o1-preview 及其参数约定【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogenAutoGen.Net v0.2.1 版本唯一的 New Feature 就是支持 OpenAI 的 o1-preview 模型。本篇以发布说明指定的官方示例Connect_To_OpenAI_o1_preview为主线完整走读接入 o1-preview 时哪些参数必须显式置空、为什么必须禁用流式输出并结合仓库中AutoGen.OpenAI/AutoGen.OpenAI.V1两个包的源码解释这些参数在请求链路中的实际去向。读完本文你可以按仓库中的现成示例在 .NET 项目中正确构造并调用一个面向 o1-preview 的OpenAIChatAgent。v0.2.1 发布了什么o1-preview 支持发布说明见 0.2.1.md全文只包含两项内容New Feature支持 OpenAI o1-preview 模型对应项目 issue #3522Example配套的官方示例Connect_To_OpenAI_o1_preview。理解这个 feature 需要一点版本背景。根据 0.2.0.mdAutoGen.OpenAI包在 v0.2.0 已经切换到 Azure.AI.OpenAI v2 SDK旧的GPTAgent被弃用统一由OpenAIChatAgent接替且构造方式从“传入模型名字符串”改为“传入ChatClient”var openAIClient new OpenAIClient(apiKey); var openAIClientAgent new OpenAIChatAgent( chatClient: openAIClient.GetChatClient(gpt-4o-mini), // Other parameters... );v0.2.1 的 o1-preview 支持沿用的正是这种chatClient模式。因此本文的重点不在“怎么连 OpenAI”而在o1-preview 与普通 GPT 模型在能力边界上的差异如何映射到OpenAIChatAgent的构造参数上。示例走读Connect_To_OpenAI_o1_preview示例位置与依赖发布说明中指向的示例在本仓库中的实际路径是 Connect_To_OpenAI_o1_preview.cs。其所在示例工程 AutoGen.OpenAI.Sample.csproj 的关键依赖为源码工程引用AutoGen.OpenAI基于 OpenAI v2 SDK 的包装层包引用Azure.AI.OpenAI以 Analyzer 方式引用AutoGen.SourceGenerator用于函数调用的类型安全绑定本示例未用到。运行前置条件是设置环境变量OPENAI_API_KEY示例在读取为空时会直接抛出InvalidOperationException。完整示例代码// Copyright (c) Microsoft Corporation. All rights reserved. // Connect_To_OpenAI_o1_preview.cs using AutoGen.Core; using OpenAI; namespace AutoGen.OpenAI.Sample; public class Connect_To_OpenAI_o1_preview { public static async Task RunAsync() { #region create_agent var apiKey Environment.GetEnvironmentVariable(OPENAI_API_KEY) ?? throw new InvalidOperationException(Please set environment variable OPENAI_API_KEY); var openAIClient new OpenAIClient(apiKey); // until 2024/09/12 // openai o1-preview doesnt support systemMessage, temperature, maxTokens, streaming output // so in order to use OpenAIChatAgent with o1-preview, you need to set those parameters to null var agent new OpenAIChatAgent( chatClient: openAIClient.GetChatClient(o1-preview), name: assistant, systemMessage: null, temperature: null, maxTokens: null, seed: 0) // by using RegisterMiddleware instead of RegisterStreamingMiddleware // it turns an IStreamingAgent into an IAgent and disables streaming .RegisterMiddleware(new OpenAIChatRequestMessageConnector()) .RegisterPrintMessage(); #endregion create_agent #region send_message await agent.SendAsync(Can you write a piece of C# code to calculate 100th of fibonacci?); #endregion send_message } }代码分两段create_agent区域负责按 o1-preview 的能力约束构造 agent 并注册中间件链send_message区域用一次SendAsync完成非流式对话。模型能力边界哪些参数必须置 null示例中的注释“until 2024/09/12”明确记录了当时的能力边界o1-preview 不支持 system message、temperature、maxTokens 和流式输出。因此接入它时必须显式把这些参数关掉参数示例取值说明chatClientopenAIClient.GetChatClient(o1-preview)v0.2.0 起推荐的模型绑定方式模型名在ChatClient层指定systemMessagenull不发送系统提示词temperaturenull不发送采样温度maxTokensnull不发送最大生成 token 数seed0示例中显式传入流式输出通过RegisterMiddleware禁用不注册流式中间件agent 退化为普通IAgent“为什么必须显式置 null”可以从旧版包装层的源码得到解释。AutoGen.OpenAI.V1/Agent/OpenAIChatAgent.cs 的构造函数带有非空默认值systemMessage默认You are a helpful AI assistant、temperature默认0.7f、maxTokens默认1024。如果不做任何处理这些默认值会随请求发出——对普通 GPT 模型这没问题但对 o1-preview 则会命中其不支持的参数。其中 system message 最值得注意V1 包装层在组装请求时只要消息历史里没有 system 消息就会自动补一条默认系统消息OpenAIChatAgent.cs// add system message if theres no system message in messages if (!oaiMessages.Any(m m is ChatRequestSystemMessage)) { oaiMessages new[] { new ChatRequestSystemMessage(systemMessage) }.Concat(oaiMessages); }也就是说即便你从不主动提供系统提示词包装层的默认逻辑仍会向请求注入一条。这正是示例必须写systemMessage: null的原因——把“默认系统提示”的注入源在构造期就掐断。从源码结构看v2 版本的OpenAIChatAgent见后文同样要求显式传null说明默认系统提示这一约定在两个包装层中是延续的。禁用流式RegisterMiddleware 与 RegisterStreamingMiddleware 的差别示例注释解释了第二个关键动作by usingRegisterMiddlewareinstead ofRegisterStreamingMiddleware, it turns anIStreamingAgentinto anIAgentand disables streaming.背景是OpenAIChatAgent本身实现了IStreamingAgent接口。以 V1 包装层为例OpenAIChatAgent.cs 声明为public class OpenAIChatAgent : IStreamingAgent并实现了GenerateStreamingReplyAsync逐帧产出StreamingChatCompletionsUpdate消息L106-L122。v2 版本同样提供流式入口CompleteChatStreamingAsyncAutoGen.OpenAI/Agent/OpenAIChatAgent.cs。对 o1-preview 而言流式端点不可用因此示例只注册非流式中间件.RegisterMiddleware(new OpenAIChatRequestMessageConnector()) .RegisterPrintMessage();OpenAIChatRequestMessageConnector是消息连接器中间件负责把 AutoGen 的消息信封转换/校验为 OpenAI 的ChatRequestMessage系列v2 与 v1 包中各有一份实现AutoGen.OpenAI/Middleware/OpenAIChatRequestMessageConnector.cs、AutoGen.OpenAI.V1/Middleware/OpenAIChatRequestMessageConnector.cs注册方式RegisterMiddleware还是RegisterStreamingMiddleware决定了最终 agent 暴露的是IAgent还是IStreamingAgent面。走非流式路径后调用方只需SendAsync拿整条回复不会触达流式端点。这两类RegisterXxx扩展方法都定义在AutoGen.Core的扩展层AutoGen.Core/Extension/MiddlewareExtension.cs是 AutoGen.Net 中间件模型的标准入口。底层参数链路置 null 之后发生了什么结合两个包装层的实现可以看清 o1-preview 场景下参数的完整去向v2 路径本示例所用OpenAIChatAgent.GenerateReplyAsync直接把组装好的历史与ChatCompletionsSettings交给ChatClient.CompleteChatAsyncAutoGen.OpenAI/Agent/OpenAIChatAgent.cs。构造期传入的systemMessage、temperature、maxTokens为null最终请求设置中就不会携带这些字段流式入口CompleteChatStreamingAsync因未注册流式中间件而不可达。v1 路径对比参考GenerateReplyAsync调用openAIClient.GetChatCompletionsAsyncAutoGen.OpenAI.V1/Agent/OpenAIChatAgent.cs。其CreateChatCompletionsOptions通过 JSON 序列化/反序列化克隆默认 options再逐条追加消息并允许GenerateReplyOptions在单次调用时覆盖Temperature/MaxTokenL147-L148。这条链路说明只要默认 options 中的这些字段没有被置空它们就会一路带进最终请求。归纳起来示例的做法与 o1-preview 的能力边界是一一对应的请求里不出现 system message、temperature、maxTokens且只走非流式端点——这两点都通过构造参数置空 非流式中间件注册在客户端侧完成不依赖任何对 o1-preview 的特殊 API 适配。适用前提与延伸阅读本文结论以当前仓库代码状态AutoGen.Net v0.2.1 发布线为准示例注释把能力边界标注为 “until 2024/09/12”意味着这些限制是当时点的时间快照。若你使用的 OpenAI 服务端能力已有变化请以 OpenAI 当时的模型文档复核但**“显式置空不支持参数 非流式注册”的配置方式**仍然是在本仓库中面向 o1-preview 使用OpenAIChatAgent的参考做法。同目录下还有可对照的 OpenAI 相关示例Use_Json_Mode.cs、Structural_Output.cs、Connect_To_Azure_OpenAI.cs、Tool_Call_With_Ollama_And_LiteLLM.cs均位于 dotnet/samples/AgentChat/AutoGen.OpenAI.Sample/。若你仍在使用AutoGen.OpenAI.V1基于 Azure.AI.OpenAI v1v0.2.0 的迁移指南0.2.0.md给出了GPTAgent→OpenAIChatAgent与OpenAIClient构造方式的对照o1-preview 的接入在 v1 包中同样需要处理默认 system message 注入问题因为该逻辑在 AutoGen.OpenAI.V1/Agent/OpenAIChatAgent.cs 中依然存在。【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考