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

dotnet Microsoft Agent Framework 配置调用工具后退出对话

本文采用的 Microsoft Agent Framework 为 1.0.0-rc4 版本

现在很多时候都采用模型编排的方式,支持 Agent As Tool 的模式,即将模型当成工具给到另一个模型使用的方式

此时的上级模型可能只是一个调度分发的功能,工具执行的结果不期望返回给到上级模型,希望调用完工具就自动退出对话

在 Microsoft Agent Framework 的函数工具调用是通过 Microsoft.Extensions.AI 的 FunctionInvokingChatClient 提供的

可以通过 UseFunctionInvocation 扩展方法进行配置,配置时可设置 FunctionInvokingChatClient 的 FunctionInvoker 委托属性。通过此 FunctionInvoker 委托属性,可以在每次函数工具被调用的时候触发。在此委托里的 FunctionInvocationContext 参数里面,通过设置 Terminate 属性,即可控制是否在调用完成工具之后立刻退出对话

示例内容如下:

OpenAI.Chat.ChatClient chatClient = ...;var agent = chatClient.AsIChatClient().AsBuilder()// 在 ChatClientExtensions.cs 的 WithDefaultAgentMiddleware 会判断是否有 FunctionInvokingChatClient 从而来决定是否注册//.Use((innerClient, services) =>//{//    var functionInvokingChatClient = innerClient.GetService<FunctionInvokingChatClient>();//    var invokingChatClient = services.GetService<FunctionInvokingChatClient>();//    return innerClient;//}).UseFunctionInvocation(configure: functionInvokingChatClient =>{functionInvokingChatClient.FunctionInvoker = (context, token) =>{// 写入属性,即可在调用函数之后退出context.Terminate = true;return context.Function.InvokeAsync(context.Arguments, token);};}).BuildAIAgent(options: new ChatClientAgentOptions(){ChatOptions = new ChatOptions(){Tools =[AIFunctionFactory.Create(GetWeather)]}});[Description("Get the weather for a given location.")]
static string GetWeather([Description("The location to get the weather for.")] string location,[Description("查询天气的日期")] string date)
{Console.WriteLine($"调用函数");return $"查询不到 {location} 城市信息";
}

此时的代码里面,无论调用的函数是什么,都会设置 Terminate 属性,这就意味着一旦模型尝试调用工具,则会在工具完成之后立刻退出对话

await foreach (var reasoningAgentResponseUpdate in agent.RunReasoningStreamingAsync(new ChatMessage(ChatRole.User,"今天北京的天气咋样.")))
{if (reasoningAgentResponseUpdate.IsFirstThinking){Console.WriteLine($"思考:");}if (reasoningAgentResponseUpdate.IsThinkingEnd && reasoningAgentResponseUpdate.IsFirstOutputContent){Console.WriteLine();Console.WriteLine("----------");}Console.Write(reasoningAgentResponseUpdate.Reasoning);Console.Write(reasoningAgentResponseUpdate.Text);
}Console.WriteLine($"结束");Console.WriteLine();Console.Read();

尝试运行代码,可以看到模型在对话过程中,尝试调用 GetWeather 方法。方法执行完成之后,对话也就结束了

如此可见工具的结果不会返回到模型里,如此也就可以很方便地被设计为让模型只负责工具的调用分发,而不让模型对工具返回结果感兴趣

本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 743fb8a7885af20c265dbd323dd703c912e41774

以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 743fb8a7885af20c265dbd323dd703c912e41774

获取代码之后,进入 SemanticKernelSamples/BejalljeawakihereKearyojileelai 文件夹,即可获取到源代码

更多技术博客,请参阅 博客导航

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

相关文章:

  • SAP FI模块实战:会计年度变式配置详解(OB29事务码T009表解析)
  • LVGL:深入解析日历部件 lv_calendar 的定制化与交互实践
  • 从编译到调试:深入mimikatz核心模块的实战源码剖析
  • 百度网盘解析工具终极使用指南:告别限速困扰,实现高速下载
  • 自动化测试新思路:OpenClaw+GLM-4.7-Flash生成测试用例
  • SpringBoot实战:手把手教你处理海康/大华摄像头的GB28181注册信令(附完整代码)
  • 百度网盘提取码智能获取:基于正则匹配与网络请求的自动化解决方案
  • 乐高Studio与Solidworks联动指南:如何让你的3D设计变成可拼装的积木模型
  • Element UI 的 el-cascader 三级联动数据回显实战:从配置到避坑指南
  • directTimers:AVR微控制器硬件定时器直控库
  • 新手必看:用快马AI生成HTML链接代码示例,轻松掌握网页跳转
  • OpenClaw技能市场挖掘:nanobot镜像十大实用技能推荐
  • ArduinoThread:资源受限MCU上的协作式多任务调度
  • MacBook上跑Milvus向量数据库,8GB内存够用吗?我的踩坑与优化实录
  • Mind+连接百度AI实战:手把手教你做一个能听会说的垃圾分类小助手
  • 期货量化实战指南:CTP API版本选择、SimNow仿真与生产环境部署全解析
  • 资源占用实测:nanobot让OpenClaw在低配电脑流畅运行
  • ollama部署QwQ-32B效果实测:超越o1-mini的中文推理表现
  • 新手必看:阿里云服务器搭建全流程指南
  • Phi-3-mini-128k-instruct辅助3D设计:根据描述生成SolidWorks宏命令思路
  • vLLM-v0.17.1开发者案例:VS Code插件集成vLLM实现本地代码补全
  • 科哥定制FunASR镜像:一键开启中文语音识别,支持实时录音和文件上传
  • ai辅助开发新思路:让快马kimi模型将ps“液化”滤镜创意变成网页动画
  • 毕设园区网络设计实战:从拓扑规划到安全策略落地
  • IPC-TM-650 2023版测试方法深度解析:从标准解读到实践应用
  • PyTorch 2.7镜像体验报告:开箱即用的AI开发环境实测
  • 告别代码异味!在PyCharm 2024.1中配置pylint的保姆级教程(含常见错误排查)
  • CentOS 7/8 实战:从零搭建高可用STT语音识别工具链
  • OpenClaw性能测试:Qwen3-32B在RTX4090D上的极限并发数
  • Cesium 视角控制全攻略:禁用鼠标交互的多种方法