探索Semantic Kernel内置插件:深入了解HttpPlugin的应用

简介: 其他Put和Delete类似。最后可以借鉴HttpPlugin的实现思路在项目中灵活的运行,如果不支持那就可以自定义插件来完成需求的开发,还是比较期待这个插件能够更加完善的一点,在未来以更灵活的方式支持Post等请求的多种形式。

前言

上一章我们熟悉了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-typetext/plainpost请求,如果支持需要自定义实现没有提供对应的MediaTypeFormatter

所以说这个插件的Post请求场景局限,真正用到生产还需要自己去实现一个插件!!!

User > 向https://localhost:7014/student 发一个post请求
Assistant > 已成功向 https://localhost:7014/student 发送了 POST 请求。如果需要发送具体的数据,请提供要包含在请求体内的 JSON 数据。

其他

PutDelete类似。

最后

可以借鉴HttpPlugin的实现思路在项目中灵活的运行,如果不支持那就可以自定义插件来完成需求的开发,还是比较期待这个插件能够更加完善的一点,在未来以更灵活的方式支持Post等请求的多种形式。


相关文章
|
运维 Cloud Native Devops
「译文」什么是 SRE(站点可靠性工程师)?SRE 是做什么的?
「译文」什么是 SRE(站点可靠性工程师)?SRE 是做什么的?
|
3月前
|
运维 Kubernetes 负载均衡
教你读懂 高可用/SRE
高可用(HA)与网站可靠性工程(SRE)是保障现代分布式系统稳定运行的核心理念。HA关注系统持续可用的能力,常用“9”的数量衡量可靠性,如99.99%可用性意味着全年仅允许约52分钟宕机。实现手段包括冗余设计、故障转移、负载均衡、限流熔断与数据多活。SRE则通过工程化方法提升系统可靠性,核心在于SLI(服务指标)、SLO(目标值)、SLA(服务协议)的指标体系,结合错误预算、自动化运维、容量规划与事后分析,实现稳定与效率的平衡。二者相辅相成,HA是目标,SRE是路径,共同构建“可测、可控、可优化”的系统稳定性体系。
354 0
|
JavaScript
从零开始写一套广告组件【一】搭建基础框架并配置UI组件库
其实这个从零有点歧义,因为本质上是要基于`tdesign-vue-next`来进行二次封装为一套广告UI组件库,现在让我们在一起快乐的搭建自己的广告UI库之前,先对以下内容做出共识:
295 0
从零开始写一套广告组件【一】搭建基础框架并配置UI组件库
|
域名解析 运维 负载均衡
LVS+Keepalived 负载均衡(二)28-1
【8月更文挑战第28天】LVS+Keepalived 负载均衡 配置 LVS VIP
238 5
|
网络协议 算法 数据库
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
456 0
|
存储 消息中间件 API
FreeRTOS入门教程(堆和栈)
FreeRTOS入门教程(堆和栈)
618 0
|
前端开发 测试技术 API
揭秘Ruby on Rails的神秘力量:如何让你的Web应用飞起来?
【8月更文挑战第31天】Ruby on Rails(简称RoR)是一个基于Ruby语言的开源Web应用框架,自2005年发布以来,因简洁的语法、强大的功能和高效的开发效率而广受好评。RoR采用MVC架构,提高代码可读性和可维护性,拥有庞大的社区和丰富的库支持。本文通过示例代码展示其强大之处,并介绍RoR的核心概念与最佳实践,帮助开发者更高效地构建Web应用。
423 0
|
网络协议 物联网 测试技术
App Inventor 2 MQTT拓展入门(保姆级教程)
本文演示的是App和一个测试客户端进行消息交互的案例,实际应用中,我们的测试客户端可以看着是任意的、支持MQTT协议的硬件,通过订阅及发布消息,联网硬件与我们的App进行双向数据通信,以实现万物互联的智能控制效果。
942 2
|
XML 编解码 文字识别
PyMuPDF 1.24.4 中文文档(八)(4)
PyMuPDF 1.24.4 中文文档(八)
716 1
|
编解码 监控 API
惊艳登场!揭秘如何在Android平台上轻松玩转GB28181标准,实现多视频通道接入的超实用指南!
【8月更文挑战第14天】GB28181是公共安全视频监控联网的技术标准。本文介绍如何在Android平台上实现该标准下的多视频通道接入。首先准备开发环境,接着引入GB28181 SDK依赖并初始化SDK。实现设备注册与登录后,通过指定不同通道号请求多路视频流。最后,处理接收到的数据并显示给用户。此过程涉及视频解码,需确保应用稳定及良好的用户体验。
560 0