← Razina 5 – Izumitelj

Lekcija 6 od 8 ⏱ 40 minuta Premium

AI na serveru

Napravi serverski endpoint koji razgovara s AI-jem – i sakri tajni ključ od svijeta.

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:

💡

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 💪

  1. Dodaj redak .env u .gitignore – provjeri naredbom git status (datoteka .env se ne smije pojaviti).
  2. Napravi endpoint /zeptat-se prema primjeru.
  3. 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}"` });
});
  1. 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