بناء مكون ChatGPT مخصص لـ API Gateway
July 12, 2023
إضافات ChatGPT تعمل كـ جسور تربط ChatGPT بواجهات برمجة التطبيقات الخارجية لاستخدام بيانات هذه الواجهات بذكاء. تتيح هذه الإضافات لـ ChatGPT القيام بمجموعة من المهام، مثل استرداد المعلومات الحديثة من واجهات برمجة التطبيقات الأخرى بما في ذلك نتائج الرياضة، بيانات سوق الأسهم، أو الأخبار العاجلة، ومساعدة المستخدمين في تنفيذ إجراءات مثل حجز الرحلات أو طلب الطعام. وفي الوقت نفسه، تعتبر بوابة API أداة قوية تسمح للمطورين بـ بناء ونشر وإدارة واجهات برمجة التطبيقات على نطاق واسع. تعمل كبوابة بين ChatGPT والخدمات الخلفية، وتوفر ميزات مثل المصادقة، تحديد معدل الطلبات، وتحويلات الطلبات/الاستجابات.
يمكنك القراءة من المقال السابق حيث استكشفنا كيف يمكن أن تكون بوابة API مفيدة لمطوري إضافات ChatGPT لـ عرض، تأمين، إدارة، ومراقبة نقاط نهاية واجهات برمجة التطبيقات الخاصة بهم. يرشدك هذا المقال خطوة بخطوة عبر الطريقة البسيطة والمباشرة لـ تطوير إضافة ChatGPT لبوابة API. كمكافأة ممتعة، ستتعلم أيضًا كيفية إضافة إضافتك إلى ChatGPT وتجربتها. لذا، استعد واستمتع بهذه الرحلة!
كيفية إنشاء إضافة ChatGPT لبوابة API
كما يوضح دليل البدء على موقع OpenAI، لبناء أي إضافة ChatGPT مخصصة جديدة، نحتاج إلى اتباع هذه الخطوات العامة الثلاث:
- تطوير واجهة برمجة تطبيقات أو استخدام واجهة موجودة، والتي تنفذ مواصفات OpenAPI.
- توثيق واجهة برمجة التطبيقات باستخدام تنسيق YAML أو JSON لـ OpenAPI.
- إنشاء ملف JSON لبيان الإضافة يحتوي على معلومات أساسية عن الإضافة.
باتباع الخطوات المذكورة أعلاه، سنقوم ببناء إضافة مخصصة لـ ChatGPT تعمل كـ بوابة API لخدمات واجهات برمجة التطبيقات الخلفية. كمثال، في واجهة مستخدم ChatGPT، إذا أراد المستخدم إدخال بوابة API أمام واجهة برمجة تطبيقات Conference API الحالية للحصول على تفاصيل عن جلسات ومحاور المتحدث، فإن الإضافة قادرة على استقبال الأوامر في الدردشة ثم توجيه طلب المستخدم إلى واجهة برمجة تطبيقات إدارة Apache APISIX، والتي تنشئ مسارًا مع تكوين الإدخال المحدد من قبل المستخدم. يمكن أن تكون هذه طريقة أخرى لـ استخدام الروبوت الدردشة لتكوين ميزات بوابة API. انظر الناتج النموذجي أدناه:
بعد نجاح تشغيل الأمر، ينشئ APISIX المسار ويسجل Upstream لواجهة برمجة تطبيقات Conference الخلفية. لذا، يمكنك الوصول إلى مجال بوابة API ومسار URL للحصول على استجابة عبر البوابة. على سبيل المثال، هذا الطلب GET إلى http://localhost:9080/speaker/1/sessions يعيد جميع جلسات المتحدث من واجهة برمجة تطبيقات Conference. يمكنك أيضًا القيام بعمليات أساسية مثل الحصول على جميع المسارات، مسار بواسطة Id، تحديث مسار موجود أو إنشاء مسار مع إضافات و upstream مباشرة عن طريق سؤال ChatGPT.
لفهم تدفق البيانات بين المكونات المختلفة، يمكنك الرجوع إلى الرسم التخطيطي المعماري المقدم:
المتطلبات الأساسية
- قبل البدء، من الجيد أن يكون لديك فهم أساسي لـ APISIX. الإلمام ببوابة API، ومفاهيمها الرئيسية مثل المسارات، upstream، واجهة برمجة تطبيقات الإدارة، الإضافات، وبروتوكول HTTP سيكون مفيدًا أيضًا.
- يتم استخدام Docker لتثبيت etcd و APISIX المعبأة في حاويات.
- قم بتنزيل Visual Studio Code المتوافق مع نظام التشغيل الخاص بك، أو استخدم أي محرر أكواد آخر مثل IntelliJ IDEA، PyCharm، إلخ.
- لتطوير إضافات ChatGPT المخصصة، تحتاج إلى امتلاك حساب ChatGPT Plus والانضمام إلى قائمة انتظار الإضافات.
يقع مستودع الكود الكامل لإضافة بوابة API هنا. دعنا نمر بالخطوات واحدة تلو الأخرى بما في ذلك مقاطع الكود، الملفات ونفهم كيفية إعداد بوابة API، توثيق واجهة برمجة التطبيقات في تعريف OpenAPI، وإنشاء ملف بيان الإضافة.
تكنولوجيا التطوير المستخدمة لتطوير هذه الإضافة تشمل ما يلي:
- واجهة برمجة تطبيقات Conference API العامة الحالية حيث نستخدم نقطتي نهاية API لاسترداد الجلسات والمحاور للمتحدث في العرض التوضيحي. يمكنك اكتشاف واجهات برمجة تطبيقات أخرى في متصفحك.
- بوابة API Apache APISIX لعرض واجهة برمجة تطبيقات الإدارة وإدارة حركة واجهات برمجة التطبيقات.
- نص Python لتشغيل الإضافة، استضافة ملف بيان الإضافة، مواصفات OpenAPI، وملفات شعار الإضافة على عنوان URL المحلي http://localhost:5000/.
- يستخدم المشروع 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:
ai-plugin.json
سيكون متاحًا على مسار URI http://localhost:5000/.well-known/ai-plugin.jsonopenapi.yaml
سيكون متاحًا على مسار URI http://localhost:5000/openapi.yamllogo.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 يتحقق بنجاح من كل من ملف البيان ومواصفات OpenAPI.
الخطوة 3: اختبار الإضافة المخصصة
الآن الإضافة متصلة بواجهة ChatGPT، يمكننا كتابة أمر بسيط:
بما أنه ليس لدينا أي مسار في APISIX، يمكننا إنشاء مسار جديد. هنا، اعتمادًا على اللغة المستخدمة في طلبنا، سيختار ChatGPT استدعاء نقاط نهاية APISIX المناسبة. يرجى محاولة كتابة أمر بتفاصيل أكثر تحديدًا حتى يتمكن ChatGPT من إنشاء مسار بشكل صحيح.
الآن تم إنشاء المسار، يمكنك الوصول إلى نقطة نهاية البوابة لاسترداد تفاصيل جلسات Conference: http://localhost:9080/speaker/1/sessions. يمكنك أيضًا استبدال واجهة برمجة تطبيقات Conference بواجهة برمجة تطبيقاتك الخلفية.
حالات استخدام أخرى لإضافة بوابة API المخصصة
الآن يمكنك طرح سؤال: ما الذي يمكنك فعله بهذه الإضافة بخلاف توجيه الطلبات ببساطة؟ هناك العديد من الأشياء التي يمكنك تحسينها في هذه الإضافة أو إضافة ميزات إضافية التي توفرها APISIX عبر واجهة برمجة تطبيقات الإدارة. لأننا وضعنا بوابة API أمام واجهة برمجة تطبيقات Conference وتخدم بوابة API جميع الطلبات القادمة من الإضافة أولاً، يمكنك تحقيق ما يلي على الأقل:
- الأمان: افترض أنك تريد الآن تأمين واجهة برمجة تطبيقات Conference، بدون بوابة API في مكانها، يمكنك