1. 开始
上一篇文章《ChatGPT插件开发教程(一):创建一个Hello world插件》简单介绍了如何创建一个简单的插件,在本篇文章中,我们将通过实战演示如何创建一个可以搜索掘金文章的ChatGPT插件,并将其部署到Cloudflare Worker上,使其可以在ChatGPT中使用。
2. 插件功能
插件的主要功能是为ChatGPT提供一个掘金文章的搜索入口,返回文章的标题,链接和简介。这样,ChatGPT可以根据自己的思考,组织关键词进行搜索,打开所需的文章,并提取出所需的内容。
3. 开发流程
2.1 克隆cloudflare的开发模版
Cloudflare提供了一个专门针对ChatGPT的开发模板,可以方便地开发和部署ChatGPT插件。
github地址: github.com/cloudflare/…, 这个模版主要是使用到@cloudflare/itty-router-openapi,这使得管理插件metadata、schema和行为变得容易。请复制example-plugin文件夹做为开发模版。
2.2 设置插件的基本信息和路由
index.ts这个文件是插件的入口文件,其主要任务是定义插件的基本信息,初始化OpenAPIRouter,注册一个GET请求到/search路径,最后将router.handle函数导出作为fetch的处理函数。
文件中引入了OpenAPIRouter和GetSearch。OpenAPIRouter是Cloudflare提供的插件路由工具,可以帮助我们创建和管理插件的路由。GetSearch是我们自己定义的一个搜索类,我们会在下一节介绍它。
在OpenAPIRouter的构造函数中,我们传入了一个配置对象。这个对象中定义了插件的基本信息(如标题,描述,版本等)和插件的接口信息(如名称,描述,联系邮件,法律信息网址,logo网址等)。
import { OpenAPIRouter } from "@cloudflare/itty-router-openapi";
import { GetSearch } from "./search";
// 创建一个OpenAPI路由器
export const router = OpenAPIRouter({
// 定义插件的基本信息
schema: {
info: {
title: "Juejin Article API",
description: "A plugin that allows the user to search for articles on Juejin.cn using ChatGPT",
version: "v0.0.1"
}
},
// 定义插件的接口信息
docs_url: "/",
aiPlugin: {
name_for_human: "Juejin Article Search Unofficial Plugin",
name_for_model: "juejin_article_search",
description_for_human: "Juejin Article Search plugin for ChatGPT.",
description_for_model: "Juejin Article Search plugin for ChatGPT. You can search for articles on Juejin.cn using this plugin.",
contact_email: "support@example.com",
legal_info_url: "http://www.example.com/legal",
logo_url: "https://workers.cloudflare.com/resources/logo/logo.svg"
}
})
接着,我们使用router.get()方法注册了一个GET请求到/search路径,并指定GetSearch作为处理函数。当ChatGPT发送一个GET请求到/search路径时,GetSearch将会处理这个请求。
// 注册一个GET请求到/search路径
router.get('/search', GetSearch)
最后,我们使用router.all()方法注册了一个处理所有未定义的请求的函数,如果收到一个未定义的请求,这个函数就会返回一个404 Not Found的响应。然后我们把router.handle函数导出作为fetch的处理函数。
// 处理所有未定义的请求,返回404 Not Found
router.all('*', () => new Response('Not Found.', { status: 404 }))
// 导出router.handle函数作为fetch的处理函数
export default {
fetch: router.handle
}
2.3 创建搜索功能和处理请求
在Search.ts这个文件中,我们定义了一个名为GetSearch的类,该类继承自OpenAPIRoute。它的主要任务是处理/search的GET请求,搜索掘金文章,并返回搜索结果。
在GetSearch类中,我们首先定义了一个async function postRequest,这个函数用于发送一个POST请求,并返回响应结果。
import { ApiException, OpenAPIRoute, Query, ValidationError } from "@cloudflare/itty-router-openapi";
// 定义一个函数,用于发送POST请求
async function postRequest(url = "", data) {
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
});
return response.json();
}
接着,我们定义了GetSearch类。在GetSearch类中,我们定义了一个静态属性schema,该属性定义了搜索接口的信息,如标签,摘要,参数,响应等。在这个接口中,我们接受一个字符串参数q,该参数是搜索关键词,其默认值为"cloudflare workers"。
// 定义GetSearch类,用于处理搜索请求
export class GetSearch extends OpenAPIRoute {
// 定义搜索接口的信息
static schema = {
tags: ["Search"],
summary: "Search articles by a query parameter",
parameters: {
q: Query(String, {
description: "The query to search for",
default: "cloudflare workers"
})
},
responses: {
"200": {
schema: {
article: [
{
title: "CloudFlare Worker",
description: "OpenAPI 3 schema generator and validator for Cloudflare Workers",
author: "xxx",
url: "https://juejin.im/post/xxx"
}
]
}
}
}
}
接下来我们定义了handle函数,这个函数负责处理请求。在这个函数中,我们首先构造了一个POST请求的URL和请求数据,然后使用postRequest函数发送请求并获取响应结果。最后,我们将响应结果转换为我们需要的格式,并返回。
// 处理请求
async handle(request: Request, env, ctx, data: Record<string, any>) {
// 构造POST请求的URL和请求数据
const url = `https://api.juejin.cn/search_api/v1/search`;
const requestData = {
"key_word": data.q || "",
"id_type": 0,
"cursor": "0",
"limit": 1,
"search_type": 0,
"sort_type": 0,
"version": 1
};
// 发送请求并获取响应结果
const response:any = await postRequest(url, requestData);
// 将响应结果转换为我们需要的格式并返回
if (response.code !== 0) {
throw new ApiException("Failed to fetch articles from Juejin.cn", 500);
}
const articles = response.data.map(article => ({
title: article.title,
description: article.description,
author: article.user_info.user_name,
url: `https://juejin.cn/post/${article.article_id}`
}));
return new Response(JSON.stringify(articles), { status: 200 });
}
}
2.4 部署
Cloudflare的官方CLI工具wrangler可以帮助我们将插件部署到Cloudflare Worker上。下面是如何使用wrangler进行部署的详细步骤。
首先,需要在本地环境中全局安装wrangler。如果尚未安装,可以使用以下命令进行安装:
npm install -g @cloudflare/wrangler
接着,修改wrangler.toml文件为自己的信息:
name = "juejin-chatgpt-plugin-unofficial"
main = "src/index.ts"
compatibility_date = "2023-04-07"
然后:
wrangler publish
部署成功后,wrangler会返回一个URL,你可以使用这个URL安装你的插件。
4. 安装与使用
如同上一篇的安装方法,安装这个掘金的插件。
之后,如果提高关键词掘金,或者搜索,gpt会自动使用关键词搜索掘金的文章,如果搭配
webcopilot插件,还可以浏览和总结文章的内容,可以帮助我们研究技术的相关内容。
5. 总结
通过这篇文章,我们了解了如何开发一个可以搜索掘金文章的ChatGPT插件。首先,我们克隆了Cloudflare提供的开发模板,然后我们修改了index.ts文件,定义了插件的基本信息,并初始化OpenAPIRouter。然后我们修改了Search.ts文件,定义了处理搜索请求的GetSearch类。最后,我们使用Cloudflare的工具进行部署,从而使我们的插件可以在ChatGPT中使用。希望这篇文章能帮助你理解ChatGPT插件的开发过程,并鼓励你开发更多的ChatGPT插件。