SheetDiff™Structural Diff API

Structural Diff API

واجهة REST API تقارن النص المُنشأ بالذكاء الاصطناعي بالنسخة المُحرَّرة من قِبل المُعلِّم — تكشف التغييرات الهيكلية على مستوى الصفوف (تقسيم، دمج، تعديل، إضافة، حذف)، مع تفاصيل الفروق لكل عمود، ودرجات CER/WER/SER، ودرجة جودة مركّبة لكل دُفعة.

مصادقة بمفتاح API
رأس x-api-key
حدود الاستخدام
10/دقيقة · 60/15دقيقة
REST JSON
application/json
محرك 8 مراحل
كشف التقسيم والدمج

البدء السريع

لا حاجة إلى SDK. أرسل طلب POST مع مصفوفتين من صفوف النص المكتوب وستتلقى diff كاملاً بصيغة JSON. الـ API في مرحلة الاختبار — اطلب مفتاح API للبدء.

١. تحقق من أن الخدمة تعمل:

bash
curl https://structural-diff-engine.onrender.com/v1/health

٢. شغّل مقارنة:

curl -X POST https://structural-diff-engine.onrender.com/v1/diff \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "original": [
      { "speaker": "Alice", "start_time": 0, "end_time": 1, "transcript": "Hello world" },
      { "speaker": "Bob",   "start_time": 1, "end_time": 3, "transcript": "Good morning everyone" }
    ],
    "reworked": [
      { "speaker": "Alice", "start_time": 0, "end_time": 1, "transcript": "Hello there" },
      { "speaker": "Bob",   "start_time": 1, "end_time": 2, "transcript": "Good morning" },
      { "speaker": "Bob",   "start_time": 2, "end_time": 3, "transcript": "everyone" }
    ]
  }'

عنوان URL الأساسي

جميع نقاط الاتصال مسبوقة بـ /v1.

url
https://structural-diff-engine.onrender.com

المصادقة

أضف مفتاح API في رأس الطلب x-api-key عند كل استدعاء لـ /v1/diff.

bash
curl -H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -X POST https://structural-diff-engine.onrender.com/v1/diff -d '{...}'
تُخصَّص المفاتيح بشكل فردي لكل وكالة. مفتاح مفقود أو غير صالح يُعيد 401 Unauthorized.

حدود الاستخدام

يُطبَّق مستويان مستقلان لكل مفتاح API، مع الرجوع إلى IP عند غيابه. تجاوز أي مستوى يُعيد 429 Too Many Requests.

المستوىالحدرأس الاستجابة
دفعي10 طلبات / دقيقةRateLimit-Limit
نافذة60 طلباً / 15 دقيقةRateLimit-Remaining

نقاط الاتصال

GET /v1/health

فحص خفيف للتوفر. لا تتطلب مصادقة. تُعيد إصدار الخدمة ومدة التشغيل.

GET/v1/health· بدون مصادقة
json
{ "status": "ok", "version": "1.0.0", "uptime": 42, "timestamp": "..." }

POST /v1/diff

قارن مصفوفتين من صفوف النص المكتوب. تُعيد النتائج على مستوى الصفوف مع درجات الجودة. الحجم الأقصى: 5 ميجابايت · الصفوف القصوى: 30,000.

POST/v1/diff مصادقة مطلوبة

جسم الطلب

NameTypeDescription
original*arrayكائنات الصفوف من النسخة الأصلية / الأساسية.
reworked*arrayكائنات الصفوف للمقارنة.
configobjectتجاوزات اختيارية للخوارزمية. انظر .
headersstring[]أسماء الأعمدة — مطلوبة عند استخدام إدخال مصفوفة ثنائية الأبعاد.
columnMappingobjectخريطة فهارس الأعمدة لإدخال المصفوفة ثنائية الأبعاد. انظر .

حقول كائن الصف

جميع الحقول اختيارية باستثناء transcript. تُمرَّر الحقول غير المعروفة دون تغيير.

NameTypeDescription
transcript*stringالمحتوى النصي للصف.
speakerstringاسم المتحدث أو معرّفه.
start_timenumber|stringوقت بدء المقطع بالثواني.
end_timenumber|stringوقت انتهاء المقطع بالثواني.
non_speech_eventsstringتعليقات توضيحية مثل [موسيقى]، [ضحك].
emotionstringوسم العاطفة.
languagestringرمز اللغة (مثال: "ar"، "en").
localestringرمز اللهجة الإقليمية (مثال: "ar-MA").
accentstringوسم اللكنة.

شكل الاستجابة

جميع الاستجابات الناجحة تستخدم هذا الغلاف:

json
{
  "status": "success",
  "requestId": "550e8400-e29b-41d4-a716-446655440000",
  "timestamp": "2026-04-08T21:00:00.000Z",
  "data": {
    "results": [
      {
        "status": "MODIFIED",
        "originalRow": { "transcript": "Hello world", ... },
        "reworkedRow": { "transcript": "Hello there", ... },
        "notes": "transcript changed"
      },
      {
        "status": "SPLIT",
        "originalRow": { "transcript": "Good morning everyone", ... },
        "reworkedRows": [ { "transcript": "Good morning" }, { "transcript": "everyone" } ],
        "notes": "split into 2 rows"
      }
    ],
    "scores": { "CER": 0.12, "WER": 0.18, "SER": 0.33, "cerT": 0.12, "werT": 0.18 },
    "composite": { "score": 3.8, "grade": "B", "label": "Good" },
    "meta": { "originalRows": 2, "reworkedRows": 3, "headers": [...] }
  }
}

حالات الـ diff

الحالةالمعنى
UNCHANGEDالصف متطابق في كلا النسختين.
MODIFIEDالصف موجود في كلا النسختين لكن المحتوى تغيّر.
ADDEDالصف موجود فقط في النسخة المُعادة صياغتها.
DELETEDالصف موجود فقط في النسخة الأصلية.
SPLITصف أصلي واحد قُسِّم إلى صفين أو أكثر في النسخة المُعادة.
MERGEDصفّان أصليان أو أكثر اندمجا في صف واحد في النسخة المُعادة.

الدرجات

NameTypeDescription
CERnumberمعدل خطأ الأحرف في جميع الأعمدة (0–1، الأقل كلما كان أفضل).
WERnumberمعدل خطأ الكلمات في جميع الأعمدة (0–1).
SERnumberمعدل خطأ التجزئة — نسبة الصفوف المقسّمة أو المدمجة.
cerTnumberCER محسوب فقط على عمود النص المكتوب.
werTnumberWER محسوب فقط على عمود النص المكتوب.

الدرجة المركّبة

NameTypeDescription
scorenumberدرجة الجودة الموزونة (1.0–5.0، الأعلى كلما كان أفضل).
gradestringالدرجة الحرفية: A، B، C، D، أو F.
labelstringوسم قابل للقراءة — مثال: "ممتاز"، "جيد"، "يحتاج تحسين".

خيارات الإعداد

مرّر كائن config في جسم الطلب لتجاوز القيم الافتراضية للخوارزمية. جميع الحقول اختيارية.

NameTypeDescription
simpleModebooleanتعطيل كشف التقسيم والدمج. مقارنة صف بصف فقط. الافتراضي: false.
enableSplitsbooleanتفعيل كشف الصفوف المقسّمة. الافتراضي: true.
enableMergesbooleanتفعيل كشف الصفوف المدمجة. الافتراضي: true.
enableCERbooleanحساب معدل خطأ الأحرف. الافتراضي: true.
enableWERbooleanحساب معدل خطأ الكلمات. الافتراضي: true.
enableSERbooleanحساب معدل خطأ التجزئة. الافتراضي: true.
stripDiacriticsbooleanتوحيد الأحرف العربية/المعلَّمة قبل المقارنة. الافتراضي: true.
positionalModebooleanمقارنة الصفوف بالترتيب الحرفي مع تخطي المحاذاة. الافتراضي: false.
ignoreColNamesstring[]أسماء الأعمدة المستبعدة من كشف MODIFIED. الافتراضي: [].
enableInlineDiffbooleanتضمين transcriptDiff في صفوف MODIFIED. ضبطه false لتخطي حساب الفروق حرفاً بحرف وتقليل حجم الاستجابة. الافتراضي: true.
structuralTransformsTransformRule[]قواعد find/replace تُطبَّق على الجانبين قبل حساب التشابه (حد أقصى 20 قاعدة). الافتراضي: [].

تعيين الأعمدة

عندما تكون original / reworked مصفوفات ثنائية الأبعاد (مصفوفات من مصفوفات) بدلاً من كائنات، امدد headers و/أو columnMapping لإخبار المحرك بأي فهرس يحمل كل حقل.

json
{
  "original":      [[0, 1, "Alice", "Hello world"]],
  "headers":       ["start_time", "end_time", "speaker", "transcript"],
  "columnMapping": { "transcript": 3, "speaker": 2, "start_time": 0, "end_time": 1 }
}
NameTypeDescription
transcript*integerفهرس عمود base-0 لحقل النص المكتوب.
speakerintegerفهرس عمود base-0 لحقل المتحدث.
start_timeintegerفهرس عمود base-0 لوقت البداية.
end_timeintegerفهرس عمود base-0 لوقت النهاية.
nseintegerفهرس عمود base-0 للأحداث غير الكلامية.
extraColsinteger[]فهارس أعمدة إضافية للتضمين (بحد أقصى 20).

مرجع الأخطاء

جميع الأخطاء تستخدم غلافاً موحداً:

json
{
  "status": "error",
  "requestId": "550e8400-...",
  "timestamp": "2026-04-08T21:00:00.000Z",
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Validation failed",
    "details": [{ "field": "original", "message": "\"original\" is required" }]
  }
}
HTTPالرمزالسبب
400BAD_REQUESTجسم JSON ذو تنسيق خاطئ
401UNAUTHORIZEDرأس x-api-key مفقود أو غير صالح
404NOT_FOUNDنقطة اتصال غير معروفة
413PAYLOAD_TOO_LARGEجسم الطلب يتجاوز 5 ميجابايت
422VALIDATION_ERRORفشل التحقق من صحة الجسم (انظر مصفوفة details)
429RATE_LIMIT_EXCEEDEDتجاوز حد الدفعة أو حد النافذة
500INTERNAL_ERRORخطأ غير متوقع في الخادم أو المحرك

تتبع الطلبات

قدّم رأس x-request-id لربط الطلبات عبر نظامك. أحرف أبجدية رقمية وشرطات وشرحطات سفلية فقط، بحد أقصى 64 حرفاً. تُعاد القيمة في رؤوس الاستجابة.

bash
curl -H "x-request-id: job-2026-01-batch-3" \
  -H "x-api-key: YOUR_KEY" \
  -X POST https://structural-diff-engine.onrender.com/v1/diff -d '{...}'

الحصول على وصول API

الـ API متاحة للوكالات والفرق في مرحلة الاختبار. تُخصَّص المفاتيح بشكل فردي. تواصل معنا لتلقي مفتاحك والبدء في التكامل.

Structural Diff API · v1.0 · تطوير Mohamed Yaakoubiالعودة إلى SheetDiff™