Hvorfor vi ikke kalder AI direkte fra nettleseren
AI-tjenester (OpenAI, Anthropic og andre) krever en API-nøgle – en hemmelig kode, der identificerer deg og brukes til fakturering. Og her er fangen:
Alt du putter i JavaScript i nettleseren, kan alle lese (F12 → kildekode). Hvis din nøgle var der, kunne alle kalde AI med dine penge.
Du kjenner allerede løsningen fra Mester: din egen server. Nøglen blir på serveren, og nettleseren taler kun med din server:
Browser → your server (the key is here!) → AI service
Browser ← your server ← AI service
Jeg viser deg: /zeptat-se-endpointet
Vi bygger videre på Express-serveren fra Mester. Vi lagrer nøglen i en .env-fil (den kommer aldrig på GitHub – legg til den til .gitignore!):
AI_KLIC=sk-your-secret-key-here
Og serveren får et nyt endpoint:
require('dotenv').config();
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.static('public'));
app.post('/zeptat-se', async (req, res) => {
const { otazka } = req.body;
const odpoved = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.AI_KLIC}`,
},
body: JSON.stringify({
model: 'gpt-4o-mini',
messages: [
{ role: 'system', content: 'You are a friendly helper. Answer briefly in English.' },
{ role: 'user', content: otazka },
],
}),
});
const data = await odpoved.json();
res.json({ text: data.choices[0].message.content });
});
app.listen(3000, () => console.log('Server running at http://localhost:3000'));
Hva der er nyt her:
fetchkan også sende data:method: 'POST'ogbody.headersmedAuthorization– det er der, nøglen præsenteres.role: 'system'– det er din prompt fra siste leksjon! Den definerer, hvordan AI opfører sig.process.env.AI_KLIC– nøglen leses fra.env, ikke skrevet i koden.
Hvor får jeg en nøgle fra? AI-tjenester utsteder API-nøgler etter registrering – og det er normalt betalt (men billigt, bare cent per svar). Det er en oppgave for en forelder: bed dem om at opprette en nøgle til deg og legg til et lille beløb (et par dollars er nok). Uden nøgle kan du fortsatt teste med et oppdiktet svar – se “Nå er det din tur” nedenfor.
Nå er det din tur 💪
- Legg til en linje
.envtil.gitignore– sjekk med kommandoengit status(.env-filen må ikke vises). - Opprett
/zeptat-se-endpointet etter eksemplet. - Har du ingen nøgle? Intet problem – returner bare et testsvar for nu og fortsett til neste leksjon:
app.post('/zeptat-se', (req, res) => {
res.json({ text: `Test answer to: "${req.body.otazka}"` });
});
- Prøv endpointet fra nettleseren (F12-konsol):
const r = await fetch('/zeptat-se', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ otazka: 'Hi, who are you?' }),
});
console.log(await r.json());
Sjekk: Serveren svarer på POST /zeptat-se (med et test- eller rigtigt AI-svar), og den hemmelige nøgle er hverken i koden eller på GitHub.
Dette tar du med deg fra leksjonen
- Hemmelige nøgler hører til på serveren i
.env, aldrig i nettleseren eller i Git. fetchkan lave POST – den sender data ibody, og nøglen iheaders.- Systemprompten former personligheden på din AI-hjelper.
© 2026 Ing. Martin Polak / AlgoRhino · Vilkår for innholdsbruk