Mimari
Bileşenler ve portlar, denetim hattı, politika modeli, dedektör kayıt defteri, kanıt defteri, kimlik ve lisans, geçit ve işlevsel olmayan gereksinimler.
Güncelleme: Ekim 2026Bileşenler ve portlar
Bir Thulpar kurulumu altı bileşenden oluşur: api (kontrol düzlemi ve check API), geçit (veri düzlemi), dedektörler (CPU ve GPU), konsol, Postgres ve Valkey. Hepsi aynı Compose projesinde ya da aynı Helm sürümünde çalışır; yalnız api ve geçit dışarıya yönlendirilen bir ağdadır, geri kalanı iç ağlardadır.
| Bileşen | Görevi | Port |
|---|---|---|
| thulpar-web | Konsol: bulgular, defter, dedektörler, politikalar, onaylar, geçit modelleri, MCP sunucuları, API anahtarları, kanıt paketleri, sağlık, kurulum ayarları; TR varsayılan, EN | 8050 |
| thulpar-api | Check API, politika çözümleme, ray motoru, Cedar, etiketler, onaylar, defter, dışa aktarımlar, lisans, konsolun kontrol düzlemi | 8051 |
| thulpar-gateway | OpenAI-uyumlu proxy ve MCP proxy; motor süreç içinde, api’ye HTTP sıçraması yok | 8053 |
| thulpar-detectors | Detector API sidecar’ları: CPU katmanı (ONNX, llama.cpp, Presidio, dosya çözümleyici) ve GPU adaptörü (vLLM uç noktaları) | yayımlanmaz |
| Postgres | Politikalar, defter, onaylar, dedektörler, API anahtarları, kurulum ayarları | yayımlanmaz |
| Valkey | Oturumlar, önbellekler, hız sınırları, hold sinyalleri, akış biletleri (Redis protokolü) | yayımlanmaz |
| Prometheus /metrics | api ve geçidin kendi dinleyicileri; hiçbir zaman 8051/8053 üzerinde değil | 9051 / 9053, yalnız loopback |
Denetim hattı
Çağıran aşamayı, içeriği ve bağlamı gönderir. api anahtarı kiracıya bağlar, hız sınırını ve kabul kontrolünü uygular; politika çözümleyici (kiracı, uygulama, ajan, sürüm) için derlenmiş ray grafiğini verir; motor grafiği çalıştırır, bulguları toplar, kararı çıkarır ve defter olayını yazar.
- Bir aşamanın rayları bağımlılığa göre seviyelenir: bağımsız raylar paralel çalışır, bir ray başka bir rayın bulgularını after ile tüketir (ör. enjeksiyondan sonra PII maskeleme).
- Her rayın kendi süre bütçesi vardır; çağıranın options.deadlineMs değeri üst sınırdır. Süresi dolan ray duruşuyla kaydedilir.
- Sonuçlar grafik sırasına göre katlanır; yanıt hangi dedektörün önce bittiğine bağlı değildir. Öncelik: deny > hold > rewrite > reask > redact > escalate > allow_with_findings > allow.
- async rayları yanıt gittikten sonra çalışır ve ana olaya bağlı bir takip olayı yazar; escalate bulgusu kiracı webhook’unu çağırır.
- Kabul edilen her denetim tam bir defter olayı yazar, her çıkış yolunda: motor hatası bile kapalı bir ray altında kaydedilmiş bir deny’dır, adaptörün açık düşebileceği bir 500 değil.
| Aşama | p50 bütçe (tasarım) | Not |
|---|---|---|
| input | 150 ms | senkron; çağıran destekliyorsa üretimle paralel (spekülatif bilet) |
| tool_call | 50 ms | Cedar + deterministik doğrulayıcılar |
| output | 250 ms | senkron ya da geri çekme çerçevesiyle asenkron |
| output_chunk | 40 ms | cümle başına |
| retrieval | 100 ms | parti başına |
Politika modeli
Bir politika paketi JSON’dur ve yayımlanmış bir şemaya karşı doğrulanır. Paketler org → kiracı → uygulama → ajan sırasıyla katmanlanır: alt paket her şeyi miras alır, ray parametrelerini değiştirebilir, ray ekleyebilir ya da bir rayı kapatabilir. Üst paketin kilitlediği bir ayar altta yalnız sıkılaştırılabilir; bunu yazarın iyi niyeti değil birleştirme işlemi zorlar.
- Sürümler: semver + içerik hash’i; her sürüm Ed25519 ile imzalanır (istemci tarafında kayıtlı bir anahtarla ya da kurulumun kendi imzalama anahtarıyla). Konsol sürümler arasındaki ray düzeyinde farkı gösterir.
- Aktivasyon kapıları: şema ve Cedar geçerliliği; hiçbir dedektörün uygulamadığı kapalı bir ray reddedilir; adlandırılmış her onay profili zincirde tanımlı olmalıdır; şablonun asgari katmanı kurulumla karşılaştırılır.
- policy.requireApproval aktivasyonu iki kişilik bir işlem yapar; policy.requireBenchmark başarısız bir kırmızı takım kıyaslamasıyla aktivasyonu engeller.
- Beş imzaya hazır sektör şablonu: tr-banking-bddk, tr-insurance-seddk, tr-public-sector, tr-defence, eu-ai-act-high-risk; her birinin CPU katmanı için bir -baslangic varyantı vardır.
{
"id": "acme-banking", "version": "1.2.0", "extends": "tr-banking-bddk",
"scope": { "level": "tenant", "tenantId": "tnt_acme" },
"rails": [
{ "id": "pii.redact", "stages": ["input", "output"], "mode": "enforce",
"failPosture": "closed", "onFinding": "redact", "locked": true },
{ "id": "groundedness", "stages": ["output"], "mode": "shadow",
"params": { "minSupport": 0.6 } }
],
"approvals": { "four-eyes": { "approvers": ["TENANT_ADMIN"], "fourEyes": true,
"slaMinutes": 60, "fallback": "deny" } }
} Dedektör kayıt defteri
Her dedektör aynı HTTP Detector API’sinin arkasında çalışır ve kendini tanıtır: kimlik, sürüm, sınıf, not, diller, uyguladığı raylar, yetenekler. Ray, ihtiyaç duyduğu sınıfı ve asgari notu bildirir; kayıt defteri kurulu katmanda o sınıfı uygulayan, nota ulaşan ve tespit edilen dili destekleyen en iyi dedektörü çözer.
- Hiçbir dedektör çözülemezse rayın duruşu uygulanır, aktivasyon boşluğu bildirir ve sağlık sayfası gösterir; sessiz bir izin yoktur.
- Dil geçişi: her cümlenin dili tespit edilir ve segment o dilin dedektörüne yönlendirilir; Türkçe bir belgenin içindeki İngilizce talimat İngilizce kurallara ulaşır.
- Hangi dedektörlerin çalıştığı konsolda seçilir; bellek tahmini konteynerin sınırına karşı gösterilir, sığmayan değişiklik uygulanmaz.
- Yerleşik raylar (secrets, system_prompt.leak, tool.args, tool.authz, labels.sink, budget, conversation, schema, exfil) süreç içinde çalışır ve dedektör gerektirmez.
- Kurumun kendi dedektörü de kayıt olur: Detector API’yi uygulayan her HTTP servisi ray grafiğinde aynı yere oturur.
Kanıt defteri
Her olay kiracının zincirine hash = SHA-256(önceki hash ‖ kanonik JSON) ile eklenir; kanonikleştirme RFC 8785’tir. İçeriğin kendisi değil hash’i saklanır; bir PII rayı içeriğin üzerinden geçtiyse en çok 2 KB’lık redakte bir örnek yanında durur ve saklama süresi sonunda zincire dokunmadan silinir.
- Zincir
- Kiracı başına bir zincir; kurulum geneli değişiklikler platform zincirinde. Her yapılandırma değişikliği (politika, anahtar, dedektör, lisans, ayar) bir config_change olayıdır.
- Çapalar
- Günlük iş son çapadan beri yazılan her olayı kök hash’iyle kapatır ve bir anchor olayı ekler; liste kurumun kendi noterine ya da SIEM’ine verilebilir.
- Gece doğrulama
- Her gece son çapaların kök hash’leri saklanan olaylardan yeniden hesaplanır ve kuyruk hash hash doğrulanır; kırık bir zincir kritik bir uyarıdır.
- Olay içeriği
- Aşama, mod, uygulama, ajan, paket sürümü, çalışan ve atlanan raylar, dedektör sürümleri, karar, bulgular, etiketler, gecikme, içerik hash’i, onay kimliği.
- Kanıt paketleri
- Kiracı, dönem ve profil başına imzalı ZIP; yedi regülatör profili; kurulumun açık anahtarıyla çevrimdışı doğrulanır.
Kimlik, kiracılık, lisans
Thulpar son kullanıcı saklamaz. İnsanlar için kimlik kurumun OIDC sağlayıcısından (ya da Aginies’e gömülü profilde Platform’dan) gelir; IdP’siz kurulumda ve break-glass için yerel yönetici hesapları + TOTP vardır. Çağıranlar thp_live_… API anahtarı taşır; anahtar bir kiracıya bağlıdır ya da bir SUPER_ADMIN tarafından birden çok kiracıya hizmet eden bir entegrasyon için kurulum anahtarı olarak basılır.
- Roller: SUPER_ADMIN (kurulum, katmanlar, dedektörler, lisans), TENANT_ADMIN (politika, bulgular, onaylar), onaylayan (yalnız onay kutusu). Konsol bir yönetici konsoludur.
- Her tablo kiracı kimliği taşır; yabancı satır 404’tür. Devre dışı bir kiracının anahtarları ve oturumları 403 alır; hiçbir şey silinmez.
- İş yükleri için isteğe bağlı SPIFFE kimliği: X.509 ya da JWT SVID güven paketi dosyalarından doğrulanır, paketin identity bölümü SPIFFE kimliğini uygulama/ajana bağlar ve kimlik kapısı her raydan önce çalışır.
- Lisans Ed25519 imzalı bir JSON belgesidir; doğrulama, uygulama ve sayım kurulumun içinde çalışır. Hiçbir kiracı ihmalle lisanslanmaz.
Geçit ve ölçekleme
Geçit Thulpar’ın kendi veri düzlemidir: herhangi bir OpenAI-uyumlu istemci ve herhangi bir MCP istemcisi onu model uç noktalarının ve araç sunucularının önüne koyar. Motoru süreç içinde çalıştırır; api’ye HTTP sıçraması, konsol kontrol düzlemi ve zamanlanmış iş yoktur. Postgres ve Valkey dışında durumsuzdur ve yatay ölçeklenir.
- Modeller kiracı takma adlarıdır: takma ad, yukarı akış URL’si, model adı ve mühürlenmiş kimlik bilgisi konsolda tanımlanır; istemci yalnız base URL ve anahtarı değiştirir.
- Akış: yanıt cümlelere bölünür, her cümle output_chunk aşamasında denetlenir; maskelenmesi ya da durdurulması gereken içerikte istemciye bir geri çekme çerçevesi ve maskeli metin gider.
- MCP proxy: tools/list şemaları hash’lenir ve sabitlenir, değişen araç karantinaya alınır, açıklama hijyeni uygulanır; tools/call argümanları araç raylarından, sonuçlar dolaylı enjeksiyon ve PII raylarından geçer.
- Egress kuralı: geçit yalnız yapılandırılmış yukarı akışlara, MCP sunucularına ve adlandırılmış yetkilendirme sunucularına çıkar; özel, loopback ve metadata adresleri kayıtta ve her çağrıda reddedilir.
- Yük altında: anahtar başına token kovası (429), replika başına eşzamanlılık sınırı; yumuşak sınırın üstünde kalite rayları atılır, sert sınırın üstünde 503 ve bir shed defter olayı; kiracı adil payı.
- Loglarda ham içerik yok: pino redakte eder, metrik etiketleri sınırlı sözcüklerdir, hiçbir zaman kiracı kimliği ya da içerik değildir. OTel izleri yalnız bir uç nokta verildiğinde ve içeriksiz.