探索Semantic Kernel内置插件:深入了解HttpPlugin的应用
前言
上一章我们熟悉了Semantic Kernel
中的内置插件和对ConversationSummaryPlugin
插件进行了实战,本章我们讲解一下另一个常用的内置插件HttpPlugin
的应用。
上一章对
ConversationSummaryPlugin
总结进行了调整之后,顺便给Semantic Kernel
提了一个PR
已经被采纳了,在此记录一下!
.Net: refactor : SummarizeConversation #6719
HttpPlugin
HttpPlugin
插件属于Native Plugins
原生插件。它提供了Http
的功能,允许用户通过Http
协议与外部进行交互。
我们对这个插件的整体进行分析一下
构造函数
提供了两个构造函数。第一个构造函数没有参数,它调用了第二个构造函数,并传递null
作为参数。
第二个构造函数接受一个HttpClient
类型的参数,如果未提供,则使用HttpClientProvider.GetHttpClient()
方法获取一个新的HttpClient
实例。
public HttpPlugin() : this(null)
{
}
[ActivatorUtilitiesConstructor]
public HttpPlugin(HttpClient? client = null) =>
this._client = client ?? HttpClientProvider.GetHttpClient();
这里重点说一下第二个构造函数,支持
HttpClient
的构造函数,这就有更多的可玩性了,比如可以定义一个HttpclientHandler
对请求进行添加自定义的HttpHeader
或者进行参数的拼接转发等操作。
Native functions
GetAsync
:发送一个HTTP GET
请求,并返回响应体作为字符串。
PostAsync
:发送一个HTTP POST
请求,带有请求体,并返回响应体作为字符串。
PutAsync
:发送一个HTTP PUT
请求,带有请求体,并返回响应体作为字符串。
DeleteAsync
:发送一个HTTP DELETE
请求,并返回响应体作为字符串。
实战
第一步需要安装Nuget
包
NuGet\Install-Package Microsoft.SemanticKernel.Plugins.Core -Version 1.14.1-alpha
该包目前只有预览版本,如果用VS的包管理器安装,那需要勾选
包括预览发行版
Semantic Kernel
注册插件有两种方式:
kernel.ImportPluginFromType<HttpPlugin>();
var httpclient = new HttpClient();
kernel.ImportPluginFromObject(new HttpPlugin(httpclient));
以上两种方式对应两种生命周期的注册
创建的接口
这个接口都很简单 对我们Student
对象的增删改查
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
执行测试
我们的测试程序还是以Semantic Kernel
的会话服务,自动触发function calling
的形式
// Get chat completion service
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// Start the conversation
Console.Write("User > ");
string? userInput;
while ((userInput = Console.ReadLine()) is not null)
{
// Add user input
history.AddUserMessage(userInput);
// Enable auto function calling
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAIPromptExecutionSettings,
kernel: kernel);
// Print the results
Console.WriteLine("Assistant > " + result);
// Add the message from the agent to the chat history
history.AddMessage(result.Role, result.Content ?? string.Empty);
// Get user input again
Console.Write("User > ");
}
Get请求测试
User > 帮我向https://localhost:7014/Student发一个get请求
Assistant > 向https://localhost:7014/Student发起GET请求后成功得到了响应,返回的数据显示包含了一个学生的信息。该学生名为 张三,年龄为16岁。这表明请求执行成功,获取到了预期的数据。
Post请求测试
HttpPlugin
的这个功能比较鸡肋,可以看一下代码
[KernelFunction]
[Description("Makes a POST request to a uri")]
public Task<string> PostAsync([Description("The URI of the request")] string uri, [Description("The body of the request")] string body, CancellationToken cancellationToken = default(CancellationToken))
{
return SendRequestAsync(uri, HttpMethod.Post, new StringContent(body), cancellationToken);
}
参数形式是new StringContent(body)
,也就是说MediaTypeHeaderValue
媒体类型默认为 StringContent text/plain
。
Asp.Net Core
只能接收Post
请求json
格式的string
,不能接收原始string
即 content-type
为text/plain
的post
请求,如果支持需要自定义实现没有提供对应的MediaTypeFormatter
。
所以说这个插件的
Post
请求场景局限,真正用到生产还需要自己去实现一个插件!!!
User > 向https://localhost:7014/student 发一个post请求
Assistant > 已成功向 https://localhost:7014/student 发送了 POST 请求。如果需要发送具体的数据,请提供要包含在请求体内的 JSON 数据。
其他
Put
和Delete
类似。
最后
可以借鉴HttpPlugin
的实现思路在项目中灵活的运行,如果不支持那就可以自定义插件来完成需求的开发,还是比较期待这个插件能够更加完善的一点,在未来以更灵活的方式支持Post等请求的多种形式。
探索Semantic Kernel内置插件:深入了解HttpPlugin的应用的更多相关文章
- maven(19)-生命周期和内置插件
生命周期和依赖一样,是maven中最重要的核心概念.平时在使用maven时并不一定需要知道生命周期,但是只有明白了生命周期,才能真正理解很多重要的命令和插件配置. default生命周期 defaul ...
- Eclipse使用Maven内置插件不需要安装Maven
首先修改eclipse项目中maven的路径,默认在C盘,修改路径例如 在d盘创建文件夹-D:- |---m2 |--repository |--setting.xml 没有文件夹和文件要自己新建,如 ...
- Apache使用内置插件mod_php解析php的配置
apache安装完毕之后,修改httpd.conf配置文件,添加代码如下: LoadModule php5_module modules/libphp5.so <FilesMatch \.php ...
- Maven-06: 插件的内置绑定
Maven的生命周期与插件相互绑定,用以完成实际的构建任务.具体而言,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务.例如项目编译这一任务,它对应default生命周期的compile ...
- Eclipse spket插件 内置js文件
这一篇将怎么在spket内置js文件,而不用用户自己去添加. 1. 在开发的Eclipse的 运行配置将下面几个插件勾选上. 2. 在org.eclipse.ui.startup拓展里执 ...
- vue_简介_渐进式 js 框架_内置指令_自定义指令_自定义插件
vue 尤雨溪 华裔 Google 工程师 遵循 MVVM 模式 编码简洁,体积小,运行效率高,适合 移动 / PC 端 开发 动态构建用户界面: 异步获取后台数据,展现到页面 渐进式 js 框架 渐 ...
- 【转】实习小记-python 内置函数__eq__函数引发的探索
[转]实习小记-python 内置函数__eq__函数引发的探索 乱写__eq__会发生啥?请看代码.. >>> class A: ... def __eq__(self, othe ...
- {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...
- Unity即将内置骨骼动画插件Anima2D
Unity一直在寻找新的方法来帮助开发者,并为他们提供最好的工具.在此我们向大家宣布,Unity将内置流行的骨骼动画插件Anima2D,从2017年1月开始免费供所有Unity开发者使用! 同时也欢迎 ...
- 使用 VS2012 开发 IDA GUI 插件 WIN32 SDK 和 内置函数 AskUsingForm_c
1. 执行菜单的File->New->Project… (Ctrl-Shift-N)打开新建工程窗口. 2. 展开左侧的Visual C++项目模板分支,然后选择右侧的Win32 Proj ...
随机推荐
- 2019-11-29-VisualStudio-2019-如何离线下载
title author date CreateTime categories VisualStudio 2019 如何离线下载 lindexi 2019-11-29 08:38:13 +0800 2 ...
- 使用组合逻辑电路驱动VGA显示器
使用组合逻辑电路驱动VGA显示器 1. 概述 本文讲述一种不使用缓冲存储器驱动VGA显示的简单方法.其中,VGA分辨率采用DE10-Lite建议使用的640X480.像素的时钟25MHz,刷新率59. ...
- 习题8 #第8章 Verilog有限状态机设计-3 #Verilog #Quartus #modelsim
3. 编写一个8路彩灯控制程序,要求彩灯有以下3种演示花型. (1) 8路彩灯同时亮灭: (2) 从左至右逐个亮(每次只有1路亮): (3) 8路彩灯每次4路灯亮,4路灯灭,且亮灭相间,交替亮灭. 在 ...
- Android Studio自强迫升级到4.2版本后调试Native项目时总是卡死问题
原文地址:https://www.zhaimaojun.top/Note/5464968 就在昨天,也就是2021年5月6号,Android Studio强迫用户升级到4.2版本, 原因就是jcent ...
- NSThread的isEexcuting和isFinish什么时候被设置
NSThread的isExecuting在进入-[NSThread main]函数之前就已经被设置成YES; NSThread的isFinished在执行+[NSThread exit]后才被设置成N ...
- Nginx 常用的基础配置(web前端相关方面)
文章出处:https://juejin.cn/post/7196859948554715195 基础配置 user root; worker_processes 1; events { worker_ ...
- 学习c# 7.0-7.3的ref、fixed特性并在Unity下测试
1.ref的一些运用 1.1 ref readonly 关于ref,一个主要应用是防止结构体拷贝,若返回的结构体不需要修改则用ref readonly,类似c++的const标记 : private ...
- 用pageOffice控件实现 office word文档在线编辑 表格中写数据的方法
PageOffice对Word文档中Table的操作,包括给单元格赋值和动态添加行的效果. 1 应用场景 OA办公中,经常要在文档的指定位置表格,填充后端指定数据. 如word文档中,表格数据 如下表 ...
- 一次nginx文件打开数的问题排查处理
现象:nginx域名配置合并之后,发现consul-template无法完成nginx重载,然后发现需要重启nginx,才能让配置生效. 注意:下次哪个服务有报错,就看重启时所有日志输出,各种情况日志 ...
- yum install --downloadonly
yum install --downloadonly --downloaddir=[directory] [package] https://www.cnblogs.com/wangbaobao/p/ ...