بناء مكون ChatGPT مخصص لـ API Gateway

Bobur Umurzokov

Bobur Umurzokov

July 12, 2023

Technology

إضافات ChatGPT تعمل كـ جسور تربط ChatGPT بواجهات برمجة التطبيقات الخارجية لاستخدام بيانات هذه الواجهات بذكاء. تتيح هذه الإضافات لـ ChatGPT القيام بمجموعة من المهام، مثل استرداد المعلومات الحديثة من واجهات برمجة التطبيقات الأخرى بما في ذلك نتائج الرياضة، بيانات سوق الأسهم، أو الأخبار العاجلة، ومساعدة المستخدمين في تنفيذ إجراءات مثل حجز الرحلات أو طلب الطعام. وفي الوقت نفسه، تعتبر بوابة API أداة قوية تسمح للمطورين بـ بناء ونشر وإدارة واجهات برمجة التطبيقات على نطاق واسع. تعمل كبوابة بين ChatGPT والخدمات الخلفية، وتوفر ميزات مثل المصادقة، تحديد معدل الطلبات، وتحويلات الطلبات/الاستجابات.

يمكنك القراءة من المقال السابق حيث استكشفنا كيف يمكن أن تكون بوابة API مفيدة لمطوري إضافات ChatGPT لـ عرض، تأمين، إدارة، ومراقبة نقاط نهاية واجهات برمجة التطبيقات الخاصة بهم. يرشدك هذا المقال خطوة بخطوة عبر الطريقة البسيطة والمباشرة لـ تطوير إضافة ChatGPT لبوابة API. كمكافأة ممتعة، ستتعلم أيضًا كيفية إضافة إضافتك إلى ChatGPT وتجربتها. لذا، استعد واستمتع بهذه الرحلة!

كيفية إنشاء إضافة ChatGPT لبوابة API

كما يوضح دليل البدء على موقع OpenAI، لبناء أي إضافة ChatGPT مخصصة جديدة، نحتاج إلى اتباع هذه الخطوات العامة الثلاث:

  1. تطوير واجهة برمجة تطبيقات أو استخدام واجهة موجودة، والتي تنفذ مواصفات OpenAPI.
  2. توثيق واجهة برمجة التطبيقات باستخدام تنسيق YAML أو JSON لـ OpenAPI.
  3. إنشاء ملف JSON لبيان الإضافة يحتوي على معلومات أساسية عن الإضافة.

باتباع الخطوات المذكورة أعلاه، سنقوم ببناء إضافة مخصصة لـ ChatGPT تعمل كـ بوابة API لخدمات واجهات برمجة التطبيقات الخلفية. كمثال، في واجهة مستخدم ChatGPT، إذا أراد المستخدم إدخال بوابة API أمام واجهة برمجة تطبيقات Conference API الحالية للحصول على تفاصيل عن جلسات ومحاور المتحدث، فإن الإضافة قادرة على استقبال الأوامر في الدردشة ثم توجيه طلب المستخدم إلى واجهة برمجة تطبيقات إدارة Apache APISIX، والتي تنشئ مسارًا مع تكوين الإدخال المحدد من قبل المستخدم. يمكن أن تكون هذه طريقة أخرى لـ استخدام الروبوت الدردشة لتكوين ميزات بوابة API. انظر الناتج النموذجي أدناه:

روبوت الدردشة لتكوين ميزات بوابة API

بعد نجاح تشغيل الأمر، ينشئ APISIX المسار ويسجل Upstream لواجهة برمجة تطبيقات Conference الخلفية. لذا، يمكنك الوصول إلى مجال بوابة API ومسار URL للحصول على استجابة عبر البوابة. على سبيل المثال، هذا الطلب GET إلى http://localhost:9080/speaker/1/sessions يعيد جميع جلسات المتحدث من واجهة برمجة تطبيقات Conference. يمكنك أيضًا القيام بعمليات أساسية مثل الحصول على جميع المسارات، مسار بواسطة Id، تحديث مسار موجود أو إنشاء مسار مع إضافات و upstream مباشرة عن طريق سؤال ChatGPT.

لفهم تدفق البيانات بين المكونات المختلفة، يمكنك الرجوع إلى الرسم التخطيطي المعماري المقدم:

المتطلبات الأساسية

يقع مستودع الكود الكامل لإضافة بوابة API هنا. دعنا نمر بالخطوات واحدة تلو الأخرى بما في ذلك مقاطع الكود، الملفات ونفهم كيفية إعداد بوابة API، توثيق واجهة برمجة التطبيقات في تعريف OpenAPI، وإنشاء ملف بيان الإضافة.

تكنولوجيا التطوير المستخدمة لتطوير هذه الإضافة تشمل ما يلي:

  1. واجهة برمجة تطبيقات Conference API العامة الحالية حيث نستخدم نقطتي نهاية API لاسترداد الجلسات والمحاور للمتحدث في العرض التوضيحي. يمكنك اكتشاف واجهات برمجة تطبيقات أخرى في متصفحك.
  2. بوابة API Apache APISIX لعرض واجهة برمجة تطبيقات الإدارة وإدارة حركة واجهات برمجة التطبيقات.
  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_key_required لأغراض العرض التوضيحي.

الخطوة 2: تسجيل APISIX و etcd في Docker Compose

في الخطوة الأخيرة، نقوم بإنشاء ملف docker-compose.yml وتسجيل APISIX و etcd هناك كخدمات لبناءها ونشرها وتشغيلها. وستكون واجهة برمجة تطبيقات إدارة APISIX متاحة على المنفذ: 9180 ويمكنك الوصول إلى البوابة على المنفذ: 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 لـ ChatGPT",
    "name_for_model": "apigatewayplugin",
    "description_for_human": "إضافة بوابة API لإدارة واجهات برمجة التطبيقات الخلفية الخاصة بك.",
    "description_for_model": "إنشاء، استرداد، إدارة مسارات APISIX، upstreams، والإضافات",
    "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 التي ستستخدمها الإضافة للتواصل مع النموذج. اقرأ المزيد هنا. هنا مثال لملف openapi.yaml:

openapi: 3.1.0
info:
  title: واجهة برمجة تطبيقات إدارة APISIX
  description: >-
    واجهة برمجة تطبيقات إدارة APISIX هي واجهة برمجة تطبيقات RESTful تسمح لك بإنشاء وإدارة
    موارد APISIX.
  version: 3.3.0
servers:
  - url: http://localhost:5000
    description: بيئة التطوير
tags:
  - name: المسار
    description: |-
      يعرّف المسار مسارًا لواحدة أو أكثر من خدمات upstream.
      انظر [المسارات](/apisix/key-concepts/routes) لمزيد من المعلومات.

paths:
  /apisix/admin/routes:
    get:
      operationId: getAllRoutes
      summary: الحصول على جميع المسارات
      deprecated: false
      description: الحصول على جميع المسارات المكونة.
      tags:
        - المسار
...
# انظر النسخة الكاملة على مستودع GitHub

مواصفات OpenAPI أعلاه هي مجرد استخراج من مخطط واجهة برمجة تطبيقات الإدارة الحقيقي ويمكنك بسهولة إضافة المزيد من المخططات API إذا لزم الأمر. في عرض الإضافة الخاص بنا، استخدمنا فقط المسارات المتعلقة بالمسار.

الخطوة 3: إضافة نقاط نهاية لملفات الإضافة الثابتة (اختياري للمحلي)

بعد ذلك، نقوم بإنشاء تطبيق 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
@app.route('/<path:path>', methods=['GET', 'POST'])
def wrapper(path):

    headers = {
    'Content-Type': 'application/json',
    }

    url = f'{api_url}/{path}'
    print(f'توجيه الطلب: {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'الطريقة {request.method} غير مطبقة في الوكيل لـ {path=}')
    return response.content

if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0')

عند تشغيل النص، يمكنك الوصول إلى الملفات على نطاق API:

  1. ai-plugin.json سيكون متاحًا على مسار URI http://localhost:5000/.well-known/ai-plugin.json
  2. openapi.yaml سيكون متاحًا على مسار URI http://localhost:5000/openapi.yaml
  3. logo.png سيكون متاحًا على مسار URI http://localhost:5000/logo.png

لاحظ أننا قمنا بتمكين CORS في الكود أعلاه فقط لـ اختبار الإضافة محليًا مع واجهة ChatGPT. إذا كانت الإضافة تعمل على خادم بعيد، فلن تحتاج إلى جزء الوكيل. راجع وثائق OpenAI لتشغيل الإضافة عن بُعد.

الخطوة 4: تعبئة تطبيق Python في Docker

لتشغيل تطبيق 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 حيث أنها معطلة افتراضيًا. نحتاج إلى الانتقال إلى الإعدادات والنقر على خيار بيتا والنقر على "تمكين الإضافات". ثم انقر على شريط الإضافات في أعلى ChatGPT، انتقل إلى "متجر الإضافات" واختر "تطوير إضافتك الخاصة". قدم عنوان URL المحلي للإضافة (localhost:5000).

توصيل الإضافة المخصصة بواجهة ChatGPT

بعد النقر على "العثور على ملف بيان"، إذا تم إعداد كل شيء بشكل صحيح، سترى أن ChatGPT يتحقق بنجاح من كل من ملف البيان ومواصفات OpenAPI.

العثور على ملف بيان

الخطوة 3: اختبار الإضافة المخصصة

الآن الإضافة متصلة بواجهة ChatGPT، يمكننا كتابة أمر بسيط:

عرض جميع المسارات

بما أنه ليس لدينا أي مسار في APISIX، يمكننا إنشاء مسار جديد. هنا، اعتمادًا على اللغة المستخدمة في طلبنا، سيختار ChatGPT استدعاء نقاط نهاية APISIX المناسبة. يرجى محاولة كتابة أمر بتفاصيل أكثر تحديدًا حتى يتمكن ChatGPT من إنشاء مسار بشكل صحيح.

إنشاء مسار في APISIX

الآن تم إنشاء المسار، يمكنك الوصول إلى نقطة نهاية البوابة لاسترداد تفاصيل جلسات Conference: http://localhost:9080/speaker/1/sessions. يمكنك أيضًا استبدال واجهة برمجة تطبيقات Conference بواجهة برمجة تطبيقاتك الخلفية.

حالات استخدام أخرى لإضافة بوابة API المخصصة

الآن يمكنك طرح سؤال: ما الذي يمكنك فعله بهذه الإضافة بخلاف توجيه الطلبات ببساطة؟ هناك العديد من الأشياء التي يمكنك تحسينها في هذه الإضافة أو إضافة ميزات إضافية التي توفرها APISIX عبر واجهة برمجة تطبيقات الإدارة. لأننا وضعنا بوابة API أمام واجهة برمجة تطبيقات Conference وتخدم بوابة API جميع الطلبات القادمة من الإضافة أولاً، يمكنك تحقيق ما يلي على الأقل:

  • الأمان: افترض أنك تريد الآن تأمين واجهة برمجة تطبيقات Conference، بدون بوابة API في مكانها، يمكنك
Tags: