Создание пользовательского плагина ChatGPT для API Gateway

Bobur Umurzokov

Bobur Umurzokov

July 12, 2023

Technology

Плагины ChatGPT служат мостами, связывающими ChatGPT с внешними API, чтобы интеллектуально использовать данные этих API. Эти плагины позволяют ChatGPT выполнять различные задачи, такие как получение актуальной информации из других API, включая результаты спортивных событий, данные фондового рынка или последние новости, а также помогают пользователям выполнять действия, такие как бронирование авиабилетов или заказ еды. В то же время, API Gateway — это мощный инструмент, который позволяет разработчикам создавать, развертывать и управлять API в масштабе. Он действует как шлюз между ChatGPT и серверными службами, предоставляя такие функции, как аутентификация, ограничение скорости и преобразование запросов/ответов.

Вы можете прочитать в предыдущем посте, где мы исследовали, как API Gateway может быть полезен для разработчиков плагинов ChatGPT, чтобы предоставлять, защищать, управлять и мониторить свои конечные точки API. Этот пост шаг за шагом проведет вас через простой и прямой метод разработки плагина ChatGPT для API Gateway. В качестве приятного бонуса вы также узнаете, как добавить свой плагин в ChatGPT и протестировать его. Так что устраивайтесь поудобнее, и давайте начнем это путешествие!

Как создать плагин ChatGPT для API Gateway

Как указано в руководстве по началу работы на сайте OpenAI, чтобы создать любой новый пользовательский плагин ChatGPT, нам нужно выполнить следующие три общих шага:

  1. Разработать API или использовать существующий, который реализует спецификацию OpenAPI.
  2. Документировать API с использованием формата OpenAPI YAML или JSON.
  3. Создать файл манифеста плагина в формате JSON, содержащий основную информацию о плагине.

Следуя аналогичным шагам, мы собираемся создать пользовательский плагин для ChatGPT, который будет действовать как API Gateway для серверных API-сервисов. В качестве примера, в интерфейсе пользователя ChatGPT, если пользователь хочет ввести API Gateway перед существующим Conference API, чтобы получить информацию о сессиях и темах докладчика, плагин способен получать команды в чате и затем перенаправлять запрос пользователя в Admin API Apache APISIX, который создает Route с конфигурацией, указанной пользователем. Это может быть еще один подход к использованию чат-бота для настройки функций API Gateway. Пример вывода ниже:

Чат-бот для настройки функций API Gateway

После успешного выполнения команды APISIX создает маршрут и регистрирует Upstream для нашего серверного API Conference. Таким образом, вы можете получить доступ к домену API Gateway и URL-пути, чтобы получить ответ через шлюз. Например, этот GET-запрос к конечной точке http://localhost:9080/speaker/1/sessions возвращает все сессии докладчика из Conference API. Вы также можете выполнять базовые операции, такие как получение всех маршрутов, маршрута по Id, обновление существующего маршрута или создание маршрута с плагинами и upstream, просто задавая вопросы ChatGPT.

Чтобы понять поток данных между различными компонентами, вы можете обратиться к предоставленной архитектурной диаграмме:

Предварительные требования

  • Прежде чем начать, полезно иметь базовое понимание APISIX. Знание API Gateway и его ключевых концепций, таких как маршруты, upstream, Admin API, плагины и протокол HTTP, также будет полезным.
  • Docker используется для установки контейнеризованных etcd и APISIX.
  • Скачайте Visual Studio Code, совместимый с вашей операционной системой, или используйте любой другой редактор кода, например IntelliJ IDEA, PyCharm и т.д.
  • Для разработки пользовательских плагинов ChatGPT вам необходимо иметь аккаунт ChatGPT Plus и присоединиться к списку ожидания плагинов.

Весь репозиторий кода для полного плагина API Gateway находится здесь. Давайте пройдемся по шагам, включая фрагменты кода, файлы и поймем, как настроить API Gateway, задокументировать API в определении OpenAPI и создать файл манифеста плагина.

Технологический стек, используемый для разработки этого плагина, включает следующее:

  1. Существующий публичный Conference API, где мы используем две конечные точки API для получения информации о сессиях и темах докладчика в демо. Вы можете изучить другие API в своем браузере.
  2. Apache APISIX API Gateway для предоставления Admin API и управления трафиком API.
  3. Скрипт на Python для запуска плагина, размещения файлов манифеста плагина, спецификации OpenAPI и логотипа плагина на локальном хосте по URL http://localhost:5000/.
  4. Проект использует Docker для удобства сборки, развертывания и запуска APISIX, etcd и нашего Python-скрипта с помощью одной команды docker compose up.

Мы будем следовать серии шагов для создания плагина. В Части 1 мы сосредоточимся на настройке APISIX. Часть 2 будет посвящена разработке самого плагина ChatGPT, а Часть 3 включает подключение плагина к ChatGPT и его тестирование. Хотя мы представляем шаги в последовательном порядке, вы можете пропустить любой из них в зависимости от вашей знакомости с темой.

Часть 1: Настройка Apache APISIX

Шаг 1: Определение конфигурации APISIX

Сначала мы создаем файл конфигурации APISIX. Конфигурации APISIX могут быть определены с использованием различных методов, включая статические файлы конфигурации, обычно написанные в формате YAML. В файле apisix.yml мы предоставили пример конфигурации:

deployment: etcd: host: - "http://etcd:2397" admin: admin_key_required: false allow_admin: - 0.0.0.0/0

Вы также можете проконсультироваться с ChatGPT, чтобы понять, что означает вышеуказанный файл apisix.yml. В основном, эта конфигурация определяет режим развертывания для APISIX. Здесь мы используем простой традиционный вариант, где APISIX использует хранилище etcd для хранения деталей конфигурации, которые он получает из Admin API. Мы также отключаем ключ администратора admin_key_required для демонстрации.

Шаг 2: Регистрация APISIX и etcd в Docker Compose

На последнем шаге мы создаем файл docker-compose.yml и регистрируем там APISIX и etcd как сервисы для сборки, развертывания и запуска. И Admin API APISIX будет доступен на порту: 9180, а Gateway — на порту: 9080.

version: "3" services: apisix: image: apache/apisix:3.3.0-debian volumes: - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro restart: always ports: - "9080:9080" - "9180:9180" depends_on: - etcd etcd: image: bitnami/etcd:3.5.9 environment: ETCD_ENABLE_V2: "true" ALLOW_NONE_AUTHENTICATION: "yes" ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2397" ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2397"

Часть 2: Разработка плагина ChatGPT

Шаг 1: Создание манифеста плагина

Каждый плагин требует файла манифеста ai-plugin.json, который предоставляет важную информацию о вашем плагине, такую как его имя, описание, логотип и т.д. Подробнее о каждом поле файла манифеста можно прочитать здесь, а OpenAI предоставляет некоторые лучшие практики для создания описаний модели (description_for_model). Когда вы устанавливаете плагин в интерфейсе ChatGPT, интерфейс будет искать файл манифеста на вашем домене (http://localhost:5000/.well-known/ai-plugin.json). Это помогает ChatGPT понять, как взаимодействовать с вашим плагином.

Создайте новый файл с именем ai-plugin.json и вставьте следующий код:

{ "schema_version": "v1", "name_for_human": "APISIX plugin for ChatGPT", "name_for_model": "apigatewayplugin", "description_for_human": "API Gateway plugin to manage your backend APIs.", "description_for_model": "Create, retrive, manage APISIX routes, upstreams, and plugins", "auth": { "type": "none" }, "api": { "type": "openapi", "url": "http://localhost:5000/openapi.yaml" }, "logo_url": "http://localhost:5000/logo.png", "contact_email": "support@example.com", "legal_info_url": "http://www.example.com/legal" }

Вы можете заметить, что файл также указывает URL на файл http://localhost:5000/openapi.yaml.

Когда пользователь взаимодействует с ChatGPT, он будет ссылаться на файл openapi.yaml, чтобы понять описания конечных точек. На основе этой информации ChatGPT определит наиболее подходящую конечную точку для использования в ответ на запрос пользователя.

Шаг 2: Создание спецификации OpenAPI

Спецификация OpenAPI — это стандарт для описания REST API. Она используется для указания каждой конечной точки API, которую плагин будет использовать для взаимодействия с моделью. Подробнее здесь. Вот пример файла openapi.yaml:

openapi: 3.1.0 info: title: APISIX Admin API description: >- APISIX Admin API is a RESTful API that allows you to create and manage APISIX resources. version: 3.3.0 servers: - url: http://localhost:5000 description: Dev Environment tags: - name: Route description: |- A route defines a path to one or more upstream services. See [Routes](/apisix/key-concepts/routes) for more information. paths: /apisix/admin/routes: get: operationId: getAllRoutes summary: Get All Routes deprecated: false description: Get all configured routes. tags: - Route ... # Полную версию можно увидеть в репозитории GitHub

Вышеуказанная спецификация OpenAPI — это лишь извлечение из реальной схемы Admin API, и вы можете легко добавить больше схем API, если это необходимо. В нашем демо-плагине мы использовали только пути, связанные с маршрутами.

Шаг 3: Добавление конечных точек для статических файлов плагина (Опционально для localhost)

Далее мы создаем Flask-приложение на Python, чтобы предоставить наши статические файлы как конечные точки для логотипа плагина, манифеста и спецификации OpenAPI. ChatGPT делает вызов к конечным точкам API, чтобы получить всю необходимую информацию для пользовательского плагина:

import requests import os import yaml from flask import Flask, jsonify, request, send_from_directory from flask_cors import CORS app = Flask(__name__) PORT = 5000 # Примечание: Настройка CORS для разрешения chat.openapi.com необходима для доступа ChatGPT к вашему плагину CORS(app, origins=[f"http://localhost:{PORT}", "https://chat.openai.com"]) api_url = 'http://apisix:9180' @app.route('/.well-known/ai-plugin.json') def serve_manifest(): return send_from_directory(os.path.dirname(__file__), 'ai-plugin.json') @app.route('/openapi.yaml') def serve_openapi_yaml(): with open(os.path.join(os.path.dirname(__file__), 'openapi.yaml'), 'r') as f: yaml_data = f.read() yaml_data = yaml.load(yaml_data, Loader=yaml.FullLoader) return jsonify(yaml_data) @app.route('/logo.png') def serve_openapi_json(): return send_from_directory(os.path.dirname(__file__), 'logo.png') # Для проксирования запросов от ChatGPT к API Gateway @app.route('/<path:path>', methods=['GET', 'POST']) def wrapper(path): headers = { 'Content-Type': 'application/json', } url = f'{api_url}/{path}' print(f'Forwarding call: {request.method} {path} -> {url}') if request.method == 'GET': response = requests.get(url, headers=headers, params=request.args) elif request.method in ['POST', 'DELETE', 'PATCH', 'PUT']: print(request.headers) response = requests.post(url, headers=headers, params=request.args, json=request.json) else: raise NotImplementedError(f'Method {request.method} not implemented in wrapper for {path=}') return response.content if __name__ == '__main__': app.run(debug=True,host='0.0.0.0')

Когда скрипт запущен, вы можете получить доступ к файлам на домене API:

  1. ai-plugin.json будет доступен по пути http://localhost:5000/.well-known/ai-plugin.json
  2. openapi.yaml будет доступен по пути http://localhost:5000/openapi.yaml
  3. logo.png будет доступен по пути http://localhost:5000/logo.png

Обратите внимание, что мы включили CORS в вышеуказанном коде только для тестирования плагина локально с интерфейсом ChatGPT. Если плагин работает на удаленном сервере, вам не нужна часть прокси. Обратитесь к документации OpenAI для запуска плагина удаленно.

Шаг 4: Докеризация Python-приложения

Чтобы автоматически запускать Python-приложение с Docker, мы создаем Dockerfile и регистрируем его в файле docker-compose.yml. Узнайте, как докеризировать Python-приложение здесь.

FROM python:3.9 WORKDIR /app COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt COPY . . CMD ["python","main.py"]

В итоге наш файл docker-compose.yml выглядит так:

version: "3" services: apisix: image: apache/apisix:3.3.0-debian volumes: - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro restart: always ports: - "9080:9080" - "9180:9180" depends_on: - etcd etcd: image: bitnami/etcd:3.5.9 environment: ETCD_ENABLE_V2: "true" ALLOW_NONE_AUTHENTICATION: "yes" ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2397" ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2397" chatgpt-config: build: chatgpt-plugin-config ports: - '5000:5000'

Часть 3: Интеграция ChatGPT с пользовательским плагином

Шаг 1: Развертывание пользовательского плагина

После завершения разработки вашего пользовательского плагина пришло время развернуть и запустить его локально. Чтобы запустить проект, просто выполните следующую команду из корневой директории проекта:

docker compose up

Когда вы запустите проект, Docker загрузит все необходимые образы. Вы увидите, что сервисы APISIX, etcd и Python-приложение (chatgpt-config) запущены.

Развертывание пользовательского плагина

Шаг 2: Подключение пользовательского плагина к интерфейсу ChatGPT

Итак, вы развернули плагин ChatGPT, файлы конфигурации плагина доступны через API, и теперь вы готовы протестировать его. Если у вас есть аккаунт Plus, мы должны сначала включить плагин в GPT-4, так как он отключен по умолчанию. Нам нужно перейти в настройки, нажать на опцию beta и выбрать “Enable plugins”. Затем нажмите на всплывающую панель плагинов в верхней части ChatGPT, перейдите в “Plugin Store” и выберите “Develop your own plugin”. Укажите локальный URL для плагина (localhost:5000).

Подключение пользовательского плагина к интерфейсу ChatGPT

После того как вы нажмете на “Find a manifest file”, если все настроено правильно, вы увидите, что ChatGPT успешно проверяет как файл манифеста, так и спецификацию OpenAPI.

Поиск файла манифеста

Шаг 3: Тестирование пользовательского плагина

Теперь плагин подключен к интерфейсу ChatGPT, и мы можем написать простую команду:

Показать все маршруты

Поскольку у нас нет ни одного маршрута в APISIX, мы можем создать новый. В зависимости от языка, используемого в нашем запросе, ChatGPT выберет вызов соответствующих конечных точек APISIX. Пожалуйста, попробуйте написать команду с более конкретными деталями, чтобы ChatGPT мог правильно создать маршрут.

Создание маршрута в APISIX

Теперь маршрут создан, и вы можете получить доступ к конечной точке Gateway, чтобы получить информацию о сессиях Conference: http://localhost:9080/speaker/1/sessions. Вы также можете заменить этот Conference API на ваш собственный серверный API.

Другие варианты использования пользовательского плагина API Gateway

Теперь вы можете задать вопрос: Что еще можно сделать с этим плагином, кроме простого маршрутизации запросов? Есть много вещей, которые вы можете улучшить в этом плагине или добавить дополнительные функции, которые APISIX предлагает через Admin API. Поскольку мы поместили API Gateway перед Conference API, и API Gateway обрабатывает все запросы, поступающие от плагина, вы можете достичь как минимум следующего:

  • Безопасность: Предположим, что теперь вы хотите защитить Conference API, без API Gateway вы все еще можете защитить обмен данными между интерфейсом ChatGPT и плагином, используя методы аутентификации плагинов от OpenAI. Однако связь между плагином и вашим серверным сервисом остается незащищенной, пока вы не реализуете некоторые сквозные задачи в Python-коде, вместо того чтобы тратить время на это:
    • Мы можем реализовать меры безопасности, такие как аутентификация, авторизация и ограничение скорости, с помощью API Gateway, чтобы защитить Conference API от несанкционированного доступа и потенциальных атак. ChatGPT может свободно общаться с API Gateway, но связь между API Gateway и серверным сервисом может быть абсолютно безопасной.
  • Кэширование: Возможно кэшировать похожие ответы Conference API, чтобы быстро показывать данные для ChatGPT.
  • Версионирование: Мы можем создать вторую версию Conference API, чтобы маршрутизировать запросы плагина ChatGPT к новейшему сервису без изменения конфигурации и простоев.
  • Балансировка нагрузки: Мы можем распределять входящие запросы между несколькими экземплярами Conference API, обеспечивая высокую доступность и эффективное использование ресурсов.
  • Преобразование запросов: Мы можем изменять запросы, отправляемые в Conference API, позволяя преобразовывать данные, проверять их или преобразовывать запросы из REST в GraphQL или в вызовы gRPC-сервисов.
  • Мониторинг и аналитика: API Gateway предоставляет мощные плагины для мониторинга и аналитики плагины, позволяя вам собирать ценные данные об использовании API, производительности и потенциальных проблемах.

Если вы хотите использовать Apache APISIX API Gateway как шлюз для связи между пользовательскими плагинами ChatGPT и серверными API, вы можете проверить этот репозиторий API Gateway между пользовательскими плагинами ChatGPT и серверными API

Следующие шаги

На протяжении поста вы узнали, как создать пользовательский плагин для API Gateway с базовыми функциями. Теперь вы можете взять пример проекта за основу и улучшить функциональность, добавив больше спецификаций Admin API APISIX в файл openapi.yaml, чтобы использовать и тестировать другие плагины и добавить потребителей API и многое другое. Не стесняйтесь вносить вклад в проект на GitHub, создавая pull-запросы.

Связанные ресурсы

Tags: