الانتقال إلى المحتوى
Bayanii
المطوّرون

واجهة بياني البرمجية

درّب نموذجًا في بياني، ثم استخدمه من شيفرتك الخاصة. أرسل الصفوف بصيغة JSON واحصل على التنبؤات — من نص برمجي، أو مهمة جدول بيانات، أو خدمة خلفية، أو دفتر ملاحظات برمجي.

عنوان URL الأساسي
https://bayanii.com/api/v1
الصيغة
JSON في الطلب والاستجابة
المصادقة
رمز Bearer
الإصدار
v1
الصفوف في كل طلب
حتى 10,000

بداية سريعة

ثلاث خطوات من الصفر إلى أول تنبؤ. تحتاج إلى حساب في بياني يضم نموذجًا مدرَّبًا واحدًا على الأقل.

  1. 1

    إنشاء رمز

    سجّل الدخول وافتح الحساب ← الواجهة البرمجية. سمِّ الرمز باسم تتعرّف عليه لاحقًا (مثل البرنامج الذي سيستخدمه)، واختر مدة صلاحيته، ثم انسخه. يبدأ الرمز بـ bay_ ولا يُعرض إلا مرة واحدة.

    احفظه في متغيّر بيئة، لا في شيفرتك:

    الطرفية
    export BAYANII_TOKEN="bay_..."
  2. 2

    اعثر على نموذجك

    اعرض قائمة نماذجك. دوّن معرّف النموذج الذي تريده وأعمدة الإدخال التي يتوقعها.

    curl
    curl -H "Authorization: Bearer $BAYANII_TOKEN" \
      https://bayanii.com/api/v1/models
    الاستجابة
    {
      "data": [
        {
          "id": 88,
          "name": "Churn",
          "task_type": "classification",
          "targets": ["churned"],
          "input_columns": ["tenure", "plan", "monthly_charges"],
          "input": "rows",
          ...
        }
      ],
      "meta": {"total": 1, "limit": 50, "offset": 0, "has_more": false}
    }
  3. 3

    احصل على تنبؤ

    أرسل كائنًا واحدًا لكل صف، يكون فيه كل عمود إدخال مفتاحًا.

    curl
    curl -X POST https://bayanii.com/api/v1/models/88/predictions \
      -H "Authorization: Bearer $BAYANII_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"rows": [{"tenure": 12, "plan": "monthly", "monthly_charges": 70.5}]}'
    الاستجابة
    {
      "data": {
        "model_id": 88,
        "task_type": "classification",
        "row_count": 1,
        "predictions": [
          {"prediction": "yes", "confidence": 0.82, "runner_up": "no", "runner_up_confidence": 0.18}
        ],
        "warnings": [],
        "prediction_run_id": 1234,
        "stored": false
      }
    }

المصادقة

يحمل كل طلب رمزك في ترويسة Authorization:

HTTP
Authorization: Bearer bay_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • مدة العمل

    30 أو 90 أو 365 يومًا، أو دون انتهاء. حتى 10 رموز نشطة لكل حساب.

  • الإلغاء

    ألغِ الرمز من الحساب ← الواجهة البرمجية. يُرفض الطلب التالي الذي يحمله.

  • تغييرات الحساب

    حذف حسابك يحذف رموزه. وتتوقف رموز الحساب المعطَّل عن العمل خلال 15 دقيقة.

  • إدارة الرموز

    لا يستطيع الرمز إنشاء الرموز أو عرضها أو إلغاءها — فذلك يتطلب أن تكون أنت مسجّل الدخول.

عامِل الرمز معاملة كلمة المرور

يستطيع أي شخص يملكه استخدام نماذجك. استدعِ الواجهة البرمجية من خادم أو نص برمجي أو دفتر ملاحظات — ولا تستدعها أبدًا من شيفرة تعمل في متصفح الزائر، حيث يصبح الرمز مرئيًا للجميع. والمتصفحات لا تستطيع استدعاء الواجهة من موقع آخر على أي حال.

إذا تسرّب رمز، فألغِه وأنشئ رمزًا جديدًا. لا يحتفظ بياني إلا ببصمة لكل رمز، لذا لا يمكن عرض رمز مفقود مرة أخرى — أنشئ رمزًا جديدًا بدلًا منه.

الطلبات والاستجابات

لكل استجابة الشكل نفسه: النتيجة تحت "data"، أو المشكلة تحت "error" — ولا يجتمعان أبدًا. تحقّق من حالة HTTP أولًا، ثم اقرأ المفتاح المقابل.

نجاح
{
  "data": { ... },
  "meta": { ... }
}
إخفاق
{
  "error": {
    "code": "missing_columns",
    "message": "Row 3 is missing: plan.",
    "details": {"row": 3, "columns": ["plan"]}
  }
}
  • يظهر "meta" في القوائم ويحمل معلومات التنقّل بين الصفحات.
  • اعتمد على "code" في منطق برنامجك — فهو لا يتغيّر أبدًا. أما "message" فجملة موجّهة للناس تتبع ترويسة Accept-Language (en أو ar؛ والإنجليزية افتراضيًا).
  • الطوابع الزمنية مثل created_at وexpires_at بصيغة ISO 8601 بالتوقيت العالمي المنسّق (UTC)، وتنتهي بالحرف Z — مثل 2026-11-01T09:30:00Z. أما period في التنبؤ الزمني فهو التاريخ كما ورد في بيانات تدريبك، دون إضافة منطقة زمنية.
  • أرسل أجسام الطلبات بصيغة JSON مع الترويسة Content-Type: application/json.
  • لا تُخزَّن الاستجابات مؤقتًا أبدًا (Cache-Control: no-store): فقد تحمل بياناتك.

نقاط النهاية

خمس نقاط نهاية، جميعها تحت عنوان URL الأساسي. النموذج الذي ليس في حسابك يُجاب عنه بالحالة 404، تمامًا كالنموذج غير الموجود.

GET /me

لمن يعود الرمز. أول استدعاء تجريه برمز جديد.

الاستجابة
{
  "data": {
    "user_id": "Xy12...",
    "token": {"id": 7, "name": "Sales dashboard", "expires_at": "2027-01-30T10:00:00Z"}
  }
}
GET /models

نماذجك الحالية الجاهزة، الأحدث أولًا.

معاملات الاستعلام

الاسم الوصف
limitعدد صحيح عدد النتائج المُعادة، من 1 إلى 100. الافتراضي 50.
offsetعدد صحيح عدد النتائج التي تُتخطّى. الافتراضي 0. استخدم meta.has_more لتعرف متى تتوقف.

لكل نموذج حقل "input": القيمة "rows" تعني أنك ترسل صفوف إدخال؛ والقيمة "steps" تعني أنه نموذج تنبؤ زمني بلا أعمدة إدخال، فترسل عدد الفترات المستقبلية التي تريدها.

GET /models/{id}

نموذج واحد، مع ما يتوقعه من مدخلات بالضبط: نوع كل عمود، والمدى الذي رآه في التدريب، والفئات التي يعرفها.

الاستجابة
{
  "data": {
    "id": 88,
    "name": "Churn",
    "task_type": "classification",
    "input_schema": {
      "features": [
        {"name": "tenure", "dtype": "numeric", "min": 0, "max": 72, "integer": true},
        {"name": "plan", "dtype": "categorical", "options": ["monthly", "yearly"], "options_complete": true}
      ],
      "order": ["tenure", "plan", "monthly_charges"]
    }
  }
}

ولنموذج التنبؤ الزمني أيضًا الحقل "forecast": أفقه (عدد الفترات التي يستطيع التنبؤ بها) وعرض مجال التنبؤ.

POST /models/{id}/predictions

التنبؤ. يُشرح جسم الطلب والاستجابة في قسم «إجراء التنبؤات» أدناه.

جسم الطلب

الاسم الوصف
rowsمصفوفة كائنات صفوف الإدخال، من 1 إلى 10,000 — كائن واحد لكل صف، يكون فيه كل عمود إدخال مفتاحًا. ولنموذج التنبؤ الزمني ذي أعمدة الإدخال: صف واحد لكل فترة مستقبلية، حتى أفقه.
stepsعدد صحيح فقط لنموذج تنبؤ زمني قيمة "input" فيه "steps": عدد الفترات المستقبلية، من 1 إلى أفقه. الافتراضي: الأفق.
storeقيمة منطقية احفظ النتائج أيضًا كملف CSV يمكنك تنزيله من صفحة النموذج. الافتراضي false. وتظهر الدفعة في سجل النموذج في الحالتين.
GET /models/{id}/predictions

سجل تنبؤات النموذج — الدفعات من الموقع ومن الواجهة البرمجية — الأحدث أولًا.

معاملات الاستعلام

الاسم الوصف
limitعدد صحيح عدد النتائج المُعادة، من 1 إلى 100. الافتراضي 20.
beforeعدد صحيح أعِد الدفعات الأقدم من هذا المعرّف. للصفحة التالية، مرّر قيمة meta.next_before من الصفحة التي لديك.
الاستجابة
{
  "data": [
    {"id": 1234, "created_at": "2026-11-01T09:30:00Z", "row_count": 2,
     "input_method": "api", "drift": false, "stored": false}
  ],
  "meta": {"limit": 20, "has_more": true, "next_before": 1234}
}

إجراء التنبؤات

ما ترسله

  • يجب أن يحضر كل عمود إدخال في كل صف. قد تكون القيمة رقمًا أو نصًا أو true / false، أو null لخلية فارغة — ويملأ النموذج الخلية الفارغة بالطريقة التي اتبعها في التدريب.
  • تُتجاهَل المفاتيح الزائدة، ويسمّيها تحذير، كي لا يمرّ خطأ إملائي في اسم عمود دون أن يُلاحَظ.
  • استخدم input_schema الخاص بالنموذج لبناء الصفوف: أسماء الأعمدة بدقة، والقيم التي يعرفها للفئات.

ما تحصل عليه

الاسم الوصف
predictionsمصفوفة عنصر واحد لكل صف إدخال، بالترتيب نفسه. "prediction" هي القيمة — اسم الفئة في التصنيف، أو كائن من «الهدف ← القيمة» لنموذج متعدد الأهداف.
confidenceرقم من 0 إلى 1 في التصنيف فقط، حين تعطي الخوارزمية احتمالات: مدى ثقة النموذج، مع الفئة التالية runner_up وثقتها runner_up_confidence.
period / lower / upperالتنبؤات الزمنية الفترة المستقبلية التي تخصّها كل قيمة، ومجال تنبؤ بنسبة 90% حولها.
warningsمصفوفة أمور جديرة بالمعرفة عن مدخلاتك — انظر أدناه. وتبقى التنبؤات قائمة.
prediction_run_idعدد صحيح أو null قيد هذه الدفعة في السجل؛ أو null إن تعذّر تسجيله.
storedقيمة منطقية هل حُفظ ملف النتائج CSV فعلًا. احتفظ بنسختك الخاصة ما لم تكن القيمة true.

التحذيرات

لكل تحذير رمز ودرجة خطورة وعنوان ورسالة. "caution" تعني أن التنبؤ قد يكون أقل موثوقية؛ و"notice" للعلم فقط.

تحذير واحد
{
  "code": "out_of_range",
  "severity": "caution",
  "title": "Values outside the training range",
  "message": "Values in \"tenure\" are outside the range seen during training (0–72; count: 1). They were not changed.",
  "details": {"column": "tenure", "min": 0, "max": 72, "count": 1}
}
الرمز المعنى
out_of_rangecaution رقم خارج المدى الذي رآه النموذج في التدريب.
unseen_categoriescaution فئة لم يرها النموذج قط في التدريب.
rare_categoriescaution فئة رآها النموذج بضع مرات فقط.
empty_cellscaution مُلئت الخلايا الفارغة بالطريقة التي تعلّمها النموذج.
non_numeric_valuescaution عومل النص في عمود رقمي كقيمة فارغة.
missing_columncaution عمود يستخدمه النموذج لم يكن صالحًا للاستخدام.
extra_columnsnotice تُجوهلت مفاتيح لا يستخدمها النموذج.
low_confidencecaution لم يكن النموذج واثقًا من بعض الصفوف.
driftcaution تبدو هذه الدفعة مختلفة عن بيانات التدريب إجمالًا.
sklearn_version_mismatchnotice دُرِّب النموذج على إصدار أقدم من المكتبة.

نماذج التنبؤ الزمني

يأخذ نموذج التنبؤ الزمني الذي لا أعمدة إدخال له "steps" بدل الصفوف، ويعود كل عنصر بفترته الزمنية ومجال التنبؤ حوله:

جسم الطلب
{"steps": 3}
عنصر واحد
{
  "period": "2026-01-01T00:00:00",
  "prediction": 120.5,
  "lower": 98.1,
  "upper": 141.7
}

الأخطاء

تعني الحالة 4xx أن في الطلب ما يحتاج إلى إصلاح — وإعادة الطلب نفسه ستفشل بالطريقة نفسها، باستثناء 429. أما الحالة 5xx فمن جهتنا: أعد المحاولة لاحقًا، واذكر details.request_id إن تواصلت معنا.

الحالة المعنى
400invalid_json جسم الطلب ليس JSON صالحًا.
401unauthorized الرمز مفقود أو غير معروف أو ملغى أو منتهي الصلاحية.
404not_found لا توجد نقطة نهاية كهذه، أو لا يوجد نموذج بهذا المعرّف في حسابك.
405method_not_allowed طريقة HTTP خاطئة — تسرد الترويسة Allow الطرق الصحيحة.
409model_not_ready ملفات النموذج غير مكتملة (لم يكتمل حفظ تدريبه).
409model_too_large النموذج أكبر من أن يُحمَّل على الخادم (دُرِّب قبل أن يُبقى كل نموذج ضمن الحد) — أعد تدريبه. التفاصيل: footprint_mb وlimit_mb وfootprint_is_lower_bound (true: عُدّ الحجم حتى الحد فقط).
413payload_too_large جسم الطلب أكبر من حد الرفع.
415unsupported_media_type لم يُرسَل جسم الطلب بصيغة application/json.
422invalid_body جسم الطلب أو أحد الصفوف ليس بالشكل المتوقع؛ ويحدد details الموضع.
422unknown_field حقل لا تقبله نقطة النهاية هذه.
422field_not_allowed أُرسل "rows" إلى نموذج تنبؤ زمني يقبل "steps" فقط، أو "steps" إلى أي نموذج آخر.
422missing_columns ينقص أحدَ الصفوف بعضُ أعمدة الإدخال؛ ويسمّي details الصف والأعمدة.
422invalid_value قيمة من نوع خاطئ أو خارج النطاق.
422too_many_rows صفوف أكثر من المسموح؛ ويحدد details.max_rows العدد.
422invalid_parameter معامل استعلام خارج النطاق.
422prediction_failed لم يستطع النموذج استخدام القيم المرسلة؛ ويوضّح details.reason السبب.
429rate_limited طلبات كثيرة جدًا — انتظر عدد الثواني الوارد في الترويسة Retry-After.
500internal_error حدث خلل من جهتنا.

الحدود

تُحتسب الحدود لكل حساب — لجميع رموزك معًا. اجمع الصفوف في طلب واحد بدل إرسال طلب لكل صف: فهذا أسرع لك ويُحتسب مرة واحدة.

طلب تنبؤ في الدقيقة
30
طلبًا آخر في الدقيقة
120
صف في كل طلب تنبؤ
10,000
رموز نشطة لكل حساب
10

أمثلة كاملة

تنبؤ مع معالجة الأخطاء، يقرأ الرمز من متغيرات البيئة.

Python · requests
import os
import requests

API = "https://bayanii.com/api/v1"
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['BAYANII_TOKEN']}"

rows = [
    {"tenure": 12, "plan": "monthly", "monthly_charges": 70.5},
    {"tenure": 48, "plan": "yearly", "monthly_charges": 55.0},
]
resp = session.post(f"{API}/models/88/predictions", json={"rows": rows}, timeout=120)
body = resp.json()

if resp.ok:
    for row, p in zip(rows, body["data"]["predictions"]):
        print(row, "->", p["prediction"], p.get("confidence"))
    for w in body["data"]["warnings"]:
        if w["severity"] == "caution":
            print("caution:", w["message"])
elif resp.status_code == 429:
    print("Slow down; retry after", resp.headers.get("Retry-After"), "seconds")
else:
    print(resp.status_code, body["error"]["code"], body["error"]["message"])

الإصدارات

الإصدار جزء من عنوان URL. وضمن v1 قد نضيف نقاط نهاية وحقول استجابة ورموز تحذيرات ورموز أخطاء، لذا تجاهل الحقول التي لا تعرفها. لن نعيد تسمية حقل أو نحذفه أو نغيّر معنى رمز — فتغيير كهذا يصبح /api/v2، ويستمر v1 في العمل إلى جانبه.

هل تعثّرت، أو ينقصك شيء؟

أخبرنا بما تبنيه — فالواجهة البرمجية تنمو مما يحتاجه الناس.

تواصل معنا