Zašto ne zovemo AI izravno iz preglednika
AI servisi (OpenAI, Anthropic i drugi) traže API ključ – tajni kod koji te identificira i koristi se za naplatu. I evo problema:
Sve što staviš u JavaScript u pregledniku može pročitati svatko (F12 → izvorni kod). Kad bi ključ bio tamo, svatko bi mogao zvati AI na tvoj račun.
Rješenje već znaš iz Majstora: vlastiti server. Ključ ostaje na serveru, a preglednik razgovara samo s tvojim serverom:
Browser → your server (the key is here!) → AI service
Browser ← your server ← AI service
Pokazat ću ti: endpoint /zeptat-se
Gradimo na Express serveru iz Majstora. Ključ pohranjujemo u .env datoteci (to nikad ne ide na GitHub – dodaj u .gitignore!):
AI_KLIC=sk-your-secret-key-here
A server dobiva novi 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'));
Što je novo:
fetchmože i slati podatke:method: 'POST'ibody.headerssAuthorization– tu se predaje ključ.role: 'system'– to je tvoj prompt iz prošle lekcije! Definira kako se AI ponaša.process.env.AI_KLIC– ključ se čita iz.env, ne piše u kodu.
Gdje dobiti ključ? AI servisi izdaju API ključeve nakon registracije – i obično je plaćeno (ali jeftino, samo nekoliko centi po odgovoru). To je posao za roditelja: zamoli ih da naprave ključ i dodaju malo kredita (nekoliko dolara je dovoljno). Bez ključa možeš testirati s lažnim odgovorom – vidi “Sad si ti na redu” dolje.
Sad si ti na redu 💪
- Dodaj redak
.envu.gitignore– provjeri naredbomgit status(datoteka.envse ne smije pojaviti). - Napravi endpoint
/zeptat-seprema primjeru. - Nemaš ključ? Nema problema – za sada samo vrati testni odgovor i nastavi na sljedeću lekciju:
app.post('/zeptat-se', (req, res) => {
res.json({ text: `Test answer to: "${req.body.otazka}"` });
});
- Isprobaj endpoint iz preglednika (konzola F12):
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());
Provjera: Server odgovara na POST /zeptat-se (s testnim ili pravim AI odgovorom), a tajni ključ nije ni u kodu ni na GitHubu.
Što ćeš ponijeti iz ove lekcije
- Tajni ključevi pripadaju serveru u
.env, nikad u preglednik ili Git. fetchmože POST – šalje podatke ubody, a ključ uheaders.- System prompt oblikuje osobnost tvog AI pomoćnika.
© 2026 Ing. Martin Polak / AlgoRhino · Uvjeti korištenja sadržaja