Zet Sluis voor je modelaanroepen.
Sluis is een OpenAI-compatibele proxy. Wijzig één regel, je base_url, en elk verzoek stroomt voortaan door je residency-beleid het manipulatiebestendige grootboek in. Geen SDK om te leren, geen payloads om te herschrijven. Vijf stappen hieronder; de volledige referentie vind je in de zijbalk.
Tijd tot je eerste verzegelde call: ~2 minuten. Praat je code al met OpenAI, dan houd je je client, je modellen en je berichtformaat precies zoals ze zijn.
Haal een key
Maak een key aan in de Console onder API keys. Elke key draagt een residency-beleid en een budget, dus je kunt eu-only reserveren voor productie en eu-uk-us voor een onderzoekssandbox zonder een regel code te wijzigen.
# keep it in your environment, never in source export SLUIS_KEY="sk_live_a91c…"
Richt base_url op Sluis
Verwissel de host. Alles erna (modellen, streaming, tools, function calling) werkt ongewijzigd, omdat Sluis hetzelfde API-oppervlak proxyt.
from openai import OpenAI client = OpenAI( base_url="https://api.sluis.ai/v1", api_key=os.environ["SLUIS_KEY"], )
import OpenAI from "openai"; const client = new OpenAI({ baseURL: "https://api.sluis.ai/v1", apiKey: process.env.SLUIS_KEY, });
// no SDK required — reqwest = { version = "0.12", features = ["json"] } let client = reqwest::Client::new(); let base = "https://api.sluis.ai/v1"; // ← the only change let key = std::env::var("SLUIS_KEY")?;
curl https://api.sluis.ai/v1/chat/completions \ -H "Authorization: Bearer $SLUIS_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "mistral/mistral-large-latest", "messages": [...] }'
Stuur een verzoek
Roep het precies zo aan als je de provider zou aanroepen. Sluis inspecteert het verzoek, routeert het volgens je beleid en geeft het antwoord van het model terug met twee extra headers die vertellen waar het draaide en hoe het verzegeld is.
# Anthropic Claude, served from Google's EU multi-region resp = client.chat.completions.create( model="vertex/claude-opus-4-8", messages=[{"role": "user", "content": "Summarise this chart…"}], ) print(resp.choices[0].message.content)
// Anthropic Claude, served from Google's EU multi-region const resp = await client.chat.completions.create({ model: "vertex/claude-opus-4-8", messages: [{ role: "user", content: "Summarise this chart…" }], }); console.log(resp.choices[0].message.content);
// Anthropic Claude, served from Google's EU multi-region let resp: serde_json::Value = client .post(format!("{base}/chat/completions")) .bearer_auth(&key) .json(&serde_json::json!({ "model": "vertex/claude-opus-4-8", "messages": [{ "role": "user", "content": "Summarise this chart…" }] })) .send().await? .json().await?; println!("{}", resp["choices"][0]["message"]["content"]);
{
"x-sluis-region": "eu multi-region",
"x-sluis-provider": "vertex · claude-opus-4-8",
"x-sluis-decision": "in-region",
"x-sluis-seal": "#4f9c2a",
"x-sluis-prev": "#e1b7d9"
}Stel residency per verzoek in
Het beleid van de key is de standaard. Overschrijf het voor één enkele call met een header, handig wanneer één endpoint een striktere dataklasse verwerkt dan de rest van de key.
resp = client.chat.completions.create(
model="mistral/mistral-large-latest",
messages=msgs,
extra_headers={"X-Sluis-Residency": "eu-only"},
)
# PHI in the prompt? Sluis routes EU-only and
# blocks with 451 if no EU provider is available.const resp = await client.chat.completions.create( { model: "mistral/mistral-large-latest", messages }, { headers: { "X-Sluis-Residency": "eu-only" } }, ); // PHI in the prompt? Sluis routes EU-only and // blocks with 451 if no EU provider is available.
let resp = client .post(format!("{base}/chat/completions")) .bearer_auth(&key) .header("X-Sluis-Residency", "eu-only") .json(&body) .send().await?; // PHI in the prompt? Sluis routes EU-only and // blocks with 451 if no EU provider is available.
De header kan een verzoek alleen strikter maken dan het beleid van de key, nooit ruimer. Een verzoek kan zijn eigen residency nooit verbreden. Om te verbreden waar data heen mag (bijvoorbeeld Amerikaanse of Chinese providers toestaan) wijzig je het basisbeleid in de Console.
Wil je persoonsgegevens volledig buiten het model houden, zodat je elk model kunt gebruiken zonder ook maar één naam, nummer of secret te lekken? Schakel Beleid → Gegevensbescherming in: Sluis vervangt gedetecteerde PII en secrets door stabiele getypeerde tokens (bijv. «EMAIL_1»), stuurt alleen de tokens naar de provider en herstelt de originele waarden in het antwoord. De koppeling wordt nooit opgeslagen. Dat is wat het veilig maakt om een Amerikaans of Chinees model aan te roepen. De volledige detectorbibliotheek en naamdetectie staan beschreven in de Gegevensbeschermingsreferentie hieronder.
Verifieer het zegel
Elke call voegt een regel toe aan de hashketen. Haal de keten op en verifieer hem offline opnieuw, de hash van elke regel is sha256(prev_hash + record), dus elk gewijzigd veld breekt alle schakels erna.
curl https://api.sluis.ai/v1/audit/export?from=genesis \ -H "Authorization: Bearer $SLUIS_KEY" | sluis verify - # → 18,442 entries · chain intact · head #4f9c2a ✓