Miksi emme kutsu tekoälyä suoraan selaimesta
Tekoälypalvelut (OpenAI, Anthropic ja muut) vaativat API-avaimen – salaisen koodin joka tunnistaa sinut ja jota käytetään laskutukseen. Ja tässä on ongelma:
Kaiken mitä laitat JavaScriptiin selaimessa, kuka tahansa voi lukea (F12 → lähdekoodi). Jos avain olisi siellä, kuka tahansa voisi kutsua tekoälyä sinun rahallasi.
Tunnet jo ratkaisun Mestarilta: oma palvelin. Avain pysyy palvelimella, ja selain puhuu vain palvelimellesi:
Browser → your server (the key is here!) → AI service
Browser ← your server ← AI service
Näytän sinulle: /zeptat-se-endpoint
Rakennamme Mestarin Express-palvelimen päälle. Avain tallennetaan .env-tiedostoon (tämä ei koskaan mene GitHubiin – lisää .gitignore:en!):
AI_KLIC=sk-your-secret-key-here
Ja palvelimelle tulee uusi 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'));
Uutta tässä:
fetchvoi myös lähettää dataa:method: 'POST'jabody.headersAuthorization:lla – siellä avain esitellään.role: 'system'– se on promptisi edellisestä oppitunnista! Se määrittää miten tekoäly käyttäytyy.process.env.AI_KLIC– avain luetaan.env:stä, ei kirjoiteta koodiin.
Mistä saan avaimen? Tekoälypalvelut antavat API-avaimia rekisteröitymisen jälkeen – ja se on yleensä maksullista (mutta halpaa, vain senttejä per vastaus). Tämä on vanhemman tehtävä: pyydä heitä luomaan avain ja lisäämään pieni saldo (muutama dollari riittää). Ilman avainta voit silti testata keinotellulla vastauksella – katso “Nyt sinun vuorosi” alla.
Nyt sinun vuorosi 💪
- Lisää rivi
.env.gitignore:en – tarkistagit status-komennolla (.env-tiedoston ei saa näkyä). - Luo
/zeptat-se-endpoint esimerkin mukaan. - Ei avainta? Ei hätää – palauta toistaiseksi testivastaus ja jatka seuraavaan oppituntiin:
app.post('/zeptat-se', (req, res) => {
res.json({ text: `Test answer to: "${req.body.otazka}"` });
});
- Kokeile endpointia selaimesta (F12-konsoli):
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());
Tarkista: Palvelin vastaa POST /zeptat-se:een (testi- tai oikealla tekoälyvastauksella), eikä salainen avain ole koodissa eikä GitHubissa.
Mitä opit tästä oppitunnista
- Salaiset avaimet kuuluvat palvelimelle
.env:ään, eivät koskaan selaimessa tai Gitissä. fetchosaa POST:in – se lähettää datanbody:ssä ja avaimenheaders:issa.- System prompt muokkaa tekoälyapusi persoonallisuutta.
© 2026 Ing. Martin Polak / AlgoRhino · Sisällön käyttöehdot