DEV Community

Cover image for Criando um Chatbot com JavaScript e Gemini AI: criando o backend
Neilton Seguins
Neilton Seguins

Posted on

Criando um Chatbot com JavaScript e Gemini AI: criando o backend

Salve! \o

Dando continuidade a criação do nosso chatbot com Javascript e Gemini AI, vamos adicionar o "backend" do projeto. Da vez passada criamos o frontend, com HTML, CSS e Javascript, onde garantimos que a interface do usuário irá refletir uma conversa entre o usuário e o chatbot.

Agora precisamos criar um servidor, configurando uma rota com express.js para nos comunicar com a API do Gemini. Vamos lá!

Instalando as dependências do projeto

Bom, vamos precisar do express.js, o sdk do google gemini e para proteger nossa chave de API vou instalar o dotenv para trabalharmos com variáveis de ambiente.

npm install @google/generative-ai express dotenv
Enter fullscreen mode Exit fullscreen mode

Agora estamos prontos para criar nosso servidor adotando melhores práticas como usar variáveis de ambiente locais para proteger dados particulares.

Para isso, vamos criar um arquivo na pasta raiz do projeto chamado de server.js. Neste arquivo vamos começar importando as dependências e configurando os recursos necessários.

const express = require("express");
require("dotenv").config();
const { GoogleGenerativeAI } = require("@google/generative-ai");

const app = express();
const port = 3000;

const genAI = new GoogleGenerativeAI(process.env.GOOGLE_GEMINI_API_KEY);

app.use(express.static("public"));

app.use(express.json());
Enter fullscreen mode Exit fullscreen mode

Este código configura o express para servir arquivos estáticos da pasta "public" e aceita requisições com payload em JSON. Por isso colocamos os arquivos index.html, styles.css e script.js nesta pasta. Também configuramos a aplicação para rodar na porta 3000.

Utilizamos a biblioteca @google/generative-ai para integrar a API do Gemini, autenticando-a com uma chave armazenada em uma variável de ambiente chamada GOOGLE_GEMINI_API_KEY.

Mas onde conseguimos essa API Key? É o que vamos descobrir agora.

Chave de API do Gemini

Obtendo a chave

Para conseguir uma chave de API do Gemini, recomendo que você esteja logado em uma conta "@gmail.com". Após isso, acesse este link e você verá uma tela como esta:

A imagem mostra uma interface de usuário para configurar e testar uma API, apresentando um exemplo de comando cURL para enviar requisições à API. Há um botão destacado no canto inferior que permite criar uma chave de API, e o layout inclui um título, um exemplo de código e links para guias ou informações adicionais.

Clique no botão de "Criar chave de API", indique um projeto no qual você usará esta chave e prontinho. Logo abaixo aparecerá sua chave e você poderá visualizá-la e até copiá-la para fazer o próximo passo.

Protegendo sua chave de API

Agora no seu projeto, crie um arquivo com o nome .env.local ou só .env na pasta raiz do seu projeto. Neste arquivo coloque sua chave de API da seguinte maneira:

GOOGLE_GEMINI_API_KEY="sua-chave-vai-aqui"
Enter fullscreen mode Exit fullscreen mode

Agora salve o seu arquivo e pronto. Se você fez o passo anterior corretamente, sua chave de API estará funcionando.

PS: atente-se ao plano que aparece na sua chave de API. O gemini oferece um plano gratuito com uma quantidade limitada de tokens que sua chave pode retornar. Se quiser maior quantidade de tokens, avalie assinar um plano pago. Vamos utilizar o plano gratuito, que mesmo limitado vai nos permitir trocar algumas mensagens com o chatbot.

Criando a rota /chat

Agora com as dependências configuradas e chave de API em mãos, vamos abrir as portas de possibilidades do que podemos fazer com a inteligência artificial.

No arquivo server.js vamos criar a rota /chat:

app.post("/chat", async (req, res) => {
  const { message } = req.body;

  if (!message) {
    return res.status(400).json({ error: "Mensagem não pode estar vazia." });
  }

  //...
});
Enter fullscreen mode Exit fullscreen mode

Nossa rota é do tipo POST, pois irá receber uma mensagem no corpo, justamente a mensagem do usuário que irá interagir com o chat. Então, com essa mensagem nós utilizamos um pouco de programação defensiva (não faz mal pra ninguém um pouco de cuidado rs) e verificamos se não temos uma mensagem. Se não tivermos, um erro é devolvido como resposta e uma mensagem é lançada.

Se tivermos a mensagem, aí sim iremos enviar ela como prompt para o modelo que escolhermos, da seguinte forma:

try {
    const model = genAI.getGenerativeModel({
      model: "gemini-1.5-flash",
    });

    const chat = model.startChat({
      history: [],
      generationConfig: { maxOutputTokens: 100 },
    });

    const result = await chat.sendMessage(message);
    res.json({ response: result.response.text() });
  } catch (error) {
    console.error(error);
    res.status(500).json({ error: "Erro ao processar mensagem." });
  }
Enter fullscreen mode Exit fullscreen mode

Como essa comunicação é um processo assíncrono, vamos usar try/catch para lidar com a resposta. Primeiro eu defino o modelo do Gemini que será usado (você pode conferir uma lista de modelos neste link). Neste caso optei pelo gemini-1.5-flash.

O segundo passo é iniciar o chat. Então com o model.startChat() eu posso iniciar a comunicação com o Gemini, configurando a quantidade máxima de tokens que quero na resposta (neste caso 100 tokens por resposta).

Agora nós aguardamos esta resposta depois de enviar a mensagem para o modelo com chat.sendMessage(message). Quando tivermos a resposta, iremos devolver ela para quem fez a requisição, convertendo o formato de texto devolvido pelo modelo para JSON.

E por fim mas não menos importante, se tivermos um erro podemos usá-lo dentro do catch para lançar este erro no console, e também devolvendo um status 500, facilitando a vida do cliente que está consumindo esta "mini api". Beleza?

Agora só falta indicar onde a nossa "mini api" irá rodar com o trecho de código abaixo:

app.listen(port, () => {
  console.log(`Servidor rodando em http://localhost:${port}`);
});
Enter fullscreen mode Exit fullscreen mode

Nossa api irá rodar na porta que especificamos lá no início. O código completo do server.js é mostrado abaixo:

const express = require("express");
require("dotenv").config();
const { GoogleGenerativeAI } = require("@google/generative-ai");

const app = express();
const port = 3000;

const genAI = new GoogleGenerativeAI(process.env.GOOGLE_GEMINI_API_KEY);

app.use(express.static("public"));

app.use(express.json());

app.post("/chat", async (req, res) => {
  const { message } = req.body;

  if (!message) {
    return res.status(400).json({ error: "Mensagem não pode estar vazia." });
  }

  try {
    const model = genAI.getGenerativeModel({
      model: "gemini-1.5-flash",
    });

    const chat = model.startChat({
      history: [],
      generationConfig: { maxOutputTokens: 100 },
    });

    const result = await chat.sendMessage(message);
    res.json({ response: result.response.text() });
  } catch (error) {
    console.error(error);
    res.status(500).json({ error: "Erro ao processar mensagem." });
  }
});

app.listen(port, () => {
  console.log(`Servidor rodando em http://localhost:${port}`);
});
Enter fullscreen mode Exit fullscreen mode

Testando o chatbot

Agora chegou o momento mais aguardado, o de testar nosso chatbot. Para isso, vamos abrir um terminal e digitar o seguinte comando:

node server.js
Enter fullscreen mode Exit fullscreen mode

Você deve receber a seguinte mensagem no terminal depois de rodar este comando:

Servidor rodando em http://localhost:3000
Enter fullscreen mode Exit fullscreen mode

Agora acessando a url http://localhost:3000 e escrevendo uma mensagem no input e pressionando o botão de enviar, a IA responde sua mensagem e ela é mostrada na tela.

Interface de chat com duas mensagens: uma pergunta

Muito legal, né?

Conclusão

Com isso a gente finaliza a criação de um chatbot usando JavaScript e a API do Google Gemini. Vimos como criar o frontend do zero, aplicar estilos, fazer manipulação do DOM. Criamos um servidor com express.js, usamos a api do gemini, configuramos uma rota POST para nos comunicarmos com o cliente da aplicação e conseguimos conversar com a IA de uma interface própria, desenvolvida por nós mesmos.


Mas não é só isso que dá para fazer. Podemos personalizar e configurar este chatbot para diversas tarefas, desde ser um assistente de idiomas, até um professor virtual que tira suas dúvidas sobre matemática ou programação, vai depender de sua criatividade.

Transformar uma IA em um assistente personalizado envolve treinamento do modelo, mais sobre como a forma que você quer que ele responda e se comporte do que sobre código propriamente dito.

Vamos explorar um pouco disso em um próximo artigo.

Até lá!

Top comments (0)