# Belge Kaynakları

> Bir projenin taşıyabileceği altı kaynak türü, her yolun önüne eklenen mount adı, ve hepsinde senkronizasyonun ve hataların nasıl işlediği.

- Güncelleme: 2026-09-21
- Kaynak: https://contextator.com/tr/docs/document-sources/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
Bir projenin dokümantasyonu nadiren tek bir yerde yaşar. Bir **kaynak** o yerlerden biridir ve bir
proje ihtiyacı kadar çok kaynak taşıyabilir — hepsi tek bir aranabilir endpoint'te birleşir.

| Tür | Nedir | Kim senkronize eder | Sayfa |
|------|-----------|-----------------|------|
| **Local directory** | Sunucuya bağlanan bir klasör, olduğu yerde taranır. Hiçbir şey kopyalanmaz | İndeksleme anında okuyarak | [Yerel Klasör Kaynağı](/tr/docs/local-directory-source/) |
| **Git repository** | Bir dalın, isteğe bağlı olarak yalnızca bir alt klasörünün shallow checkout'u | Her çalıştırmanın başında `git fetch`, ya da bir push webhook | [Git Deposu Kaynağı](/tr/docs/git-repository-source/) |
| **Upload** | Sunucuda açılan dosyalar, klasörler ve arşivler (`.zip`, `.tar.gz`, `.rar`) | Senkronize edilecek bir şey yok — değiştiğinde tekrar yüklersiniz | [Yükleme Kaynağı](/tr/docs/upload-source/) |
| **Notion** | Dahili bir entegrasyonla paylaşılan, Markdown'a dönüştürülen sayfalar | Notion API'si, yalnızca değişen sayfaları yeniden render ederek | [Notion](/tr/docs/notion/) |
| **Confluence** | Bir Confluence Cloud ya da Data Center hesabının okuyabildiği ya da sizin adlandırdığınız her space, Markdown'a dönüştürülür | Confluence REST API'si, yalnızca sürümü değişen sayfaları yeniden render ederek; Data Center ayrıca bir webhook kabul edebilir | [Confluence](/tr/docs/confluence/) |
| **Dokümantasyon sitesi** | Herkese açık bir sitenin kendi sitemap'i, `llms.txt`'i ya da bir crawl'ı, Markdown'a dönüştürülür | Sitenin tamamının yeniden çekilmesi; `<lastmod>` tarihleri olan bir `sitemap.xml`, değişiklikler için önce iki istekte kontrol edilebilir | [Dokümantasyon Sitesi Kaynağı](/tr/docs/documentation-site-source/) |

Bir **Obsidian vault**'u bir Markdown klasörüdür, bu yüzden tek bir ayar çevrilerek local directory ya
da upload olarak gelir. Bkz. [Obsidian Vault'ları](/tr/docs/obsidian-vaults/).

## Mount adı

Her kaynağın bir **adı** vardır ve bu ad, katkıda bulunduğu her yolun önüne eklenir:

```
source "handbook"  contains  install.md   →  indexed as  handbook/install.md
source "api-repo"  contains  install.md   →  indexed as  api-repo/install.md
```

İki kaynağın çakışmadan aynı dosya adını taşıyabilmesinin, ve her arama sonucunun hangi kaynaktan
geldiğini söyleyebilmesinin nedeni budur. **Adın oluşturulduktan sonra değiştirilememesinin** nedeni
de budur — her indekslenmiş yol ve bir ajanın gördüğü her yol onu içerir. Bir kaynak hakkındaki
geri kalan her şey düzenlenebilir.

Adlar, proje adlarıyla aynı kuralı izler: küçük harf, rakam, `-` ve `_`.

## Bir kaynak eklemek

Bir proje üzerinde **Add source**, her tür için bir sekmesi olan bir diyalog açar. Ortak alanlar:

| Alan | Notlar |
|-------|-------|
| **Name** | Mount öneki. Değiştirilemez |
| **Label** | Listede gösterilen serbest metin. Opsiyonel, değiştirilebilir |
| **Content type** | `Plain Markdown / text`, `Obsidian vault`, `Notion export` ya da `OpenAPI / Swagger` — sonuncusu `.yaml`, `.yml` ve `.json` dosyalarını spesifikasyon olarak okur ve birini operasyon başına bir belgeye çevirir |
| **File types** | Hangi uzantıların indeksleneceği: varsayılan olarak `.md` ve `.mdx`, isteğe bağlı `.txt`, `.html`/`.htm`, `.csv`, `.docx` ve `.pdf` |
| **Index now** | Kaynak kaydedilir kaydedilmez bir çalıştırma kuyruğa alınır |

Git, Notion, Confluence ve dokümantasyon sitesi kaynaklarının, hiçbir şeyi indekslemeden kimlik
bilgilerini ve erişilebilirliği kontrol eden bir **Test connection** düğmesi de vardır — kaydetmeden
önce kullanın.

## Kaynaklar nasıl senkronize edilir

Her kaynak **her indeksleme çalıştırmasının başında** senkronize edilir, birbiri ardına, sonra taranır:

1. git kaynakları dalın ucunu çeker; Notion kaynakları değişen sayfaları çeker; local ve upload
   kaynaklarının çekecek bir şeyi yoktur.
2. Her kaynağın klasörü, seçtiği dosya türleri için taranır.
3. Yollar kaynak adıyla öneklenir ve indeksleyiciye verilir.

Tek bir kaynak satırında **Sync**'e basmak, başlıktaki **Re-index** ile aynı çalıştırmayı kuyruğa
alır — kaynak başına değil, proje başına bir kuyruk vardır.

## Bir kaynak başarısız olduğunda

Senkronize olamayan bir kaynak **kendi satırında raporlar** ve diğerleri yine indekslenir. Projenin
durumu bir özetle `error` olur:

```
2/3 sources synced; notion: API token is invalid
```

Önemlisi, içeriği **hiç** okunamayan bir kaynak, daha önce katkıda bulunduğu dokümanları korur.
İptal edilmiş bir Notion paylaşımı ya da ulaşılamayan bir git host'u, bir kaynağı boşaltmaz, yalnızca
bayatlatır. Nedeni düzeltin ve o satırda **Sync**'e basın.

## Düzenleme ve kaldırma

Kaynağın ürettiğini değiştiren bir ayarı değiştirmek — yol, dal, alt klasör, dosya türleri, içerik
türü — otomatik olarak bir indeksleme çalıştırması kuyruğa alır, bu yüzden bir kaynak asla sessizce
bayat kalmaz.

Bir kaynağı silmek, dokümanlarını, chunk'larını ve somutlaştırdığı dosyaları kaldırır. Proje
indekslenirken reddedilir.

## Ne indekslenir

Yalnızca kaynağın seçtiği dosya türleri: varsayılan olarak `.md` ve `.mdx`, isteğe bağlı olarak
`.txt`, `.html`/`.htm`, `.csv`, `.docx` ve `.pdf`. **Her şey girerken Markdown'a dönüşür** — dönüşüm
kenarda, bir kez olur; böylece chunker, embedder ve `read_document` tek bir format görür. `.yaml`,
`.yml` ve `.json` bu listede değildir: yalnızca OpenAPI / Swagger içerik türüyle okunurlar ve okunan
bir spesifikasyon tek bir belge değil, operasyon başına bir belge olur.

Her zaman atlanır:

- gizli dosyalar ve gizli klasörler (`.git/`, `.obsidian/`, …)
- `node_modules`, `dist`, `build`, `vendor`, `__pycache__`
- kaynağın dışına işaret eden sembolik linkler
- `IGNORE_GLOBS` ile eşleşen her şey

| Tür | Neye dönüşür | Korunan | Kaybedilen |
|------|-----------------|------|------|
| `.md`, `.mdx`, `.txt` | kendisi, değişmeden | her şey | hiçbir şey |
| `.html`, `.htm` | turndown + GFM ile Markdown | başlıklar, listeler, tablolar, kod, bağlantılar, `<title>` | script'ler, stil sayfaları, `svg`, gömülü görsel verisi (`alt` metni kalır) |
| `.docx` | mammoth ile Markdown, sonra aynı dönüştürücü | Word'ün kendi başlık stilleri, numaralı ve madde imli listeler, tablolar, bağlantılar | görseller, dipnotlar, yorumlar, izlenen değişiklikler |
| `.csv` | bir GFM tablosu, her 200 satırda bir `## Rows n–m` bölümü | her bölümün üstündeki başlık, tırnaklı virgüller ve satır sonları, `;`/tab/pipe ayraçları | verinin hiçbir şeyi; hücre içi satır sonları `<br>` olur |
| `.pdf` | glif konumlarından yeniden kurulan Markdown | yazı tipi boyutuna göre başlıklar, satır sonları arasında yeniden birleştirilip tire kaldırılan paragraflar, madde imli ve numaralı listeler, kolon hizalı tablolar, iki kolonlu okuma sırası, düşürülen üst/alt bilgi satırları | dipnotlar, şekiller, ve kolonları hizalı olmayan her tablo |

Görseller ve diğer ikili dosyalar indekslenmez. OCR da yoktur, bu yüzden dönüştürülemeyen bir dosya —
taranmış bir PDF, şifreli bir PDF, tamamı görsel olan bir Word dosyası, bu türlerden herhangi birinin
bozuk bir kopyası, hiç metne dönüşmeyen bir sayfa ya da e-tablo — **reddedilir, indekslenmez**: dosyayı
adıyla anan gerekçe kaynağın satırında gösterilir ve kaynağın geri kalanı normal şekilde indekslenir. Bir
ret hiçbir zaman senkronizasyonu ya da projeyi başarısız kılmaz: artımlı bir çalıştırmada dosya zaten
sahip olduğu belgeyi korur, ve bir rebuild onu yalnızca yeni nesle dahil etmez — hiç okunamayan bir
kaynağa uygulanan kuralın aynısı.

Dönüştürme kendi worker thread'inde çalışır, pano ve MCP endpoint'ini sunan thread'de değil, bu yüzden
yavaş bir dosya hiçbir zaman bir aramayı engellemez ve heap'ini tüketen bir parser yalnızca o dosyayı
başarısız kılar. Boyut tavanları, tek bir dosyanın dönüşürken neye mal olabileceğini sınırlar —
bir belge için `MAX_CONVERTED_FILE_BYTES`, akla yatkın olmayan bir sayfa sayısı iddia eden bir PDF için
`MAX_PDF_PAGES`, bir `.docx` içindeki bir zip bomb'una karşı `MAX_DOCX_UNPACKED_BYTES` — ve
`CONVERSION_TIMEOUT_MS` / `CONVERSION_IDLE_MS`, bir dosyanın ve boşta bir worker'ın ne kadar
çalışmasına izin verildiğini sınırlar. Tüm varsayılanlar ve her birinin ne durdurduğu:
[Yapılandırma](/tr/docs/configuration/#belgeler).

**Uzun bir PDF, `MAX_STORED_DOCUMENT_BYTES`'a karşı nereye düşer** (1 MB UTF-8, bunun ötesinde
saklanan önek `read_document`'ın sunduğu şeydir ve `content_truncated` ayarlanır — kesme saklanan metin
üzerinde olduğu ve parçalar üzerinde olmadığı için belge her durumda tamamen aranabilir kalır). 80, 200,
600 ve 1600 yoğun sayfalık üretilmiş kılavuzlar üzerinde ölçülmüştür (yaklaşık 95 karakterlik 42 satır,
bir üst/alt bilgi satırı, her onuncu sayfada bir bölüm başlığı):

| Sayfa | Markdown | Sayfa başına | Çıkarma |
|-------|----------|----------|------------|
| 80 | 316 KiB | 4,0 KiB | 0,18 sn |
| 200 | 795 KiB | 4,0 KiB | 0,21 sn |
| 600 | 2393 KiB | 4,0 KiB | 0,61 sn |
| 1600 | 6414 KiB | 4,0 KiB | 1,73 sn |

Tavan kabaca 250 yoğun sayfada ısırır — daha gevşek gerçek dünya kılavuzları bunu 300–400 sayfaya kadar
uzatır. Çıkarma sayfa başına yaklaşık bir milisaniyeye mal olur ve içerik hash'i dosyanın değiştiğini
söyledikten sonra bir kez gerçekleşir. Bunların hiçbirinden önce, girişte sınırlanan şey dosyanın
kendisidir: varsayılan olarak 50 MB olan `UPLOAD_MAX_FILE_BYTES`.
