Geliştirme
Veri: dosyalar, bağlayıcılar ve veri kümeleri
Verileriniz zaten bir yerlerde yaşıyor — bir diskte, bir HTTP uç noktasının arkasında, bir bulut sürücüsünde, bir nesne depolama kovasında, SSH ile eriştiğiniz bir makinede. Scellis bunların tümünün ortasından tek bir keskin çizgi çeker: İçeri gelen baytlar, yalnızca sizde duran kimlik bilgileriyle cihazınıza akar; dışarı çıkan baytlar ise hedefi adıyla anan ayrı ve daha güçlü bir onay gerektirir. Arada veri, Scellis'te zaten her şeyin olduğu şeye dönüşür — sürümlü, içerik adresli, hash ile atıf yapılabilir. Bu sayfa o yolu dolaşır: dosyalar, bağlayıcılar, kimlik bilgileri, yön kuralı — ve ham baytların, hash ile yeniden üretebileceğiniz bir veri kümesine nasıl dönüştüğü.
Yerel dosyalar doğrudan diskten akar#
En yaygın kaynak, en gösterişsiz olanıdır. Yerel bir dosya, bir dosya tanıtıcısı üzerinden doğrudan diskten akar: Gigabaytlarca büyüklükteki bir veri kümesi yerinde okunur — varsayılan olarak asla karşıya yüklenmez ve asla tarayıcının yerel veritabanından geçirilmez. O veritabanı çalışma setinizi tutar — elinizdekilerin yerel-öncelikli kataloğunu — ham verinizi değil. Büyük bir dosyayı açmak bu yüzden yalnızca okumanın maliyetine mal olur, fazlasına değil: içe aktarma adımı yok, gigabaytların tarayıcı depolamasına sessizce kopyalanması yok, sonradan asıl dosyayla uzlaştırmanız gereken bir kopya yok.
Bağlayıcılar içeriktir, motor özelliği değil#
Geri kalan her şey bir bağlayıcı (connector) üzerinden gelir — ve bağlayıcı bir motor özelliği değil, içeriktir. Üç şeyi bir araya getirir: bildirilmiş bir etki — ağa uzanan bir iş akışı bunu çalışmadan önce söyler; tipli IO blokları — gelen veri grafa gerçek bir biçimle girer; ve bir kimlik doğrulama bağlaması — aşağıdaki kimlik bilgisi kuralları her yerde aynı biçimde geçerli olur. Altta yatan kaydın bir biçimi vardır:
# A connector is content — three parts, checked like any block.
name: user/ada/s3_source # namespaced — never shadows a builtin
version: 1
effect: { id: net.ingress, direction: ingress } # declared before it runs
auth: { kind: api_key, store: device_only } # never synced, never provenance-stamped
io:
in: [{ name: bucket, dtype: string }, { name: key, dtype: string }]
out: [{ name: object, dtype: bytes }] # enters the graph with a real shape
transport: client_signed # SigV4 signed on device — the secret never leavesPlatformla gelen küme, verilerin çoğunun arkasında yaşadığı protokolleri kapsar — yerel dosyalar ve yüklemeler, HTTP giriş ve çıkış, bir relay üzerinden FTP/FTPS/SFTP, istemci tarafında imzalamayla S3 ve GCS, OAuth üzerinden Google Drive ve Dropbox, SMTP e-posta, bir Telegram botu, giden ve gelen webhook'lar, Google Sheets ekleme ve Colab dışa aktarımı:
| Protokol | Nasıl bağlanır |
|---|---|
| Yerel dosyalar & yüklemeler | bir dosya tanıtıcısı, doğrudan diskten akış |
| HTTP(S), giriş ve çıkış | doğrudan tarayıcıdan çekilir — ve gönderilir |
| Bulut sürücüleri | OAuth ile yetkilendirilir (dosya-başı kapsam) |
| Nesne depolama (S3 / GCS) | istekler istemci tarafında imzalanır |
| SSH/SFTP ve FTP | bir relay üzerinden aracılanır — adı konmuş tek istisna |
| E-posta, webhook, Sheets, Colab | act-block'lar ve bir gelen kutusu, her biri açık bir egress ya da ingress |
Bağlayıcı sıradan içerik olduğu için, bu küme bir taban çizgisidir, tavan değil. OneDrive, Slack, Discord, bir Gmail-API istemcisi — hiçbiri platformla gelmez ve gelmesine gerek de yoktur: her biri, herhangi bir bloğu yazdığınız gibi bir öğleden sonralık yazım işidir — o da diğerleri gibi kataloglanır, paylaşılır ve onaya tabi olur. Eksik bir entegrasyon asla bir bakımcı kuyruğu değildir — Catalog'u döndüren çarkın ta kendisidir.
Kimlik bilgileri cihazınızdan asla ayrılmaz#
Kimlik bilgileri kökten istemci tarafındadır. Bir token, anahtar ya da parola cihazınızda şifrelenmiş olarak durur — cihaza bağlı bir anahtarla AES-256-GCM — ve hayatı orada biter. Asla eşitlenmez. Diğer değişikliklerinizi sunucuya sıraya koyan eşitleme kuyruğuna asla yazılmaz. Köken kaydına asla damgalanmaz. Bir çalıştırma neyin geldiğini kaydeder — içeri nasıl girdiğinizi asla. Kendiniz için parola ile sarmalanmış bir kopyayı dışa aktarabilirsiniz; platform hiçbir kopya tutmaz. Güven modelinin tamamı güvenlik ve gizlilik sayfasının konusudur.
Not
Cihazı kaybederseniz kimlik bilgileri de onunla gider: Bir kurtarma yolu olmadığı için bir sonraki makinede yeniden girersiniz. Bu, tasarımın bozulması değil, çalışmasıdır — çalınabilecek bir sunucu kopyası hiç var olmaz.
İçerik olarak edinilen OAuth#
Bir OAuth token'ı edinmek bile içeriktir. Bir OAuthProviderSpec, bir sağlayıcının uç noktalarını, kapsamlarını ve PKCE akışını bildirir; böylece yeni bir sağlayıcı motor kodu değil, yazdığınız bir spec olur — ve kullanıcı yazımı bir sağlayıcı kendi client id'sini getirir. Kapsam-asgariliği yazarlık denetiminden geçer: Google yalnızca dosya-başı seçici kapsamıyla gelir, asla toptan Drive erişimiyle değil. Relay'den geçen tek sır (bir tarayıcının gerçekten kaçınamayacağı SSH/FTP kimlik doğrulaması) onaylıdır, bağlantı kapsamlıdır ve yalnızca bellekte tutulur.
Gizlilik çizgisi yöndür#
Scellis “ağ erişimini” tek bir izin olarak ele almaz. İçeri alma (ingress) — veriyi cihazınıza çekmek — onaylı bir ağ etkisidir: Bağlayıcı bunu bildirir, siz onaylarsınız ve sonrasında baytlar yerelde yaşar — bildiğiniz yerel-öncelikli hikâyenin içinde. Dışarı çıkış (egress) — cihazınızdan ayrılan veri — hedefi adıyla anan ayrı ve daha güçlü bir onaydır ve asla bir içeri-alma onayının üzerine binemez. “Bu kaynaktan çek” demek, hiçbir şeyi hiçbir yere göndermeye sessizce yetki vermez.
Çizgi, iş cihazlara yayıldığında da geçerlidir. Dağıtık bir işte bağlayıcılar cihaz-yerel kalır: İçeri alma, iş bölünmeden önce işi başlatanın cihazında çalışır; dışarı çıkış, sonuçlar birleştikten sonra. Eşler hesaplanacak işi alır — kimlik bilgilerinizi asla.
Dışarı göndermek — ve dünyayı içeri almak#
İki an kendi disiplinini hak eder: veriyi dışarı göndermek ve bir şeyin içeri uzanmasına izin vermek. Her act-block — bir e-posta, bir webhook, bir mesaj — önce saf bir kuru çalıştırma (dry-run) yapar. Sıfır egress ile tam giden zarfı üretir; böylece herhangi bir şey gönderilmeden önce tam olarak neyin gönderileceğini görürsünüz:
# Every act-block runs a pure dry-run first — the exact envelope, zero egress.
dry_run email_send
to ada@example.org # consent copy names this recipient
subject "run 812 finished"
body 2.4 KB
egress none # nothing left the device
ledger send-key 5f1a… # idempotent — a re-run will not double-sendGerçek gönderim idempotenttir, bir gönderim-defteriyle korunur; böylece bir yeniden çalıştırma iki kez göndermez; onay metni alıcıyı adıyla anar; bütçeler yüksek seslidir. Gelen taraf bilerek mütevazıdır. Bir webhook-in, platformun aracıladığı bir gelen kutusudur — döndürülebilir bir capability URL'i, boyutu sınırlı ve TTL'li — tarayıcının dinlediği bir soket değil. Ve tetikleyiciler yalnızca bir sekme açıkken ateşlenir: Sekme yoksa olaylar, siz dönene kadar yüksek sesle sınırlı biçimde sıraya girer. Bir tetikleyiciyi kurmak onayın kendisidir — iş akışının tüm etki kapanışı üzerinde, bilinçli bir jestle basılmış ve bir düzenleme o kapanışı genişlettiği anda otomatik olarak devre dışı bırakılan, duran bir onay. Bu, kesinlikle gözetimsiz otomasyon değildir: Kapalı bir sekme hiçbir şey çalıştırmaz. (Gönderim yinelenmezliği cihaz başınadır; başka bir makinede bir yeniden çalıştırma tekrar gönderebilir — köken kaydı anahtarları tutar — platformun sakladığı değil açıkça belirttiği bir sınır.)
Biçimler de veri kümeleri de içeriktir#
Yabancı bir dosya biçimi, motorun tesadüfen anladığı bir şey değildir; bir çözme (decode) bloğudur — dönüş yolunda da bir kodlama (encode) bloğu. Yerleşik set; CSV, Parquet ve Arrow'u; ONNX, safetensors ve PyTorch state-dict'leri; XLSX ve DOCX dışa aktarımını; ve sözlüğü kendisi içerik adresli bir yapıt olan BPE/WordPiece tokenizer'ları kapsar. Yabancı bir dosyayı tuvale sürükleyin, tek bir hamlede bağlayıcı ve codec üzerinden veri kümesi oluşturmaya yönlensin; eksik bir codec, platformdaki her şey gibi yazılabilir. Yüzeyin tamamı kataloglanmış içeriktir — veri sayfasında görebilirsiniz.
Çözülen veri bir veri kümesine dönüşür: birinci sınıf, sürümlü bir katalog varlığı. Her sürüm içerik adreslidir — aynı veri, aynı hash — ve bir eğitim çalıştırması tükettiği veri kümesi sürümüne tam olarak bu hash ile başvurur. “Bu modeli hangi veri eğitti?” bir sorgudur, arkeoloji değil. Bölmeler (split) de aynı derinliğe iner: Bir eğitim/doğrulama/test bölmesi, kendi başına sürümlü, içerik adresli bir yapıttır — deterministik, sabit tohumlu bir bölümleme — böylece bir sonucun arkasındaki tam bölme yeniden üretilebilirdir, aşağı yukarı yeniden çekilmez.
Her veri kümesi bir veri kümesi kartı taşır — köken kaydı, lisans, onay dayanağı, bilinen sınırlar — ve bir profil görünümü sunar: sütunlar, veri tipleri, eksik değerler, sınıf dengesi. Veri, gözetimli eğitim başlamadan önce etikete ihtiyaç duyuyorsa, etiketleme ve işaretleme yüzeyi platformun parçasıdır — platformu terk etmenizi gerektiren bir araç değil.
Bellekten büyük olmak normal durumdur#
Gigabaytlarca girdi, atlatılacak bir uç durum değildir; motorun planladığı asıl durumdur. Her blok akış sınıfını bildirir — tek geçişli, sınırlı çok geçişli ya da tam somutlaştırmalı — ve motor bu bildirimlerle, RAM, VRAM ve depolama için açık bütçelere karşı parça parça yürütme planlar. Uygulanabilirlik yürütmeden önce denetlenir, yürütme sırasında keşfedilmez: Sığmayan bir çalıştırma, adı konmuş seçeneklerle baştan reddedilir — batch'i küçült, akışı aç, hassasiyeti değiştir — asla çalıştırmanın ortasında bir bellek-tükendi sürprizi olarak değil. Harekete geçebileceğiniz bir ret, nedenini sonradan kazıp çıkarmanız gereken bir çökmeden iyidir — Scellis her yerde aynı takası yapar.