← Nível 5 – Inventor

Lição 6 de 8 ⏱ 40 minutos Premium

IA no servidor

Constrói um endpoint de servidor que fala com IA – e esconde a tua chave secreta do mundo.

Porque não chamamos a IA diretamente do browser

Os serviços de IA (OpenAI, Anthropic e outros) exigem uma chave API – um código secreto que te identifica e serve para faturação. E aqui está o problema:

Tudo o que pões em JavaScript no browser pode ser lido por qualquer pessoa (F12 → código fonte). Se a tua chave estivesse lá, qualquer pessoa podia chamar a IA com o teu dinheiro.

Já conheces a solução do Mestre: o teu próprio servidor. A chave fica no servidor e o browser só fala com o teu servidor:

Browser  →  your server (the key is here!)  →  AI service
Browser  ←  your server                     ←  AI service

Vou mostrar-te: o endpoint /zeptat-se

Vamos construir sobre o servidor Express do Mestre. Guardamos a chave num ficheiro .env (isto nunca vai para o GitHub – adiciona ao .gitignore!):

AI_KLIC=sk-your-secret-key-here

E o servidor ganha um endpoint novo:

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'));

O que é novo aqui:

💡

Onde arranjo uma chave? Os serviços de IA emitem chaves API após registo – e é normalmente pago (mas barato, só cêntimos por resposta). Isto é trabalho para um pai: pede-lhe para criar uma chave e adicionar um pequeno crédito (uns poucos euros chegam). Sem chave, podes testar com uma resposta inventada – vê «Agora és tu» abaixo.

Agora és tu 💪

  1. Adiciona a linha .env ao .gitignore – verifica com o comando git status (o ficheiro .env não deve aparecer).
  2. Cria o endpoint /zeptat-se seguindo o exemplo.
  3. Não tens chave? Sem problema – devolve uma resposta de teste por agora e continua para a próxima lição:
app.post('/zeptat-se', (req, res) => {
  res.json({ text: `Test answer to: "${req.body.otazka}"` });
});
  1. Experimenta o endpoint no browser (consola 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());

Verifica: O servidor responde a POST /zeptat-se (com resposta de teste ou IA real), e a chave secreta não está no código nem no GitHub.

O que ficas a saber desta lição