Izrađeno u EU-u i gdje žive vaši podaci
Gdje se Nessie izrađuje, gdje su vaši podaci i što kontrolirate kada ga sami pokrećete na vlastitoj infrastrukturi.
Tko ga gradi i po kojem pravu
Nessie gradi tvrtka UnlikeOtherAI s.r.o., registrirana u Češkoj i poslujuća prema češkom pravu.
Ova stranica opisuje kako je softver izgrađen i gdje radi. Nije izjava o sukladnosti: Nessie nema nijednu sigurnosnu certifikaciju i ništa se ovdje ne smije tumačiti kao da je ima. Koji se osobni podaci obrađuju i na kojoj osnovi tema je politike privatnosti, koja je zasebna stranica.
Gdje radi hostirani proizvod
Nessie Cloud radi kod europskih pružatelja hostinga — Scaleway, Hetzner i drugih. Od svakog pružatelja biramo najbolju uslugu koju nudi, pa različiti dijelovi proizvoda mogu raditi kod različitih pružatelja, i to svi u Europi.
Sve preciznije od toga — određena lokacija, grad ili podatkovni centar — ovdje se namjerno ne navodi, jer bi zastarjelo a da nitko ne primijeti.
Uz vlastiti hosting izbor je u vašim rukama
Gdje radi instanca koju sami hostirate postavka je implementacije, a ne postavka proizvoda. Put s jednim strojem je Docker Compose stog koji postavljate na stroj po vlastitom izboru. U Terraform stablu za upravljani oblak regija je ulazni parametar bez ikakve zadane vrijednosti: ništa se tu ne može pogađati, pa ništa tu nema zadanu vrijednost, a baza podataka, spremnik objektne pohrane i servisi slijede regiju koju navedete.
Za isto pitanje važna su još dva strukturna detalja. Red čekanja i prijenos u stvarnom vremenu oba su PostgreSQL — na putu nema Redisa ni brokera poruka, pa nema ni trećeg sustava koji bi trebalo smjestiti. A objektna pohrana kompatibilna je sa S3-om i nije vezana uz jednog dobavljača; referentna implementacija pokreće MinIO u kontejneru na privatnoj mreži bez vlastitog ulaza izvana. Dijelovi koji moraju negdje živjeti su baza podataka, objektna pohrana i dva Node servisa, a svi žive tamo gdje ih vi postavite. Kako to postaviti opisano je na stranici s uputama za instalaciju.
Što Nessie čuva — a što namjerno ne čuva
Identitet se ne kopira
Uz prijavu putem UnlikeOtherAI davatelj identiteta upravlja ljudskim identitetom i pohranjuje ga — čimbenike autentikacije, profile, članstvo u organizaciji i timu te pozivnice. Nessie je pouzdajuća strana (relying party), a ne drugi sustav identiteta. To je podjednako odluka o podacima i o arhitekturi: identitet koji Nessie nikad ne pohranjuje ne može procuriti, izgubiti se niti ostati neizbrisan.
Tablica users zapravo čuva stabilan korisnički identifikator davatelja — ključ preko kojeg se razrješava sve ostalo — adresu e-pošte, 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 redak, a ponovno se usklađuje s provjerenim tvrdnjama davatelja pri prijavi, pri promjeni tima i pri osvježavanju sesije. Ništa ne izmišlja vrijednost: osoba koju davatelj nije imenovao nosi svoju adresu e-pošte dok se to ne promijeni. Hash lozinke postoji samo za početnog vlasnika instalacije koja uopće nema davatelja identiteta.
Isto vrijedi i za strukturu. Jedna organizacija kod davatelja jest jedna organizacija u Nessieju, povezana ID-jem organizacije kod davatelja; tim bez poveznice na izvor odgovara s 404 TEAM_NOT_LINKED umjesto da se vrati na lokalno nagađanje, a čitanje popisa članova uživo ide davatelju identiteta i ništa ne pohranjuje.
Dvije kopije još nisu uklonjene i bilo bi nepošteno sugerirati suprotno. Nazivi organizacija i timova još se lokalno pohranjuju uz ID-jeve veze, a lokalni zapisi o članstvu još uvijek autoriziraju uobičajene zahtjeve između sinkronizacija. Uklanjanje obiju stavki vodi se kao otvoren posao u repozitoriju, a ne kao nešto već dovršeno.
Ništa komercijalno
Plaćanjima upravlja središnji servis za naplatu. Nessie ne pohranjuje klijenta, pretplatu, račun, cijenu, stanje kredita, pravilo dopune, privolu za plaćanje, izvadak 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 potreban je konfiguriran trezor. Namjerno ne postoji rezerva u bazi podataka niti put s nešifriranim tekstom: bez trezora spremanje, rotacija i opoziv tajne vraćaju pogrešku umjesto da se spuste na manje sigurno rješenje. Nessiejevi vlastiti zapisi o tajni ne sadrže vrijednost, šifrirani tekst, ključ ni token trezora — samo neprozirnu referencu i njezine metapodatke — a putevi u trezoru grade se isključivo od strukturnih identifikatora, nikad od naziva organizacije, tima, projekta ili imena osobe.
Vjerodajnice koje Nessie mora sam čuvati da bi djelovao kao OAuth klijent — vjerodajnice konektora i poštanskih sandučića, tajne webhookova, materijal za osvježavanje sesije, sadržaj executora — zapečaćene su u AES-256-GCM omotnicama vezanima uz namjenu, 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: za tajnu se može znati da postoji i može biti odobrena za uporabu, 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 dodijeliti mogućnost da tajnu koristi. Nikad mu se ne može dodijeliti mogućnost da je otkrije.
Jesu li temeljni diskovi šifrirani svojstvo je stroja na kojem implementacija radi. Repozitorij ne uspostavlja šifriranje na razini volumena za volumene baze podataka i objektne pohrane, pa ga ova stranica ne tvrdi.
Izolacija tenanata
Nessie je po dizajnu višenajamni (multi-tenant): jedna baza podataka u kojoj svaki redak pripada točno jednoj organizaciji, a svaka podređena tablica ima stupac organization_id. Izolacija se provodi na dva mjesta — klauzula opsega koju nosi svaki upit i pravi strani ključevi na tom stupcu, dodani kroz četrdeset i dva ograničenja nakon što je interna revizija utvrdila da stupac postoji, ali nije ograničen u desecima tablica.
Skup testova sukladnosti drži taj uvjet na mjestu na HTTP granici. Postavlja maksimalno privilegiranog napadača — punopravnog vlasnika vlastite organizacije — i provjerava da svako kanonsko čitanje resursa druge organizacije odgovara s 403, 404 ili praznim rezultatom, a svaka kanonska izmjena biva odbijena bez diranja retka druge organizacije. Pokriva kanale, odobrenja, zapisnik revizije, okidače, agente i njihove veze, izvođenja, projekte, zadatke, niti, povezivanja, instalacije radnih tokova, MCP instance, bazu znanja i upozorenja.
Da budemo precizni oko mehanizma: riječ je o provedbi na razini aplikacije uz strane ključeve, a ne o sigurnosti na razini redaka u PostgreSQL-u (row-level security). Nema RLS pravila ni zaštite na strani baze podataka, a skup testova sukladnosti izvodi se nad vjernom memorijskom pohranom, a ne nad živom bazom, pa dokazuje klauzule opsega koje kod piše, a ne SQL koji poslužitelj izvršava. Repozitorij to navodi u dokumentaciji samog skupa testova, a navodi i ova stranica.
Revizijski trag
Bilježi se svaka značajna radnja: tko je djelovao i u kojoj ulozi — osoba, agent, servis — što je učinio, na kojem resursu, 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 ne postoji način da se u njega piše izvana: POST /api/audit-log ne postoji, i to je namjerno. Zapisi su ulančani — svaki nosi SHA-256 sažetak vlastitih kanonskih polja i sažetak prethodnog zapisa te organizacije — pa izmijenjen ili uklonjen redak prekida lanac i to se može otkriti. Vlasnik ili administrator 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 otkrivim pri neovlaštenoj izmjeni, a ne imunim na nju: iza njega nema opoziva prava pisanja na razini baze podataka ni pohrane jednokratnog upisa, pa je jamstvo otkrivanje, a ne sprječavanje. I zapisi se prema zadanim postavkama čuvaju neograničeno — konfigurabilno zadržavanje s izvozom prije brisanja predviđeno je, ali nije izgrađeno. Zapisi također ne smiju sadržavati tajne ni cjelovita tijela zahtjeva, a fiksni skup naziva osjetljivih polja metapodataka briše se pri unosu.
Knjiga troškova
Svaki poziv modela bilježi se uz organizaciju te uz korisnika, tim, projekt, kanal, agenta i izvođenje iz kojeg dolazi, s utrošenim tokenima, a trošak koji je prijavio pružatelj i Nessiejeva vlastita procjena čuvaju se jedno uz drugo. Metrika koju pružatelj ne prijavljuje pohranjuje se kao null umjesto da se pogađa. Izvještaje može čitati vlasnik ili administrator organizacije.
Ova knjiga je operativna telemetrija — koliko je organizacija potrošila i u čije ime. Nije račun niti tijelo koje obračunava naplatu.
Treće strane, kada koristite hostirani proizvod
Hostirana implementacija razgovara s malim, fiksnim skupom servisa. Promet prema modelima i web-pretraga ne idu izravno pružateljima: oboje izlazi kroz jedan pristupnik kojim upravlja UnlikeOtherAI, a iza njega su pružatelji modela i pretrage. Prijava i naplata idu na autentikator tvrtke UnlikeOtherAI. Trezor tajni hostira se samostalno uz aplikaciju. Poveznice za videopozive koje generira poslužitelj prema zadanim postavkama koriste javni servis Jitsi.
Gotovo sve ostalo isključeno je dok operator to ne konfigurira, i to navodi umjesto da tiho zakaže: povezani Google, Microsoft i Slack računi; e-pošta agenata preko Amazon SES-a, koju implementacija vodi u vlastitom računu bez posrednika; push obavijesti za mobilne uređaje i preglednik; konektori za istraživanje i izvore ploča; oblačni preglednici. Dva detalja vrijedi istaknuti jer mijenjaju kamo 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 pružateljeve vlastite prijave; Nessie pohranjuje zapečaćenu vjerodajnicu i ništa drugo o računu. Sandučić koji povežete s Clients sandučićem iznimka je: tražite da se njegovi razgovori čuvaju uz svakog kupca, pa se kopiraju.
- Glasovni pozivi ne prolaze kroz Nessie. API posreduje vjerodajnicu, a klijent sam otvara audio vezu. Diktiranje i telefonski pozivi drukčiji su: njihov zvuk prolazi kroz Nessie do pružatelja govora i modela koji ga obrađuju.
Jedan detalj o inferenciji slijedi isto načelo: potpisana zaglavlja s identitetom pozivatelja šalju se samo konfiguriranom poslužitelju za chat, pa usmjeravanje ugradnji (embeddings) na drugi endpoint tom endpointu nikad ne predaje tvrdnju o delegiranju za osobu čiji se tekst ugrađuje.
Hostirani proizvod koristi više pružatelja inferencije i među njima bira prema cijeni i kvaliteti. Organizacija će u administraciji moći odabrati koje pružatelje smiju koristiti njezini agenti: samo zapadne, samo europske, samo kineske ili bez preferencije — najučinkovitijeg pružatelja za svaki posao. Instanca koju sami hostirate bira za sebe.
Vlastiti hosting mijenja sve ovo
Svaka treća strana gore navedena konfiguracijski je izbor na instanci koju sami hostirate. Inferencija se može usmjeriti na bilo koji endpoint kompatibilan s OpenAI-jem, uključujući onaj na vašem vlastitom hardveru. Konektori su isključeni dok ih ne uključite. Prijava putem UnlikeOtherAI podržan je put, a implementacija bez ikakvog davatelja identiteta radi kao jedna nepovezana organizacija s početnim vlasnikom.
U tome je cijela poanta takvog uređenja: softver je isti, a odluke o tome gdje radi i čemu smije pristupiti pripadaju onome tko ga pokreće. Kako to učiniti opisuje stranica s uputama za instalaciju.