
AutoGen.NET 接入 Google GeminiAutoGen.Gemini 的 GeminiChatAgent 与消息连接器中间件实战【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogenAutoGen.Gemini 是 AutoGen.NETautogen 的 .NET 实现提供的 Google Gemini 集成包它通过GeminiChatAgent让 .NET 应用无缝接入 Google AI Gemini 或 Vertex AI Gemini支持文本聊天、多模态聊天与函数调用function call并借助GeminiMessageConnector中间件完成 Gemini 原生消息与 AutoGen 内置消息类型之间的双向转换。读完本文你将掌握三种 Agent 构造方式、各构造参数的含义与取值、Gemini 多轮对话规则在底层是如何被满足的、函数调用链路的源码实现以及可直接复制运行的官方示例。包概览AutoGen.Gemini 提供什么根据 AutoGen.Gemini 概览文档该包对外提供两类核心组件GeminiChatAgent连接 Google Gemini 或 Vertex AI Gemini 的聊天 Agent支持聊天chat、多模态聊天multi-modal chat和函数调用function call。从源码看它实现了IStreamingAgent接口见 GeminiChatAgent.cs因此同时具备GenerateReplyAsync一次性回复与GenerateStreamingReplyAsync流式回复两种能力。GeminiMessageConnector一个流式中间件IStreamingMiddleware负责把 Gemini 返回的GenerateContentResponse转换成 AutoGen 内置消息类型并把 AutoGen 侧的TextMessage、ImageMessage、ToolCallMessage等消息转换成 Gemini 的Content/Part结构见 GeminiMessageConnector.cs。围绕这两个组件包内还包含IGeminiClient.cs客户端抽象接口定义GenerateContentAsync同步请求与GenerateContentStreamAsync流式请求两个方法GoogleGeminiClient.cs基于 REST API 的 Google Gemini 客户端端点为https://generativelanguage.googleapis.com/v1beta分别调用models/{model}:generateContent与models/{model}:streamGenerateContentSSE两个接口见 GoogleGeminiClient.cs#L17-L20VertexGeminiClient.cs基于 Google.Cloud.AIPlatform.V1 SDK 的 Vertex AI 客户端构造时传入location参数FunctionContractExtension.cs把 AutoGen 的FunctionContract转换为 Gemini 的FunctionDeclaration。安装方式见 Chat-with-google-gemini.mddotnet add package AutoGen.GeminiGeminiChatAgent 的三种构造方式GeminiChatAgent提供三个构造函数分别对应三种接入场景全部定义在 GeminiChatAgent.cs#L38-L134构造方式典型参数适用场景IGeminiClient client, name, model, ...传入任意实现了IGeminiClient的客户端自定义/测试客户端model 需为完整资源路径name, model, apiKey, ...Google Gemini API Key通过 Google AI API 快速原型验证name, model, project, location, provider, ...GCP 项目 ID 与区域Vertex AI 生产化部署1. 通过 API Key 连接 Google Geminivar geminiAgent new GeminiChatAgent( name: gemini, model: gemini-1.5-flash-001, apiKey: apiKey, systemMessage: You are a helpful C# engineer, put your code between csharp and ) .RegisterMessageConnector() .RegisterPrintMessage();该构造函数内部自动创建GoogleGeminiClient(apiKey)见 GeminiChatAgent.cs#L74-L93。注意此重载的systemMessage默认值为You are a helpful AI assistant其余重载默认为null。2. 通过 Project/Location 连接 Vertex AIvar geminiAgent new GeminiChatAgent( name: gemini, model: gemini-1.5-flash-001, location: us-central1, project: projectID, systemMessage: You are a helpful AI assistant);从源码看该重载会自动拼装 Gemini 要求的完整模型资源名projects/{project}/locations/{location}/publishers/{provider}/models/{model}其中provider默认值为google并创建VertexGeminiClient(location)见 GeminiChatAgent.cs#L113-L134。3. 构造参数全解三个重载共享一组可选参数含义如下依据构造函数 XML 文档注释与BuildChatRequest的实现参数类型默认值说明namestring必填Agent 名称也用于消息From字段与角色映射判断modelstring必填模型 ID如gemini-1.5-flash-001自定义客户端时若连 Vertex 需为完整资源路径systemMessagestring?各重载不同系统指令会被转换为 Gemini 的system_instructiontoolConfigToolConfig?null函数调用配置如FunctionCallingConfig.Mode AutotoolsTool[]?null预置的 GeminiTool列表safetySettingsRepeatedFieldSafetySetting?nullGemini 安全策略设置原样附加到请求responseMimeTypestringtext/plain响应 MIME 类型可选application/json/text/plain用于 JSON Mode这些参数如何影响最终请求可以在下一节的请求构建逻辑中逐一看到。请求构建Gemini 多轮对话规则是如何被满足的GeminiChatAgent.GenerateReplyAsync/GenerateStreamingReplyAsync都会先调用私有方法BuildChatRequestGeminiChatAgent.cs#L157-L267把 AutoGen 消息列表翻译成GenerateContentRequest其中包含若干 Gemini 特有的强制规则处理1. 首尾消息角色校验。Gemini 多轮对话要求第一条消息必须来自user或function最后一条消息也必须来自user或function。源码在构建请求时显式校验这两条规则不满足则抛出ArgumentException见 GeminiChatAgent.cs#L165-L180。2. 连续同角色消息合并。Gemini 要求(user|model)角色交替出现。源码用Aggregate把连续相同角色的消息合并为一条Content将其Parts依次追加见 GeminiChatAgent.cs#L182-L195从而保证交替约束。3. 系统指令独立通道。构造时的systemMessage不会被塞进对话历史而是转换为角色为system_instruction的独立Content赋给请求的SystemInstruction字段见 GeminiChatAgent.cs#L197-L205。4. 生成配置的组装。GenerationConfig固定CandidateCount 1并写入ResponseMimeType运行时选项GenerateReplyOptions中的StopSequence、MaxToken映射到MaxOutputTokens、Temperature在传值时才会写入对应字段见 GeminiChatAgent.cs#L209-L240。5. 函数声明与工具合并。运行时options.Functions中的每个FunctionContract会通过ToFunctionDeclaration()扩展方法FunctionContractExtension.cs转成FunctionDeclaration与构造函数传入的tools合并后统一聚合到单个Tool中——源码注释说明这是因为 Gemini 当前不支持一次请求传多个Tool对象见 GeminiChatAgent.cs#L242-L264。ToFunctionDeclaration的转换细节提取FunctionContract中IsRequired的参数名列表作为 OpenAPI Schema 的Required并用JsonSchemaBuilder().FromType(type)把 .NET 参数类型映射为OpenAPISchemaTypeObject/Array/Boolean/Integer/Number/String非必需参数标记Nullable true见 FunctionContractExtension.cs#L20-L89。GeminiMessageConnector 中间件消息类型双向转换GeminiChatAgent本身只收发 Gemini 原生类型真正让 Agent 能使用 AutoGen 内置消息TextMessage、ToolCallMessage、ImageMessage等的是GeminiMessageConnector。入向转换AutoGen → Gemini。ProcessMessage方法按消息类型分派TextMessage若角色为System非严格模式下被降级为user角色严格模式直接抛异常因为 Gemini 只有user/model两种角色否则按ShouldParseAsUser判定映射为user或model见 GeminiMessageConnector.cs#L379-L422ImageMessage/MultiModalMessage生成InlineData内嵌字节或FileDataURL MIME形式的Part图片消息不允许出现在model角色见 GeminiMessageConnector.cs#L28-L38 的strictMode说明与 L424-L472 的实现ToolCallMessage转换为角色model、FunctionCall类型的PartToolCallResultMessage转换为角色function、FunctionResponse类型的Part结果若不是合法 JSON 会自动包装为{result: ...}对象见 GeminiMessageConnector.cs#L269-L310。角色判定规则。ShouldParseAsUser的核心逻辑是消息From不等于当前 AgentName时视为 user 侧等于时视为 model 侧见 GeminiMessageConnector.cs#L474-L482。出向转换Gemini → AutoGen。响应处理分同步与流式两条路径同步GenerateContentResponse中若只有单个文本Part产出TextMessage含FunctionCallPart时产出ToolCallMessage见 GeminiMessageConnector.cs#L165-L199流式逐段产出TextMessageUpdate/ToolCallMessage增量同时把更新累积到 bucket流结束时再聚合为一条完整TextMessage或ToolCallMessage下发空文本且FinishReason.Stop的尾部消息会被丢弃见 GeminiMessageConnector.cs#L42-L112。strictMode 参数。构造函数GeminiMessageConnector(bool strictMode false)默认宽松模式遇到不支持的消息类型时原样透传设为true后遇到不支持类型立即抛出InvalidOperationException适合需要尽早暴露集成问题的场景。函数调用实战FunctionCallMiddleware 驱动的两轮对话官方示例 Function_Call_With_Gemini.cs 展示了完整的函数调用链路核心步骤var movieFunction new MovieFunction(); var functionMiddleware new FunctionCallMiddleware( functions: [ movieFunction.FindMoviesFunctionContract, movieFunction.FindTheatersFunctionContract, movieFunction.GetShowtimesFunctionContract ], functionMap: new Dictionarystring, Funcstring, Taskstring { { movieFunction.FindMoviesFunctionContract.Name!, movieFunction.FindMoviesWrapper }, { movieFunction.FindTheatersFunctionContract.Name!, movieFunction.FindTheatersWrapper }, { movieFunction.GetShowtimesFunctionContract.Name!, movieFunction.GetShowtimesWrapper }, }); var geminiAgent new GeminiChatAgent( name: gemini, model: gemini-1.5-flash-001, location: us-central1, project: projectID, systemMessage: You are a helpful AI assistant, toolConfig: new ToolConfig() { FunctionCallingConfig new FunctionCallingConfig() { Mode FunctionCallingConfig.Types.Mode.Auto, } }) .RegisterMessageConnector() .RegisterPrintMessage() .RegisterStreamingMiddleware(functionMiddleware);要点MovieFunction是partial class方法上标注[Function]特性后由 AutoGen 源生成器AutoGen.SourceGenerator生成FindMoviesFunctionContract与FindMoviesWrapper等成员无需手写契约ToolConfig.FunctionCallingConfig.Mode Auto让模型自行决定是否调用函数第一轮SendAsync得到的回复类型为ToolCallAggregateMessage工具调用 执行结果的聚合消息把[question, functionCallReply]作为历史再调用一次SendAsync模型基于FunctionResponse生成最终的TextMessage。FunctionCallMiddleware在执行本地函数后其结果会经GeminiMessageConnector.ProcessToolCallResultMessage包装为 Gemini 的function角色内容完成闭环。完整示例与 Google Gemini 聊天最简聊天示例位于 Chat_With_Google_Gemini.cs运行前需设置GOOGLE_GEMINI_API_KEY环境变量using AutoGen.Core; public class Chat_With_Google_Gemini { public static async Task RunAsync() { var apiKey Environment.GetEnvironmentVariable(GOOGLE_GEMINI_API_KEY); if (apiKey is null) { Console.WriteLine(Please set GOOGLE_GEMINI_API_KEY environment variable.); return; } var geminiAgent new GeminiChatAgent( name: gemini, model: gemini-1.5-flash-001, apiKey: apiKey, systemMessage: You are a helpful C# engineer, put your code between csharp and , dont explain the code) .RegisterMessageConnector() .RegisterPrintMessage(); var reply await geminiAgent.SendAsync(Can you write a piece of C# code to calculate 100th of fibonacci?); reply.Should().BeOfTypeTextMessage(); } }同一示例目录下还有Chat_With_Vertex_Gemini.csVertex AI 版本的对话示例需GCP_VERTEX_PROJECT_ID等环境配置Image_Chat_With_Vertex_Gemini.cs多模态图片聊天示例Function_Call_With_Gemini.cs上文详述的函数调用示例。对应的分步教程文档见 Chat-with-google-gemini.md、Chat-with-vertex-gemini.md、Function-call-with-gemini.md 与 Image-chat-with-gemini.md。需要说明概览文档中的示例链接指向旧目录dotnet/samples/AutoGen.Gemini.Sample在当前仓库中该示例工程已位于dotnet/samples/AgentChat/之下。测试用例与验证方式测试工程位于 dotnet/test/AutoGen.Gemini.Tests可用来验证各组件行为GeminiAgentTests.csGeminiChatAgent行为测试GeminiMessageTests.cs消息转换含严格模式、多模态等场景GoogleGeminiClientTests.cs / VertexGeminiClientTests.cs两个客户端的 HTTP/SSE 请求行为FunctionContractExtensionTests.csFunctionContract到FunctionDeclaration的 schema 转换断言。适用边界与注意事项接入前提Google Gemini 路径需要 Google Gemini API KeyVertex 路径需要 GCP 项目对 Vertex AI API 的访问权限且model参数在该场景下由构造函数自动拼成projects/.../locations/.../publishers/.../models/...完整路径消息类型限制从GeminiMessageConnector源码看响应内容只支持文本与工具调用两类其他候选内容会抛出InvalidOperationExceptionSystem角色没有原生映射非严格模式下会被降级为user多 Tool 限制多个函数声明会被合并进单个Tool这是当前 Gemini API 的限制而非本包缺陷源码注释见 GeminiChatAgent.cs#L253-L255JSON Mode如需结构化输出通过构造函数responseMimeType: application/json启用该值固定写入每次请求的GenerationConfig.ResponseMimeType。整体来看AutoGen.Gemini 的设计模式与仓库中其他 LLM 集成包如 AutoGen.OpenAI、AutoGen.Anthropic一致一个实现IStreamingAgent的 Agent 类 一个消息连接器中间件 对 AutoGen 消息/函数契约体系的复用区别在于对 Gemini 多轮对话规则角色交替、system_instruction、单 Tool 聚合的专门处理这些规则都集中在BuildChatRequest与GeminiMessageConnector两处实现中便于按需阅读与扩展。【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考