YOLO Vision 2026:

مرجع REST API#

يوفر Ultralytics Platform واجهة برمجة تطبيقات (REST API) للوصول البرمجي إلى مجموعات البيانات، والصور، والمشاريع، والنماذج، والتدريب، والصادرات، وعمليات النشر.

Ultralytics Platform Interactive API Documentation

بدء التشغيل السريع
# List the datasets owned by a workspace
curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://platform.ultralytics.com/api/datasets/YOUR_USERNAME

يعرض كل نقطة نهاية أدناه استدعاء client.<resource>.<method>(...) من SDK ultralytics-platform، والذي يتم إنشاؤه من نفس العقد مثل هذا المرجع.

مرجع واجهة برمجة التطبيقات التفاعلي

هذه الصفحة هي جولة إرشادية في واجهة برمجة التطبيقات. يتواجد المرجع المُولَّد والدائم التحديث على platform.ultralytics.com/api/docs، ويتم نشر مستند OpenAPI 3.2 القابل للقراءة الآلية والذي يُشغّله على platform.ultralytics.com/openapi.json. يتم توليد كليهما مباشرة من العقد الموجود في جانب الخادم، لذلك فهما المرجع الأساسي كلما اختلفت هذه الصفحة مع المخطط.

نظرة عامة على API#

تم تنظيم واجهة برمجة التطبيقات حول موارد المنصة الأساسية:

graph LR
    A[API Key]:::start --> B[Datasets]:::proc
    A --> C[Projects]:::proc
    B -->|images| G[Images]:::proc
    C -->|contains| D[Models]:::proc
    B -->|train on| D
    D -->|deploy| E[Deployments]:::proc
    D -->|export| F[Exports]:::proc

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
الموردالوصفالعمليات الرئيسية
مجموعات البياناتمجموعات الصور المصنفةالإنشاء، والقراءة، والتحديث، والحذف (CRUD)، والاستيراد، والإصدارات، والفئات، والانقسامات، والاستنساخ
Imagesالصور والتسميات الفرديةالقراءة، والتعليق، ونقل الانقسام، والحذف، والتعليق التلقائي
المشاريعمساحات عمل النماذجالإنشاء والقراءة والتحديث والحذف (CRUD)، والاستنساخ
النماذجنقاط التحقق المدربةالإنشاء والقراءة والتحديث والحذف (CRUD)، والتنبؤ، والتنزيل، والاستنساخ، وحالة التدريب
التدريبوظائف تدريب Cloud GPUتوفر وحدة معالجة الرسومات (GPU)، والبدء، والتقدم، والإلغاء
عمليات التصديروظائف تحويل التنسيقالإنشاء، والقائمة، والحالة، والإلغاء
عمليات النشرنقاط نهاية الاستدلال المخصصةالإنشاء، والبدء/الإيقاف/الاستبدال، والتنبؤ، والمقاييس، والسجلات
Trashالموارد المحذوفة بشكل مؤقتالقائمة، والاستعادة، والحذف الدائم
Storageتكاملات التخزين السحابيالأتصال، والاكتشاف، والاستعراض، والقطع
Accountالخطة، والأرصدة، والتخزين، والملف الشخصيملخص الحساب، ومفاتيح واجهة برمجة التطبيقات، واستخدام التخزين، والبحث عن المستخدم
الفوترةاستخدام الخطة دفتر الأستاذملخص الاستخدام، والمعاملات
Exploreبحث المحتوى العامالبحث في المشاريع ومجموعات البيانات

المصادقة#

تتطلب معظم نقاط النهاية مفتاح واجهة برمجة التطبيقات. تقبل نقاط النهاية التي تعرض محتوى عاماً — مثل قراءة مجموعة بيانات عامة، أو مشروع، أو نموذج، أو سرد صور مجموعة بيانات عامة، أو تشغيل الاستدلال على نموذج عام، أو البحث في استعراض (Explore) — الطلبات مجهولة الهوية أيضاً وترجع ببساطة المزيد عند توفير مفتاح.

الحصول على مفتاح واجهة برمجة التطبيقات#

  1. انتقل إلى Settings > API Keys
  2. انقر على Create Key
  3. انسخ المفتاح الذي تم إنشاؤه

راجع API Keys للحصول على تعليمات تفصيلية.

رأس التفويض#

قم بتضمين مفتاح واجهة برمجة التطبيقات الخاص بك كرمز مصادقة (bearer token):

Authorization: Bearer YOUR_API_KEY
تنسيق مفتاح API

مفاتيح واجهة برمجة التطبيقات هي البادئة الحرفية ul_ متبوعة بـ 40 حرفاً ست عشرياً، ليصبح المجموع 43 حرفاً (على سبيل المثال ul_a1b2c3d4e5f6789012345678901234567890abcd). الطلبات التي تحتوي على رأس مفقود، أو مفتاح منسق بشكل خاطئ، أو مفتاح ملغي ترجع 401. حافظ على سرية مفتاحك — ولا تقم أبداً بإيداعه في التحكم في الإصدار أو مشاركته علناً.

مثال#

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://platform.ultralytics.com/api/account/summary

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

تستخدم جميع نقاط نهاية API:

https://platform.ultralytics.com/api

مسارات الموارد#

يتم عنونة الموارد بنفس الأسماء المقروءة بشرياً التي تظهر في عناوين (URLs) الخاصة بالمنصة، وليس بواسطة معرفات قاعدة البيانات:

الموردالمسارمثال
مجموعة البيانات/api/datasets/{owner}/{dataset}/api/datasets/acme-vision/warehouse
مشروع/api/projects/{owner}/{project}/api/projects/acme-vision/inspection
النموذج/api/models/{owner}/{project}/{model}/api/models/acme-vision/inspection/v3
النشر/api/deployments/{owner}/{deployment}/api/deployments/acme-vision/edge-1
الصورة/api/images/{imageId}/api/images/65f1c0a2b3d4e5f601234567
  • {owner} هو اسم مستخدم شخصي أو معرف مساحة عمل الفريق: من 4 إلى 32 حرفاً، أحرف أبجدية رقمية صغيرة مع شرطات مفردة بين الجزئيات.
  • تتبع {dataset} و {project} و {model} و {deployment} نفس النمط المكون من أحرف صغيرة وشرطات، يصل إلى 128 حرفاً.
  • {imageId} و {exportId} هما معرفان ست عشريان مكونان من 24 حرفاً يتم إرجاعهما بواسطة واجهة برمجة التطبيقات.
  • تغيير اسم مورد من خلال PATCH يغير عرض name واسم عنوان (URL) معاً، وترجع الاستجابة اسم عنوان (URL) الحالي حتى تتمكن من الاستمرار في تتبعه.
تحديد مساحة العمل

لا يوجد معامل استعلام owner. تحتوي المسارات ذات نطاق مساحة العمل على المالك في المسار، وتعمل نقاط النهاية ذات نطاق الحساب (/api/account/summary و /api/api-keys و /api/storage و /api/billing/* و /api/trash و /api/integrations/buckets) على مساحة العمل التي أصدرت مفتاح واجهة برمجة التطبيقات. للعمل على مساحة عمل فريق، استخدم مفتاح واجهة برمجة تطبيقات تم إنشاؤه في مساحة العمل تلك.

حدود المعدل#

تفرض واجهة برمجة التطبيقات حدود النافذة المنزلقة لكل مفتاح واجهة برمجة تطبيقات. يندرج كل مسار ضمن فئة واحدة، ولكل فئة عداد مستقل، لذلك لا تستهلك 20 طلباً للتنبؤ مخصصك الافتراضي.

الفئةالحدينطبق على
Default100 طلب/دقيقةكل مسار غير مدرج أدناه
Training10 طلبات/دقيقةPOST /api/training/start
Upload10 طلبات/دقيقةعناوين URL الموقعة للرفع، وإتمام الرفع، واستيعاب مجموعات البيانات
Predict20 طلب/دقيقةاستدلال النموذج والنشر من خلال مسارات واجهة برمجة تطبيقات المنصة (Platform API)
التصدير20 طلب/دقيقةمسارات تصدير النماذج ومسارات تصدير/إصدار مجموعات البيانات
Download30 طلب/دقيقةتنزيلات ملفات النماذج
تعديل (Mutation)10 طلبات/دقيقةسرد مففاتيح واجهة برمجة التطبيقات، أو الاتصال بالتخزين السحابي أو اكتشافه، وإجراءات النشر PATCH
ترطيب البيانات (Hydrate)20 طلب/دقيقةPOST /api/datasets/{owner}/{dataset}/images (جلب مجموعة مختارة من الصور)
التجميع (Clustering)10 طلبات/دقيقةGET /api/datasets/{owner}/{dataset}/images/clustering

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

عند تقييد السرعة، تُرجع واجهة برمجة التطبيقات 429 مع كل من الرؤوس وجسم JSON:

Retry-After: 12
X-RateLimit-Reset: 2026-02-21T12:34:56.000Z
{
    "error": "Rate limit exceeded",
    "retryAfter": 12,
    "resetAt": "2026-02-21T12:34:56.000Z"
}

نقاط النهاية المخصصة (غير محدودة)#

نقاط النهاية المخصصة لا تخضع لحدود معدل مفتاح واجهة برمجة تطبيقات المنصة عندما تتصل بـ serviceUrl الخاص بنشر النشر مباشرة (على سبيل المثال، https://predict-abc123.run.app/predict). يعتمد الإنتاجية بعد ذلك على تكوين الخدمة المنشورة.

التعامل مع حدود المعدل

عندما تتلقى 429، انتظر لمدة Retry-After ثانية (أو حتى X-RateLimit-Reset) قبل إعادة المحاولة. راجع الأسئلة الشائعة حول حد المعدل للحصول على تطبيق التراجع الأسي.

تنسيق الاستجابة#

استجابات النجاح#

الاستجابات هي كائنات JSON ذات حقول خاصة بالمورد. لا يوجد غلاف عام: ترجع نقاط نهاية القائمة مجموعة مسماة بجانب العدد، وتجديدات الحالة تُرجع المعرفات المحدثة.

{
    "datasets": [{ "id": "65f1c0a2b3d4e5f601234567", "owner": "acme-vision", "dataset": "warehouse" }],
    "total": 1,
    "region": "us"
}

تتضمن الاستجابات الحاملة للبيانات أيضاً region (us أو eu أو ap)، وهي منطقة التخزين لمساحة العمل تلك.

استجابات الخطأ#

كل استجابة خطأ هي كائن JSON يحتوي على رسالة error:

{
    "error": "Dataset not found"
}
حالة HTTPالمعنى
200نجاح
201تم الإنشاء
202مقبول، ويستمر العمل بشكل غير متزامن
400مسار أو استعلام أو جسم طلب غير صالح
401مصادقة مفقودة أو غير صالحة
402أرصدة غير كافية (للتدريب)
403أذونات أو خطة أو حصة غير كافية
404المورد غير موجود
409تعارض مع الحالة الحالية (اسم مكرر، وظيفة قيد التنفيذ)
413إدخال التنبؤ كبير جداً
422فئات النموذج لا تتطابق مع مجموعة البيانات (التعليق التلقائي)
429تم تجاوز حد المعدل
500خطأ في الخادم
502فشل موفر المنبع أو مكالمة الخدمة
503الخدمة التابعة غير متاحة مؤقتاً

الترقيم#

يعتمد نمط الترقيم على المجموعة:

النمطنقاط النهايةالمعاملات
الحد الأقصى فقطقوائم مجموعات البيانات والمشاريع والنماذج والصادرات وعمليات النشرlimit
الإزاحة والحد الأقصىصور مجموعة البيانات، وتجميع الصور، وبحث Exploreoffset، limit، بالإضافة إلى hasMore في الاستجابة
المؤشر (Cursor)صور مجموعة البيانات (مجموعات البيانات الكبيرة)cursor، includeTotal، بالإضافة إلى nextCursor
رقم الصفحةسلة المهملاتpage، limit، بالإضافة إلى totalPages
رمز صفحة غامضسجلات النشرpageToken، بالإضافة إلى nextPageToken

API مجموعات البيانات#

إنشاء مجموعات البيانات المصورة للتدريب على نماذج YOLO، واستعراضها، وإدارتها. راجع وثائق مجموعات البيانات.

سرد مجموعات البيانات#

GET /api/datasets/{owner}

Python SDK: client.datasets.list(owner)

يُرجع مجموعات البيانات العامة للمالك، بالإضافة إلى مجموعات البيانات الخاصة عندما يمكن لمفتاحك عرض مساحة العمل تلك.

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

المعاملالنوعالوصف
limitintالحد الأقصى لمجموعات البيانات المراد إرجاعها (الافتراضي: 1000، الحد الأقصى: 1000)
includeSamplesbooleanتضمين معاينات الصور النموذجية (الافتراضي: true)
includeImageUrlsbooleanتضمين روابط احتياطية للصور النموذجية بالحجم الكامل (الافتراضي: false)
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://platform.ultralytics.com/api/datasets/acme-vision?limit=10&includeSamples=false"

الاستجابة:

{
    "datasets": [
        {
            "id": "65f1c0a2b3d4e5f601234567",
            "owner": "acme-vision",
            "dataset": "warehouse",
            "name": "Warehouse",
            "task": "detect",
            "visibility": "private",
            "imageCount": 1000,
            "classCount": 2,
            "classNames": ["person", "forklift"],
            "splits": { "train": 800, "val": 200, "test": 0, "labeled": 1000 },
            "annotationCount": 5400,
            "starCount": 3,
            "isStarred": false,
            "status": "ready",
            "createdAt": "2026-01-15T10:00:00Z",
            "updatedAt": "2026-01-16T08:30:00Z"
        }
    ],
    "total": 1,
    "region": "us"
}

الحصول على مجموعة بيانات#

GET /api/datasets/{owner}/{dataset}

Python SDK: client.datasets.retrieve(owner, dataset)

يُرجع كائن مجموعة البيانات الكامل تحت مفتاح dataset، بما في ذلك classNames و splits و versions و source، والكائن المحدد بواسطة المستخدم metadata.

إنشاء مجموعة بيانات#

POST /api/datasets

Python SDK: client.datasets.create(dataset=..., name=...)

الجسم (Body):

{
    "dataset": "warehouse",
    "name": "Warehouse",
    "task": "detect",
    "description": "Forklift and pedestrian safety dataset",
    "classNames": ["person", "forklift"],
    "visibility": "private",
    "metadata": { "location": "factory-1", "reviewed": true },
    "owner": "acme-vision"
}
الحقلالنوعمطلوبالوصف
datasetstringنعماسم مجموعة البيانات المستخدم في عناوين المنصة (حروف صغيرة، مفصولة بشرطات، بحد أقصى 128 حرفاً)
namestringنعماسم العرض (بحد أقصى 100 حرف)
descriptionstringلاالوصف (بحد أقصى 1000 حرف)
taskstringلانوع المهمة (الافتراضي: detect)
classNamesمصفوفةلاأسماء الفئات بترتيب الفهرس (بحد أقصى 25000)
formatstringلاتنسيق التعليق: yolo (افتراضي)، coco، raw، ndjson
visibilitystringلاpublic أو private
tagsمصفوفةلاما يصل إلى 50 علامة تحتوي كل منها على 50 حرفاً
licensestringلامعرف ترخيص مجموعة البيانات
metadataكائنلابيانات JSON الوصفية المخصصة
ownerstringلامعرف مساحة عمل الفريق؛ يتم تعيينه افتراضياً إلى مساحة عملك الشخصية
المهام المدعومة

قيم task الصالحة عند إنشاء أو تحديث مجموعة بيانات: detect، وsegment، وsemantic، وdepth، وclassify، وpose، وobb. لا تحتوي مجموعات بيانات العمق على أي فئات.

الاستجابة (201):

{
    "id": "65f1c0a2b3d4e5f601234567",
    "owner": "acme-vision",
    "dataset": "warehouse",
    "region": "us"
}

تحديث مجموعة بيانات#

PATCH /api/datasets/{owner}/{dataset}

Python SDK: client.datasets.update(owner, dataset)

الجسم (تحديث جزئي):

{
    "name": "Warehouse Safety",
    "description": "New description",
    "visibility": "public",
    "metadata": { "location": "factory-2", "reviewed": true }
}

الحقول المقبولة: name و description و visibility و metadata و tags و classNames و classColors و format و task و license و iconColor و iconLetter و starred. أرسل كائن metadata فارغاً ({}) لمسح البيانات الوصفية المخصصة. تقتصر مفاتيح البيانات الوصفية على 128 حرفاً والكائن المسلسل على 500000 حرف.

الاستجابة:

{
    "success": true,
    "dataset": "warehouse-safety"
}

يؤدي تغيير الاسم إلى تغيير اسم عنوان (URL)، لذا استخدم قيمة dataset المُرجعة للطلبات اللاحقة.

حذف مجموعة بيانات#

DELETE /api/datasets/{owner}/{dataset}

Python SDK: client.datasets.delete(owner, dataset)

ينقل مجموعة البيانات إلى سلة المهملات، حيث يمكن استعادتها لمدة 30 يوماً.

استنساخ مجموعة البيانات#

POST /api/datasets/{owner}/{dataset}/clone

Python SDK: client.datasets.clone(owner, dataset)

يقوم بانسخ مجموعة بيانات قابلة للوصول، مع صورها وتسمياتها، إلى مساحة عملك الشخصية أو مساحة عمل الفريق.

جسم اختياري (جميع الحقول اختيارية):

{
    "dataset": "warehouse-copy",
    "name": "Warehouse Copy",
    "description": "Cloned for experimentation",
    "visibility": "private",
    "license": "CC-BY-4.0",
    "owner": "acme-vision"
}

الاستجابة (201): id و owner و dataset و name و imageCount و classCount و region. تُرجع مجموعات البيانات المدعومة بمصدر تخزين متصل 409 نظراً لعدم نسخ ملفاتها.

تنزيل تصدير مجموعة البيانات#

GET /api/datasets/{owner}/{dataset}/export

Python SDK: client.datasets.export(owner, dataset)

يُرجع رابط تنزيل NDJSON موقعاً. قم بإلغاء v لتصدير الحالة الحالية لمجموعة البيانات، مع إعادة استخدام التصدير المخزن مؤقتاً عندما لم يتغير شيء منذ توليده.

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

المعاملالنوعالوصف
vintegerرقم الإصدار المحفوظ (يبدأ من 1). يتم تخطيه للحصول على مجموعة البيانات الحالية.

الاستجابة:

{
    "downloadUrl": "https://storage.googleapis.com/...&signature=...",
    "cached": true
}

يؤدي طلب إصدار معين إلى إرجاع downloadUrl و version بدلاً من cached.

إنشاء إصدار مجموعة بيانات#

POST /api/datasets/{owner}/{dataset}/export

Python SDK: client.datasets.create_export(owner, dataset)

ينشئ لقطة مرقمة غير قابلة للتغيير لمجموعة البيانات ويخزن تصدير NDJSON الخاص بها. يتطلب صلاحيات محرر.

النص الأساسي (اختياري):

{
    "description": "Added 500 training images"
}

الاستجابة:

{
    "version": 3,
    "downloadUrl": "https://storage.googleapis.com/...&signature=...",
    "reused": false
}

reused تكون true عندما تكون مجموعة البيانات كما هي ولم تتغير منذ الإصدار السابق وتم إرجاع تلك اللقطة بدلاً من ذلك.

تحديث وصف الإصدار#

PATCH /api/datasets/{owner}/{dataset}/export

Python SDK: client.datasets.update_export(owner, dataset, version=..., description=...)

الجسم (Body):

{
    "version": 2,
    "description": "Fixed mislabeled classes"
}

الاستجابة: {"ok": true}

استعادة إصدار مجموعة البيانات#

POST /api/datasets/{owner}/{dataset}/restore

Python SDK: client.datasets.restore(owner, dataset, version=...)

يعيد بناء الصور والتعليقات التوضيحية والفئات من إصدار محفوظ دون نسخ بايتات الصور.

الجسم (Body):

{
    "version": 2
}

الاستجابة: {"version": 2, "imageCount": 1000}

الحصول على إحصاءات مجموعة البيانات#

GET /api/datasets/{owner}/{dataset}/class-stats

Python SDK: client.datasets.class_stats(owner, dataset)

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

الاستجابة (مختصرة):

{
    "classes": [{ "classId": 0, "count": 1500, "imageCount": 450 }],
    "imageStats": {
        "widthHistogram": [{ "bin": 640, "count": 120, "size": 1 }],
        "heightHistogram": [{ "bin": 480, "count": 95, "size": 1 }],
        "pointsHistogram": [{ "bin": 4, "count": 200, "size": 1 }],
        "formatDistribution": { "jpg": 900, "png": 100 },
        "fileSizeHistogram": [{ "bin": 250000, "count": 300, "size": 50000 }],
        "objectsPerImageHistogram": [{ "bin": 5, "count": 210, "size": 1 }],
        "bboxWidthHistogram": [{ "bin": 120, "count": 340, "size": 20 }],
        "bboxHeightHistogram": [{ "bin": 90, "count": 300, "size": 20 }]
    },
    "locationHeatmap": {
        "bins": [
            [5, 10],
            [8, 3]
        ],
        "maxCount": 50
    },
    "dimensionHeatmap": {
        "bins": [
            [2, 5],
            [3, 1]
        ],
        "maxCount": 12,
        "minWidth": 10,
        "maxWidth": 1920,
        "minHeight": 10,
        "maxHeight": 1080
    },
    "classNames": ["person", "forklift"],
    "cached": true,
    "sampleSize": null
}

إدارة الفئات#

دمج الفئات (إعادة تعيين التعليقات التوضيحية إلى فئة مستهدفة، ثم إزالة المصادر):

POST /api/datasets/{owner}/{dataset}/classes/merge

Python SDK: client.datasets.merge_classes(owner, dataset, source_class_ids=..., target_class_id=...)

{
    "sourceClassIds": [2, 4],
    "targetClassId": 1
}

حذف الفئات (يتم حذف تعليقاتها التوضيحية وتنزل معرفات الفئات المتبقية للأدنى):

POST /api/datasets/{owner}/{dataset}/classes/delete

Python SDK: client.datasets.delete_classes(owner, dataset, class_ids=...)

{
    "classIds": [2, 4]
}

تُرجع كلتا العمليتين success، و classNames المحدثة و classColors، وملخصاً لما تغير (mergedClassIds و targetClassId، أو deletedClassIds و deletedAnnotations).

معرفات الفئات تعتمد على الموقع

نظرًا لأن المعرفات المتبقية تتغير بعد عملية الدمج أو الحذف، فهذه العمليات ليست ثابتة التابع (idempotent). قم بإعادة جلب مجموعة البيانات للحصول على مؤشرات الفئات الحالية قبل إجراء عملية فئة أخرى.

إعادة توزيع التقسيمات#

POST /api/datasets/{owner}/{dataset}/splits/redistribute

Python SDK: client.datasets.redistribute_splits(owner, dataset, train=..., val=..., test=...)

يعيد تعيين الصور عشوائياً عبر التقسيمات. يجب أن يجموع النسبة المئوية الثلاثة 100.

{
    "train": 80,
    "val": 20,
    "test": 0
}

الاستجابة: success، وتعدادات splits الناتجة، و modified (عدد الصور المنقولة).

تضمينات (Embeddings) مجموعة البيانات#

GET /api/datasets/{owner}/{dataset}/embeddings
POST /api/datasets/{owner}/{dataset}/embeddings
DELETE /api/datasets/{owner}/{dataset}/embeddings

Python SDK: client.datasets.embeddings(owner, dataset)، client.datasets.create_embeddings(owner, dataset)، client.datasets.delete_embeddings(owner, dataset)

يقوم GET بإرجاع ملخص التحليل (analyzedAt، و embeddingsCount، و latestImageAt، و activeJob). يقوم POST بوضع تحليل التضمينات في قائمة الانتظار ويُرجع 202 مع jobId. يقوم DELETE بإلغاء المهمة النشطة ويُرجع معرف المهمة الملغاة أو null.

تجميع الصور#

GET /api/datasets/{owner}/{dataset}/images/clustering

Python SDK: client.datasets.clustering(owner, dataset)

يُرجع تخطيط UMAP ثنائي الأبعاد من تحليل مكتمل، مقسماً على صفحات مع offset و limit (الافتراضي والحد الأقصى 50,000). يحتوي كل مدخل على id، و umapX، و umapY، و split، و classIds، و width، و height، و bytes، و labelCount، و missing.

سرد النماذج المدربة على مجموعة بيانات#

GET /api/datasets/{owner}/{dataset}/models

Python SDK: client.datasets.models(owner, dataset)

الاستجابة:

{
    "models": [
        {
            "id": "65f1c0a2b3d4e5f601234599",
            "owner": "acme-vision",
            "project": "inspection",
            "model": "v3",
            "name": "v3",
            "status": "completed",
            "task": "detect",
            "epochs": 100,
            "bestEpoch": 87,
            "metrics": { "mAP50": 0.85, "mAP50-95": 0.72, "precision": 0.88, "recall": 0.81 },
            "startedAt": "2026-01-14T22:00:00Z",
            "completedAt": "2026-01-15T10:00:00Z",
            "createdAt": "2026-01-14T21:55:00Z"
        }
    ],
    "count": 1
}

سرد صور مجموعة البيانات#

GET /api/datasets/{owner}/{dataset}/images

Python SDK: client.datasets.images(owner, dataset)

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

المعاملالنوعالوصف
limitintالحد الأقصى للصور المراد إرجاعها (الافتراضي: 50، الحد الأقصى: 5000)
offsetintالصور المراد تخطيها (الافتراضي: 0)
cursorstringمعرف الصورة الأخيرة من الصفحة السابقة، للترقيم باستخدام المؤشر
includeTotalbooleanتضمين العدد الإجمالي المتطابق (الافتراضي: true)
splitstringالتصفية حسب التقسيم: train، val، test
hasLabelbooleanالتصفية حسب حالة التعليقات التوضيحية
hasErrorbooleanالتصفية حسب حالة خطأ المعالجة
classIdsstringمعرفات الفئات مفصولة بفواصل؛ تُرجع الصور التي تحتوي على أي منها
searchstringمطابقة الجزء النصي على اسم الملف والبيانات الوصفية المخصصة (بحد أقصى 200 حرف)
sortstringnewest (الافتراضي)، oldest، name-asc، name-desc، height-asc، height-desc، width-asc، width-desc، size-asc، size-desc، labels-asc، labels-desc
includeThumbnailsbooleanتضمين عناوين URL للصور المصغرة الموقعة (الافتراضي: true)
includeImageUrlsbooleanتضمين عناوين URL للصور الموقعة بالحجم الكامل (الافتراضي: false)
includeLabelsbooleanتضمين التعليقات التوضيحية للمعاينة المحدودة (الافتراضي: false)

الاستجابة:

{
    "images": [
        {
            "id": "65f1c0a2b3d4e5f601234567",
            "hash": "9f2c1d4b6a8e0f3c5d7b9a1e2f4c6d8b",
            "ext": "jpg",
            "name": "aisle-04.jpg",
            "thumbnailUrl": "https://storage.googleapis.com/...&signature=...",
            "width": 1920,
            "height": 1080,
            "split": "train",
            "labelCount": 6,
            "bytes": 284213,
            "error": null
        }
    ],
    "total": 1000,
    "hasMore": true,
    "classes": ["person", "forklift"],
    "errorCount": 0,
    "nextCursor": "65f1c0a2b3d4e5f601234567"
}

الحصول على الصور المحددة#

POST /api/datasets/{owner}/{dataset}/images

Python SDK: client.datasets.selected_images(owner, dataset, image_ids=...)

يُرجع شكل الصورة نفسه لما يصل إلى 1,000 معرف صورة مقدم، ويقبل نفس معاملات التصفية والاستعلام الخاصة بـ URL كعملية القائمة.

{
    "imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}

استيعاب بيانات مجموعة البيانات#

POST /api/datasets/{owner}/{dataset}/ingest

Python SDK: client.datasets.ingest(owner, dataset, body=...)

يعالج عملية تحميل مكتملة، أو أرشيفاً عن بُعد، أو مصدراً تخزينياً متصلاً في مجموعة بيانات موجودة. قم بتوفير مصدر واحد بالضبط:

الحقلالنوعالوصف
sessionIdstringجلسة تحميل من POST /api/upload/signed-url، وقد اكتملت بالفعل
sourceUrlstringعنوان URL عام لـ HTTP أو HTTPS لملف ZIP أو TAR أو TAR.GZ أو TGZ أو NDJSON (بحد أقصى 4096 حرفاً)
referenceكائنمصدر متصل: التخزين السحابي (provider: "cloud"، و integrationId، و target، و prefix) أو محلي On Premise (provider: "local"، و keyId، و root، و prefix)
targetSplitstringtrain، أو val، أو test؛ يتجاوز هيكل التقسيم الخاص بالأرشيف
conflictPolicystringskip، أو keep_both، أو replace في حالة تعارض أسماء الملفات أو المحتوى
classMappingكائنيربط أسماء الفئات الواردة بمؤشر فئة، أو اسم فئة جديد أو موجود، أو null للتخطي
imageMetadataكائنالبيانات الوصفية المخصصة المُعَرَّفة بواسطة المسار النسبي للأرشيف لكل صورة أو قيمة NDJSON لـ file

تكون جلسات الرفع مرتبطة بمجموعة بيانات بواسطة assetId الممرر إلى POST /api/upload/signed-url، ويرفض الاستيعاب جلسة تنتمي إلى مجموعة بيانات مختلفة.

النص (أرشيف مرفوع):

{
    "sessionId": "session_abc123",
    "targetSplit": "train"
}

النص (أرشيف عن بُعد أو NDJSON):

{
    "sourceUrl": "https://example.com/my-dataset.zip"
}

النص الأساسي (استيراد التسميات في عملية استيعاب لاحقة):

{
    "sessionId": "session_abc123",
    "classMapping": { "person": 0, "automobile": "forklift", "background": null }
}

النص الأساسي (إرفاق بيانات وصفية لكل صورة):

{
    "sessionId": "session_abc123",
    "imageMetadata": {
        "airbus-wing.jpg": { "aircraft": { "family": "A350" }, "inspectionStatus": "reviewed" },
        "images/tail.jpg": { "aircraft": { "family": "A320" }, "inspectionSeverity": 2 }
    }
}

يجب أن تتطابق مفاتيح البيانات الوصفية مع المسار المُطَبَّع داخل الأرشيف، بما في ذلك المجلدات. بالنسبة لعمليات استيراد NDJSON، يمكن لكل سجل حمل كائن metadata الخاص به، والذي له الأولوية على مدخل imageMetadata المتطابق. تقتصر مسارات الأرشيف على 1,024 حرفاً، ومفاتيح البيانات الوصفية للمستوى الأعلى على 128 حرفاً، وكل كائن بيانات وصفية - بالإضافة إلى خريطة imageMetadata بأكملها - على 500,000 حرف متسلسل.

تعيين الفئات

ينشئ الاستيعاب الأول فئات من الأرشيف تلقائياً. في عمليات الاستيعاب اللاحقة، تعود فئات الأرشيف المستبعدة من classMapping إلى مطابقة غير حساسة لحالة الأحرف مقابل فئات مجموعة البيانات الموجودة. يتم تخطي التسميات فقط للفئات المعينة صراحةً إلى null أو التي ليس لها فئة موجودة متطابقة.

الاستجابة (201):

{
    "jobId": "65f1c0a2b3d4e5f6012345aa",
    "status": "queued"
}
graph LR
    A[POST /api/datasets]:::start --> B[POST /api/upload/signed-url]:::proc
    B --> C[PUT archive to signed URL]:::proc
    C --> D[POST /api/upload/complete]:::proc
    D --> E["POST /api/datasets/{owner}/{dataset}/ingest"]:::proc
    E --> F[Process archive]:::proc
    F --> G[Dataset ready]:::out

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef out fill:#9C27B0,color:#fff
تحميل صورة واحدة مع البيانات الوصفية باستخدام Python

يتعامل نفس الكود مع مجموعة من الصور: أضف المزيد من الملفات إلى ملف ZIP وإدخالات متطابقة إلى imageMetadata.

import io
import zipfile
from pathlib import Path

import requests

api = "https://platform.ultralytics.com/api"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
owner, dataset = "acme-vision", "warehouse"
dataset_id = "65f1c0a2b3d4e5f601234567"  # id returned by POST /api/datasets
image_path = Path("airbus-wing.jpg")

archive = io.BytesIO()
with zipfile.ZipFile(archive, "w", zipfile.ZIP_DEFLATED) as zf:
    zf.write(image_path, image_path.name)
data = archive.getvalue()

signed = requests.post(
    f"{api}/upload/signed-url",
    headers=headers,
    json={
        "assetType": "datasets",
        "assetId": dataset_id,
        "filename": "images.zip",
        "contentType": "application/zip",
        "totalBytes": len(data),
    },
)
signed.raise_for_status()
upload = signed.json()

requests.put(upload["uploadUrl"], headers={"Content-Type": "application/zip"}, data=data).raise_for_status()
requests.post(
    f"{api}/upload/complete",
    headers=headers,
    json={"sessionId": upload["sessionId"]},
).raise_for_status()

ingest = requests.post(
    f"{api}/datasets/{owner}/{dataset}/ingest",
    headers=headers,
    json={
        "sessionId": upload["sessionId"],
        "imageMetadata": {
            "airbus-wing.jpg": {
                "aircraft": {"family": "A350", "section": "wing"},
                "inspectionStatus": "reviewed",
            }
        },
    },
)
ingest.raise_for_status()
print(ingest.json())

واجهة برمجة تطبيقات الصور#

فحص، والتعليق على، ونقل، وحذف صور مجموعة البيانات بواسطة معرف الصورة المكون من 24 حرفاً. راجع توثيق التعليقات التوضيحية.

الحصول على صورة#

GET /api/images/{imageId}

Python SDK: client.images.retrieve(image_id)

يُرجع metadata (مخصص، محدد من قبل المستخدم)، و properties (اسم الملف، الهاش، الأبعاد، التقسيم، التعدادات، الطوابع الزمنية)، و labels، و classNames الخاص بمجموعة البيانات.

تحديث صورة#

PATCH /api/images/{imageId}

Python SDK: client.images.update(image_id, body=...)

يستبدل إما التعليقات التوضيحية أو البيانات الوصفية المخصصة - أرسل أحد الشكلين، وليس كلاهما.

النص الأساسي (التعليقات التوضيحية):

{
    "labels": [
        { "classId": 0, "bbox": [0.5, 0.5, 0.2, 0.3] },
        { "classId": 1, "segments": [0.1, 0.2, 0.3, 0.2, 0.2, 0.4] }
    ]
}

النص الأساسي (البيانات الوصفية):

{
    "metadata": { "location": "strasbourg", "reviewed": true }
}
تنسيق الإحداثيات

تستخدم إحداثيات التسميات قيم YOLO المُطَبَّعة بين 0 و 1. تستخدم صناديق الإحاطة [x_center, y_center, width, height]. تستخدم تسميات التقسيم segments، وهي قائمة مسطحة لرؤوس المضلع [x1, y1, x2, y2, ...]. تستخدم تسميات الوضعية keypoints في شكل مسطح متسق واحد: أزواج [x1, y1, x2, y2, ...] أو ثلاثيات [x1, y1, v1, x2, y2, v2, ...]، حيث تستخدم الرؤية تقليدياً 0 أو 1 أو 2. تستخدم الصناديق الموجهة زوايا obb. يتم تقريب الإحداثيات المحفوظة إلى 5 منازل عشرية، وتقبل الصورة ما يصل إلى 10,000 تعليق توضيحي.

حذف صورة#

DELETE /api/images/{imageId}

Python SDK: client.images.delete(image_id)

يحذف صورة واحدة وتعليقاتها التوضيحية بشكل دائم.

التعليق التلقائي على الصورة#

POST /api/images/{imageId}/predict

Python SDK: client.images.predict(image_id, model_id=...)

يشغل استدلال YOLO على الصورة ويُرجع التعليقات التوضيحية المتوقعة. إنه لا يحفظها - قم كتابة النتائج مرة أخرى باستخدام PATCH /api/images/{imageId} عندما تكون راضياً عنها.

الحقلالنوعمطلوبالوصف
modelIdstringنعمعنوان URI كامل للنموذج، ul://{owner}/{project}/{model}
confidencefloatلاعتبة الثقة، 0.01 – 1.0 (الافتراضي: 0.25)
ioufloatلاعتبة IoU لقمع الحد الأقصى (NMS)، 0.0 – 0.95 (الافتراضي: 0.7)

الاستجابة: success، و predictions (كائنات التعليقات التوضيحية)، و modelUsed، و inferenceTime. النموذج الذي لا تتطابق فئاته مع مجموعة البيانات يُرجع 422.

نقل الصور بالجملة#

PATCH /api/images/bulk

Python SDK: client.images.update_bulk(image_ids=..., split=...)

ينقل ما يصل إلى 1,000 صورة من مجموعة بيانات إلى تقسيم مختلف.

{
    "imageIds": ["65f1c0a2b3d4e5f601234567"],
    "split": "val",
    "conflictPolicy": "skip"
}

تُرجع تعارضات أسماء الملفات أو المحتوى 409 حتى تختار conflictPolicy على مستوى السلة لـ skip، أو keep_both، أو replace. تُبلغ الاستجابة عن modifiedCount، و skippedCount، و targetSplit.

حذف الصور بالجملة#

DELETE /api/images/bulk

Python SDK: client.images.delete_bulk(image_ids=...)

{
    "imageIds": ["65f1c0a2b3d4e5f601234567", "65f1c0a2b3d4e5f601234568"]
}

يحذف ما يصل إلى 1,000 صورة من مجموعة بيانات واحدة ويُرجع deletedCount و deletedImageIds.

الحصول على روابط الصور الموقعة#

POST /api/images/urls

Python SDK: client.images.urls(image_ids=...)

يُرجع عناوين URL موقة مؤقتة لما يصل إلى 100 معرف صورة من مجموعة بيانات واحدة.

{
    "imageIds": ["65f1c0a2b3d4e5f601234567"]
}

الاستجابة: urls و thumbnails، وكلاهما معرف بواسطة معرف الصورة.


API المشاريع#

قم بتنظيم نماذجك في مشاريع. ينتمي كل نموذج إلى مشروع واحد. راجع توثيق المشاريع.

سرد المشاريع#

GET /api/projects/{owner}

Python SDK: client.projects.list(owner)

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

المعاملالنوعالوصف
limitintالحد الأقصى للمشاريع المراد إرجاعها (الافتراضي: 20، الحد الأقصى: 500)

الحصول على مشروع#

GET /api/projects/{owner}/{project}

Python SDK: client.projects.retrieve(owner, project)

يُرجع كائن project، ومصفوفة models لملخصات كل نموذج (الحالة، المقاييس، الحقبة، الأوزان، وسائط التدريب)، و isOwner.

إنشاء مشروع#

POST /api/projects

Python SDK: client.projects.create(project=..., name=...)

الحقلالنوعمطلوبالوصف
projectstringنعماسم المشروع المستخدم في عناوين URL للمنصة
namestringنعماسم العرض (بحد أقصى 100 حرف)
descriptionstringلاالوصف (بحد أقصى 1000 حرف)
visibilitystringلاpublic أو private
tagsمصفوفةلاما يصل إلى 50 علامة
licensestringلامعرف ترخيص المشروع
metadataكائنلابيانات JSON الوصفية المخصصة
ownerstringلامعرف مساحة عمل الفريق؛ يتم تعيينه افتراضياً إلى مساحة عملك الشخصية
curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "project": "inspection",
    "name": "Inspection",
    "description": "Detection experiments",
    "metadata": {"department": "manufacturing", "cost_center": "cv-01"}
  }' \
  https://platform.ultralytics.com/api/projects

الاستجابة (201): id، و owner، و project، و region.

تحديث مشروع#

PATCH /api/projects/{owner}/{project}

Python SDK: client.projects.update(owner, project)

الحقول المقبولة: name، و description، و visibility، و metadata، و tags، و license، و archived، و iconColor، و iconLetter، و viewPreferences، و starred.

{
    "metadata": { "department": "research", "program": "inspection" }
}

أرسل كائن metadata فارغاً ({}) لمسحه. تستخدم البيانات الوصفية للمشروع نفس حدود المفتاح البالغة 128 حرفاً وحدود الكائن المتسلسل البالغة 500,000 حرف مثل البيانات الوصفية لمجموعة البيانات.

حذف مشروع#

DELETE /api/projects/{owner}/{project}

Python SDK: client.projects.delete(owner, project)

ينقل المشروع ونماذجه إلى سلة المهملات، مع إرجاع cascadedModels.

استنساخ مشروع#

POST /api/projects/{owner}/{project}/clone

Python SDK: client.projects.clone(owner, project)

يستنسخ مشروعاً يمكن الوصول إليه ونماذجه المكتملة. يقبل النص الأساسي الاختياري project، و name، و description، و visibility، و license، ووجهة owner.


API النماذج#

إدارة نماذج YOLO المدربة - عرض المقاييس، وتنزيل الأوزان، وتشغيل الاستدلال، ومراقبة التدريب. راجع توثيق النماذج.

سرد النماذج في مشروع#

GET /api/models/{owner}/{project}

Python SDK: client.models.list(owner, project)

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

المعاملالنوعالوصف
limitintالحد الأقصى للنماذج المراد إرجاعها (الافتراضي: 20، الحد الأقصى: 100)

الحصول على نموذج#

GET /api/models/{owner}/{project}/{model}

Python SDK: client.models.retrieve(owner, project, model)

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

المعاملالنوعالوصف
analysisintمحدد على 1 لإرجاع تحليل التحقق لكل صورة بدلاً من النموذج

تحتوي الاستجابة الافتراضية على كائن model - الحالة، المهمة، المقاييس، trainArgs، و trainResults، و classNames، و computeCost، و metadata، والمزيد - بالإضافة إلى isOwner.

إنشاء نموذج#

POST /api/models

Python SDK: client.models.create(body=...)

ينشئ سجلاً لنموذج غير مدرب يمكنك إرفاق أوزان به أو تدريبه.

الحقلالنوعمطلوبالوصف
projectstringنعماسم المشروع المستهدف
ownerstringلامُعرّف مساحة العمل (Workspace handle)؛ الوضع الافتراضي هو مساحة عملك الشخصية
modelstringلااسم النموذج المستخدم في عناوين URL للمنصة؛ يتم توليده عند حذفه أو تخطيه
namestringلااسم العرض (مقبول فقط بجانب model)
descriptionstringلاالوصف (بحد أقصى 1000 حرف)
taskstringلاdetect، أو segment، أو semantic، أو depth، أو classify، أو pose، أو obb
metadataكائنلابيانات JSON الوصفية المخصصة
trainArgsكائنلاوسائط التدريب المراد تسجيلها
metricsكائنلاالمقاييس مثل mAP50، و mAP50-95، و precision، و recall
epochsnumberلاعدد الحقب لنموذج مدرب بالفعل
versionstringلاتسمية الإصدار (بحد أقصى 50 حرفاً)

الاستجابة (201): id، و owner، و project، و model، و region.

رفع ملف النموذج

لإرفاق أوزان .pt، اطلب عنوان URL للرفع موقّعاً باستخدام assetType: "models" ومعرف نموذج id كـ assetId، وارفع PUT الملف إلى عنوان URL المُرجَع، ثم استدعِ POST /api/upload/complete مع sessionId المُرجَع.

تحديث نموذج#

PATCH /api/models/{owner}/{project}/{model}

Python SDK: client.models.update(owner, project, model)

تشمل الحقول المقبولة name، و description، و color، و metadata، و status، و license، و datasetSlug، و trainArgs، و trainResults، و epochs، و bestEpoch، و bestFitness، و version، و trainingError، و starred.

{
    "metadata": { "release": "candidate-3", "reviewed": true }
}

يكون كائن metadata المخصص منفصلاً عن الحقول المملوكة للتدريب مثل trainArgs، و environment، و trainResults، ويستخدم نفس حدود الحجم مثل البيانات الوصفية لمجموعة البيانات.

حذف نموذج#

DELETE /api/models/{owner}/{project}/{model}

Python SDK: client.models.delete(owner, project, model)

يقوم بنقل النموذج إلى trash لمدة 30 يومًا.

تنزيل ملفات النموذج#

GET /api/models/{owner}/{project}/{model}/files

Python SDK: client.models.files(owner, project, model)

يعيد عناوين URL موقعة قصيرة الأجل لأوزان النموذج.

{
    "files": [
        {
            "name": "best.pt",
            "size": 6534127,
            "downloadUrl": "https://storage.googleapis.com/...&signature=..."
        }
    ]
}

استنساخ نموذج#

POST /api/models/{owner}/{project}/{model}/clone

Python SDK: client.models.clone(owner, project, model, project_body=...)

ينسخ نموذجًا متاحًا إلى مشروع موجود.

{
    "owner": "acme-vision",
    "project": "inspection",
    "model": "v3-copy",
    "name": "V3 Copy",
    "description": "Cloned from a public model"
}
الحقلالنوعمطلوبالوصف
projectstringنعماسم المشروع المستهدف
ownerstringلامساحة العمل الوجهة؛ الافتراضي هي مساحة عملك الشخصية
modelstringلااسم النموذج الوجهة
namestringلااسم العرض الوجهة
descriptionstringلاوصف النسخة المكررة

تشغيل الاستنتاج#

POST /api/models/{owner}/{project}/{model}/predict

Python SDK: client.models.predict(owner, project, model, body=...)

يمكن التنبؤ بالنماذج العامة بدون مصادقة. تتطلب النماذج الخاصة والمشتركة مفتاح API مع صلاحية الوصول إلى المشروع الأصل.

نموذج Multipart:

المعاملالنوعالافتراضيالنطاقالوصف
fileملف--ملف صورة أو فيديو (مطلوب ما لم يتم تعيين source)
conffloat0.250.01 – 1.0الحد الأدنى لعتبة الثقة
ioufloat0.70.0 – 0.95عتبة NMS IoU
imgszint64032 – 1280حجم صورة الإدخال بالبكسل
normalizeمنطقي (bool)false-إرجاع إحداثيات صندوق الإحاطة (bounding box) كـ 0 – 1
decimalsint50 – 10الدقة العشرية لقيم الإحداثيات
bitsint88, 12, 16كمية خريطة العمق، لنماذج العمق فقط
sourcestring--عنوان URL لصورة أو سلسلة base64 (بديل لـ file)

قم بتوفير إما file أو source. تقبل نماذج العمق أيضًا bits (8 أو 12 أو 16) لتحديد تكميم PNG لخريطة العمق. الطلبات التي تتجاوز حدود إدخال الخدمة تعيد 413.

curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@image.jpg" \
  -F "conf=0.5" \
  https://platform.ultralytics.com/api/models/acme-vision/inspection/v3/predict

الاستجابة:

يتحمل كل مدخل في images القيم shape وspeed وresults، وبالنسبة لمهام التنبؤ الكثيف، حمولة PNG لـ semantic_mask أو depth (قيم العمق هي pixel × max / divisor، مع مقسم 255 للخريطة الافتراضية ذات 8 بت و65535 عندما تكون bits 12 أو 16). يبلغ الكائن metadata عن عدد الصور، وأوقات تنفيذ الدوال، والمهمة، وإصدارات الخدمة. لا يتم إرجاع مسارات النموذج الداخلية أبدًا.

{
    "images": [
        {
            "shape": [1080, 1920],
            "speed": { "preprocess": 2.1, "inference": 12.4, "postprocess": 1.3 },
            "results": [
                {
                    "class": 0,
                    "name": "person",
                    "confidence": 0.92,
                    "box": { "x1": 100, "y1": 50, "x2": 300, "y2": 400 }
                }
            ]
        }
    ],
    "metadata": {
        "imageCount": 1,
        "functionTimeAlive": 184.2,
        "functionTimeCall": 0.31,
        "task": "detect",
        "version": { "ultralytics": "8.4.120" }
    }
}

التحقق من تقدم التدريب#

GET /api/models/{owner}/{project}/{model}/training

Python SDK: client.models.training(owner, project, model)

يعيد job، الذي يحتوي على الحالة، وتقدم الحقبة الزمنية، والتوقيت، وتفاصيل الحوسبة، ووسائط التدريب، ومقاييس الحقبة، وتفاصيل الأخطاء الآمنة، أو null عندما لم يتم تدريب النموذج أبدًا. النماذج الموجودة في المشاريع العامة قابلة للقراءة بدون مصادقة.

إلغاء التدريب#

DELETE /api/models/{owner}/{project}/{model}/training

Python SDK: client.models.delete_training(owner, project, model)

ينهي مثيل الحوسبة قيد التشغيل ويضع علامة على المهمة كملغاة. يعيد 409 عندما لا يكون التدريب نشطًا بعد الآن.


API التدريب#

قم بإطلاق تدريب YOLO على وحدات معالجة الرسوميات السحابية ومراقبة التقدم في الوقت الفعلي. راجع وثائق التدريب السحابي.

graph LR
    A[POST /api/training/start]:::start --> B[Job Created]:::proc
    B --> C{Training}:::decide
    C -->|progress| D[GET .../training]:::proc
    C -->|cancel| E[DELETE .../training]:::error
    C -->|complete| F[Model Ready]:::out
    F --> G[Deploy or Export]:::proc

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef decide fill:#FF9800,color:#fff
    classDef out fill:#9C27B0,color:#fff
    classDef error fill:#F44336,color:#fff

الحصول على توفر GPU#

GET /api/training/gpu-availability

Python SDK: client.training.gpu_availability()

يعيد حالة المخزون الحالية مصنفة بواسطة معرف وحدة معالجة الرسوميات. عامة وبدون مصادقة؛ قم تمرير managed=true لتضمين سعة التدريب المُدارة، والتي تتطلب مفتاح API.

بدء التدريب#

POST /api/training/start

Python SDK: client.training.start(model_id=..., train_args=...)

الحقلالنوعمطلوبالوصف
modelIdstringنعممعرف النموذج المراد تدريبه
trainArgsكائننعموسائط تدريب YOLO؛ model وdata وepochs مطلوبة
gpuTypestringلاوحدة معالجة الرسوميات السحابية المراد استخدامها (الافتراضي: rtx-4090)
captureDatasetVersionbooleanلاحفظ إصدار مجموعة بيانات غير قابلة للتغيير لهذا التشغيل (الافتراضي: false)
curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "modelId": "65f1c0a2b3d4e5f601234599",
    "gpuType": "rtx-4090",
    "trainArgs": {
      "model": "yolo26n.pt",
      "data": "ul://acme-vision/datasets/warehouse",
      "epochs": 100,
      "imgsz": 640,
      "batch": 16
    }
  }' \
  https://platform.ultralytics.com/api/training/start

الاستجابة:

{
    "modelId": "65f1c0a2b3d4e5f601234599",
    "status": "starting",
    "gpuType": "rtx-4090",
    "estimatedCost": { "pricePerHour": 0.69, "gpuMemoryGb": 24 },
    "billing": {
        "estimatedCostCents": 138,
        "estimatedCostDisplay": "$1.38",
        "balanceCents": 2500
    }
}

يعيد التدريب 402 عندما يكون رصيد نقاطك منخفضًا للغاية و503 عندما لا تتوفر سعة لوحدة معالجة الرسوميات المطلوبة.

أنواع GPU

تتوفر 26 نوعًا من وحدات معالجة الرسوميات، من rtx-2000-ada إلى b300، بما في ذلك rtx-4090 وl40s وa100-80gb-pcie وa100-80gb-sxm وrtx-pro-6000 وh100-sxm وh200-sxm وb200. راجع التدريب السحابي للحصول على القائمة الكاملة مع الأسعار.


واجهة برمجة تطبيقات التصدير#

تحويل النماذج إلى تنسيقات محسنة مثل ONNX وTensorRT وCoreML وLiteRT للنشر على الحافة. راجع وثائق النشر.

سرد عمليات التصدير#

GET /api/models/{owner}/{project}/{model}/exports

Python SDK: client.exports.list(owner, project, model)

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

المعاملالنوعالوصف
statusstringالتصفية حسب queued أو starting أو running أو completed أو failed أو cancelled
limitintالحد الأقصى لعمليات التصدير المراد إرجاعها (الافتراضي: 20، الحد الأقصى: 100)

إنشاء تصدير#

POST /api/models/{owner}/{project}/{model}/exports

Python SDK: client.exports.create(owner, project, model, format=...)

الحقلالنوعمطلوبالوصف
formatstringنعمتنسيق التصدير المستهدف (انظر الجدول أدناه)
gpuTypestringشرطيمطلوب عندما يكون format هو engine؛ استخدم GPU or Jetson target مدعوماً
argsكائنلاخيارات التصدير: imgsz وquantize وdynamic وsimplify وopset وconf وiou وbatch وworkspace وnms وend2end وoptimize وkeras وname (الهدف للجهاز لتنسيقات RKNN وQNN وHailo وAscend)
curl -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"format": "onnx", "args": {"imgsz": 640, "quantize": 16}}' \
  https://platform.ultralytics.com/api/models/acme-vision/inspection/v3/exports

الاستجابة (201): id، format، status (queued أو runninggpuType، region. عملية تصدير مكافئة قيد التنفيذ بالفعل تعيد 409.

التنسيقات المدعومة:

استخدم الوسيط format من جدول التصدير المشترك أدناه. PyTorch هو تنسيق المصدر وليس هدف تصدير لواجهة برمجة التطبيقات.

التنسيقوسيط formatالنموذجالبيانات الوصفيةالوسائط (Arguments)
PyTorch-yolo26n.pt-
TorchScripttorchscriptyolo26n.torchscriptimgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n.onnximgsz، quantize، dynamic، simplify، opset، nms، batch، data، fraction، device
OpenVINOopenvinoyolo26n_openvino_model/imgsz، quantize، dynamic، nms، batch، data، fraction، device
TensorRTengineyolo26n.engineimgsz، quantize، dynamic، simplify، opset، workspace، nms، batch، data، fraction، device
CoreMLcoremlyolo26n.mlpackageimgsz, dynamic, quantize, nms, batch, device
TF SavedModelsaved_modelyolo26n_saved_model/imgsz، keras، quantize، opset، nms، batch، data، fraction، device
TF GraphDefpbyolo26n.pbimgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n_edgetpu.tfliteimgsz, quantize, opset, data, fraction, device
PaddlePaddlepaddleyolo26n_paddle_model/imgsz، batch، device
MNNmnnyolo26n.mnnimgsz، batch، dynamic، quantize، simplify، opset، nms، device
NCNNncnnyolo26n_ncnn_model/imgsz, quantize, batch, device
IMX500imxyolo26n_imx_model/imgsz, quantize, data, fraction, nms, device
RKNNrknnyolo26n_rknn_model/imgsz، batch، name، quantize، simplify، opset، data، fraction، device
ExecuTorchexecutorchyolo26n_executorch_model/imgsz، batch، device
Axeleraaxelerayolo26n_axelera_model/imgsz, batch, quantize, data, fraction, device
DEEPXdeepxyolo26n_deepx_model/imgsz, quantize, simplify, opset, data, optimize, device
Qualcomm QNNqnnyolo26n_qnn.onnximgsz، batch، name، quantize، simplify، opset، data، fraction، device
LiteRTlitertyolo26n.tfliteimgsz, quantize, batch, data, fraction, device
Hailohailoyolo26n_hailo_model/imgsz، name، quantize، data، fraction، simplify، conf، iou
Huawei Ascendascendyolo26n_ascend_model/imgsz, batch, name, quantize, opset, simplify, nms
Apple Core AIcoreaiyolo26n.aimodelimgsz، batch، quantize

الحصول على حالة التصدير#

GET /api/models/{owner}/{project}/{model}/exports/{exportId}

Python SDK: client.exports.retrieve(owner, project, model, export_id)

يعيد الكائن export مع status وformat وargs وgpuType والطوابع الزمنية، وبمجرد اكتماله، كائن file يحتوي على size وdownloadUrl وdownloadFilename.

إلغاء أو حذف التصدير#

DELETE /api/models/{owner}/{project}/{model}/exports/{exportId}

Python SDK: client.exports.delete(owner, project, model, export_id)

يلغي عملية تصدير نشطة أو يحذف عملية مكتملة وملفها. توضح الاستجابة ما حدث:

{
    "success": true,
    "action": "cancelled"
}

API النشر#

نشر النماذج على نقاط نهاية استدلال مخصصة مع عمليات التحقق من الصحة والمراقبة. راجع وثائق نقاط النهاية.

graph LR
    A[Create]:::start --> B[Deploying]:::proc
    B --> C[Ready]:::out
    C -->|action stop| D[Stopped]:::extern
    C -->|action replace| B
    D -->|action start| C
    C -->|delete| E[Deleted]:::error
    D -->|delete| E
    C -->|predict| F[Inference Results]:::out

    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef out fill:#9C27B0,color:#fff
    classDef error fill:#F44336,color:#fff
    classDef extern fill:#607D8B,color:#fff

سرد عمليات النشر#

GET /api/deployments/{owner}

Python SDK: client.deployments.list(owner)

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

المعاملالنوعالوصف
statusstringcreating أو deploying أو ready أو stopping أو stopped أو failed
modelstringالتصفية حسب {project}/{model}، على سبيل المثال inspection/v3
limitintالحد الأقصى لعمليات النشر المراد إرجاعها (الافتراضي: 20، الحد الأقصى: 100)

يجب على المتصلين مجهولي الهوية التصفية حسب نموذج عام واحد؛ تتطلب سرد مساحة عمل كاملة مصادقة.

إنشاء نشر#

POST /api/deployments/{owner}

Python SDK: client.deployments.create(owner, project=..., model=..., deployment=..., name=..., region=...)

الجسم (Body):

{
    "project": "inspection",
    "model": "v3",
    "deployment": "edge-1",
    "name": "Edge 1",
    "region": "us-central1"
}
الحقلالنوعمطلوبالوصف
projectstringنعمالمشروع الذي يحتوي على النموذج
modelstringنعمالنموذج المراد نشره
deploymentstringنعماسم النشر المستخدم في عناوين URL للمنصة
namestringنعماسم العرض
regionstringنعمواحدة من 42 منطقة نشر مدعومة

الاستجابة (201): id وdeployment وstatus (creating) وmessage وregion.

تحجيم الموارد

يتم إدارة وحدة المعالجة المركزية، والذاكرة، وتحجيم المثيلات بواسطة المنصة بناءً على حدود خطتك، ولا يقبل طلب الإنشاء تكوين موارد. يتم إرجاع القيم الحالية في الكائن resources عند كل قراءة للنشر.

اختيار المنطقة

اختر منطقة قريبة من مستخدميك لأقل زمن وصول. تُظهر واجهة مستخدم المنصة تقديرات زمن الوصول لجميع المناطق المتاحة البالغ عددها 42 منطقة.

الحصول على نشر#

GET /api/deployments/{owner}/{deployment}

Python SDK: client.deployments.retrieve(owner, deployment)

يعيد الكائن deployment مع status وstatusMessage وregion وserviceUrl وresources.

بدء النشر أو إيقافه أو استبداله#

PATCH /api/deployments/{owner}/{deployment}

Python SDK: client.deployments.update(owner, deployment, body=...)

حقل واحد action يحدد العملية:

{ "action": "start" }

يطرح الاستبدال مراجعة جديدة مع الحفاظ على معرف النشر، والمنطقة، وعنوان URL لنقطة النهاية؛ تظل المراجعة الحالية نشطة إذا فشل الطرح. يجب أن يكون نموذج الاستبدال نموذجًا مكتملًا بأوزان يمكن لمفتاحك الوصول إليها. العمليات المكتملة تعيد 200 مع status ready أو stopped؛ العمليات التي لا تزال قيد الطرح تعيد 202 مع deploying أو stopping.

حذف نشر#

DELETE /api/deployments/{owner}/{deployment}

Python SDK: client.deployments.delete(owner, deployment)

يزيل نقطة نهاية الاستدلال بشكل دائم.

فحص الصحة#

GET /api/deployments/{owner}/{deployment}/health

Python SDK: client.deployments.health(owner, deployment)

يرسل إشارات ويُسخِّن نقطة النهاية، مع إرجاع healthy وlatencyMs ورمز الوصلة العلوية status.

تشغيل الاستدلال على عملية نشر#

POST /api/deployments/{owner}/{deployment}/predict

Python SDK: client.deployments.predict(owner, deployment, body=...)

يوجه صورة أو فيديو عبر نقطة النهاية المخصصة. تتطابق عقود الطلب والاستجابة مع استدلال النموذج.

نموذج Multipart:

المعاملالنوعالافتراضيالنطاقالوصف
fileملف--ملف صورة أو فيديو (مطلوب ما لم يتم تعيين source)
conffloat0.250.01 – 1.0الحد الأدنى لعتبة الثقة
ioufloat0.70.0 – 0.95عتبة NMS IoU
imgszint64032 – 1280حجم صورة الإدخال بالبكسل
normalizeمنطقي (bool)false-إرجاع إحداثيات صندوق الإحاطة (bounding box) كـ 0 – 1
decimalsint50 – 10الدقة العشرية لقيم الإحداثيات
bitsint88, 12, 16كمية خريطة العمق، لنماذج العمق فقط
sourcestring--عنوان URL لصورة أو سلسلة base64 (بديل لـ file)

الحصول على المقاييس#

GET /api/deployments/{owner}/{deployment}/metrics

Python SDK: client.deployments.metrics(owner, deployment)

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

المعاملالنوعالوصف
rangestring1h أو 6h أو 24h (الافتراضي) أو 7d أو 30d
sparklinebooleanإرجاع ملخص لوحة القيادة المدمج بدلاً من السلسلة الكاملة (الافتراضي: false)

تحتوي الاستجابة الكاملة على summary (إجماليات الطلبات، ومعدل الخطأ، ومتوسط و p50/p95/p99 لزمن الوصول) وtimeSeries (الطلبات، والأخطاء، وزمن الوصول، ووحدة المعالجة المركزية، والذاكرة، وعدد المثيلات). تعيد استجابة الرسم البياني المصغر requests24h وtotalRequests وerrorRate وavgLatencyMs.

الحصول على السجلات#

GET /api/deployments/{owner}/{deployment}/logs

Python SDK: client.deployments.logs(owner, deployment)

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

المعاملالنوعالوصف
severitystringمفصولة بفواصل: DEBUG، INFO، NOTICE، WARNING، ERROR، CRITICAL، ALERT، EMERGENCY
limitintالمدخلات المراد إرجاعها (الافتراضي: 50، الحد الأقصى: 200)
pageTokenstringرمز التصفح من استجابة سابقة

API سلة المهملات#

عرض واستعادة وحذف المشاريع ومجموعات البيانات والنماذج المحذوفة مؤقتًا بشكل دائم. يتم مسح العناصر تلقائيًا بعد 30 يومًا. راجع وثائق سلة المحذوفات.

سرد سلة المهملات#

GET /api/trash

Python SDK: client.lifecycle.trash()

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

المعاملالنوعالوصف
typestringall (الافتراضي)، project، dataset، أو model
pageintرقم الصفحة (الافتراضي: 1)
limitintالعناصر في كل صفحة (الافتراضي: 50، الحد الأقصى: 200)

تتضمن الاستجابة items (كل منها مع daysRemaining) وtotal وpage وlimit وtotalPages وsummary مع الإجماليات حسب النوع.

استعادة العنصر#

POST /api/trash

Python SDK: client.lifecycle.restore(id=..., type=...)

{
    "id": "65f1c0a2b3d4e5f601234567",
    "type": "dataset"
}

استعادة المشروع تستعيد أيضًا النماذج التي تم نقلها إلى سلة المحذوفات معه، والتي يتم الإبلاغ عنها كـ restoredModels.

الحذف الدائم#

DELETE /api/trash

Python SDK: client.lifecycle.delete_trash(body=...)

حذف عنصر واحد:

{
    "id": "65f1c0a2b3d4e5f601234567",
    "type": "dataset"
}

أو إفراغ سلة المحذوفات بالكامل:

{
    "all": true
}

تبلغ الاستجابة عن deletedCount، بالإضافة إلى cascadedModels وsurvivingDeployments حيثما كان ذلك مناسبًا.

لا رجعة فيه

لا يمكن التراجع عن الحذف الدائم. تتم إزالة المورد وجميع البيانات المرتبطة به.


واجهة برمجة تطبيقات الرفع#

تحميل الملفات مباشرة إلى التخزين السحابي باستخدام عناوين URL الموقعة. يؤدي إكمال تحميل نموذج إلى إرفاق أوزانه؛ ويقوم إكمال تحميل أرشيف مجموعة بيانات بتسجيل الجلسة، والتي تقوم بتمريرها بعد ذلك إلى استيعاب مجموعة البيانات. راجع وثائق البيانات.

الحصول على عنوان URL موقع للرفع#

POST /api/upload/signed-url

Python SDK: client.upload.signed_url(body=...)

الجسم (Body):

{
    "assetType": "datasets",
    "assetId": "65f1c0a2b3d4e5f601234567",
    "filename": "warehouse.zip",
    "contentType": "application/zip",
    "totalBytes": 52428800
}
الحقلالنوعمطلوبالوصف
assetTypestringنعمdatasets أو models أو images أو videos
assetIdstringنعممعرف مجموعة البيانات أو النموذج المستهدف
filenamestringنعماسم الملف الاصلي (الحد الأقصى 256 حرفًا)
contentTypestringنعمنوع MIME
totalBytesnumberنعمحجم الملف بالبايت
أسماء ملفات أرشيف مجموعة البيانات

عندما يكون assetType هو datasets، يجب أن ينتهي filename بـ .zip أو .tar أو .tar.gz أو .tgz أو .ndjson. قم بتجميع الصور السائبة في أرشيف قبل التحميل.

الاستجابة:

{
    "sessionId": "session_abc123",
    "uploadUrl": "https://storage.googleapis.com/...&signature=...",
    "expiresAt": "2026-02-22T12:00:00Z"
}

قم بتحميل الملف بطلب PUT إلى uploadUrl، باستخدام نفس Content-Type الذي أعلنته.

إكمال الرفع#

POST /api/upload/complete

Python SDK: client.upload.complete(session_id=...)

{
    "sessionId": "session_abc123",
    "checksum": "<optional sha-256 hex>"
}

الاستجابة: success وكائن file مع size وcontentType. بالنسبة للنماذج، يؤدي هذا إلى إرفاق الأوزان؛ أما بالنسبة لأرشيفات مجموعات البيانات، فاتصل بـ ingest بعد ذلك لبدء المعالجة.


واجهة برمجة تطبيقات تكاملات التخزين#

قم بتوصيل حسابات Google Cloud Storage أو Amazon S3 أو Azure Blob Storage للقراءة فقط وتصفحها كمصادر لمجموعات البيانات. راجع وثائق التكاملات.

سرد التكاملات#

GET /api/integrations/buckets

Python SDK: client.storage_integrations.list()

يعيد integrations، كل منها مع id وprovider وcredentialIdentity وtargets وcreatedAt. لا يتم إرجاع بيانات الاعتماد أبدًا.

اكتشاف المواقع#

POST /api/integrations/buckets/discover

Python SDK: client.storage_integrations.discover(body=...)

يسرد الدلاء أو الحاويات القابلة للقراءة باستخدام بيانات الاعتماد المقدمة، دون حفظها.

{
    "provider": "gcs",
    "credentials": {
        "client_email": "svc@project.iam.gserviceaccount.com",
        "private_key": "-----BEGIN PRIVATE KEY-----\n...",
        "project_id": "my-project"
    }
}

الاستجابة: {"targets": ["my-bucket", "another-bucket"]}

توصيل التخزين#

POST /api/integrations/buckets

Python SDK: client.storage_integrations.create(body=...)

نفس أشكال بيانات الاعتماد الخاصة بالاكتشاف، بالإضافة إلى مصفوفة مطلوبة targets من 1-50 اسم دلو أو حاوية. يعيد 201 مع التكامل المخزن. يتم رفض بيانات اعتماد S3 المؤقتة (مفاتيح الوصول ASIA).

تصفح الكائنات#

GET /api/integrations/buckets/{id}/objects

Python SDK: client.storage_integrations.objects(id, target=...)

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

المعاملالنوعمطلوبالوصف
targetstringنعماسم الدلو أو الحاوية
prefixstringلابادئة المجلد (الحد الأقصى 1024 حرفًا)
cursorstringلامؤشر ترقيم صفحة المزود من صفحة سابقة

يعيد entries (كل kind هو folder أو file) وcursor اختياري للصفحة التالية.

فصل التخزين#

DELETE /api/integrations/buckets/{id}

Python SDK: client.storage_integrations.delete(id)

يزيل بيانات الاعتماد المحفوظة دون حذف بيانات المزود. تظل مجموعات البيانات المتصلة مرئية، ولكن تظل ملفاتها غير متاحة حتى يتم إعادة توصيل نفس حساب التخزين. يتطلب وصول مسؤول مساحة العمل.


واجهة برمجة تطبيقات استيراد مجموعات البيانات#

استيراد مجموعات البيانات من خدمات الطرف الثالث. راجع تكامل Roboflow.

معاينة استيراد من Roboflow#

POST /api/integrations/roboflow/preview

Python SDK: client.datasets.preview_roboflow(api_key=...)

يحول مفتاح واجهة برمجة تطبيقات Roboflow إلى خطة استيراد: تفاصيل مساحة العمل، وnewDatasets الذي سيتم استيراده، وإعدادات المشاريع التي تم تخطيها أو غير المدعومة أو التي لم يتم حلها، وbytesTotal، والمساحة المتاحة لديك من storage. تتم قراءة مفتاح واجهة برمجة تطبيقات Roboflow من جسم الطلب ولا يتم الاحتفاظ به.

{
    "apiKey": "ROBOFLOW_API_KEY"
}

استيراد من Roboflow#

POST /api/integrations/roboflow/import

Python SDK: client.datasets.import_roboflow(api_key=..., items=...)

يضع مهام الإدخال في قائمة انتظار لما يصل إلى 500 إصدار مشروع مختار من Roboflow، باستخدام العناصر التي أرجعتها المعاينة.

{
    "apiKey": "ROBOFLOW_API_KEY",
    "items": [
        {
            "workspace": "my-workspace",
            "projectId": "warehouse-safety",
            "projectName": "Warehouse Safety",
            "projectType": "object-detection",
            "latestVersion": 4
        }
    ]
}

الاستجابة (201): مصفوفات imported، وfailed، وskipped. تتطلب عمليات الاستيراد مساحة تخزين متاحة، ويجب أن تتناسب كل مجموعة بيانات مع حد الحجم لكل عملية استيراد في خطتك.


واجهة برمجة تطبيقات الحساب#

افحص حسابك على المنصة، والمفاتيح، والتخزين، والملفات الشخصية العامة. راجع وثائق الإعدادات.

ملخص الحساب#

GET /api/account/summary

Python SDK: client.account.summary()

يعيد الخطة، ورصيد الائتمان، وتعداد الموارد لمساحة العمل التي أصدرت المفتاح.

{
    "username": "acme-vision",
    "name": "Acme Vision",
    "accountType": "team",
    "plan": "pro",
    "creditsCents": 2500,
    "counts": { "projects": 4, "datasets": 7, "models": 21 },
    "teams": []
}
قائمة الفرق

يتم ملء teams لجلسات المتصفح. تُرجع استجابات مفاتيح واجهة برمجة التطبيقات قائمة فارغة، لأن المفتاح مخصص بالفعل لمساحة عمل واحدة.

سرد مفاتيح API#

GET /api/api-keys

Python SDK: client.account.api_keys()

يعيد keys مع keyId، وname، وkeyPrefix، وcreatedAt لمساحة عمل المفتاح. تتلقى الطلبات الموثقة بمفتاح واجهة برمجة التطبيقات بيانات وصفية فقط؛ ويتم إظهار قيم المفاتيح الكاملة لمالك مساحة العمل في الإعدادات > مفاتيح واجهة برمجة التطبيقات في واجهة المستخدم للمنصة، وهي أيضًا المكان الذي يتم فيه إنشاء المفتاح وإلغاؤه.

التحقق من استخدام التخزين#

GET /api/storage

Python SDK: client.account.storage()

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

المعاملالنوعالوصف
detailsbooleanتضمين أكبر عشرة مستهلكين للتخزين (افتراضي: false)

الاستجابة:

{
    "tier": "pro",
    "usage": {
        "storage": { "current": 1073741824, "limit": 107374182400, "percent": 1.0 },
        "datasets": { "current": 536870912, "limit": 107374182400, "percent": 0.5 }
    },
    "breakdown": {
        "byCategory": {
            "datasets": { "bytes": 536870912, "count": 2 },
            "models": { "bytes": 268435456, "count": 4 },
            "exports": { "bytes": 268435456, "count": 3 }
        },
        "topItems": [
            {
                "_id": "65f1c0a2b3d4e5f601234567",
                "name": "Warehouse",
                "slug": "warehouse",
                "sizeBytes": 536870912,
                "type": "dataset"
            }
        ]
    },
    "region": "us",
    "username": "acme-vision",
    "updatedAt": "2026-01-15T10:00:00Z"
}

الحصول على ملف تعريف مستخدم عام#

GET /api/users

Python SDK: client.account.profile(username=...)

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

المعاملالنوعمطلوبالوصف
usernamestringنعماسم المستخدم للبحث عنه

يعيد ملف التعريف العام user مع followerCount، وللمتصلين الموثقين، isFollowed.

متابعة أو إلغاء متابعة مستخدم#

PATCH /api/users

Python SDK: client.account.follow(username=..., followed=...)

{
    "username": "target-user",
    "followed": true
}

الاستجابة: followed و followerCount المحدث.


API الفوترة#

تحقق من استخدام خطتك وسجل الائتمان الخاص بك. راجع وثائق الفوترة.

وحدات العملة

مبالغ الفوترة هي أعداد صحيحة بالسنت الأمريكي، حيث 100 = $1.00.

عرض الخطة والاستخدام#

GET /api/billing/usage-summary

Python SDK: client.billing.usage_summary()

يعيد plan (المعرف، والحالة، دورة الفوترة، ونهاية الفترة)، وmetrics (حد التخزين والاستخدام)، وtrainingCredit، وfeatures، وcreditsCents، وتعداد المقاعد.

عرض المعاملات#

GET /api/billing/transactions

Python SDK: client.billing.transactions()

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

المعاملالنوعالوصف
fromstringالطابع الزمني لأقدم معاملة (ISO 8601)
tostringالطابع الزمني لأحدث معاملة (ISO 8601)

تتضمن كل معاملة id، وtype (مثل purchase، أو training، أو monthly_grant، أو refund)، وamountCents، وbalanceAfter، وcreatedAt، وحقل اختيارياً receiptUrl، وسياق النموذج لرسوم التدريب. لا يتم إرجاع تفاصيل الفوترة الداخلية أبدًا.


واجهة برمجة تطبيقات الاستكشاف#

ابحث في المشاريع العامة ومجموعات البيانات التي تشترك فيها المجتمعات. راجع وثائق الاستكشاف.

البحث في المحتوى العام#

GET /api/explore/search

Python SDK: client.explore.search()

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

المعاملالنوعالوصف
qstringمصطلح البحث (بحد أقصى 200 حرف)
typestringall (افتراضي)، أو projects، أو datasets
sortstringnewest (افتراضي)، أو oldest، أو stars، أو name-asc، أو name-desc، أو count-desc، أو count-asc
offsetintالنتائج المراد تخطيها (افتراضي: 0)
limitintالحد الأقصى للنتائج لكل نوع مورد (افتراضي: 20، الحد الأقصى: 100)
taskstringمرشحات المهام مفصولة بفواصل: detect، أو segment، أو semantic، أو depth، أو classify، أو pose، أو obb
authorstringمرشح اسم مستخدم المالك
starredbooleanإرجاع المحتوى الذي تم وضع نجمة عليه فقط بواسطة المتصل الموثق؛ يتطلب مفتاح واجهة برمجة تطبيقات

الاستجابة: projects، وdatasets، وhasMore.

curl "https://platform.ultralytics.com/api/explore/search?type=datasets&task=detect&sort=stars&limit=20"

Python SDK#

ultralytics-platform هو عميل Python محدد الأنواع تم إنشاؤه من عقد OpenAPI، مع طريقة واحدة لكل نقطة نهاية (client.datasets.list، client.models.predict، client.exports.create، ...). تقبل كل طريقة معاملات المسار حسب الموضع، والمدخلات الأخرى كمعاملات رئيسية، وtimeout وextra_headers اختيارية لكل طلب.

pip install "ultralytics-platform>=0.1.5" # Python 3.11+
from ultralytics_platform import Platform

with Platform() as client:  # reads ULTRALYTICS_API_KEY
    dataset = client.datasets.retrieve("acme-vision", "warehouse")
    images = client.datasets.images("acme-vision", "warehouse", limit=10)
    export = client.exports.create("acme-vision", "inspection", "v3", format="onnx")

يعرض AsyncPlatform نفس شجرة الموارد لشفرة async/await، وترفع الاستجابات غير الناجحة APIError مع status_code وbody وjson المحللة، وترفع اخفاقات الاتصال APIConnectionError. راجع مستودع SDK لمعرفة ملف README الكامل.

التكامل مع Python#

لسير عمل التدريب والاستدلال، استخدم حزمة Ultralytics لـ Python، والتي تتعامل مع المصادقة، والتحميلات، وبث المقاييس في الوقت الفعلي تلقائيًا.

التثبيت والإعداد#

pip install "ultralytics>=8.4.120"

التحقق من التثبيت:

yolo check

المصادقة#

yolo login YOUR_API_KEY

استخدام مجموعات بيانات المنصة#

الإشارة إلى مجموعات البيانات بمعرّفات URI من نوع ul://:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Train on your Platform dataset
model.train(
    data="ul://your-username/datasets/your-dataset",
    epochs=100,
    imgsz=640,
)

تنسيق URI:

النمطالوصف
ul://username/datasets/slugمجموعة البيانات
ul://username/project-nameمشروع
ul://username/project/model-nameنموذج محدد
ul://ultralytics/yolo26/yolo26nنموذج رسمي

النشر إلى المنصة#

إرسال النتائج إلى مشروع على المنصة:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# Results automatically sync to Platform
model.train(
    data="coco8.yaml",
    epochs=100,
    project="your-username/my-project",
    name="experiment-1",
)

ما الذي تتم مزامنته:

  • مقاييس التدريب (في الوقت الفعلي)
  • أوزان النموذج النهائية
  • مخططات التحقق
  • مخرجات وحدة التحكم
  • مقاييس النظام

أمثلة API#

تحميل نموذج من المنصة:

# Your own model
model = YOLO("ul://username/project/model-name")

# Official model
model = YOLO("ul://ultralytics/yolo26/yolo26n")

تشغيل الاستدلال:

results = model("image.jpg")

# Access results
for r in results:
    boxes = r.boxes  # Detection boxes
    masks = r.masks  # Segmentation masks
    keypoints = r.keypoints  # Pose keypoints
    probs = r.probs  # Classification probabilities

تصدير النموذج:

# Export to ONNX
model.export(format="onnx", imgsz=640, quantize=16)

# Export to TensorRT
model.export(format="engine", imgsz=640, quantize=16)

# Export to CoreML
model.export(format="coreml", imgsz=640)  # use imgsz=224 for classification

التحقق:

metrics = model.val(data="ul://username/datasets/my-dataset")

print(f"mAP50: {metrics.box.map50}")
print(f"mAP50-95: {metrics.box.map}")

الأسئلة الشائعة#

  • استخدم نفس أجزاء المالك والاسم التي تظهر في عنوان URL للمنصة. النموذج الموجود على https://platform.ultralytics.com/acme-vision/inspection/v3 هو GET /api/models/acme-vision/inspection/v3. لا تزال معرفات قاعدة البيانات تُعاد في الاستجابات (كـ id)، وتأخذ القليل من المسارات مباشرتها - مسارات الصور تأخذ imageId، وعمليات الرفع تأخذ assetId، وPOST /api/training/start تأخذ modelId.

  • يعتمد ذلك على المجموعة. تقبل معظم نقاط نهاية القائمة limit:

    curl -H "Authorization: Bearer YOUR_API_KEY" \
      "https://platform.ultralytics.com/api/datasets/acme-vision?limit=50"

    تستخدم صور مجموعات البيانات، والتجميع، وبحث الاستكشاف offset مع limit وتُبلغ عن hasMore:

    curl "https://platform.ultralytics.com/api/explore/search?type=datasets&offset=20&limit=20&sort=stars"

    من الأفضل تصفح مجموعات الصور الكبيرة جداً باستخدام المؤشر المُعاد كـ nextCursor:

    curl -H "Authorization: Bearer YOUR_API_KEY" \
      "https://platform.ultralytics.com/api/datasets/acme-vision/warehouse/images?limit=1000&includeTotal=false&cursor=LAST_IMAGE_ID"

    تستخدم سلة المهملات page، وتستخدم سجلات نشر النشر المؤشر الغامض pageToken المُعاد كـ nextPageToken.

  • نعم. كل عملية في هذه الصفحة هي طلب HTTPS عادي، ويتم نشر العقد الكامل كـ OpenAPI 3.2 على platform.ultralytics.com/openapi.json، والذي يمكنك تغذيته لولد عميل بأي لغة. حزمة ultralytics-platform هي بالضبط ذلك: عميل محدد الأنواع تم إنشاؤه من العقد، بينما تضيف حزمة ultralytics بث المقاييس في الوقت الفعلي وتحميل النماذج التلقائي علاوة على التدريب والاستدلال. تظل تدفقات حساب جلسة المتصفح فقط، مثل الدفع بالفواتير وإدارة الفريق، في واجهة مستخدم Platform UI.

  • استخدم رأس Retry-After من استجابة 429 للانتظار للمدة الزمنية الصحيحة:

    import time
    
    import requests
    
    def api_request_with_retry(url, headers, max_retries=3):
        for attempt in range(max_retries):
            response = requests.get(url, headers=headers)
            if response.status_code != 429:
                return response
            wait = int(response.headers.get("Retry-After", 2**attempt))
            time.sleep(wait)
        raise RuntimeError("Rate limit exceeded")
  • يعني 404 أن المورد غير موجود أو أنه غير مرئي لمفتاحك على الإطلاق. يعني 403 أنه تم العثور على المورد ولكن الإجراء يتطلب وصولاً أكثر مما يملكه مفتاحك - وصول محرر لتعديل مجموعة بيانات، وصول مالك لحذف نشر، وصول مسؤول لفصل التخزين، أو خطة أعلى أو حصة أكبر للصادرات والنشر.

  • قراءة مجموعات البيانات والمشاريع والنماذج العامة، بما في ذلك صورها، وعناوين URL للصور الموقعة، وإحصائيات الفئات، وحالة التضمين، وتنسيق التجميع، وقائمة التصدير؛ التحقق من تقدم التدريب على نموذج عام؛ تنزيل ملفات نموذج عام؛ تشغيل الاستدلال على نموذج عام؛ البحث عن ملف تعريف مستخدم عام؛ سرد العمليات المنشورة المفلترة لنموذج عام واحد؛ والبحث في الاستكشاف. GET /api/training/gpu-availability عام تماماً ما لم تطلب سعة مُدارة. كل شيء آخر يتطلب مفتاحاً، وتوفير مفتاح على نقطة نهاية عامة يكشف أيضاً عن مواردك الخاصة.

التعليقات