Napravljeno u EU i gdje se nalaze vaši podaci
Gdje se Nessie razvija, gdje se čuvaju vaši podaci i šta kontrolišete kada ga sami hostirate.
Ko ga gradi i po kojem pravu
Nessie gradi UnlikeOtherAI s.r.o., društvo registrovano u Češkoj Republici koje posluje po češkom pravu.
Ova stranica opisuje kako je softver izgrađen i gdje radi. Ona nije izjava o usklađenosti: Nessie nema nijedan sigurnosni certifikat i ništa ovdje ne treba tumačiti kao takav. Koji se lični podaci obrađuju i na kojoj osnovi, predmet je politike privatnosti, koja je zasebna stranica.
Gdje radi hostirani proizvod
Nessie Cloud radi na evropskim hosting pružateljima — Scaleway, Hetzner i drugima. Biramo najbolju uslugu koju svaki pružatelj nudi, pa različiti dijelovi proizvoda mogu raditi kod različitih pružatelja, svi u Evropi.
Sve preciznije od toga — konkretna lokacija, grad ili podatkovni centar — namjerno se ovdje ne navodi, jer bi zastarjelo a da to niko ne primijeti.
Samostalnim hostiranjem izbor je u vašim rukama
Gdje radi samostalno hostirana instanca jeste postavka implementacije, a ne postavka proizvoda. Put s jednim računarom jeste Docker Compose stack koji postavljate na računar koji sami odaberete. U Terraform strukturi za upravljani oblak regija je ulazni parametar bez ikakve zadane vrijednosti: ništa se tu ne može pogađati, pa zato ništa tu nema zadanu vrijednost, a baza podataka, spremnik objektne pohrane i servisi prate regiju koju navedete.
Za isto pitanje važna su još dva strukturna detalja. Red čekanja i transport u realnom vremenu oba su PostgreSQL — na putu nema Redisa ni posrednika poruka, pa nema ni trećeg sistema koji bi trebalo smjestiti. A objektna pohrana kompatibilna je sa S3 umjesto da bude vezana za jednog dobavljača; referentna implementacija pokreće MinIO u kontejneru na privatnoj mreži bez vlastitog ulaza. Dijelovi koji moraju negdje živjeti jesu baza podataka, objektna pohrana i dva Node servisa, i svi oni žive tamo gdje ih vi postavite. Kako to podići, objašnjeno je na stranici s uputama za instalaciju.
Šta Nessie čuva — i šta namjerno ne čuva
Identitet se ne kopira
Uz prijavu putem UnlikeOtherAI, identitet osoba vodi i pohranjuje pružatelj identiteta — faktore autentifikacije, profile, članstvo u organizaciji i timu te pozivnice. Nessie je pouzdana strana (relying party), a ne drugi sistem identiteta. To je podjednako odluka o podacima i arhitektonska odluka: identitet koji Nessie nikad ne pohranjuje jeste identitet koji ne može procuriti, izgubiti se ili ostati neobrisan.
Tabela users zapravo čuva stabilni identifikator korisnika kod pružatelja — ključ preko kojeg se razrješava sve ostalo — e-mail adresu, neautoritativnu kopiju prikazanog imena i avatara te polja lokalna za proizvod (postavke, zamjenice, verziju tokena kojom se opozivaju sesije). Kopija postoji samo zato da se ime i slika mogu prikazati bez zahtjeva za svaki red, a ponovo se usklađuje iz provjerenih tvrdnji pružatelja pri prijavi, pri promjeni tima i pri osvježavanju sesije. Ništa ne izmišlja vrijednost: osoba koju pružatelj nije imenovao nosi svoju e-mail adresu dok to ne učini. Hash lozinke postoji samo za početnog vlasnika instalacije koja uopće nema pružatelja identiteta.
Isto vrijedi i za strukturu. Jedna organizacija kod pružatelja jeste jedna Nessie organizacija, povezana id-om organizacije kod pružatelja; tim bez veze prema pružatelju odgovara s 404 TEAM_NOT_LINKED umjesto da se vrati na lokalno nagađanje, a čitanje aktuelnog spiska članova ide pružatelju identiteta i ništa ne pohranjuje.
Dvije kopije još nisu uklonjene i bilo bi nepošteno praviti se da jesu. Nazivi organizacija i timova još se pohranjuju lokalno uz id-ove veza, a lokalni redovi članstva još uvijek odobravaju obične zahtjeve između sinhronizacija. Uklanjanje oba jeste otvoren, praćen posao u repozitoriju, a ne nešto što je već završeno.
Ništa komercijalno
Plaćanja vodi centralni servis za naplatu. Nessie ne pohranjuje klijenta, pretplatu, fakturu, cijenu, stanje kredita, pravilo dopune, saglasnost za plaćanje, izvod ni stanje otkazivanja kod pružatelja plaćanja, i ne izračunava tarife. Čita vrijednosti spremne za prikaz i prikazuje ih.
Tajne
Za pohranu bilo koje tajne obavezan je konfigurisani trezor. Namjerno nema rezerve u bazi podataka ni puta s golim tekstom: bez trezora spremanje, rotiranje i opoziv tajne vraćaju grešku umjesto da se spuste na nešto manje sigurno. Nessiejevi vlastiti zapisi o tajni ne sadrže vrijednost, šifrat, ključ ni token trezora — samo neprozirnu referencu i njene metapodatke — a putanje u trezoru grade se isključivo od strukturnih identifikatora, nikad od naziva organizacije, tima, projekta ili imena osobe.
Vjerodajnice koje Nessie mora sam držati da bi djelovao kao OAuth klijent — vjerodajnice konektora i poštanskih sandučića, tajne webhookova, materijal za osvježavanje sesija, sadržaj izvršitelja — zapečaćene su u AES-256-GCM omotnicama vezanim za svrhu, pod verzioniranim prstenom ključeva koji je zaseban korijen u odnosu na tajnu za potpisivanje sesija, uz dokumentiran postupak rotacije.
Postoji i pravilo o modelima: može se znati da tajna postoji i može biti odobrena za upotrebu, ali materijal tajne ne smije ući u kontekst modela, upite, argumente alata, rezultate alata, memoriju, ugradnje (embeddings), pretragu, zapisnike ni poruke. Agentu se može dati mogućnost da tajnu koristi. Nikad mu se ne može dati mogućnost da je otkrije.
Jesu li osnovni diskovi šifrirani, svojstvo je računara na kojem implementacija radi. Repozitorij ne utvrđuje šifriranje na nivou volumena za volumene baze podataka i objektne pohrane, pa ga ova stranica ne tvrdi.
Izolacija tenanata
Nessie je po dizajnu višetenantan (multi-tenant): jedna baza podataka u kojoj svaki red pripada tačno jednoj organizaciji i svaka podređena tabela ima kolonu organization_id. Izolacija se provodi na dva mjesta — u klauzuli opsega koju nosi svaki upit i u stvarnim stranim ključevima na toj koloni, koji su dodani kroz četrdeset i dva ograničenja nakon što je interna revizija utvrdila da kolona postoji, ali nije ograničena, na desetinama tabela.
Paket testova usklađenosti drži tu invarijantu na mjestu na HTTP granici. On postavlja maksimalno privilegiranog napadača — punog vlasnika vlastite organizacije — i provjerava da svako kanonsko čitanje resursa druge organizacije vraća 403, 404 ili prazan rezultat, a da se svaka kanonska izmjena odbija bez diranja reda druge organizacije. Obuhvata kanale, odobrenja, zapisnik revizije, okidače, agente i njihove veze, pokretanja, projekte, zadatke, niti, veze, instalacije tokova rada, MCP instance, bazu znanja i upozorenja.
Da budemo precizni o mehanizmu: riječ je o provedbi na nivou aplikacije plus stranim ključevima, a ne o sigurnosti na nivou reda (row-level security) u PostgreSQL-u. Nema RLS politike ni zaštite na strani baze podataka, a paket testova usklađenosti radi nad vjernim memorijskim spremištem, a ne nad živom bazom, pa dokazuje klauzule opsega koje kôd piše, a ne SQL koji server izvršava. Repozitorij to navodi u dokumentaciji samog paketa testova, a navodi to i ova stranica.
Revizorski trag
Bilježi se svaka značajna radnja: ko je djelovao i u kojoj ulozi — osoba, agent, servis — šta je uradio, nad kojim resursom, u kojoj organizaciji, projektu, timu ili kanalu, je li uspjelo ili je odbijeno, zašto, te id zahtjeva, adresa i korisnički agent s kojima je stigao.
Zapisnik je po dizajnu samo za dodavanje i izvana se u njega ne može pisati: POST /api/audit-log ne postoji, i to je namjerno. Unosi su ulančani — svaki nosi SHA-256 sažetak vlastitih kanonskih polja plus sažetak prethodnog unosa za tu organizaciju — pa izmijenjen ili uklonjen red prekida lanac i to se može otkriti. Vlasnik ili admin organizacije može po potrebi proći kroz taj lanac i dobiti informaciju gdje se prvi put prekinuo, ako jest.
Dvije iskrene napomene. Lanac čini zapisnik vidljivim u slučaju neovlaštene izmjene, a ne imunim na njih: iza njega nema opoziva prava pisanja na nivou baze podataka ni pohrane koja se može upisati samo jednom, pa je garancija otkrivanje, a ne sprečavanje. I unosi se po zadanim postavkama čuvaju neograničeno — podesivo čuvanje s izvozom prije brisanja je osmišljeno, a nije izgrađeno. Unosima je također zabranjeno da nose tajne ili cijela tijela zahtjeva, a fiksni skup naziva osjetljivih polja metapodataka prikriva se pri upisu.
Knjiga troškova
Svako pozivanje modela bilježi se na organizaciju, kao i na korisnika, tim, projekt, kanal, agenta i pokretanje iz kojeg je potekao, uz utrošene tokene, a trošak koji je prijavio pružatelj i Nessiejeva vlastita procjena čuvaju se jedno uz drugo. Metrika koju pružatelj ne prijavi pohranjuje se kao null umjesto da se pogađa. Izvještaje može čitati vlasnik ili admin organizacije.
Ova knjiga je operativna telemetrija — šta je organizacija potrošila i u čije ime. Nije faktura niti mjerodavna evidencija naplate.
Treće strane kada koristite hostirani proizvod
Hostirana implementacija komunicira s malim, fiksnim skupom servisa. Saobraćaj prema modelima i web pretraga ne idu direktno pružateljima: oboje izlazi kroz jedan pristupnik kojim upravlja UnlikeOtherAI, a iza njega stoje pružatelji modela i pretrage. Prijava i naplata idu autentifikatoru kompanije UnlikeOtherAI. Trezor tajni hostira se samostalno uz aplikaciju. Veze za video pozive koje generira server po zadanim postavkama vode na javni Jitsi servis.
Gotovo sve ostalo isključeno je dok ga operator ne konfiguriše i to jasno kaže umjesto da tiho ne uspije: povezani Google, Microsoft i Slack nalozi; e-mail agenata preko Amazon SES-a, koji implementacija vodi u vlastitom nalogu bez posrednika; push obavještenja za mobilne uređaje i preglednik; konektori za istraživanja i izvore ploča; oblačni preglednici. Dva detalja vrijedi navesti jer mijenjaju kuda podaci idu:
- Povezani poštanski sandučići ostaju kod vašeg pružatelja. Pošta se čita uživo od vašeg pružatelja, preko IMAP-a i SMTP-a ili preko vlastite prijave pružatelja; Nessie pohranjuje zapečaćenu vjerodajnicu i ništa drugo o nalogu. Izuzetak je sandučić koji povežete sa sandučićem Klijenata: tražite da se njegovi razgovori čuvaju uz svakog kupca, pa se kopiraju.
- Glasovni pozivi u aplikaciji ne prolaze kroz Nessie. API posreduje vjerodajnicu, a klijent sam otvara audio vezu. Diktiranje i telefonski pozivi su drugačiji: njihov zvuk prolazi kroz Nessie do pružatelja govora i modela koji ga obrađuju.
Jedan detalj o inferenciji slijedi isti princip: potpisana zaglavlja s identitetom pozivatelja šalju se samo konfigurisanom chat hostu, pa usmjeravanje ugrađivanja (embeddings) na drugu krajnju tačku toj krajnjoj tački nikad ne daje tvrdnju o delegiranju za osobu čiji se tekst ugrađuje.
Hostirani proizvod koristi nekoliko pružatelja inferencije i bira među njima prema cijeni i kvaliteti. Organizacija će u Adminu moći izabrati koje pružatelje njeni agenti smiju koristiti: samo zapadne, samo evropske, samo kineske ili bez preference — najefikasnijeg pružatelja za svaki posao. Samostalno hostirana instanca bira vlastite.
Samostalno pokretanje mijenja sve ovo
Svaka treća strana navedena gore jeste izbor konfiguracije na samostalno hostiranoj instanci. Inferencija se može usmjeriti na bilo koju krajnju tačku kompatibilnu s OpenAI-jem, uključujući onaj na vašem vlastitom hardveru. Konektori su isključeni ako ih ne uključite. Prijava putem UnlikeOtherAI je podržani put, a implementacija bez pružatelja identiteta radi kao jedna nevezana organizacija s početnim vlasnikom.
To je cijela svrha takvog aranžmana: softver je isti, a odluke o tome gdje radi i čemu smije pristupiti pripadaju onome ko ga pokreće. Kako, objašnjava stranica s uputama za instalaciju.