> ## Documentation Index
> Fetch the complete documentation index at: https://www.krea.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# تدريب أسلوب مخصص

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

export const HeroHeader = ({image, video, title, description}) => {
  return <div className="relative aspect-[2/1] h-[30vh] w-full rounded-lg overflow-hidden mb-8">
      {}
      {video && <video autoPlay muted loop playsInline className="absolute top-0 left-0 w-full h-full object-cover hidden md:block m-0" style={{
    zIndex: 1,
    objectPosition: "20% 20%"
  }}>
          <source src={video} type="video/webm" />
        </video>}

      {}
      <img src={image} alt="" className={`absolute top-0 left-0 m-0 w-full h-full object-cover ${video ? "md:hidden" : "block"}`} style={{
    zIndex: 1,
    objectPosition: "20% 20%"
  }} />

      {}
      <div className="absolute inset-0 bg-gradient-to-t from-black/70 via-black/30 to-black/10 flex flex-col justify-end p-8 dark:hidden" style={{
    zIndex: 2
  }}>
        <h1 className="text-4xl font-bold text-white m-0 drop-shadow-[0_2px_4px_rgba(0,0,0,0.5)]">
          {title}
        </h1>
        <p className="text-lg text-white/95 mt-2 drop-shadow-[0_1px_2px_rgba(0,0,0,0.5)]">
          {description}
        </p>
      </div>

      {}
      <div className="absolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-black/20 hidden dark:flex flex-col justify-end p-8" style={{
    zIndex: 2
  }}>
        <h1 className="text-4xl font-bold text-white m-0 drop-shadow-[0_2px_4px_rgba(0,0,0,0.5)]">
          {title}
        </h1>
        <p className="text-lg text-white/95 mt-2 drop-shadow-[0_1px_2px_rgba(0,0,0,0.5)]">
          {description}
        </p>
      </div>
    </div>;
};

<HeroHeader image="https://s.krea.ai/docs-lora.webp" title="Train a Custom Style (LoRA)" description="Train a custom style using your own images to generate AI art with consistent visual aesthetics." />

## نظرة عامة

LoRA (تكيّف الرتبة المنخفضة) هي تقنية للضبط الدقيق تُعلّم نموذج ذكاء اصطناعي أسلوبًا بصريًا جديدًا باستخدام مجموعة صغيرة من صور المثال. تعمل عن طريق حقن "أوزان أسلوب" جديدة في نموذج موجود، مما يجعل التدريب سريعًا وفعّالًا في آن واحد.

يرشدك هذا الدليل عبر سير العمل الكامل:

<Steps>
  <Step title="تحضير صور التدريب" icon="images">
    نسّق ورفع صورًا عالية الجودة تُمثّل الأسلوب الذي تريده
  </Step>

  <Step title="إرسال مهمة التدريب" icon="play">
    أرسل طلب POST إلى `/styles/train` مع روابط صورك وتكوينك
  </Step>

  <Step title="مراقبة التقدّم" icon="clock">
    تتبّع حالة مهمة التدريب باستخدام `job_id` المُرجَع
  </Step>

  <Step title="التوليد بأسلوبك" icon="sparkles">
    طبّق أسلوبك المدرّب على توليد الصور
  </Step>
</Steps>

***

## تحضير صور التدريب

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

تؤثر جودة صور التدريب مباشرةً على النتائج. تختلف متطلبات أنواع التدريب المختلفة:

| النوع         | حالة الاستخدام                     | نصائح                        |
| ------------- | ---------------------------------- | ---------------------------- |
| **Style**     | الأساليب الفنية، الجماليات البصرية | أسلوب متسق عبر مواضيع متنوعة |
| **Character** | التشابه الشخصي، الشخصيات المتسقة   | أوضاع وتعابير وإضاءة متنوعة  |
| **Object**    | عناصر أو منتجات محددة              | زوايا متعددة، جسم متسق       |

### كم صورة؟

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

| حجم مجموعة البيانات | إرشادات                                            |
| ------------------- | -------------------------------------------------- |
| **5 صور**           | الحد الأدنى العملي. قد تعمل مع أساليب بسيطة ومتسقة |
| **10-30 صورة**      | موصى بها. أفضل توازن بين الجودة والتغطية           |
| **50+ صورة**        | عوائد متناقصة ما لم يكن للأسلوب تنوع كبير          |

<Warning>
  **الجودة > الكمية**

  15 صورة عالية الجودة ستُنتج نتائج أفضل من 50 صورة منخفضة الجودة. أعطِ الأولوية لـ:

  * الدقة العالية (1024x1024 كحد أدنى)
  * الأسلوب المتسق عبر جميع الصور
  * خالية من العلامات المائية أو النصوص المتراكبة أو تشوّهات الضغط
  * مواضيع متنوعة مع الحفاظ على تماسك الأسلوب
</Warning>

<Info>
  **أمثلة على مجموعات البيانات**

  * **تدريب الشخصيات**: صور لشخص بأوضاع وتعابير وظروف إضاءة متنوعة. تجنّب تضمين أشخاص آخرين في الصور.
  * **تدريب الأسلوب**: مجموعة من الأعمال الفنية بأسلوب متسق. على سبيل المثال، [مجموعة بيانات Ukiyo-E من متحف المتروبوليتان للفنون](https://www.kaggle.com/datasets/kengoichiki/the-metropolitan-museum-of-art-ukiyoe-dataset) توفر مطبوعات يابانية على الخشب مثالية لتدريب أسلوب فني.
</Info>

### رفع الصور

قبل التدريب، ارفع صورك للحصول على روابط مستضافة. استخدم نقطة النهاية `/assets`:

<CodeGroup>
  ```python Python theme={null}
  import requests
  import os
  from dotenv import load_dotenv
  import mimetypes

  load_dotenv()

  API_BASE = "https://api.krea.ai"
  API_TOKEN = os.getenv("API_TOKEN")

  image_dir = "training_images"
  uploaded_urls = []

  for filename in os.listdir(image_dir):
      if filename.lower().endswith(('.jpg', '.jpeg', '.png', '.webp')):
          filepath = os.path.join(image_dir, filename)
          mime_type, _ = mimetypes.guess_type(filepath)

          with open(filepath, 'rb') as f:
              response = requests.post(
                  f"{API_BASE}/assets",
                  headers={"Authorization": f"Bearer {API_TOKEN}"},
                  files={"file": (filename, f, mime_type)},
                  data={"description": f"Training image: {filename}"}
              )

          if response.ok:
              data = response.json()
              uploaded_urls.append(data["image_url"])
              print(f"Uploaded: {filename}")
          else:
              print(f"Failed: {filename}")

  print(f"\nUploaded {len(uploaded_urls)} images")
  ```

  ```bash cURL theme={null}
  # Upload a single image
  curl -X POST https://api.krea.ai/assets \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -F "file=@/path/to/image.jpg" \
    -F "description=Training image"

  # Response: {"id": "...", "image_url": "https://..."}
  ```
</CodeGroup>

<Tip>
  احفظ قيم `image_url` المُرجَعة — ستُمرّرها إلى نقطة نهاية التدريب.
</Tip>

***

## تدريب أسلوبك

### مثال أساسي على التدريب

أرسل روابط صورك لبدء التدريب:

<CodeGroup>
  ```python Python theme={null}
  import requests
  import os
  from dotenv import load_dotenv

  load_dotenv()

  API_BASE = "https://api.krea.ai"
  API_TOKEN = os.getenv("API_TOKEN")

  # Training URLs from the upload step
  urls = [
      "https://krea.ai/assets/img1.jpg",
      "https://krea.ai/assets/img2.jpg",
      "https://krea.ai/assets/img3.jpg",
      # ... more images
  ]

  response = requests.post(
      f"{API_BASE}/styles/train",
      headers={
          "Authorization": f"Bearer {API_TOKEN}",
          "Content-Type": "application/json"
      },
      json={
          "name": "Ukiyo-E Style",
          "urls": urls,
          "model": "flux_dev",
          "type": "Style",
          "max_train_steps": 500
      }
  )

  response.raise_for_status()
  job = response.json()
  print(f"Training started! Job ID: {job['job_id']}")
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.krea.ai/styles/train \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Ukiyo-E Style",
      "urls": [
        "https://krea.ai/assets/img1.jpg",
        "https://krea.ai/assets/img2.jpg",
        "https://krea.ai/assets/img3.jpg"
      ],
      "model": "flux_dev",
      "type": "Style",
      "max_train_steps": 500
    }'
  ```
</CodeGroup>

### أنواع التدريب

يعيّن معلم `type` قيمًا افتراضية ذكية مُحسَّنة لحالة الاستخدام لديك:

| النوع       | الأفضل لـ                          |
| ----------- | ---------------------------------- |
| `Style`     | الأساليب الفنية، الجماليات البصرية |
| `Character` | التشابه الشخصي، الشخصيات المتسقة   |
| `Object`    | عناصر أو منتجات محددة              |
| `Default`   | تدريب عام                          |

### المعلمات

#### المعلمات المطلوبة

<ParamField path="name" type="string" required>
  اسم وصفي لأسلوبك المخصص.

  **مثال:** `"Ukiyo-E Style"`، `"Product Photos"`
</ParamField>

<ParamField path="urls" type="array" required>
  مصفوفة من روابط الصور للتدريب عليها. أدرج المزيد من الصور للحصول على نتائج أفضل.
</ParamField>

#### المعلمات الاختيارية

<ParamField path="model" type="string" default="flux_dev">
  النموذج الأساسي للتدريب:

  **نماذج الصور:**

  * `flux_dev` - عالي الجودة، متعدد الاستخدامات
  * `flux_schnell` - نموذج BFL الفوري
  * `qwen` - نموذج Alibaba
  * `z-image` - نموذج صور فعّال من Alibaba
  * `wan22` - توليد الصور فقط

  **نماذج الفيديو:**

  * `wan` - نموذج فيديو Alibaba
</ParamField>

<ParamField path="type" type="string" default="Default">
  فئة التدريب: `Style` أو `Object` أو `Character` أو `Default`
</ParamField>

<ParamField path="trigger_word" type="string">
  كلمة مخصصة لتفعيل هذا الأسلوب في النصوص الوصفية. عند عدم تحديدها، يُستخدم اسم الأسلوب.

  <Tip>اختر كلمات تفعيل فريدة لن تظهر في النصوص الوصفية النمطية. استخدم الشرطات السفلية للكلمات المتعددة: `ukiyo_style`</Tip>
</ParamField>

<Accordion title="معلمات متقدمة" icon="sliders">
  <ParamField path="learning_rate" type="number">
    تتحكم في كثافة التدريب. القيم الأعلى تُدرّب أسرع لكن قد تُفرط في التعلّم.

    **النطاق الموصى به:** 0.0001 - 0.001
  </ParamField>

  <ParamField path="max_train_steps" type="integer">
    الحد الأقصى لتكرارات التدريب. النطاق: 1-2000
  </ParamField>

  <ParamField path="batch_size" type="integer">
    عدد الصور المعالجة في وقت واحد. الدفعات الأكبر = تدريب أسرع لكن ذاكرة أكثر.
  </ParamField>
</Accordion>

### ضبط المعلمات المتقدمة

ابدأ بالقيم الافتراضية التي يضبطها حقل `type` — إنها تعمل جيدًا لمعظم الحالات. اضبطها فقط إذا كنت تواجه مشكلات محددة:

<AccordionGroup>
  <Accordion title="معدل التعلّم" icon="gauge">
    يتحكم في مدى تكيّف النموذج بقوة مع صور التدريب لديك.

    | القيمة                  | متى تستخدمها                                                         |
    | ----------------------- | -------------------------------------------------------------------- |
    | **0.0001** (أقل)        | مشاكل الإفراط في التعلّم، الأساليب المعقدة، مجموعات البيانات الصغيرة |
    | **0.0003** (افتراضي)    | معظم حالات الاستخدام                                                 |
    | **0.0005-0.001** (أعلى) | تدريب أسرع                                                           |

    **علامات تدل على أنك تحتاج إلى الضبط:**

    * المخرجات تبدو مطابقة لصور التدريب ← اخفض المعدل
    * تأثير الأسلوب ضعيف بعد التدريب ← ارفع المعدل قليلًا
  </Accordion>

  <Accordion title="خطوات التدريب" icon="shoe-prints">
    مدة تدريب النموذج على صورك.

    | حجم مجموعة البيانات | الخطوات الموصى بها |
    | ------------------- | ------------------ |
    | 5-10 صور            | 300-500 خطوة       |
    | 15-30 صورة          | 500-800 خطوة       |
    | 50+ صورة            | 800-1500 خطوة      |

    **علامات تدل على أنك تحتاج إلى الضبط:**

    * المخرجات جامدة جدًا، تتجاهل النصوص الوصفية ← قلّل الخطوات
    * تأثير الأسلوب ضعيف ← زد الخطوات
    * الصور المُولّدة تبدو تمامًا مثل بيانات التدريب ← قلّل الخطوات (إفراط في التعلّم)
  </Accordion>
</AccordionGroup>

<Tip>
  **الضبط التكراري**

  إذا لم تُنتج محاولة التدريب الأولى النتائج التي تريدها:

  1. ابدأ بضبط `max_train_steps` (الحل الأكثر شيوعًا)
  2. ثم جرّب `learning_rate` إذا لم تكن الخطوات وحدها كافية
</Tip>

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

```json theme={null}
{
  "job_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "queued",
  "created_at": "2024-01-15T10:30:00Z"
}
```

***

## مراقبة تقدّم التدريب

يستغرق التدريب عادةً 5-15 دقيقة. استعلم عن Jobs API للتحقق من الحالة:

<CodeGroup>
  ```python Python theme={null}
  import requests
  import time
  import os
  from dotenv import load_dotenv

  load_dotenv()

  API_BASE = "https://api.krea.ai"
  API_TOKEN = os.getenv("API_TOKEN")
  job_id = "your-job-id"

  while True:
      response = requests.get(
          f"{API_BASE}/jobs/{job_id}",
          headers={"Authorization": f"Bearer {API_TOKEN}"}
      )
      job = response.json()
      status = job["status"]

      print(f"Status: {status}")

      if status == "completed":
          style_id = job["result"]["style_id"]
          print(f"Training complete! Style ID: {style_id}")
          break
      elif status in ["failed", "cancelled"]:
          print(f"Training {status}")
          break

      time.sleep(30)
  ```

  ```bash cURL theme={null}
  # Check job status (repeat until completed)
  curl -X GET https://api.krea.ai/jobs/YOUR_JOB_ID \
    -H "Authorization: Bearer YOUR_API_TOKEN"
  ```
</CodeGroup>

<Accordion title="قيم حالة المهمة" icon="diagram-project">
  تمرّ مهام التدريب بهذه الحالات:

  1. **queued** - في انتظار الطابور
  2. **processing** - تدريب نشط
  3. **completed** - انتهى التدريب بنجاح
  4. **failed** - واجه التدريب خطأ
  5. **cancelled** - تم إلغاء المهمة يدويًا
</Accordion>

***

## استخدام أسلوبك المدرّب

بمجرد اكتمال التدريب، طبّق أسلوبك على توليد الصور باستخدام معلم `styles`:

<Warning>
  **ملكية الأسلوب بين التطبيق وواجهة API**

  تعمل واجهة API وتطبيق Krea على الويب كهويات مستخدم منفصلة داخل مساحة عملك. الأساليب خاصة بالمستخدم الذي أنشأها، لذلك:

  * **الأساليب المدرّبة عبر التطبيق** غير متاحة عبر واجهة API ما لم تتم مشاركتها
  * **الأساليب المدرّبة عبر API** غير متاحة في التطبيق ما لم تتم مشاركتها

  لمشاركة أسلوب مع مساحة عملك (يعمل في كلا الاتجاهين):

  ```bash theme={null}
  curl -X POST https://api.krea.ai/styles/YOUR_STYLE_ID/share/workspace \
    -H "Authorization: Bearer YOUR_API_TOKEN"
  ```
</Warning>

<CodeGroup>
  ```python Python theme={null}
  import requests
  import time
  import os
  from dotenv import load_dotenv

  load_dotenv()

  API_BASE = "https://api.krea.ai"
  API_TOKEN = os.getenv("API_TOKEN")
  STYLE_ID = "w29t6pvy0"

  response = requests.post(
      f"{API_BASE}/generate/image/krea/krea-2/medium",
      headers={
          "Authorization": f"Bearer {API_TOKEN}",
          "Content-Type": "application/json"
      },
      json={
          "prompt": "An abstract, colorful, surreal composition of symmetry and balance. Swirling colors, imagery of trees and coalescing patterns converge. The lantern of light and death. It is as if the world was at once dark, and yet again lit.",
          "aspect_ratio": "1:1",
          "resolution": "1K",
          "styles": [
              {
                  "id": STYLE_ID,
                  "strength": 0.95
              }
          ]
      }
  )

  job = response.json()
  job_id = job["job_id"]
  print(f"Generation started! Job ID: {job_id}")

  # Poll for completion
  while True:
      check = requests.get(
          f"{API_BASE}/jobs/{job_id}",
          headers={"Authorization": f"Bearer {API_TOKEN}"}
      )
      status_data = check.json()

      if status_data["status"] == "completed":
          image_url = status_data["result"]["urls"][0]
          print(f"Image ready: {image_url}")
          break
      elif status_data["status"] == "failed":
          print("Generation failed")
          break

      time.sleep(2)
  ```

  ```bash cURL theme={null}
  # Generate with style
  curl -X POST https://api.krea.ai/generate/image/krea/krea-2/medium \
    -H "Authorization: Bearer YOUR_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "prompt": "An abstract, colorful, surreal composition of symmetry and balance. Swirling colors, imagery of trees and coalescing patterns converge. The lantern of light and death. It is as if the world was at once dark, and yet again lit.",
      "aspect_ratio": "1:1",
      "resolution": "1K",
      "styles": [
        {
          "id": "w29t6pvy0",
          "strength": 0.95
        }
      ]
    }'

  # Then poll /jobs/{job_id} for the result
  ```
</CodeGroup>

### قوة الأسلوب

يتحكم معلم `strength` (0.0-1.0) في مدى قوة تطبيق أسلوبك:

| القوة    | التأثير                                                 |
| -------- | ------------------------------------------------------- |
| 0.5-0.7  | تأثير خفيف، يحافظ على مرونة النص الوصفي                 |
| 0.8-0.9  | تطبيق أسلوب قوي، نقطة انطلاق موصى بها                   |
| 0.95-1.0 | التزام أقصى بالأسلوب، قد يُقلل من الاستجابة للنص الوصفي |

<Tip>
  ابدأ بقوة `0.8` واضبط بناءً على النتائج. القيم الأقل تُتيح حرية إبداعية أكبر؛ والقيم الأعلى تفرض التزامًا أكثر صرامة بالأسلوب.
</Tip>

### دمج أساليب متعددة

طبّق أساليب متعددة عن طريق إضافتها إلى مصفوفة `styles`:

```python theme={null}
"styles": [
    {"id": "style-id-1", "strength": 0.6},
    {"id": "style-id-2", "strength": 0.4}
]
```

***

## أفضل الممارسات

<AccordionGroup>
  <Accordion title="اختيار الصور" icon="images">
    * استخدم أكبر عدد ممكن من الصور عالية الجودة للحصول على نتائج مثالية
    * تأكّد من تناسق الأسلوب عبر جميع صور التدريب
    * تنوّع في المواضيع مع الحفاظ على تماسك الأسلوب
    * تجنّب العلامات المائية أو النصوص المتراكبة أو التشوّهات
    * استخدم صورًا بدقة 1024x1024 على الأقل
  </Accordion>

  <Accordion title="تكوين التدريب" icon="sliders">
    * ابدأ بالمعلمات الافتراضية باستخدام حقل `type`
    * للأساليب: 500-1000 خطوة عادةً كافية
    * معدلات التعلّم الأقل (0.0001-0.0003) تمنع الإفراط في التعلّم
    * زد الخطوات إذا لم يكن الأسلوب قويًا بما يكفي
    * قلّل الخطوات إذا كانت المخرجات جامدة جدًا
  </Accordion>

  <Accordion title="كلمات التفعيل" icon="wand-magic-sparkles">
    * استخدم كلمة التفعيل نفسها إذا كنت تخطط لدمج أساليب متعددة
    * يتم حقن كلمات التفعيل تلقائيًا في النص الوصفي إذا أدرجت الأسلوب
    * تجنّب الكلمات الشائعة التي تظهر في النصوص الوصفية النمطية
    * استخدم الشرطات السفلية للكلمات المتعددة: `my_custom_style`
  </Accordion>
</AccordionGroup>
