PhotoRestore

نظرة عامة

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

عنوان URL الأساسي
/apiجميع المسارات أدناه نسبية إلى هذا الأساس من نفس المصدر — لا يوجد مضيف واجهة برمجة تطبيقات منفصل يجب إعداده.
المصادقة
مقيّدة بالجلسة عبر ملف تعريف ارتباط httpOnly يُصدر عند المتابعة كضيف. لا توجد مفاتيح واجهة برمجة تطبيقات بعد (راجع "المخطط له" أدناه).

ضمان العقد: قيمة result_url الخاصة بأي مهمة تكون دائمًا image_url صالحة — يمكنك إرسالها مباشرة إلى /api/restore أو /api/upscale لسلسلة عملية أخرى (هذه بالضبط الطريقة التي تعمل بها "تكبير هذه الصورة" بعد الترميم).

POST/api/uploads

رفع صورة

يرفع ملف صورة واحدًا ويعيد عنوان URL لأصل من نفس المصدر يمكنك تمريره كـ image_url إلى الترميم أو التكبير.

نص الطلب

الاسمالنوعمطلوبالحدودالوصف
filebinary (multipart/form-data)نعمملف الصورة، يُرسل بصيغة multipart/form-data.

نص الاستجابة

الاسمالنوعمطلوبالحدودالوصف
image_urlstringنعمعنوان URL لأصل من نفس المصدر يُعاد من عملية رفع سابقة — الشكل الوحيد المقبول لـ image_url.
bytesnumberنعم0–9007199254740991حجم الملف المخزَّن بالبايت.
mimestringنعمنوع MIME المكتشف للملف المخزَّن (وهو الموثوق — وليس النوع الذي يعلنه العميل).

مثال استجابة 201

{
  "image_url": "/api/mock-assets/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "bytes": 2458112,
  "mime": "image/jpeg"
}

أمثلة الكود

curl -X POST 'https://your-app.example.com/api/uploads' \
  -F "file=@photo.jpg"
POST/api/restore

إنشاء مهمة ترميم

يبدأ مهمة ترميم غير متزامنة لصورة تم رفعها مسبقًا. يعيد فورًا مرجع مهمة بحالة pending — استطلع التقدم عبر GET /api/jobs/{job_id}.

نص الطلب

الاسمالنوعمطلوبالحدودالوصف
image_urlstringنعم/api/mock-assets/<uuid>عنوان URL لأصل من نفس المصدر يُعاد من عملية رفع سابقة — الشكل الوحيد المقبول لـ image_url.
user_hintstringلاmax 300 charsملاحظة نصية اختيارية تصف الصورة، تُستخدم لتوجيه خطوة التحليل التجريبية.
params.colorizebooleanنعممطلوب للتوافق مع المخطط. تُقبل القيمة لكنها لا تحدّد وضع معالجة؛ فمسار الترميم واحد مهما كانت القيمة.
params.resolutionunknownنعم
params.variantunknownنعم

نص الاستجابة

الاسمالنوعمطلوبالحدودالوصف
job_idstringنعمjob_<uuid>المعرّف الفريد لهذه المهمة.
statuspending | processing | succeeded | failed | cancelledنعمالحالة الحالية لدورة حياة المهمة.

مثال استجابة 202

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "pending"
}

أمثلة الكود

curl -X POST 'https://your-app.example.com/api/restore' \
  -H 'Content-Type: application/json' \
  -d '{  "image_url": "/api/mock-assets/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",  "user_hint": "the sky was blue",  "params": {    "colorize": true  }}'
POST/api/upscale

إنشاء مهمة تكبير

يبدأ مهمة تكبير غير متزامنة لصورة تم رفعها مسبقًا، بالوضع والدقة المستهدفة المطلوبين. يعيد فورًا مرجع مهمة بحالة pending.

نص الطلب

الاسمالنوعمطلوبالحدودالوصف
image_urlstringنعم/api/mock-assets/<uuid>عنوان URL لأصل من نفس المصدر يُعاد من عملية رفع سابقة — الشكل الوحيد المقبول لـ image_url.
user_hintstringلاmax 300 charsملاحظة نصية اختيارية تصف الصورة، تُستخدم لتوجيه خطوة التحليل التجريبية.
params.modefast | balanced | highنعمالمفاضلة بين الجودة والسرعة عند التكبير.
params.target_megapixelsnumberنعم1–64دقة الإخراج المطلوبة، بالميجابكسل.

نص الاستجابة

الاسمالنوعمطلوبالحدودالوصف
job_idstringنعمjob_<uuid>المعرّف الفريد لهذه المهمة.
statuspending | processing | succeeded | failed | cancelledنعمالحالة الحالية لدورة حياة المهمة.

مثال استجابة 202

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "pending"
}

أمثلة الكود

curl -X POST 'https://your-app.example.com/api/upscale' \
  -H 'Content-Type: application/json' \
  -d '{  "image_url": "/api/mock-assets/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",  "params": {    "mode": "fast",    "target_megapixels": 12  }}'
GET/api/jobs/{job_id}

الحصول على حالة المهمة

يعيد الحالة الحالية للمهمة: status وprogress، وبمجرد أن تصبح succeeded، عنوان result_url يمكنك تنزيله أو إعادة إرساله كـ image_url جديد.

نص الاستجابة

الاسمالنوعمطلوبالحدودالوصف
job_idstringنعمjob_<uuid>المعرّف الفريد لهذه المهمة.
typerestore | upscaleنعمالأداة التي أنشأت هذه المهمة.
statuspending | processing | succeeded | failed | cancelledنعمالحالة الحالية لدورة حياة المهمة.
progressnumberنعم0–100النسبة المئوية للإنجاز، من 0 إلى 100.
result_urlstringلايظهر بمجرد نجاح المهمة — عنوان URL لأصل من نفس المصدر يمكن أيضًا إرساله كـ image_url جديد.
result_urls.lightstringنعم
result_urls.strongstringلا
before_urlstringلا
error.codeINVALID_REQUEST | UNSUPPORTED_FORMAT | FILE_TOO_LARGE | JOB_NOT_FOUND | VLM_FAILED | WORKFLOW_FAILED | TIMEOUT | CANCELLED | INTERNAL | INSUFFICIENT_CREDITS | STORAGE_QUOTA_EXCEEDEDنعمسبب الفشل القابل للقراءة آليًا.
error.messagestringنعمرسالة فشل قابلة للقراءة البشرية. تظهر فقط عندما تكون status هي failed.
created_atstringنعموقت إنشاء المهمة، بصيغة ISO 8601.
updated_atstringنعموقت آخر تحديث للمهمة، بصيغة ISO 8601.

مثال استجابة 200

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "type": "restore",
  "status": "succeeded",
  "progress": 100,
  "result_url": "/api/mock-assets/6c1d3a2e-4f5b-4a1e-9c2d-1a2b3c4d5e6f",
  "created_at": "2026-08-03T10:15:00.000Z",
  "updated_at": "2026-08-03T10:15:42.000Z"
}

أمثلة الكود

curl -X GET 'https://your-app.example.com/api/jobs/job_3fa85f64-5717-4562-b3fc-2c963f66afa6'
POST/api/jobs/{job_id}/cancel

إلغاء مهمة

يطلب إلغاء مهمة. إلغاء مهمة وصلت بالفعل إلى حالة نهائية لا يُحدث أي أثر ويعيد حالتها الحالية دون تغيير.

نص الاستجابة

الاسمالنوعمطلوبالحدودالوصف
job_idstringنعمjob_<uuid>المعرّف الفريد لهذه المهمة.
statuspending | processing | succeeded | failed | cancelledنعمالحالة الحالية لدورة حياة المهمة.

مثال استجابة 202

{
  "job_id": "job_3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "cancelled"
}

أمثلة الكود

curl -X POST 'https://your-app.example.com/api/jobs/job_3fa85f64-5717-4562-b3fc-2c963f66afa6/cancel'

دورة حياة حالة المهمة

تمر كل مهمة بآلة الحالات هذه. الحالتان pending وprocessing غير نهائيتين؛ أما succeeded وfailed وcancelled فهي حالات نهائية ولا تتغير بعدها أبدًا.

pendingprocessingsucceededfailedcancelled

إذا لم تصل المهمة إلى حالة نهائية ضمن مهلة الاستطلاع لدى العميل، تُعامل كفشل من نوع TIMEOUT.

رموز الأخطاء

تستخدم جميع الأخطاء مجموعة الرموز الثابتة هذه. تُعاد الرموز INVALID_REQUEST وUNSUPPORTED_FORMAT وFILE_TOO_LARGE وJOB_NOT_FOUND كاستجابات خطأ HTTP؛ أما الباقي فيظهر كـ error.code داخل كائن المهمة عندما تصل تلك المهمة إلى حالة نهائية failed أو cancelled.

الرمزأين يظهرالمعنى
INVALID_REQUESTاستجابة خطأ HTTP 400هذا الطلب غير صالح. يرجى التحقق من البيانات المدخلة والمحاولة مرة أخرى.
UNSUPPORTED_FORMATاستجابة خطأ HTTP 415صيغة الملف هذه غير مدعومة. يرجى استخدام JPEG أو PNG أو WebP أو HEIC أو HEIF.
FILE_TOO_LARGEاستجابة خطأ HTTP 413هذا الملف كبير جدًا. يرجى استخدام صورة أصغر.
JOB_NOT_FOUNDاستجابة خطأ HTTP 404لم نتمكن من العثور على هذه المهمة. ربما تكون قد انتهت صلاحيتها.
VLM_FAILEDداخل حقل error لمهمة وصلت إلى حالة نهائيةلم نتمكن من تحليل هذه الصورة. يرجى المحاولة مرة أخرى.
WORKFLOW_FAILEDداخل حقل error لمهمة وصلت إلى حالة نهائيةفشلت المعالجة. يرجى المحاولة مرة أخرى.
TIMEOUTداخل حقل error لمهمة وصلت إلى حالة نهائيةتستغرق هذه العملية وقتًا أطول من المتوقع. يرجى المحاولة مرة أخرى.
CANCELLEDداخل حقل error لمهمة وصلت إلى حالة نهائيةتم إلغاء هذه المهمة.
INTERNALاستجابة خطأ HTTP 500حدث خطأ من جانبنا. يرجى المحاولة مرة أخرى.
INSUFFICIENT_CREDITSاستجابة خطأ HTTP 402لا يوجد لديك رصيد كافٍ لهذه المهمة. أعد الشحن للمتابعة.
STORAGE_QUOTA_EXCEEDEDاستجابة خطأ HTTP 413ألبومك ممتلئ. احذف بعض الصور أو قم بالترقية للمتابعة.