1、前言

5月13日早上醒来发现ChatGPT官网迎来了一波更新,页面有所调整,并且在settings页面有了关于插件装备的切换。

ChatGPT Plugins插件的开发原来就这么简单,看完就会

如图所示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插件

ChatGPT Plugins插件的开发原来就这么简单,看完就会

目前看官网的插件如漫山遍野,感觉很快会迎来一波量的变化,昨天上午看还是四十几个,今日看便是54个。下周或许一切Plus用户都能够体会插件,将会对插件迎来一波压力。 看到了自己有了插件的开发权限,于是就顺手来体会一下,看看插件到底是怎么开发出来的呢

OpenAI的插件将ChatGPT连接到第三方运用程序。这些插件使 ChatGPT 能够与开发人员界说的 API 进行交互,从而增强 ChatGPT 的功用并答应它履行广泛的操作,例如:

  • 检索实时信息;例如,体育比分、股票价格、最新消息等。
  • 检索知识库信息;例如,公司文档、个人笔记等。
  • 代表用户履行操作;例如,预定航班、订货食物等。
  • 。。。。。。

3、上手调试体会插件

3.1、找到测验项目

首要我直接来到OpenAI的官网 platform.openai.com/docs/plugin… 。 发现demo例子的第一个便是一个最简略的库房。

ChatGPT Plugins插件的开发原来就这么简单,看完就会

看到了 Plugin quickstart,顺手找到了github github.com/openai/plug… 一看是OpenAI官网开源的,啥也不说了,直接git clone开撸代码吧。

3.2、下载运转项目

将项目下载到本地之后,便依照readme进行装置即可

  • 3.2.1、首要保证python已经在本机装置
python --version
pip -V

ChatGPT Plugins插件的开发原来就这么简单,看完就会

  • 3.2.2、 装置依靠
pip install -r requirements.txt

ChatGPT Plugins插件的开发原来就这么简单,看完就会

  • 3.2.3、运转调试项目
python main.py

ChatGPT Plugins插件的开发原来就这么简单,看完就会

  • 3.2.4、对接ChatGPT 官网

ChatGPT Plugins插件的开发原来就这么简单,看完就会

然后将 localhost:5003 输入到domain中,然后右下角点击。

ChatGPT Plugins插件的开发原来就这么简单,看完就会

再点击装置,到Chat便能够挑选插件进行聊天运用了

ChatGPT Plugins插件的开发原来就这么简单,看完就会

4、测验运用自己的插件

查看跟插件进行对话是成功的。

ChatGPT Plugins插件的开发原来就这么简单,看完就会

再来查看调试日志

ChatGPT Plugins插件的开发原来就这么简单,看完就会

经过本地接口也能够获取数据了

ChatGPT Plugins插件的开发原来就这么简单,看完就会

根本上已经证明咱们的插件调试成功了。

ChatGPT Plugins插件的开发原来就这么简单,看完就会

最终突然想到自然言语运用恰当直接操作挑选数据接口,有利有弊吧。

5、项目结构解析

ChatGPT Plugins插件的开发原来就这么简单,看完就会

如上图所示,我标注箭头的文件大家看了根本都懂,能够疏忽了。重要文件就三个

  • .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)的库。

下面是每段代码的扼要解释:

  1. 导入模块:

    • quart:Quart 结构的主要模块,用于创建和管理 web 运用。
    • quart_cors:用于处理跨域资源共享 (CORS) 的 Quart 扩展。
    • json:用于处理 JSON 数据的 Python 规范库。
  2. 初始化运用:

    • app = quart_cors.cors(quart.Quart(__name__), allow_origin="https://chat.openai.com")

    这儿创建了一个 Quart 运用并答应来自 “chat.openai.com” 的跨源恳求。

  3. 界说一个大局的 _TODOS 字典,用于存储各用户的待办事项列表。

  4. 界说 API 路由:

    • @app.post("/todos/<string:username>"):增加待办事项。此 API 经过 POST 恳求承受新的待办事项,并将其增加到特定用户的待办事项列表中。
    • @app.get("/todos/<string:username>"):获取待办事项。此 API 经过 GET 恳求回来特定用户的一切待办事项。
    • @app.delete("/todos/<string:username>"):删去待办事项。此 API 经过 DELETE 恳求和待办事项的索引来删去特定用户的一个待办事项。
  5. 为插件供给的其他路由:

    • @app.get("/logo.png"):回来一个 logo 文件。
    • @app.get("/.well-known/ai-plugin.json"):回来插件的 manifest 文件。这是一个包含插件元数据的 JSON 文件,如插件名、版别、描绘等。
    • @app.get("/openapi.yaml"):回来 OpenAPI 规范文件。OpenAPI 是一个用于描绘和文档化 RESTful API 的规范。
  6. 界说主函数:

    • 这个函数会在文件被作为脚本直接运转时发动 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…

后边我会持续更新我对插件运用的总结。欢迎有爱好的一起来学习。