1、前言
5月13日早上醒来发现ChatGPT官网迎来了一波更新,页面有所调整,并且在settings页面有了关于插件装备的切换。
如图所示OpenAI官网发布,将在下周针对一切ChatGPT Plus用户推出网络阅读和插件权限。我的猜想是一方面最近谷歌AI的发布会能够拜访互联网,拜访插件等等,假如真如发布会,那比3月份发布时的提高真的太大了,以claude.ai 宣告将文本上下文约束从 9K 扩展到 100K!并且在3月中旬发布ChatGPT-4模型后,新东西出来也比较慢了,种种痕迹都在标明OpenAI也面临着一点点的压力。
期望多几家能与OpenAI公司竞赛的企业,这样才能促进OpenAI更微弱的迸发。 5月12日拿到了插件开发的权限,当天工作比较忙,就没时间来测验,于是今日运用了一下。接下来,我会根据我的运用情况来学习一下ChatGPT Plugins官网的插件开发机制。官网的插件我昨天也体会了一番作用还是非常棒的,有爱好的能够来看看我的体会文章 mp.weixin.qq.com/s/SKycfpMMR… 。
2、ChatGPT Plugins插件
目前看官网的插件如漫山遍野,感觉很快会迎来一波量的变化,昨天上午看还是四十几个,今日看便是54个。下周或许一切Plus用户都能够体会插件,将会对插件迎来一波压力。 看到了自己有了插件的开发权限,于是就顺手来体会一下,看看插件到底是怎么开发出来的呢
OpenAI的插件将ChatGPT连接到第三方运用程序。这些插件使 ChatGPT 能够与开发人员界说的 API 进行交互,从而增强 ChatGPT 的功用并答应它履行广泛的操作,例如:
- 检索实时信息;例如,体育比分、股票价格、最新消息等。
- 检索知识库信息;例如,公司文档、个人笔记等。
- 代表用户履行操作;例如,预定航班、订货食物等。
- 。。。。。。
3、上手调试体会插件
3.1、找到测验项目
首要我直接来到OpenAI的官网 platform.openai.com/docs/plugin… 。 发现demo例子的第一个便是一个最简略的库房。
看到了 Plugin quickstart,顺手找到了github github.com/openai/plug… 一看是OpenAI官网开源的,啥也不说了,直接git clone开撸代码吧。
3.2、下载运转项目
将项目下载到本地之后,便依照readme进行装置即可
- 3.2.1、首要保证python已经在本机装置
python --version
pip -V
- 3.2.2、 装置依靠
pip install -r requirements.txt
- 3.2.3、运转调试项目
python main.py
- 3.2.4、对接ChatGPT 官网
然后将 localhost:5003
输入到domain中,然后右下角点击。
再点击装置,到Chat便能够挑选插件进行聊天运用了
4、测验运用自己的插件
查看跟插件进行对话是成功的。
再来查看调试日志
经过本地接口也能够获取数据了
根本上已经证明咱们的插件调试成功了。
最终突然想到自然言语运用恰当直接操作挑选数据接口,有利有弊吧。
5、项目结构解析
如上图所示,我标注箭头的文件大家看了根本都懂,能够疏忽了。重要文件就三个
- .wll-known/ai-plugin.json
- openapi.yaml
- main.py
5、1 ai-plugin.json
先来查看示例
{
"schema_version": "v1",
"name_for_human": "TODO Plugin (no auth)",
"name_for_model": "todo",
"description_for_human": "Plugin for managing a TODO list, you can add, remove and view your TODOs.",
"description_for_model": "Plugin for managing a TODO list, you can add, remove and view your TODOs.",
"auth": {
"type": "none"
},
"api": {
"type": "openapi",
"url": "http://localhost:5003/openapi.yaml",
"is_user_authenticated": false
},
"logo_url": "http://localhost:5003/logo.png",
"contact_email": "legal@example.com",
"legal_info_url": "http://example.com/legal"
}
这儿最重要的一个装备便是:auth:身份验证架构 (“type”: “none”) 。
我上面运用的便是没有身份验证的机制,假如咱们的插件api接口时面向一切用户开发,需求身份的验证,这儿便能够这样设置。假如需求身份验证能够设置为(“type”: “service_http”),这儿就简略一提,留给后边再细心学习。
5.2、openapi.yaml
openapi: 3.0.1
info:
title: TODO Plugin
description: A plugin that allows the user to create and manage a TODO list using ChatGPT. If you do not know the user's username, ask them first before making queries to the plugin. Otherwise, use the username "global".
version: 'v1'
servers:
- url: http://localhost:5003
paths:
/todos/{username}:
get:
operationId: getTodos
summary: Get the list of todos
parameters:
- in: path
name: username
schema:
type: string
required: true
description: The name of the user.
responses:
"200":
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/getTodosResponse'
post:
operationId: addTodo
summary: Add a todo to the list
parameters:
- in: path
name: username
schema:
type: string
required: true
description: The name of the user.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/addTodoRequest'
responses:
"200":
description: OK
delete:
operationId: deleteTodo
summary: Delete a todo from the list
parameters:
- in: path
name: username
schema:
type: string
required: true
description: The name of the user.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/deleteTodoRequest'
responses:
"200":
description: OK
components:
schemas:
getTodosResponse:
type: object
properties:
todos:
type: array
items:
type: string
description: The list of todos.
addTodoRequest:
type: object
required:
- todo
properties:
todo:
type: string
description: The todo to add to the list.
required: true
deleteTodoRequest:
type: object
required:
- todo_idx
properties:
todo_idx:
type: integer
description: The index of the todo to delete.
required: true
简略看到下面这个文件,感觉便是openai界说的一套接口规范,插件的接口需求依照这样的规范来界说。 并且这儿的规范,要跟代码里完结的接口要保持一致。下面来看看代码
5.3、main.py
import json
import quart
import quart_cors
from quart import request
app = quart_cors.cors(quart.Quart(__name__), allow_origin="https://chat.openai.com")
# Keep track of todo's. Does not persist if Python session is restarted.
_TODOS = {}
@app.post("/todos/<string:username>")
async def add_todo(username):
request = await quart.request.get_json(force=True)
if username not in _TODOS:
_TODOS[username] = []
_TODOS[username].append(request["todo"])
print(_TODOS)
return quart.Response(response='OK', status=200)
@app.get("/todos/<string:username>")
async def get_todos(username):
print(username)
todos = _TODOS.get(username, [])
print(todos)
return quart.Response(response=json.dumps(_TODOS.get(username, [])), status=200)
@app.delete("/todos/<string:username>")
async def delete_todo(username):
request = await quart.request.get_json(force=True)
todo_idx = request["todo_idx"]
# fail silently, it's a simple plugin
if 0 <= todo_idx < len(_TODOS[username]):
_TODOS[username].pop(todo_idx)
return quart.Response(response='OK', status=200)
@app.get("/logo.png")
async def plugin_logo():
filename = 'logo.png'
return await quart.send_file(filename, mimetype='image/png')
@app.get("/.well-known/ai-plugin.json")
async def plugin_manifest():
host = request.headers['Host']
with open("./.well-known/ai-plugin.json") as f:
text = f.read()
return quart.Response(text, mimetype="text/json")
@app.get("/openapi.yaml")
async def openapi_spec():
host = request.headers['Host']
with open("openapi.yaml") as f:
text = f.read()
return quart.Response(text, mimetype="text/yaml")
def main():
app.run(debug=True, host="localhost", port=5003)
if __name__ == "__main__":
main()
代码完结的思路大致如下:
这段代码是一个根据 Quart 和 Quart-CORS 的简略的 RESTful API 服务器,用于处理待办事项(todo)数据的 CRUD 操作(创建、读取、更新、删去)。Quart 是一个 Python 的异步 web 结构,相当于异步版别的 Flask。Quart-CORS 是一个用于处理跨源资源共享(CORS)的库。
下面是每段代码的扼要解释:
-
导入模块:
-
quart
:Quart 结构的主要模块,用于创建和管理 web 运用。 -
quart_cors
:用于处理跨域资源共享 (CORS) 的 Quart 扩展。 -
json
:用于处理 JSON 数据的 Python 规范库。
-
-
初始化运用:
app = quart_cors.cors(quart.Quart(__name__), allow_origin="https://chat.openai.com")
这儿创建了一个 Quart 运用并答应来自 “chat.openai.com” 的跨源恳求。
-
界说一个大局的
_TODOS
字典,用于存储各用户的待办事项列表。 -
界说 API 路由:
-
@app.post("/todos/<string:username>")
:增加待办事项。此 API 经过 POST 恳求承受新的待办事项,并将其增加到特定用户的待办事项列表中。 -
@app.get("/todos/<string:username>")
:获取待办事项。此 API 经过 GET 恳求回来特定用户的一切待办事项。 -
@app.delete("/todos/<string:username>")
:删去待办事项。此 API 经过 DELETE 恳求和待办事项的索引来删去特定用户的一个待办事项。
-
-
为插件供给的其他路由:
-
@app.get("/logo.png")
:回来一个 logo 文件。 -
@app.get("/.well-known/ai-plugin.json")
:回来插件的 manifest 文件。这是一个包含插件元数据的 JSON 文件,如插件名、版别、描绘等。 -
@app.get("/openapi.yaml")
:回来 OpenAPI 规范文件。OpenAPI 是一个用于描绘和文档化 RESTful API 的规范。
-
-
界说主函数:
- 这个函数会在文件被作为脚本直接运转时发动 Quart 服务器。
总的来说,这段代码为一个根据用户的待办事项运用程序供给了一个 RESTful API。经过这些 API,运用程序能够增加、获取和删去待办事项。
6、总结
经过这个文章相信你对插件的开发应该没那么害怕了,等候ChatGPT下周的更新一切Plus用户都会开端运用插件了,假如你有什么灵感也能够告诉我,我来完结你心目中的插件,来更好的辅助你完结你手头上需求处理的工作。
经过上面的代码也能够看到,是经过python言语进行完结插件的,可是经过代码完结我发现,经过go言语或者java、.net core、nodejs、php等言语应该都能够完结插件的,不出意外下周开端讨论插件的日子应该到来了,群里的人或许会问处理这个问题能够用那个插件。
更多插件玩法能够参阅 github.com/openai/chat…
插件文档地址能够参阅 platform.openai.com/docs/plugin…
本文参阅的代码库房是 github.com/openai/plug…
后边我会持续更新我对插件运用的总结。欢迎有爱好的一起来学习。