Diffusers documentation
Bria Fibo 2.0
Bria Fibo 2.0
Fibo 2.0 هو نموذج تحويل (transformer) يعتمد على مطابقة التدفق (flow-matching) ويضم 8.1 مليار معامل، من تطوير Bria، ويولّد الصور من عناوين نصية منظمة بصيغة JSON. مشفّر النص فيه هو Qwen3-VL: حيث يقوم Perceiver بتلخيص الحالات المخفية (hidden states) الخاصة بـ Qwen3-VL إلى رموز ملخصة (gist tokens) تنضم إلى رموز الصورة في تدفق واحد، كما تقرأ خمسة من كتل التحويل (blocks) مباشرةً من Qwen3-VL عبر الانتباه المتقاطع البوَّابي (gated cross-attention).
هناك نقطتا تفتيش:
briaai/Fibo-2.0-dev، وهو النموذج الكامل لتحويل النص إلى صورة والتحرير، مع إرشاد بدون مُصنِّف. الإعدادات الافتراضية للخط، وهي 30 خطوة مع إرشاد بقيمة 5، مخصصة لهذا نقطة الفحص.briaai/Fibo-2.0-edit-turbo، مُصغَّر للتعديل في 4 خطوات دون توجيه (guidance_scale=1.0).
مع التوجيه على، فإن الموجه السلبي الافتراضي هو الوصف الفارغ الذي تم تدريب النموذج عليه: الوصف المهيكلي مع ترك كل قيمة فارغة.
توليد
يتم تدريب Fibo 2.0 على عناوين JSON منظمة ولن يعمل بشكل جيد مع النصوص الحرة. مرر العنوان كسلسلة JSON:
import json
import torch
from diffusers import BriaFibo2Pipeline
pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-dev", dtype=torch.bfloat16).to("cuda")
caption = {
"short_description": "A red vintage bicycle leaning against a whitewashed wall on a narrow Mediterranean street.",
"objects": [
{
"description": "A red vintage bicycle with a wicker basket of lemons on its handlebars.",
"location": "center",
"relative_size": "large within frame",
}
],
"background_setting": "A whitewashed wall with a blue wooden door and potted red geraniums.",
"lighting": {"conditions": "bright morning sun", "direction": "from the right", "shadows": "long and crisp"},
"aesthetics": {"composition": "centered", "color_scheme": "red, white and blue", "mood_atmosphere": "calm"},
"photographic_characteristics": {"depth_of_field": "deep", "focus": "sharp on the bicycle", "camera_angle": "eye level"},
"style_medium": "photograph",
"context": "A travel photograph.",
"artistic_style": "realistic",
}
image = pipe(json.dumps(caption)).images[0]
image.save("bicycle.png")تنظّف خطّ المعالجة الوصف بالطريقة التي تمّ بها التدريب: فهي تُزيل القيم الفارغة وحقلي aesthetic_score وpreference_score، اللذين لم يكونا موجودين في أيّ وصف تدريبي، وتُرمّز الوصف بشكل مدمج. وقد تمّ تدريب صيغتين مختصرتين أيضاً وتُحفظان كما هما:
# The caption's short description alone, as plain text
image = pipe("A red vintage bicycle leaning against a whitewashed wall on a narrow Mediterranean street.").images[0]
# Exactly a "short_description" and a "text_render" list. The list is kept even when it's empty, to say the image
# has no text
caption = {"short_description": "A bakery storefront at dawn with a painted sign.", "text_render": [{"text": "FRESH BREAD"}]}
image = pipe(json.dumps(caption)).images[0]لتحويل النص الحر إلى عنوان منظم، راجع نماذج prompt-to-JSON في صفحة Bria Fibo.
التحرير
تعديل الصور باستخدام نفس خط الأنابيب. مرّر الصورة كـimage وتعليمات التعديل كـ prompt:
import torch
from diffusers import BriaFibo2Pipeline
from diffusers.utils import load_image
pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-dev", dtype=torch.bfloat16).to("cuda")
image = load_image(
"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/yarn-art-pikachu.png"
)
edited = pipe("Make the background a snowy forest", image=image).images[0]
edited.save("pikachu_snow.png")لتحقيق تعديلات أسرع، حمّل نقطة الفحص turbo وأوقف التوجيه:
import torch
from diffusers import BriaFibo2Pipeline
from diffusers.utils import load_image
pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-edit-turbo", dtype=torch.bfloat16).to("cuda")
image = load_image(
"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/yarn-art-pikachu.png"
)
edited = pipe("Make the background a snowy forest", image=image, num_inference_steps=4, guidance_scale=1.0).images[0]
edited.save("pikachu_snow.png")تستمر الأمثلة أدناه من أيٍّ منهما، مع pipe وimage. عند استخدام نقطة التفتيش turbo، مرّر num_inference_steps=4 وguidance_scale=1.0 إلى كل استدعاء.
موجّه التحرير
يمكن أن يكون الأمر أيضًا كائن JSON يحتوي على مفتاح "edit_instruction" ووصف للنتيجة، بأي من الأشكال التي تم تدريب Fibo 2.0 على التحرير بها. يقوم خط المعالجة بتحويله إلى الأمر الذي تم تدريب Fibo 2.0 على التحرير به.
وصف كامل: مفاتيح الوصف بجانب "edit_instruction"، كما تكتب نماذج Bria من النص إلى JSON للتحرير. يتجاهل خط الأنابيب القيم الفارغة وحقلي aesthetic_score وpreference_score، حيث أزال التدريب هذين الحقلين من كل وصف.
import json
prompt = {
"short_description": "A crocheted yellow Pikachu doll sitting in a snowy pine forest.",
"objects": [{"description": "A crocheted yellow Pikachu doll with red cheeks.", "location": "center"}],
"background_setting": "A snowy pine forest with falling snow.",
"edit_instruction": "Make the background a snowy forest",
}
edited = pipe(json.dumps(prompt), image=image).images[0]وصف قصير: نص في مفتاح "structured_caption".
prompt = {
"structured_caption": "A crocheted yellow Pikachu doll sitting in a snowy pine forest.",
"edit_instruction": "Make the background a snowy forest",
}
edited = pipe(json.dumps(prompt), image=image).images[0]وصف قصير ونصه: قائمة "short_description" وقائمة "text_render" بالضبط. تُحفظ القائمة حتى عندما تكون فارغة، مما يُخبر Fibo 2.0 أن النتيجة لا تحتوي على نص. يمكن أن يحتوي المفتاح "structured_caption" على هذا النموذج، أو على وصف كامل أيضاً.
prompt = {
"short_description": "A crocheted yellow Pikachu doll holding a small wooden sign.",
"text_render": [{"text": "HELLO"}],
"edit_instruction": "Give the doll a small wooden sign that reads HELLO",
}
edited = pipe(json.dumps(prompt), image=image).images[0]بعض الصور
يمكن تحرير ما يصل إلى 5 صور معًا، على سبيل المثال لوضع كائن من صورة في أخرى. تشير التعليمات إليها بالترتيب على أنها <image_1>، <image_2> وهكذا.
cat = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/cat.png")
edited = pipe("Put the cat from <image_2> next to the doll in <image_1>", image=[image, cat]).images[0]حجم المخرجات
ما لم يُحدد height وwidth، فإن النتيجة تتخذ الحجم الذي تم تدريب Fibo 2.0 عليه بالنسبة لنسبة أبعاد الصورة الأولى، أي حوالي ميجابكسل واحد. يتم اقتصاص صورة واحدة إلى حجم النتيجة. أما الصور المتعددة فيتم اقتصاص كل منها إلى الحجم المُدرَّب عليه الخاص بنسبة أبعادها.
edited = pipe("Make the background a snowy forest", image=image, width=1424, height=800).images[0]التعديلات المقنّعة
يحدد mask المنطقة من صورة واحدة يجب إعادة توليدها، باللون الأبيض على خلفية سوداء، وبمقاس الصورة. تم تدريب Fibo 2.0 على تعديلات تكون فيها تلك المنطقة من الصورة رمادية، ويقوم خط الأنابيب بتغميقها بنفس الطريقة قبل ترميز الصورة: رمادي مسطح (128، 128، 128)، عبر قناع تم تحويله إلى ثنائي عند القيمة 128.
from PIL import Image, ImageDraw
mask = Image.new("L", image.size, 0)
ImageDraw.Draw(mask).rectangle((image.width // 2, 0, image.width, image.height // 2), fill=255)
edited = pipe("Add a red balloon floating in the sky", image=image, mask=mask).images[0]النص في الصور
عندما يطلب الوصف النص، في إدخالات text_render الخاصة به، يميل Fibo 2.0 إلى عرضه بشكل أفضل إذا كان Qwen3-VL يرى كل نص مرسومًا على حدة. ترسم خط المعالجة هذه الصور افتراضيًا، بالطريقة التي تم بها التدريب، ويمكن تعطيلها. بالنسبة لوصف يحتوي على نص، مثل وصف المخبز أعلاه:
prompt = json.dumps(caption)
image = pipe(prompt, render_text_images=False).images[0]أظهر التدريب على Fibo 2.0 هذه الصور لبعض التسميات الوصفية التي تحتوي على نصوص ولم يُظهرها لغيرها، لذا يعمل الأمر في الحالتين.
- يحصل كل إدخال
text_renderيحتوي علىtextعلى صورة: النص في سطر واحد، أسود على أبيض، بخط Pillow المدمج بحجم 20. يتم تقسيم النص الأطول من 256 حرفًا إلى أسطر من 256 حرفًا. - تُرسم الأحرف التي لا تتوفر في الخط باستخدام أول خط من
fontsيحتوي عليها. استخدم التدريب خط Aileron ثم خط DejaVu Sans، وهما موجودان في مجلدfontsضمنbriaai/Fibo-2.0-dev. في حال عدم وجودfonts، تُرسم هذه الأحرف بالطريقة التي يرسمها الخط المدمج في Pillow، ويصدر خط المعالجة تحذيرًا. - يضع خط الأنابيب علامة على كل إدخال بحقل
image_tokensالخاص بصورة، ويرى Qwen3-VL الصور بعد أي صور مخصصة للتعديل. - تقوم عملية التوليد بخطواتها الأولى، بينما يكون مستوى الضوضاء أعلى من
pipe.text_images_max_noise_level(0.9)، على الوصف النصي دون الصور. أما عملية التعديل فتستخدمها في كل خطوة. - لا تحصل التسمية بدون نص على أي صور، وكذلك الوصف القصير، كما هو الحال في التدريب.
لرسمها باستخدام خطوط التدريب المستخدمة:
from huggingface_hub import hf_hub_download
fonts = [
hf_hub_download("briaai/Fibo-2.0-dev", name, subfolder="fonts")
for name in ("Aileron-Regular.otf", "DejaVuSans.ttf")
]
image = pipe(prompt, fonts=fonts).images[0]لرسم الصور بنفسك، مررها كـtext_images، صورة واحدة لكل إدخال text_render يحتوي على text، بالترتيب، لموجّه واحد. لها الأولوية على صور خط الأنابيب نفسه. الصور المرسومة بشكل مختلف عن التدريب خارج نطاق التوزيع.
واجهات الخلفية للانتباه
يعمل المحوّل على أيٍّ من واجهات الانتباه الخلفية في diffusers، على سبيل المثال FlashAttention-3 على معالجات Hopper الرسومية مثل H100:
pipe.transformer.set_attention_backend("_flash_3_varlen_hub")يعمل _flash_3_hub أيضًا مع موجه واحد، لكنه لا يقنّ الأقنعة، لذا لا يمكنه تشغيل دفعة من الموجهات بطول مختلف (انظر أدناه).
التجميع
يمكن توليد عدة طلبات في استدعاء واحد. يتم ملء الطلبات ذات الأطوال المختلفة، ويُستبعد الحشو من كل طبقة انتباه، لذا فإن هذه الدفعة تتطلب واجهة خلفية للانتباه تأخذ قناعًا: إما الافتراضية، أو واجهة خلفية متغيرة الطول مثل flash_varlen. في float32، تُعيد الدفعة إنتاج صور الاستدعاءات المنفصلة؛ أما في bfloat16 فتختلف نوى الانتباه بين المدخلات المملوءة وغير المملوءة، لذا قد تختلف صور الدفعات عن الاستدعاءات الفردية في التفاصيل الدقيقة.
BriaFibo2Pipeline
فئة diffusers.BriaFibo2Pipeline
< source >( transformer: BriaFibo2Transformer2DModelscheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLFlux2text_encoder: Qwen3VLForConditionalGenerationprocessor: Qwen3VLProcessor )
المعاملات
- transformer (BriaFibo2Transformer2DModel) — المحوّل الذي يُزيل الضوضاء من الكامنات (latents) للصورة.
- scheduler (FlowMatchEulerDiscreteScheduler) —
المجدول المستخدم مع
transformerلإزالة الضوضاء من الكمونيات. - vae (
AutoencoderKLFlux2) — شبكة ترميز-فك ترميز احتمالية تقوم بتحويل الصور إلى تمثيلات كامنة (latents) والعكس. - text_encoder (
Qwen3VLForConditionalGeneration) — Qwen3-VL. تُشكّل حالاته المخفية شرطًا للتحويلي. - processor (
Qwen3VLProcessor) — يحوّل الأمر، والصور المراد تحريرها، إلى مدخلات Qwen3-VL.
خط أنابيب لتوليد الصور من النص وتحرير الصور باستخدام Fibo 2.0.
__call__
< source >( prompt: str | list[str] | None = Noneimage: PIL.Image.Image | list[PIL.Image.Image] | None = Nonemask: PIL.Image.Image | None = Nonetext_images: list[PIL.Image.Image] | None = Nonerender_text_images: bool = Truefonts: list[str] | None = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int = 30guidance_scale: float = 5.0negative_prompt: str | list[str] | None = Nonenum_images_per_prompt: int = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_embeds_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds_mask: typing.Optional[torch.Tensor] = Noneoutput_type: str = 'pil'return_dict: bool = Truecallback_on_step_end: typing.Optional[typing.Callable[[int, int, dict], NoneType]] = Nonecallback_on_step_end_tensor_inputs: list = ['latents'] ) → BriaFibo2PipelineOutput or tuple
المعاملات
- prompt (
strأوlist[str]، اختياري) — الموجّه الذي يوجه توليد الصورة، وهو عادةً موجّه JSON منظم، يتم تنظيفه كما تم تنظيف التسميات في تدريب Fibo 2.0: تُحذف القيم الفارغة وحقلَيaesthetic_scoreوpreference_score، ثم يُسلسل بشكل مضغوط. معimage، تعليمات التحرير، أو كائن JSON يحتوي على مفتاح"edit_instruction"وتسمية النتيجة: مفاتيحه الأخرى، أو مفتاح"structured_caption"يحتوي على التسمية أو وصفًا مختصرًا. - image (
PIL.Image.Imageأوlist[PIL.Image.Image]، اختياري) — الصورة التي سيتم تحريرها، أو حتى 5 صور لتحريرها معًا، حيث يمكن للتعليمات الإشارة إليها على أنها<image_1>،<image_2>وما إلى ذلك. بدونimage، يولّد خط الأنابيب صورة من الوصف النصي. - mask (
PIL.Image.Image, اختياري) — المنطقة منimageالتي سيتم إعادة توليدها، بيضاء على خلفية سوداء، عند تحرير صورة واحدة. وكما في التدريب، تُخفَّف المنطقة قبل ترميز الصورة، وذلك من خلال جعل القناع ثنائي القيمة عند 128. - text_images (
list[PIL.Image.Image], اختياري) — صور للنصوص التي يطلبها التعليق التوضيحي، صورة واحدة لكل عنصر فيtext_renderيحتوي علىtext، بالترتيب: يُرسم نص كل عنصر بشكل مستقل، كما ترسمهاrender_text_images. يرى Qwen3-VL هذه الصور مع الاستعلام، حيث يُشار إليها في عنصر التعليق التوضيحي الخاص بها، مما يساعد Fibo 2.0 على رسم النص. يتطلبpromptكتعليق توضيحي JSON واحد، وله الأولوية علىrender_text_images. تُنفذ عملية التوليد خطواتها الأولى، بينما يكون مستوى الضوضاء أعلى منtext_images_max_noise_level(0.9)، دون استخدام هذه الصور؛ بينما تستخدمها عملية التحرير في كل خطوة. - render_text_images (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان سيتم رسمtext_imagesلكل وصف، بالطريقة التي رسم بها تدريب Fibo 2.0 هذه الصور: كل نص في سطر واحد، أسود على أبيض، بخط Pillow المدمج بحجم 20، والحروف التي لا يتوفرها ذلك الخط تُستبدل بأول خط منfontsيحتوي عليها. الوصف الذي لا يحتوي على نص، والموجّه الذي لا يحتوي على وصف بصيغة JSON، مثل الوصف القصير، لا تُنشأ له صور، كما هو الحال في التدريب. - fonts (
list[str], اختياري) — مسارات الخطوط المستخدمة لرسم أحرفtext_imagesالتي لا تتوفر في الخط المدمج في Pillow، بالترتيب. استُخدمت خطا Aileron ثم DejaVu Sans أثناء التدريب، وهما موجودان في مجلدfontsضمنbriaai/Fibo-2.0-dev. في حال عدم توفرهما، تُرسم هذه الأحرف بالطريقة التي يرسمها الخط المدمج في Pillow. - height (
int, اختياري) — ارتفاع الصورة المولّدة بالبكسلات. يجب أن يكون قابلاً للقسمة على 16. القيمة الافتراضية هي 1024، أو عند التحرير، تكون بحجم Fibo 2.0 الذي تم تدريبه عليه بالنسبة لنسبة أبعاد الصورة الأولى، أي حوالي ميجابكسل واحد. - width (
int، اختياري) — عرض الصورة المولّدة بالبكسل. يجب أن يكون قابلاً للقسمة على 16. القيمة الافتراضية مثلheight. - num_inference_steps (
int، اختياري، القيمة الافتراضية 30) — عدد خطوات إزالة الضوضاء. - guidance_scale (
float، اختياري، القيمة الافتراضية 5.0) — مقياس التوجيه الحر من التصنيف. القيم الأعلى من 1 تُشغّل الموجه السلبي كمرحلة ثانية في كل خطوة، و1.0 يُطفئ التوجيه. - negative_prompt (
strأوlist[str]، اختياري) — الموجّه الذي يُوجَّه بعيدًا عنه عند تفعيل التوجيه. القيمة الافتراضية هي الوصف الفارغ الذي تم تدريب Fibo 2.0 عليه: الوصف المهيكلي الذي تكون جميع قيمه فارغة. - num_images_per_prompt (
int، اختياري، القيمة الافتراضية 1) — عدد الصور التي سيتم توليدها لكل موجه. - generator (
torch.Generatorأوlist[torch.Generator]، اختياري) — المولّدات المستخدمة لسحب الضوضاء الأولية، من أجل التوليد الحتمي. - latents (
torch.Tensor، اختياري) — ضوضاء بداية مُولّدة مسبقًا بأبعاد(batch_size, 32, height // 8, width // 8). - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية محسوبة مسبقًا منencode_prompt، تُستخدم بدلًا منprompt. - prompt_embeds_mask (
torch.Tensor، اختياري) — القناع الذي أعادتهencode_promptمعprompt_embeds. يُحتاج إليه عند وجود حشو. - negative_prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية محسوبة مسبقًا للموجّه السلبي، تُستخدم بدلًا منnegative_prompt. - negative_prompt_embeds_mask (
torch.Tensor، اختياري) — القناع الذي أعادتهencode_promptمعnegative_prompt_embeds. يُحتاج إليه عند وجود حشو. - output_type (
str، اختياري، الافتراضي"pil") — صيغة المخرجات:"pil"أو"np"أو"pt"أو"latent". - return_dict (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان يجب إرجاعBriaFibo2PipelineOutputبدلاً من tuple عادي. - callback_on_step_end (
Callable، اختياري) — دالة تُستدعى في نهاية كل خطوة إزالة ضوضاء على النحوcallback_on_step_end(self, step, timestep, callback_kwargs). - callback_on_step_end_tensor_inputs (
list[str]، اختياري، القيمة الافتراضية["latents"]) — المصفوفات (Tensors) التي تُمرَّر إلىcallback_on_step_endضمنcallback_kwargs.
يعيد
BriaFibo2PipelineOutput أو tuple
الصور المولّدة.
الدالة التي تُستدعى عند استدعاء خط الأنابيب للتوليد.
أمثلة:
>>> import json
>>> import torch
>>> from diffusers import BriaFibo2Pipeline
>>> from diffusers.utils import load_image
>>> # Fibo 2.0 reads structured JSON captions, serialized compactly the way it was trained
>>> caption = {
... "short_description": "A red bicycle leaning against a white brick wall on a sunny morning.",
... "objects": [{"description": "a red city bicycle with a wicker basket", "location": "center"}],
... "background_setting": "a white brick wall with a green door",
... "lighting": {"conditions": "bright morning sun", "direction": "from the right"},
... "style_medium": "photograph",
... }
>>> prompt = json.dumps(caption, separators=(",", ":"), ensure_ascii=False)
>>> # 30 steps with guidance 5, the defaults
>>> pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-dev", dtype=torch.bfloat16).to("cuda")
>>> image = pipe(prompt).images[0]
>>> image.save("fibo2.png")
>>> # editing: pass the image, and the instruction as the prompt
>>> image = load_image(
... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/yarn-art-pikachu.png"
... )
>>> edited = pipe("Make the background a snowy forest", image=image).images[0]
>>> edited.save("fibo2_edit.png")encode_prompt
< source >( prompt: str | list[str]image: list[PIL.Image.Image] | None = Nonedevice: typing.Optional[torch.device] = Nonenum_images_per_prompt: int = 1prompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_embeds_mask: typing.Optional[torch.Tensor] = Nonetext_images: list[PIL.Image.Image] | list[list[PIL.Image.Image]] | None = None )
المعاملات
- prompt (
strأوlist[str]) — الموجّه أو الموجّهات التي سيتم ترميزها. عند استخدامimage، يكون كل موجّه عبارة عن تعليمات تعديل، أو كائن JSON يحتوي على مفتاح"edit_instruction"ووصف النتيجة: مفاتيحه الأخرى، أو مفتاح"structured_caption"يحتوي على الوصف أو وصفًا مختصرًا. يتم ترميز موجّه التوليد كما هو: يضع__call__أولًا وصفًا بصيغة JSON بالشكل الذي تم تدريب Fibo 2.0 عليه. - image (
list[PIL.Image.Image]، اختياري) — الصور التي سيتم تحريرها، كما تراها Qwen3-VL. كل موجه (prompt) يعدّل جميع الصور. - device (
torch.device، اختياري) — الجهاز الذي سيتم وضع التضمينات عليه. - num_images_per_prompt (
int، القيمة الافتراضية 1) — عدد الصور التي سيتم توليدها لكل موجه. - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية محسوبة مسبقًا بأبعاد(batch_size, 6, text_len, 7680)، تُستخدم بدلاً منprompt. - prompt_embeds_mask (
torch.Tensor، اختياري) — قناع منطقي (Bool) للرموز الفعلية فيprompt_embeds، بأبعاد(batch_size, text_len). - text_images (
list[PIL.Image.Image]أوlist[list[PIL.Image.Image]]، اختياري) — صور لنص الوصف، صورة واحدة لكل إدخال فيtext_renderيحتوي علىtext، بالترتيب، أو قائمة منها لكل موجه. يحصل كل إدخال على علامة الرؤية لصورته، وترى Qwen3-VL الصور بعد أي صور مخصصة للتعديل.