Diffusers documentation

Bria Fibo 2.0

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Bria Fibo 2.0

Fibo 2.0, Bria tarafından geliştirilen, yapılandırılmış JSON açıklamalarından görsel üreten 8,1B parametreli bir akış eşleştirme (flow-matching) transformer'dır. Metin kodlayıcısı Qwen3-VL'dir: bir Perceiver, Qwen3-VL'in gizli durumlarını özet (gist) jetonlarına sıkıştırır ve bu jetonlar görsel jetonlarıyla tek bir akışta birleşir; transformer'ın beş bloğu da kapılı çapraz dikkat (gated cross-attention) yoluyla Qwen3-VL'i doğrudan okur.

İki kontrol noktası vardır:

  • briaai/Fibo-2.0-dev, metinden görüntüye dönüştürme ve düzenleme için sınıflandırıcı-ücretsiz yönlendirmeye sahip tam model. Hattın varsayılanları, yönlendirme 5 ile 30 adım, bu kontrol noktası içindir.
  • briaai/Fibo-2.0-edit-turbo, yönlendirme olmadan 4 adımda düzenleme için damıtılmış (guidance_scale=1.0).

Guidance açıkken, varsayılan negatif prompt, modelin eğitildiği null caption'dır: tüm değerleri boş bırakılmış yapılandırılmış caption.

Üretiliyor

Fibo 2.0, yapılandırılmış JSON açıklamaları üzerinde eğitilmiştir ve serbest biçimli metinlerle iyi çalışmaz. Açıklamayı bir JSON dizgesi olarak iletin:

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")

Pipeline, eğitimde yapıldığı gibi başlığı temizler: boş değerleri ve hiçbir eğitim başlığında bulunmayan aesthetic_score ile preference_score alanlarını atar ve başlığı kompakt biçimde seri hale getirir. İki kısa form da eğitildi ve olduğu gibi korunur:

# 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]

Serbest biçimli metni yapılandırılmış bir başlığa dönüştürmek için Bria Fibo sayfasındaki prompt-to-JSON modellerine bakın.

Düzenleme

Aynı boru hattı görüntüleri düzenler. Görüntüyü image olarak ve düzenleme talimatını istem olarak iletin:

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")

Daha hızlı düzenlemeler için turbo checkpoint'ini yükleyin ve guidance'ı kapatın:

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")

Aşağıdaki örnekler, pipe ve image ile devam eder. Turbo checkpoint ile her çağrıya num_inference_steps=4 ve guidance_scale=1.0 parametrelerini iletin.

Düzenleme istemi

İstem, Fibo 2.0'un düzenlemek için eğitildiği biçimlerden herhangi birinde, bir "edit_instruction" anahtarı ve sonucun açıklaması içeren bir JSON nesnesi de olabilir. Hattı, Fibo 2.0'un düzenlemek için eğitildiği isteme dönüştürür.

Tam bir açıklama: "edit_instruction" anahtarının yanı sıra, Bria’nın prompt-to-JSON modellerinin düzenlemeler için yazdığı anahtarlar. İş akışı, boş değerleri ve eğitim sırasında tüm açıklamalardan kaldırılan aesthetic_score ile preference_score alanlarını atar.

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]

Kısa bir açıklama: "structured_caption" anahtarı içindeki bir dize.

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]

Kısa bir açıklama ve metni: tam olarak bir "short_description" ve bir "text_render" listesi. Liste boş olsa bile korunur; bu, Fibo 2.0'a sonucun metin içermediğini bildirir. Bir "structured_caption" anahtarı bu formu veya tam bir altyazıyı da barındırabilir.

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]

Birkaç görsel

En fazla 5 görüntü birlikte düzenlenebilir; örneğin bir görüntüdeki nesne diğerine yerleştirilebilir. Talimat, bunlara sırasıyla <image_1>, <image_2> ve benzeri şekilde atıfta bulunur.

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]

Çıkış boyutu

height ve width verilmediği sürece, sonuç, ilk görüntünün en-boy oranı için Fibo 2.0'ın eğitimde kullandığı boyutu, yaklaşık bir megapikseli alır. Tek bir görüntü, sonucun boyutuna kırpılır. Birden fazla görüntü, her biri kendi en-boy oranı için eğitim boyutuna kırpılır.

edited = pipe("Make the background a snowy forest", image=image, width=1424, height=800).images[0]

Maskeli düzenlemeler

mask, tek bir görüntünün yeniden oluşturulacak bölgesini, görüntünün boyutunda siyah zemin üzerine beyaz olarak işaretler. Fibo 2.0, o bölge gri tonuna çevrilmiş görüntülerle düzenlemeler üzerinde eğitilmiştir ve pipeline, görüntü kodlanmadan önce aynı şekilde gri tonuna çevirir: 128'de ikili hale getirilen maske üzerinden düz (128, 128, 128) gri.

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]

Görsellerdeki metin

Başlık, text_render girdilerinde metin istediğinde, Fibo 2.0, Qwen3-VL her metni kendi başına çizilmiş olarak gördüğünde onu genellikle daha iyi işler. İş akışı, eğitimde yapıldığı gibi bu görselleri varsayılan olarak çizer ve bunlar kapatılabilir. Yukarıdaki fırın gibi metin içeren bir başlık için:

prompt = json.dumps(caption)
image = pipe(prompt, render_text_images=False).images[0]

Eğitim, Fibo 2.0'a bazı metin içeren açıklamalar için bu görselleri gösterirken diğerleri için göstermedi, bu nedenle her iki durumda da çalışır.

  • text içeren her text_render girdisine bir görüntü atanır: metin tek satırda, beyaz zemin üzerinde siyah, Pillow’un yerleşik fontuyla 20 punto boyutunda. 256 karakterden uzun bir metin, 256 karakterlik satırlara bölünür.
  • Yazı tipinde bulunmayan karakterler, bunlara sahip olan fonts listesinin ilk öğesiyle çizilir. Eğitimde Aileron, ardından DejaVu Sans kullanılmış olup bunlar briaai/Fibo-2.0-dev deposundaki fonts klasöründe yer alır. fonts yoksa, bu tür karakterler Pillow’un yerleşik yazı tipi tarafından nasıl çiziliyorsa öyle çizilir ve pipeline bir uyarı verir.
  • Pipeline, her girdiyi görseli için image_tokens alanıyla işaretler ve Qwen3-VL, düzenlenecek görsellerden sonra görselleri görür.
  • Bir üretim, gürültü seviyesi pipe.text_images_max_noise_level (0.9) değerinin üzerindeyken ilk adımlarını, görseller olmadan başlık üzerinde çalıştırır. Bir düzenleme ise her adımda onları kullanır.
  • Metin içermeyen bir başlık, tıpkı eğitim sırasında olduğu gibi kısa bir açıklama da görsel almaz.

Eğitimde kullanılan fontlarla çizmek için:

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]

Görselleri kendiniz çizecekseniz, bunları text_images olarak, tek bir istem için sırasıyla, text içeren her text_render girdisi için birer adet olarak iletin. Bunlar, hattın kendi görsellerine göre önceliklidir. Eğitimden farklı şekilde çizilen görseller dağıtım dışıdır.

Dikkat arka uçları

Transformer, diffusers'in herhangi bir dikkat (attention) arka uçlarında çalışır; örneğin H100 gibi Hopper GPU'larında FlashAttention-3:

pipe.transformer.set_attention_backend("_flash_3_varlen_hub")

_flash_3_hub tek bir istek için de çalışır ancak maskeleri kabul etmediğinden, farklı uzunluklarda bir istek grubunu çalıştıramaz (aşağıya bakın).

Toplu İşleme

Tek bir çağrıda birden fazla prompt üretilebilir. Farklı uzunluklardaki promptlar doldurulur (padding) ve bu doldurma, her dikkat katmanında maskeleme ile dışlanır; bu nedenle böyle bir grup, maskeyi dikkate alan bir dikkat arka ucuna ihtiyaç duyar: varsayılan olan veya flash_varlen gibi bir varlen arka ucu. float32'de, bir grup ayrı çağrıların görüntülerini yeniden üretir; bfloat16'da ise dikkat çekirdekleri doldurulmuş ve doldurulmamış girdiler arasında farklılık gösterdiğinden, gruplanmış görüntüler ayrıntılı düzeyde tekil çağrılardan farklılık gösterebilir.

BriaFibo2Pipeline

sınıf diffusers.BriaFibo2Pipeline

< >

( transformer: BriaFibo2Transformer2DModelscheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLFlux2text_encoder: Qwen3VLForConditionalGenerationprocessor: Qwen3VLProcessor )

Parametreler

  • transformer (BriaFibo2Transformer2DModel) — Görüntü latentlerini gürültüden arındıran transformer.
  • scheduler (FlowMatchEulerDiscreteScheduler) — transformer ile birlikte latentleri gürültüden arındırmak için kullanılan zamanlayıcı.
  • vae (AutoencoderKLFlux2) — Görselleri latentlere ve geriye eşleyen varyasyonel oto-kodlayıcı.
  • text_encoder (Qwen3VLForConditionalGeneration) — Qwen3-VL. Gizli durumları, transformer'ı koşullandırır.
  • processor (Qwen3VLProcessor) — İstemciyi ve düzenlenecek görüntüleri Qwen3-VL girdilerine dönüştürür.

Fibo 2.0 ile metinden görüntüye üretim ve görüntü düzenleme için Pipeline.

__call__

< >

( 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

Parametreler

  • prompt (str veya list[str], isteğe bağlı) — Görsel üretimi yönlendirmek için kullanılan istem, genellikle yapılandırılmış bir JSON istemidir ve Fibo 2.0'ın eğitim sırasında temizlediği altyazılar gibi temizlenir: boş değerler ile aesthetic_score ve preference_score alanları düşürülür ve içerik sıkı biçimde seri hale getirilir. image ile birlikte, düzenleme talimatı veya "edit_instruction" anahtarı ve sonucun altyazısını içeren bir JSON nesnesi: diğer anahtarları veya altyazıyı ya da kısa bir açıklamayı içeren "structured_caption" anahtarı.
  • image (PIL.Image.Image veya list[PIL.Image.Image], isteğe bağlı) — Düzenlenecek görüntü veya birlikte düzenlenecek en fazla 5 görüntü; talimat bu görüntülere <image_1>, <image_2> vb. olarak atıfta bulunabilir. image verilmezse, pipeline istemden bir görüntü üretir.
  • mask (PIL.Image.Image, isteğe bağlı) — Tek bir görüntü düzenlenirken, image içinde yeniden oluşturulacak bölge; siyah zemin üzerinde beyaz. Eğitimde olduğu gibi, görüntü kodlanmadan önce 128'de ikili hale getirilen maske aracılığıyla bu bölge gri tonlara çevrilir.
  • text_images (list[PIL.Image.Image], isteğe bağlı) — Altyazının istediği metnin görüntüleri, text içeren her text_render girdisi için bir adet, sırasıyla: her girdinin metni kendi başına çizilmiş olarak, render_text_images'in çizdiği gibi. Qwen3-VL bunları istemle birlikte görür, her biri altyazı girdisinde işaretlenmiştir, bu da Fibo 2.0'ın metni render etmesine yardımcı olur. prompt'un tek bir JSON altyazısı olarak verilmesini gerektirir ve render_text_images'e öncelik tanır. Bir üretim, gürültü seviyesi text_images_max_noise_level (0.9) üzerindeyken ilk adımlarını bunlar olmadan çalıştırır; bir düzenleme ise bunları her adımda kullanır.
  • render_text_images (bool, isteğe bağlı, varsayılan True) — Her alt yazının text_images değerlerinin, Fibo 2.0’ın eğitim sırasında çizdiği şekilde çizilip çizilmeyeceğini belirtir: her metin tek satırda, beyaz zemin üzerine siyah, Pillow’un yerleşik fontuyla 20 punto boyutunda ve bu fontta bulunmayan karakterler, bunlara sahip olan fonts listesinin ilk öğesinden alınır. Metin içermeyen bir alt yazı ve JSON alt yazısı olmayan bir istem (örneğin kısa bir açıklama), eğitimde olduğu gibi görsel almaz.
  • fonts (list[str], isteğe bağlı) — Pillow’ün yerleşik fontunda bulunmayan text_images karakterlerini çizmek için kullanılacak fontların sırasıyla yolları. Eğitim sırasında bu karakterler Aileron, ardından DejaVu Sans fontlarıyla çizildi; bu fontlar briaai/Fibo-2.0-dev deposundaki fonts klasöründe yer almaktadır. Bu fontlar kullanılmadığında, söz konusu karakterler Pillow’ün yerleşik fontunun çizdiği şekilde görüntülenir.
  • height (int, isteğe bağlı) — Oluşturulan görüntünün piksel cinsinden yüksekliği. 16'ya bölünebilir olmalıdır. Varsayılan değer 1024'tür; düzenleme sırasında ise Fibo 2.0'ın ilk görüntünün en-boy oranı için eğitimde kullanıldığı boyuta, yaklaşık bir megapiksele ayarlanır.
  • width (int, isteğe bağlı) — Oluşturulan görüntünün piksel cinsinden genişliği. 16'ya bölünebilir olmalıdır. Varsayılan değeri height ile aynıdır.
  • num_inference_steps (int, isteğe bağlı, varsayılan 30) — Gürültü azaltma adım sayısı.
  • guidance_scale (float, isteğe bağlı, varsayılan 5.0) — Sınıflandırıcı-ücretsiz yönlendirme ölçeği. 1'den büyük değerler, her adımda negatif istemi ikinci bir geçiş olarak çalıştırır ve 1.0 yönlendirmeyi kapatır.
  • negative_prompt (str veya list[str], isteğe bağlı) — Yönlendirme açıkken uzak durulacak yönlendirme metni. Varsayılan olarak, Fibo 2.0'un eğitildiği boş başlık kullanılır: tüm değerleri boş olan yapılandırılmış başlık.
  • num_images_per_prompt (int, isteğe bağlı, varsayılan 1) — Her istem için oluşturulacak görsel sayısı.
  • generator (torch.Generator veya list[torch.Generator], isteğe bağlı) — Belirleyici üretim için başlangıç gürültüsünü çizmekte kullanılan üreteç(ler).
  • latents (torch.Tensor, isteğe bağlı) — (batch_size, 32, height // 8, width // 8) biçiminde önceden oluşturulmuş başlangıç gürültüsü.
  • prompt_embeds (torch.Tensor, isteğe bağlı) — prompt yerine kullanılan, encode_prompt tarafından önceden hesaplanmış metin gömme değerleri.
  • prompt_embeds_mask (torch.Tensor, isteğe bağlı) — prompt_embeds ile birlikte encode_prompt tarafından döndürülen maske. Dolgu (padding) yapıldığında gereklidir.
  • negative_prompt_embeds (torch.Tensor, isteğe bağlı) — negative_prompt yerine kullanılan, negatif istemin önceden hesaplanmış metin gömümleri.
  • negative_prompt_embeds_mask (torch.Tensor, isteğe bağlı) — negative_prompt_embeds ile birlikte encode_prompt tarafından döndürülen maske. Dolgu (padding) yapıldığında gereklidir.
  • output_type (str, isteğe bağlı, varsayılan "pil") — Çıktı biçimi: "pil", "np", "pt" veya "latent".
  • return_dict (bool, isteğe bağlı, varsayılan True) — Düz bir tuple yerine BriaFibo2PipelineOutput döndürülüp döndürülmemesi.
  • callback_on_step_end (Callable, isteğe bağlı) — Her gürültü azaltma adımının sonunda callback_on_step_end(self, step, timestep, callback_kwargs) olarak çağrılan bir işlev.
  • callback_on_step_end_tensor_inputs (list[str], isteğe bağlı, varsayılan ["latents"]) — callback_kwargs içinde callback_on_step_end'e iletilen tensörler.

Dönüş değeri

BriaFibo2PipelineOutput veya tuple

oluşturulan görüntüler.

Üretim için pipeline çağrıldığında tetiklenen işlev.

Örnekler:

>>> 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

< >

( 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 )

Parametreler

  • prompt (str veya list[str]) — Kodlanacak istem veya istemler. image ile birlikte, her istem bir düzenleme talimatıdır veya bir "edit_instruction" anahtarı ve sonucun başlığı içeren bir JSON nesnesidir: diğer anahtarları veya başlığı ya da kısa bir açıklamayı içeren bir "structured_caption" anahtarı. Bir üretim istemi, verildiği gibi kodlanır: __call__ önce Fibo 2.0'ın eğitildiği biçimde bir JSON başlığı yerleştirir.
  • image (list[PIL.Image.Image], isteğe bağlı) — Düzenlenecek görüntüler, Qwen3-VL'nin onları gördüğü haliyle. Her istem hepsini düzenler.
  • device (torch.device, isteğe bağlı) — Gömlemelerin yerleştirileceği cihaz.
  • num_images_per_prompt (int, varsayılan 1) — Her istem için oluşturulacak görsel sayısı.
  • prompt_embeds (torch.Tensor, isteğe bağlı) — prompt yerine kullanılan, (batch_size, 6, text_len, 7680) biçiminde önceden hesaplanmış metin gömme değerleri.
  • prompt_embeds_mask (torch.Tensor, isteğe bağlı) — prompt_embeds içindeki gerçek tokenların Bool maskesi, şekli (batch_size, text_len).
  • text_images (list[PIL.Image.Image] veya list[list[PIL.Image.Image]], isteğe bağlı) — Başlığın metninin görüntüleri, text içeren her text_render girdisi için sırasıyla birer adet veya her istem için bunların listesi. Her girdi, kendi görüntüsünün görme işaretçisini alır ve Qwen3-VL, düzenlenecek görüntülerden sonra bu görüntüleri görür.
Update on GitHub