لمن يعود الرمز. أول استدعاء تجريه برمز جديد.
{
"data": {
"user_id": "Xy12...",
"token": {"id": 7, "name": "Sales dashboard", "expires_at": "2027-01-30T10:00:00Z"}
}
}
درّب نموذجًا في بياني، ثم استخدمه من شيفرتك الخاصة. أرسل الصفوف بصيغة JSON واحصل على التنبؤات — من نص برمجي، أو مهمة جدول بيانات، أو خدمة خلفية، أو دفتر ملاحظات برمجي.
https://bayanii.com/api/v1
ثلاث خطوات من الصفر إلى أول تنبؤ. تحتاج إلى حساب في بياني يضم نموذجًا مدرَّبًا واحدًا على الأقل.
سجّل الدخول وافتح الحساب ← الواجهة البرمجية. سمِّ الرمز باسم تتعرّف عليه لاحقًا (مثل البرنامج الذي سيستخدمه)، واختر مدة صلاحيته، ثم انسخه. يبدأ الرمز بـ bay_ ولا يُعرض إلا مرة واحدة.
احفظه في متغيّر بيئة، لا في شيفرتك:
export BAYANII_TOKEN="bay_..."
اعرض قائمة نماذجك. دوّن معرّف النموذج الذي تريده وأعمدة الإدخال التي يتوقعها.
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}
}
أرسل كائنًا واحدًا لكل صف، يكون فيه كل عمود إدخال مفتاحًا.
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:
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"]}
}
}
خمس نقاط نهاية، جميعها تحت عنوان URL الأساسي. النموذج الذي ليس في حسابك يُجاب عنه بالحالة 404، تمامًا كالنموذج غير الموجود.
لمن يعود الرمز. أول استدعاء تجريه برمز جديد.
{
"data": {
"user_id": "Xy12...",
"token": {"id": 7, "name": "Sales dashboard", "expires_at": "2027-01-30T10:00:00Z"}
}
}
نماذجك الحالية الجاهزة، الأحدث أولًا.
| الاسم | النوع | الوصف |
|---|---|---|
limitعدد صحيح |
عدد صحيح | عدد النتائج المُعادة، من 1 إلى 100. الافتراضي 50. |
offsetعدد صحيح |
عدد صحيح | عدد النتائج التي تُتخطّى. الافتراضي 0. استخدم meta.has_more لتعرف متى تتوقف. |
لكل نموذج حقل "input": القيمة "rows" تعني أنك ترسل صفوف إدخال؛ والقيمة "steps" تعني أنه نموذج تنبؤ زمني بلا أعمدة إدخال، فترسل عدد الفترات المستقبلية التي تريدها.
نموذج واحد، مع ما يتوقعه من مدخلات بالضبط: نوع كل عمود، والمدى الذي رآه في التدريب، والفئات التي يعرفها.
{
"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": أفقه (عدد الفترات التي يستطيع التنبؤ بها) وعرض مجال التنبؤ.
التنبؤ. يُشرح جسم الطلب والاستجابة في قسم «إجراء التنبؤات» أدناه.
| الاسم | النوع | الوصف |
|---|---|---|
rowsمصفوفة كائنات |
مصفوفة كائنات | صفوف الإدخال، من 1 إلى 10,000 — كائن واحد لكل صف، يكون فيه كل عمود إدخال مفتاحًا. ولنموذج التنبؤ الزمني ذي أعمدة الإدخال: صف واحد لكل فترة مستقبلية، حتى أفقه. |
stepsعدد صحيح |
عدد صحيح | فقط لنموذج تنبؤ زمني قيمة "input" فيه "steps": عدد الفترات المستقبلية، من 1 إلى أفقه. الافتراضي: الأفق. |
storeقيمة منطقية |
قيمة منطقية | احفظ النتائج أيضًا كملف CSV يمكنك تنزيله من صفحة النموذج. الافتراضي false. وتظهر الدفعة في سجل النموذج في الحالتين. |
سجل تنبؤات النموذج — الدفعات من الموقع ومن الواجهة البرمجية — الأحدث أولًا.
| الاسم | النوع | الوصف |
|---|---|---|
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}
}
| الاسم | النوع | الوصف |
|---|---|---|
predictionsمصفوفة |
مصفوفة | عنصر واحد لكل صف إدخال، بالترتيب نفسه. "prediction" هي القيمة — اسم الفئة في التصنيف، أو كائن من «الهدف ← القيمة» لنموذج متعدد الأهداف. |
confidenceرقم من 0 إلى 1 |
رقم من 0 إلى 1 | في التصنيف فقط، حين تعطي الخوارزمية احتمالات: مدى ثقة النموذج، مع الفئة التالية runner_up وثقتها runner_up_confidence. |
period / lower / upperالتنبؤات الزمنية |
التنبؤات الزمنية | الفترة المستقبلية التي تخصّها كل قيمة، ومجال تنبؤ بنسبة 90% حولها. |
warningsمصفوفة |
مصفوفة | أمور جديرة بالمعرفة عن مدخلاتك — انظر أدناه. وتبقى التنبؤات قائمة. |
prediction_run_idعدد صحيح أو null |
عدد صحيح أو 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_caution |
caution | رقم خارج المدى الذي رآه النموذج في التدريب. |
unseen_caution |
caution | فئة لم يرها النموذج قط في التدريب. |
rare_caution |
caution | فئة رآها النموذج بضع مرات فقط. |
empty_caution |
caution | مُلئت الخلايا الفارغة بالطريقة التي تعلّمها النموذج. |
non_caution |
caution | عومل النص في عمود رقمي كقيمة فارغة. |
missing_caution |
caution | عمود يستخدمه النموذج لم يكن صالحًا للاستخدام. |
extra_notice |
notice | تُجوهلت مفاتيح لا يستخدمها النموذج. |
low_caution |
caution | لم يكن النموذج واثقًا من بعض الصفوف. |
driftdriftcaution |
caution | تبدو هذه الدفعة مختلفة عن بيانات التدريب إجمالًا. |
sklearn_notice |
notice | دُرِّب النموذج على إصدار أقدم من المكتبة. |
يأخذ نموذج التنبؤ الزمني الذي لا أعمدة إدخال له "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_ |
invalid_json |
جسم الطلب ليس JSON صالحًا. |
401unauthorized |
unauthorized |
الرمز مفقود أو غير معروف أو ملغى أو منتهي الصلاحية. |
404not_ |
not_found |
لا توجد نقطة نهاية كهذه، أو لا يوجد نموذج بهذا المعرّف في حسابك. |
405method_ |
method_not_allowed |
طريقة HTTP خاطئة — تسرد الترويسة Allow الطرق الصحيحة. |
409model_ |
model_not_ready |
ملفات النموذج غير مكتملة (لم يكتمل حفظ تدريبه). |
409model_ |
model_too_large |
النموذج أكبر من أن يُحمَّل على الخادم (دُرِّب قبل أن يُبقى كل نموذج ضمن الحد) — أعد تدريبه. التفاصيل: footprint_mb وlimit_mb وfootprint_is_lower_bound (true: عُدّ الحجم حتى الحد فقط). |
413payload_ |
payload_too_large |
جسم الطلب أكبر من حد الرفع. |
415unsupported_ |
unsupported_media_type |
لم يُرسَل جسم الطلب بصيغة application/json. |
422invalid_ |
invalid_body |
جسم الطلب أو أحد الصفوف ليس بالشكل المتوقع؛ ويحدد details الموضع. |
422unknown_ |
unknown_field |
حقل لا تقبله نقطة النهاية هذه. |
422field_ |
field_not_allowed |
أُرسل "rows" إلى نموذج تنبؤ زمني يقبل "steps" فقط، أو "steps" إلى أي نموذج آخر. |
422missing_ |
missing_columns |
ينقص أحدَ الصفوف بعضُ أعمدة الإدخال؛ ويسمّي details الصف والأعمدة. |
422invalid_ |
invalid_value |
قيمة من نوع خاطئ أو خارج النطاق. |
422too_ |
too_many_rows |
صفوف أكثر من المسموح؛ ويحدد details.max_rows العدد. |
422invalid_ |
invalid_parameter |
معامل استعلام خارج النطاق. |
422prediction_ |
prediction_failed |
لم يستطع النموذج استخدام القيم المرسلة؛ ويوضّح details.reason السبب. |
429rate_ |
rate_limited |
طلبات كثيرة جدًا — انتظر عدد الثواني الوارد في الترويسة Retry-After. |
500internal_ |
internal_error |
حدث خلل من جهتنا. |
تُحتسب الحدود لكل حساب — لجميع رموزك معًا. اجمع الصفوف في طلب واحد بدل إرسال طلب لكل صف: فهذا أسرع لك ويُحتسب مرة واحدة.
تنبؤ مع معالجة الأخطاء، يقرأ الرمز من متغيرات البيئة.
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 في العمل إلى جانبه.
هل تعثّرت، أو ينقصك شيء؟
أخبرنا بما تبنيه — فالواجهة البرمجية تنمو مما يحتاجه الناس.