İçeriğe atla
openplate

Uygulama

Yapılandırma

Gıda veritabanı anahtarı, Content-Security-Policy, analizler, yönetilen örnekler, özel ve örnek tarafından sağlanan yapay zeka uç noktaları

Bu sayfa, İngilizce belgeden makine çevirisiyle çevrildi.

openplate hiçbir şey yapılandırılmadan başlar. Veritabanı URL'si, oturum anahtarı ve şifreleme anahtarı yoktur, çünkü sunucu hesap tutmaz ve hiçbir şey depolamaz. Her değişken isteğe bağlı bir ince ayardır.

Çoğu değişken tek bir yerde, app/config/index.ts içinde okunur ve tiplendirilmiş bir CONFIG nesnesi olarak sunulur:

typescript
import { CONFIG } from '#config';

const port = CONFIG.server.port;
const appUrl = CONFIG.app.url;

.env.example satır içi notlarla birlikte tam listeyi içerir. Birini değiştirmek için dosyayı .env yoluna kopyala.

Ortam değişkenleri

environment-variables.md, varsayılanıyla birlikte uygulamanın okuduğu her değişkeni listeler. Ayrıca çekirdek sunucu ve çıkarım servisi değişkenlerini de listeler. Aşağıdaki bölümler daha büyük özellikleri ayrıntılı olarak açıklar.

Bir değişkenin kendine ait bir bölümü yoktur. DEFAULT_UI_LANGUAGE, bir ziyaretçinin seçim yapmadan önce göreceği dili ayarlar: varsayılan olan en, de, fr, it, es veya tr. Kişinin kendi seçimi her zaman geçerlidir. Bu ayar hiçbir yemek adını, hiçbir yapay zeka cevabını ve bir kişinin yazdığı hiçbir şeyi çevirmez. Başka herhangi bir değer önyüklemeyi durdurur.

Sağlayıcı API anahtarları asla ortamdan okunmaz. Kullanıcının anahtarı tarayıcıya girilir, cihazda saklanır ve doğrudan tarayıcı → sağlayıcı yönünde gönderilir; sunucuda bir kopyası bulunmaz. .env.example içindeki MISTRAL_API_KEY / OPENROUTER_API_KEY değişkenleri, yalnızca bir geliştiricinin doğrulama betiklerini canlı bir sağlayıcıya yönlendirebilmesi için vardır. Bunları dağıtılmış bir örnekte ayarlamak hiçbir işe yaramaz.

Gıda veritabanı anahtarı

FOOD_DB_API_URL ve FOOD_DB_API_KEY iki farklı karardır ve bunları ayrı tutmak işe yarar.

URL, bu örneğin gıdaları arayıp aramayacağını belirler. Boş bir dize olarak ayarlarsan hiçbir gıda adı makinenin dışına çıkmaz.

Anahtar, ne kadar arama yapabileceğini belirler. Üç katman bulunur:

katmanne yaparsınne alırsın
anonimhiçbir şeyağ adresi başına paylaşılan küçük bir günlük kota
ücretsizlowcarbcheck.org/developers adresinde bir e-posta adresi vercömert bir aylık kota
iş ortağıtalep etaylık sınır yok

LowCarbCheck krediyle sayar ve bir gıda araması bir krediye mal olur. Bu metnin yazıldığı sırada anonim katman günde 1.000 kredi ve ücretsiz anahtar ayda 100.000 kredidir; güncel sayılar lowcarbcheck.org/developers adresindedir. LowCarbCheck kullanıcılarının adreslerini değil, uygulama sunucunun adresini görür. Anonim katmanda, örneğindeki herkes tek bir günlük kotayı paylaşır.

Anahtarı olmayan bir örnek çalışmaya devam eder. Bu anonim katmandır ve openplate'i deneyen tek bir kişi için genellikle yeterlidir. Bir ev halkı veya günde birkaç tabak tarayan herhangi biri ücretsiz anahtarı tercih eder.

FOOD_DB_DAILY_CALL_LIMIT, bu sunucunun bir UTC gününde yapacağı LowCarbCheck çağrısı sayısını sınırlar. Varsayılan değer olan 3.200, bir ayı ücretsiz anahtarın 100.000 sınırının içinde tutar. Son beş dakika içinde aranan bir isim bellekten yanıtlanır ve hiçbir maliyeti olmaz. Sınır aşıldığında, besin aramaları gece yarısı UTC'ye kadar duraklar, uygulama bunu belirtir ve taramalar yine de yapay zekanın kendi sayılarıyla tamamlanır. Anahtarın daha fazlasına izin veriyorsa bu değeri artır. Sayım bellekte tutulur, bu nedenle yeniden başlatma işlemi sayımı sıfırlar.

Yönetilen bir kurulumda yiyecek araması için de oturum açmış bir hesap gerekir. Uygulama her aramayla birlikte hesabın oturumunu gönderir ve uygulama sunucusu LowCarbCheck'e herhangi bir şey ulaşmadan önce CORE_URL adresindeki çekirdek sunucuya oturumun etkin olup olmadığını sorar. Bu nedenle uygulama sunucusunun da bu adrese erişebilmesi gerekir. Erişemezse, erişene kadar aramalar reddedilir ve taramalar yine de yapay zekanın kendi sayılarıyla tamamlanır. Açık bir kurulum, eskisi gibi her aramaya yanıt verir.

Arama her iki durumda da hata durumunda açık kalacak şekilde (fail-open) çalışır: Gıda veritabanına ulaşılamazsa, istek reddedilirse veya kota biterse, tarama yine de tamamlanır ve sayıları göstermeyi sürdürür. Bu sayılar veritabanı değeri yerine yapay zekanın kendi tahmini olur ve uygulama, farkın fark edilmeden geçip gitmesine izin vermek yerine bunu ekranda belirtir.

Yiyecek veritabanına öneriler

FOOD_DB_BACKFILL=true ve bir anahtar ile openplate, bir kullanıcının fotoğraftan veya yazarak girdiği öğünden kaydettiği her yiyeceği bu sunucu üzerinden LowCarbCheck'e iletir:

  • Kullanıcının bir LowCarbCheck satırıyla eşleştirdiği yiyecek, satırın eksik başlıkları kazanması için yiyeceğin tüm uygulama dillerindeki adlarını gönderir.
  • Eşleşmeyen bir yiyecek, LowCarbCheck'in ekleyebilmesi için tüm uygulama dillerindeki adlarını ve 100 g başına makro değerlerini gönderir. İngilizce bir ada ve karbonhidrat, yağ, protein ile enerjinin dördüne birden ihtiyaç duyar. Bunlara sahip olmayan yiyecekler gönderilmez.
  • Kullanıcının bizzat yazdığı veya değiştirdiği bir ad asla gönderilmez.

Bir öneri adları, makroları ve yiyeceğin fotoğraftan mı yoksa yazılan bir öğünden mi geldiğini taşır. Hiçbir hesap, günlük girdisi, fotoğraf ve kullanıcının adresini taşımaz. LowCarbCheck sunucunu ve anahtarını görür. LowCarbCheck her öneriyi ulaştığında bir modelle değerlendirir ve onay alanları yayımlar. Bu şekilde yayımlanan bir yiyecek, yiyecek veritabanından bir tahmin olarak işaretlenmiş şekilde geri döner; openplate bunu derlenmiş bir kaynak olarak değil, her zaman bir tahmin olarak gösterir ve saklar.

Her kullanıcı bunu kendi cihazı için Ayarlar → Yapay Zeka içinden kapatabilir. İşletici FOOD_DB_BACKFILL=true ayarını yapana kadar her örnekte kapalıdır.

Bülten kaydı

openplate e-posta listesi olmadan gelir. Hem NEWSLETTER_SUBSCRIBE_URL hem NEWSLETTER_TURNSTILE_SITE_KEY ayarlandığında, açılış sayfası bir kayıt formu ekler. Tarayıcı bunu openplate sunucusuna gönderir, o da bir adresten dakikada en fazla beş istek olacak şekilde {email, locale, consent, source, turnstileToken} verisini URL adresine iletir. Tarayıcı bu URL adresini asla öğrenmez, bu sayede özel bir ağda bulunabilir. Birini ayarlayıp diğerini ayarlamazsan önyükleme durur. İkisini de ayarlanmamış bırakırsan, ki varsayılanı budur, form olmaz, fazladan betik olmaz ve CSP değişmez.

Sürüm denetimi

Sunucu, altı saatte bir ve açılıştan yaklaşık 90 saniye sonra bir defa https://openplate.de/latest.json dosyasını çeker. Bu küçük dosya, en son sürümün adını içerir. Sunucu bu sürümü kendi çalışan sürümüyle karşılaştırır ve sonucu Ayarlar > Hakkında adresinde bildirir. Bir "Check now" düğmesi de kontrolü tetikler, bu işlem tüm kurulum genelinde dakikada bir gerçek istekle sınırlandırılmıştır.

İsteği tarayıcı değil, sunucu yapar. openplate.de değerini üretim connect-src kuralına eklemek, yerleştirilmiş bir betiğin BYOK anahtarını dışarı sızdırmasını önleyen izin listesini genişletir. Bu istek gövde, sorgu dizesi, belirteç veya kurulum tanımlayıcısı içermeyen yalın bir GET isteğidir. Her HTTPS isteği gibi sunucunun IP adresini gönderir. Ayrıca openplate/<version> (<platform>; <arch>) biçiminde bir User-Agent iletir, örneğin openplate/1.2.3 (linux; arm64). Başka hiçbir şey taşımaz. Proje, günlük tekil sorgulama adreslerini sayar ve yalnızca günlük toplamları saklar. Standart web sitesi ziyaretlerinde olduğu gibi, vekil sunucu günlükleri IP adreslerini 15 güne kadar tutar. Bkz. ADR-0021.

bash
UPDATE_CHECK=off

Bu ayar kontrolleri tamamen kapatır. Sunucu zamanlayıcı başlatmaz, istek göndermez, kurulumu proje sayımlarının dışında tutar ve About sayfasında kontrollerin kapalı olduğunu belirtir.

Bu denetim yalnızca bildirir. openplate tek bir durumsuz konteynerdir ve kendi kalıbını değiştiremez, bu nedenle yükseltme işlemi her zamanki hâliyle kalır:

bash
docker compose -f compose.yml pull && docker compose -f compose.yml up -d

Uygulamada bir şeyleri gerçekten değiştiren tek düğme, açık olan sayfanın çalıştırdığından daha yeni bir derleme sunucu tarafından sunulmaya başladığında görünen "Güncellemek için yeniden yükle" düğmesidir. Bu, tarayıcıyı sunucudaki varlıklarla yeniden yükler ve ana makinedeki hiçbir şeye dokunmaz.

Kullanıcıları başka bir örneğe taşıma

Bir örneği kapattığında ve kullanıcıları başka bir örneğe geçtiğinde, eski konteyneri tek bir ayarla çalışır durumda tut:

bash
MOVED_TO_URL=https://app.openplate.example

Eski örnekteki her rota artık tek bir bildirim sayfası sunar. openplate uygulamasının artık nerede olduğunu belirtir, oradaki oturum açma sayfasına bir düğme sağlar ve uygulamayı ana ekranına eklemiş kişilere bu simgeyi kaldırıp yeni adresi eklemelerini söyler. Sayfa dilini şu sırayla seçer: kullanıcının kayıtlı tercihi, tarayıcının talep ettiği diller, ardından DEFAULT_UI_LANGUAGE.

Sayfa, kullanıcılara hesaplarının ve günlüklerinin kendileriyle birlikte taşındığını bildirir. Bu modu yalnızca durum buysa etkinleştir: yeni kurulum aynı çekirdek sunucuyu kullanıyordur veya hesapları oraya taşımışsındır. Yalnızca tek bir tarayıcıda depolanan bir günlük, o tarayıcıda eski adres altında kalır; yeni adres onu okuyamaz.

Bir HTTP yönlendirmesi bu taşımayı gerçekleştiremez. Yüklü uygulamaya sahip bir telefon, uygulama sayfalarını önbelleğe alan bir service worker çalıştırır. Tarayıcılar, güncellemeler için bu worker'ı denetlerken yönlendirmeleri izlemez, bu nedenle yüklü bir uygulama kayıtlı kopyasını açmaya devam eder. Bu modda /sw.js, eski adres altındaki tüm önbelleği silen, kendi kaydını silen ve sayfayı yeniden yükleyen küçük bir worker sunar. Ardından bir sonraki istek bildirimi doğrudan sunucudan yükler. Worker, tarayıcıda saklanan günlük verilerine dokunmaz.

API, yanıt gövdesinde yeni adresle birlikte 410 Gone döndürür. /healthcheck eskisi gibi yanıt verir ve web uygulaması bildirimi değişmeden kalır, böylece ana ekran simgesi eski adresi açmaya ve sayfayı yüklemeye devam eder. Bu modu eski adrese gelen trafik kesilene kadar çalışır durumda tut. Değer, kullanıcı adı veya parola içermeyen, APP_URL dışındaki bir ana bilgisayarda bulunan bir https:// adresi olmalıdır; başka herhangi bir şey önyüklemeyi durdurur.

Content-Security-Policy

BYOK görme çağrısı ve anahtar tamamen tarayıcıda yer alır, bu yüzden üretim derlemesi katı bir Content-Security-Policy ile birlikte gelir. Buradaki connect-src şunlara izin verir:

  • 'self'
  • yerleşik sağlayıcıların kendi kaynakları (OpenRouter, Mistral, Anthropic), sağlayıcı kaydından otomatik olarak türetilir: bkz. ADR-0007
  • Herhangi bir bağlantı noktasında localhost ve 127.0.0.1. [::1] listede yoktur, çünkü bir CSP kaynağı IPv6 adresi belirtemez; istemciyi bunun yerine localhost adresine yönlendir.
  • ayarlanmışsa, senin CORE_URL ve DEFAULT_INFERENCE_BASE_URL değerlerin
  • CSP_CONNECT_EXTRA içindeki her şey

Sayfada bulunan bir anahtarın eklenen zararlı bir betik tarafından dışarı sızdırılmasını engelleyen şey bu izin listesidir. Onu genişletirken dikkatli ol.

Yönetilen bir kurulumda yapay zeka vekili, istemcinin zaten konuştuğu çekirdek sunucudur; bu nedenle kaynağı yukarıdaki listede zaten bulunan CORE_URL adresidir. İzin verilecek ikinci bir uzak uç nokta yoktur ve bunun için CSP_CONNECT_EXTRA değerine fazladan bir şey eklenmez.

Analitik

openplate nasıl kullanıldığını sayabilir. Sen yapılandırana kadar hiçbir şey saymaz ve ne yediğini asla saymaz.

Bir örneği kendi çalıştırdığın bir Matomo kurulumuna yönlendirmek için MATOMO_URL ve MATOMO_SITE_ID değerlerini ayarla. İkisini de ayarlanmamış olarak bırakırsan (ki varsayılan budur), örnek hiçbir analiz betiği yüklemez, hiçbir istek göndermez ve analizler var olmadan önce sunduğu Content-Security-Policy başlığının aynısını sunar. Birini ayarlayıp diğerini bırakırsan önyükleme bilerek başarısız olur: analizlerin çalıştığını sanıp aslında çalışmadığı bir durumda olmak, bir işletmen için hata görmekten daha kötüdür.

İzleyici, çerezler devre dışı bırakılmış olarak çalışır. Cihazda hiçbir şey saklamaz, dolayısıyla hazırlanacak bir onay bildirimi yoktur.

Sürüm kontrolü ayrıdır. Hiçbir izleyici ve Matomo kullanmaz. UPDATE_CHECK=off, kontrolü ve projenin günlük istek sayımını durdurur. Bkz. Sürüm denetimi.

Bir düzeyin belirledikleri

MATOMO_EVENT_LEVEL, örneğin ne kadar bildirim yapmasına izin verildiğini belirler. Yalnızca analizler zaten açıkken geçerlidir.

DüzeyNeleri sayar
pageviewsYalnızca sayfa görüntülemeleri. Hiçbir özellik olayı tetiklenmez.
productSayfa görüntülemeleri ve yazılım kullanımı. Varsayılandır.
researchAçlık, kilo, klinisyenle paylaşım ve araştırmaya katılım dahil her şey.

Ayarlanmamış olması product anlamına gelir. Tanınmayan bir değer önyüklemeyi durdurur. Matomo yapılandırılmamış bir örnekte bir düzey ayarlamak da, yarım yapılandırılmış bir ikilinin durdurmasıyla aynı nedenle önyüklemeyi durdurur.

product neleri sayar

Tamamı kişiden ziyade yazılımla ilgili 36 olay.

AlanOlaylar
İlk katılımtamamlandı, adım tamamlandı (odak, kilo, vücut), adım atlandı
Taramabaşarılı oldu, başarısız oldu (sabit bir hata kategorisiyle), hiçbir şey bulunamadı, mod seçildi, paylaşılan bir fotoğraftan başlatıldı
Günlükkaydedildi (girdi yoluyla: arama, manuel, tabak tarama, etiket tarama, çip, günü kopyala, yeniden kaydet, kaydedilmiş öğün), girdi düzenlendi, girdi silindi, girdi geri yüklendi, öğün kaydedildi
Özel yiyeceklerdüzenlendi, silindi
Yapay zeka sağlayıcısıbağlandı (manuel, OAuth, örnek önayarı), anahtar denetimi başarısız oldu, bağlantı kesildi
Tercihlerdeğiştirildi (tema veya dil)
Yedeklemedışa aktarıldı, içe aktarıldı, CSV dışa aktarıldı, fotoğraf önbelleği temizlendi
Hesapoluşturuldu, silindi, parola değiştirildi, parola sıfırlama istendi, parola sıfırlama tamamlandı, kurulum tamamlandı
Davetlerbağlantı yapıştırıldı, katılım tamamlandı
Uygulama yüklemeyükleme istemi gösterildi, yüklendi, çevrimdışı sayfa görüntüleme
Açılış sayfasıbültene abone olundu, harekete geçirici mesaja tıklandı

research ne ekler

12 olay daha. Her biri bir kişinin sağlığı veya bir araştırmaya katılımı hakkında bilgi verir, bu yüzden sen açıkça istemedikçe kapalıdırlar.

AlanOlaylar
Açlıkaçlık başladı (şimdi veya planlanmış), açlık bitti
Hedefler ve kilohedefler kaydedildi (hedefler veya vücut ölçüleri), kilo kaydedildi
Klinisyenle paylaşımpaylaşım izni verildi, iptal edildi, anahtar yenilendi, kimlik oluşturuldu, paylaşılan günlük açıldı
Bilimsel araştırmalarkaydolundu, çekilindi, katkı gönderildi

Bunlar değer taşımaz. Bir açlık olayı süresini taşımaz, bir kilo olayı da kilo değerini taşımaz. Ancak her analitik olayında olduğu gibi olaylar zaman damgalıdır, dolayısıyla bir başlangıç ve bir bitiş çıkarılarak bir süre elde edilir ve bir paylaşım olayı kişinin bir klinisyeni olduğunu söyler. Araştırma katılımı GDPR Madde 9 kapsamında özel nitelikli veridir.

Bu seviyenin var olma sebebi tamamen budur. Kendi örneğinde araştırma yürüten bir araştırmacı bu sayılara ihtiyaç duyar ve bunları rıza gösteren katılımcılardan yasal olarak toplayabilir. Genel amaçlı bir örnek bunları toplamamalıdır ve varsayılan olarak da toplamaz.

Eğer research seçeneğini açarsan, bunu kendi gizlilik politikanda belirt. openplate'in politikası senin örneklerini değil, openplate'in barındırılan örneklerini açıklar.

Hiçbir seviyede asla sayılmayanlar

  • Bir günlükten gelen herhangi bir şey. Yemek adı yok, kilo yok, hedef yok, fotoğraf yok, öğün saati yok, araştırma kimliği yok.
  • Bir kişiden ölçülen herhangi bir sayı. Olaylar sabit bir etiket taşır ya da hiçbir şey taşımaz.
  • Herhangi bir tanımlayıcı. Hesap kimliği yok, e-posta adresi yok, cihaz kimliği yok.
  • Bir sayfa görüntülemesi bildirilmeden önce tamamen atılan sorgu dizgileri ve URL parçaları. openplate tek kullanımlık belirteçleri buraya koyar.
  • Bir yoldaki tanımlayıcılar. Sayfa görüntülemesi bildirilmeden önce /diary/entry/<id> ve /shared/<account id> bir yer tutucuyla değiştirilir.

Kurallar incelemelerle değil, türlerle uygulanır. app/lib/matomo-events.ts içindeki her olay işlevi ya hiçbir şey almaz ya da sabit bir listeden tek bir değer alır, bu nedenle derleme hatası olmadan bir yemek adı iletilemez. tests/unit/no-telemetry-wiring.test.ts, başka bir dosya doğrudan izleyiciye erişirse veya kaynağa bir Matomo sunucusu ya da site kimliği yazılmışsa derlemeyi başarısız kılar; bu da kendi sunucunda barındırdığın bir örneğin başkasının hesabına rapor göndermesine neden olacak şeydir.

Karar ve gerekçesi için ADR-0010 belgesine bak.

Yönetilen örnekler

INSTANCE_MODE=managed değişkenini ayarlayan bir örnek bir yönetilen örnek örneğidir: yönetici kişileri e-posta ile davet eder ve her hesap günlük bir AI kotası taşır, böylece oturum açmak kişiye tek adımda hem günlüğü hem de AI özelliğini sağlar. beta.openplate.de ve app.openplate.de adresindeki barındırılan örnekler bu modu kullanır. Varsayılan olarak kapalıdır: hiçbir şey ayarlamayan bir self-hoster açık uygulamayı edinir.

INSTANCE_MODE=managed, CORE_URL gerektirir. Günlük ile kotayı bir arada taşıyan şey hesaptır; bir çekirdek sunucu olmadan managed tanımlamak, herhangi bir şeyi yarım yamalak etkinleştirmek yerine önyüklemeyi durdurur.

Bir yönetici, insanları uygulamanın kendisinden, /admin adresinden veya openplate-core'un yönetici API'si ve ADMIN_TOKEN ile davet eder. Herhangi bir yönetici var olmadan önceki ilk hesap bu API'den gelir. Komut self-hosting.md içinde yer alır. Çekirdek sunucuda e-posta yapılandırıldığında davet e-posta ile gönderilir. E-posta yapılandırılmadığında yanıt bağlantıyı taşır ve sen iletirsin. Unutulan bir parola bir bağlantıyla sıfırlanır. Bu bağlantı e-postayla gönderilir veya e-posta yoksa bir yönetici tarafından oluşturulur (bkz. self-hosting.md). Sunucu, sıfırlamadan sonra veri anahtarını açan emanet edilmiş bir kurtarma kodu tutar (bkz. sync.md).

Yapay zekaya sahip yönetilen bir kurulum için çekirdek sunucuda da üç değer gerekir: UPSTREAM_BASE_URL ve UPSTREAM_API_KEY (sağlayıcı ve anahtarı) ile bir model. Model, her taramanın kullandığı model olan AI_ADVERTISED_MODEL değeridir. Ya da AI_TIERS_FILE=bundled ayarını yaparsan model, modeli, yönlendirmesini ve fiyatını incelenmiş tek bir yerde tutan çekirdeğin aşama dosyasından (ai-tiers.json) gelir (bağladığın bir dosyanın yolu da geçerlidir; bkz. yapay zeka vekili). Taramalar için bir model gereklidir. Biri tanımlanmadığında çekirdek sunucu model olmadığını bildirir ve uygulama, faturana yansıyacak bir modeli rastgele seçmek yerine tarama yapmayı reddeder. Modeli sağlayıcının adlandırdığı gibi adlandır; örneğin UPSTREAM_BASE_URL=https://openrouter.ai/api/v1 ile vendor/model-name veya openplate-inference önünde openplate-plate-1. Bir aşama dosyası varken AI_ADVERTISED_MODEL, yalnızca varsayılan aşamanın modelini acil durumlarda geçersiz kılmak için kalır ve çekirdek her başlangıçta bir uyarı günlüğü düşer. Ardından her hesabın 0'dan başlayan günlük bir kotaya ihtiyacı olur. Davetiyeyi oluştururken bunu "dailyAiLimit" ile ver veya daha sonra /admin içinden ayarla.

Ayarlandığında ne değişir:

  • /welcome tam olarak iki eylem sunar: Oturum aç ve Davet bağlantım var (yapıştırılan bir bağlantıyı alır ve /join adresine iletir). "Başla" yoktur.
  • Ne yerel günlüğü ne de hesabı olan bir cihaz için /onboarding, /welcome adresine yönlendirir. Anonim ve yalnızca yerel olan yol yalnızca gizlenmekle kalmaz, tamamen kapatılır: yönetilen bir kurulumda bu yol hiçbir yere çıkmaz, çünkü hesap olmadan yapay zeka olmaz ve cihazın ötesinde varlığını koruyan bir günlük de bulunmaz. Halihazırda bir günlük barındıran bir cihaz ise asla dışarı atılmaz.
  • /join tek bir prosedür yürütür: davet, doğrudan kaydolma isteğiyle tek bir işlemde kullanılır ve hesap bu andan itibaren hem günlüğü hem de kotayı taşır. "Atla, zaten bir hesabım var" eylemi kaldırılmıştır, çünkü böyle bir kurulumda kendisine bu seçenek sunulan kişide ikisi de yoktur.
  • Oturum kapalıyken Ayarlar → Hesap, giriş yapmayı önerir ve buradaki hesapların bir davet bağlantısıyla açıldığını belirtir. "Hesap oluştur" düğmesi yoktur.

Yukarıdakilerin tümü açık bir kurulumda (INSTANCE_MODE ayarlanmamışsa veya open) değişmeden kalır ve bir test her iki varyantı yan yana sabitler.

Üye davetleri

Yönetilen bir kurulumda davet edebilen tek kişi yönetici değildir. openplate-core'un üç değişkeni, sıradan bir üyenin birini davet edip edemeyeceğini ve hangi şartlarda davet edebileceğini belirler. Bunlar uygulamada değil, çekirdek sunucuda ayarlanır. compose.core.yml ve compose.full.yml, her üçünü de .env üzerinden çekirdek sunucuya iletir.

DeğişkenVarsayılanAçıklama
MEMBER_INVITE_DAILY_AI_LIMITayarlanmamış (davetler kapalı)Davet edilen hesabın UTC günü başına kaç yapay zeka isteği alacağı. Bunu ve MEMBER_INVITE_ALLOWANCE_DAYS değişkenini birlikte ayarla ya da hiçbirini ayarlama.
MEMBER_INVITE_ALLOWANCE_DAYSayarlanmamış (davetler kapalı)Bu kotanın kaydolduktan sonra kaç gün geçerli olacağı. Bunu ve MEMBER_INVITE_DAILY_AI_LIMIT değişkenini birlikte ayarla ya da hiçbirini ayarlama.
MEMBER_INVITE_LIFETIME_CAP5Bir üyenin toplamda en fazla kaç davet gönderebileceği. 0 veya daha büyük bir tam sayıdır. Yukarıdaki ikisinin ayarlanmış olmasını gerektirir.

İlk ikisi ya birlikte kullanılır ya da hiç kullanılmaz. Yalnızca birini ayarlamak başlatmayı durdurur ve dışarıda bıraktığın değişkenin adını verir. Varsayılan durum olan ikisi de ayarlanmadığında, üyeler kimseyi davet edemez ve POST /v1/auth/invites herkese 404 yanıtı verir. Bu durumda her daveti kendin üretirsin.

Bir davetin sağladığı şey deneme süresidir. Davet edilen kişi kendi hesabını ve kendi günlüğünü alır, ayrıca kaydolduktan sonra MEMBER_INVITE_ALLOWANCE_DAYS gün boyunca günde MEMBER_INVITE_DAILY_AI_LIMIT yapay zeka isteği elde eder. Bu süre dolduğunda, yapay zeka vekili 403 yanıtı verir. Günlükleri çalışmaya devam eder. Eşitleme hiçbir zaman bir kotaya bağlanmaz. Davet eden kişi bunların hiçbirini seçemez. Yalnızca bir adres gönderir, başka bir şey değil.

Sınır başarılı olanları değil, gönderilen mektupları sayar. Bir daveti geri çekmek onu iade etmez. Sayım kurulum başına değil, hesap başınadır. MEMBER_INVITE_LIFETIME_CAP=0, rotayı tanımlı bırakır ancak her üyeye harcayacak hiçbir şey vermez. Bu, ikiliyi ayarlamayıp rotayı tamamen kaldırmaktan farklıdır. Sınırı AI_INSTANCE_DAILY_LIMIT ile birlikte oku. Yukarıdaki günlük kota, sağlayıcı faturana ulaşmadan önce kurulumdaki her bir üye ve bu sınır ile çarpılır.

Yöneticiler muaftır. Sınır onlar için geçerli değildir, ayrıca bir üye davetini zaten harcamış bir adrese ikincisinin verilemeyeceği kuralı da geçerli sayılmaz. /admin üzerinden diledikleri sıklıkta davet gönderirler.

Bir üye, kaç davetinin kaldığını uygulamada görür. Bu bilgi Ayarlar, Hesap içinde, Birini davet et altındadır. Bu bölüm yalnızca özelliğin açık olduğu bir kurulumda görünür.

Özel yapay zeka uç noktaları

openplate-inference, açık ağırlıklı modellerle kendi donanımında çalıştırdığın, böylece kimsenin bir bulut yapay zeka anahtarına ihtiyaç duymadığı, kendi barındırdığın OpenAI uyumlu bir tabak fotoğrafı uç noktasıdır. O, Ollama, vLLM, LM Studio veya OpenAI chat-completions protokolünü konuşan diğer her şey aynı şekilde bağlanır: Ayarlar → Yapay Zeka içinde bir openai-compatible sağlayıcısı ekle ve ona temel URL adresini ver.

  • Aynı makinede yerel bir uç nokta (http://localhost:11434/v1 ve benzerleri) yapılandırma gerektirmez: geri döngü istisnası bunu zaten kapsar.
  • Uzak bir uç nokta (yerel ağındaki başka bir makine veya barındırdığın bir çıkarım sunucusu) varsayılan olarak CSP tarafından engellenir. Kaynağını ekle ve uygulamayı yeniden başlat:
    bash
    echo "CSP_CONNECT_EXTRA=https://ai.example.com" >> .env
    docker compose -f compose.yml up -d
  • api.openai.com bir tarayıcıdan hiçbir zaman erişilebilir değildir: OpenAI API'si kaynaklar arası istekleri engeller. CSP_CONNECT_EXTRA değerine bakılmaksızın, OpenAI modellerini bunun yerine OpenRouter üzerinden yönlendir.

Örnek tarafından sağlanan yapay zeka

Bir kurulum, her ziyaretçiden kendi anahtarını getirmesini istemek yerine kendi uç noktasını sunabilir.

DEFAULT_INFERENCE_API_KEY değerini ayarlamadan önce, herkese açık olduğunu bil: sayfa HTML'ine gömülüdür ve uygulamayı açabilen herkes tarafından view-source ile okunabilir. Kuralın tamamı aşağıdaki ikinci maddededir. Önce onu oku.

DEFAULT_INFERENCE_BASE_URL değerini (ayrıca DEFAULT_INFERENCE_MODEL ve uç nokta ihtiyaç duyuyorsa DEFAULT_INFERENCE_API_KEY değerini) ayarla; AI ayarları sayfası ve tarama ekranına tek dokunuşluk bir "bu openplate kendi yapay zekasını sağlar" bağlantısı eklenir. Boş bırakırsan tek yol kendi anahtarını getirmektir, fazladan hiçbir şey oluşturulmaz ve tarayıcıya fazladan hiçbir şey gönderilmez.

Üç kural:

  • Bir TARAYICININ erişebileceği bir adres olmalıdır. Fotoğraf openplate sunucusundan asla geçmeyip doğrudan cihazdan uç noktaya gittiği için http://openplate-inference:8080/v1 gibi bir compose ana makine adı çalışmaz. Uç noktayı yayımla veya ters proxy'nin arkasına koy. Kaynağı senin yerine CSP'ye eklenir.
  • DEFAULT_INFERENCE_MODEL, uç noktanın gerçekten sunduğu bir modeli belirtmelidir. Varsayılan değer olan openplate-plate-1, openplate-inference tarafından sunulan kimliktir ve olduğu gibi gönderilir. Temel URL'yi bunun yerine Ollama, vLLM veya LM Studio'ya yönlendirirsen, bunu o çalışma zamanının sunduğu kendi adına ayarlamalısın, aksi takdirde tüm istekler başarısız olur.
  • DEFAULT_INFERENCE_API_KEY herkese açıktır. Sunucuda tutulmaz: sayfa HTML'ine gömülüdür ve uygulamayı açabilen herkes tarafından view-source ile okunabilir. Yalnızca ev halkının veya tailnet ağının erişebildiği bir uç nokta için bu bir sorun teşkil etmez. Kullanıma göre ücretlendirilen bir bulut sağlayıcı anahtarı için okumaz uygundur, önünde bir VPN, tailnet veya kimlik doğrulama proxy'si olmadan açık internete sunulan bir örnekte ise uygun değildir. Uç noktan anahtara ihtiyaç duymuyorsa boş bırak.

Hatalı biçimlendirilmiş bir DEFAULT_INFERENCE_BASE_URL, bilerek başlatmayı başarısız kılar, böylece bir yazım hatası "düğme hiç görünmedi" gibi duramaz.

Bu örnek ön ayarı (connectedVia: 'preset'), bu örneğin kendi işletmecisi tarafından her ziyaretçi için ayarlanır. connectedVia: 'invite' ise ilişkili, artık eskiyen bir değerdir: M192 sürümünde kullanımdan kaldırılan eski openplate-gateway davet akışı tarafından dağıtılan bir AI ayarları satırını işaret ediyordu. Yönetilen bir örnek artık bu satırı hiç yazmaz: kota doğrudan hesabın kendisinde taşınır ve AI proxy'sine ayrı bir ayar girdisiyle değil, CORE_URL üzerinden erişilir.

OpenRouter ile bağlanma

Ayarlar → AI → OpenRouter ile bağlan, tek tıkla çalışan ve yalnızca tarayıcıda işleyen bir OAuth akışıdır (PKCE); kopyalayıp yapıştırılacak bir anahtar yoktur. Bu sekmeyi OpenRouter'ın onay ekranına götürüp geri getirir; onayladığında, verilen anahtar doğrudan bu tarayıcının yerel depolama alanına kaydedilir. openplate sunucusu bu döngüye asla dahil olmaz; anahtarı hiçbir zaman görmez, depolamaz veya vekil olarak iletmez.

  • Oradayken bir harcama limiti belirle. OpenRouter onay ekranı, hesap seçicinin yanında isteğe bağlı ve sıfırlama aralığı olan bir kredi limiti belirleme seçeneği sunar. Bağlanan anahtarın harcayabileceği tutarı, openplate'in yaptıklarından bağımsız olarak sınırlandırır.
  • Varsayılan model: google/gemini-3.5-flash-lite, ücretli bir model, tarama başına yaklaşık Tarama başına $0.001. Herhangi bir :free modele tercih edilme sebebi, OpenRouter'ın :free uç noktalarının yalnızca sağlayıcının hesap düzeyindeki "istek verileri üzerinde eğitilebilir" / "istemler yayımlanabilir" seçeneklerini etkinleştirdikten sonra erişilebilir hale gelmesi ve bazı ücretsiz görüntü modellerinin istemleri haftalarca saklamasıdır. Yine de model listesinden kendin bir :free model seçebilirsin, bu açıkça belirtilmiş bir tercihtir.
  • "Bir API anahtarını elle yapıştır" paneli üzerinden OpenRouter dahil Elle anahtar girişi her sağlayıcı için çalışır.
  • Bağlanan anahtar OpenRouter anahtar ayarları sayfanda "Bir uygulama" etiketiyle görünür. openplate üzerinden bağlantıyı kesmek, anahtarı yalnızca o cihazdan temizler: anahtarı OpenRouter tarafında okumaz iptal eder. Anahtarı o sayfadan kendin iptal et.
  • Diğer tüm anahtarlarla aynı güvence: yalnızca cihazın yerel depolama alanında saklanır, JSON yedekleme/dışa aktarma işlemlerine dahil edilmez, openplate sunucusuna asla gönderilmez.

Herhangi bir güvenli kaynaktan çalışır. OAuth geri çağırma URL'si istek anında window.location.origin üzerinden türetilir. Asla koda gömülmez ve OpenRouter'a önceden kaydedilmez. Düğme, http://localhost:3000 üzerinde veya kendi https:// alan adında değişiklik yapmadan çalışır. Düz bir http:// LAN adresinde başarısız olur, çünkü tek kullanımlık kodunu tarayıcıların orada devre dışı bıraktığı Web Crypto API ile özetler. Bunun yerine elle bir anahtar yapıştır veya self-hosting.md bölümüne bak.

İstek URL'lerini günlüğe kaydeden bir ters proxy arkasında kendi sunucunu barındırıyorsan dikkat etmen gereken bir nokta: geri çağırma URL'si (tek kullanımlık state parametresi dahil), diğer tüm URL'ler gibi erişim günlüklerinde görünecektir. Bu bir sır değildir (bunu bilmek kimseye başkasının anahtarına erişim sağlamaz), ancak günlük saklama süren bir endişe kaynağıysa bu kaydı temizle.

Bu sayfayı GitHub üzerinde düzenle