Aprenda a criar um mini projeto com a API da OpenAI - HTML, CSS e JAVASCRIPT

Para iniciar a execução do projeto para seu portfólio usando inteligência artificial precisamos primeiramente criar uma pasta para adicionar os arquivos de HTML, CSS e JAVASCRIPT.

No seu terminal:

mkdir chat-gpt

Dentro desta pasta você vai adicionar os seguintes arquivos:

  • index.html
  • styles.css
  • script.js

O objetivo é praticar as APIs oferecidas pela OpenAI de maneira simples e eficaz, além de enriquecer seu currículo com projetos que utilizam inteligência artificial.

No arquivo HTML, adicione uma div que contém duas tags simples, textarea e um button, que serão usados para enviar perguntas à API.

  • O primeiro textarea será usado para exibir as respostas retornadas pela IA.
  • O segundo será onde o usuário adicionará a pergunta.
  • O button enviará a função para o método POST da API.

Arquivo HTML - index.html

  • Qualquer dúvida sobre qualquer tag ou lógica so mencionar no comentário.
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Chat GPT</title>
  <link rel="stylesheet" href="style.css">
</head>

<body>
  <div class="content">
    <textarea id="resultadoIA" rows="10" disabled placeholder="Resposta da I.A" style="height: 70%;"></textarea>

    <textarea id="inputPergunta" placeholder="Pergunte algo" style="height: 20%;"></textarea>

    <button id="EnviarPergunta">
      Enviar mensagem
    </button>
  </div>
  <script src="script.js"></script>
</body>

</html>

No arquivo CSS, adicione a estilização simples e objetiva que você desejar.

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    background-color: #171923;
    display: flex;
    justify-content: center;
    width: 100vw;
    height: 100vh;
}

.content {
    display: flex;
    width: 90%;
    flex-direction: column;
    justify-content: space-around;
}

textarea {
    resize: none;
    border: none;
    padding: 8px;
    background-color: #1A202C;
    color: #F7FAFC;
    outline: none;
    font-size: 24px;
    text-align: justify;
    border-radius: 16px;
}

textarea:focus {
    border: 2px solid #4299E1;
}

button {
    background-color: #4299E1;
    color: #EBF8FF;
    padding: 10px 20px;
    border-radius: 5px;
    border: none;
    cursor: pointer;
    animation: fadeIn 2s;
    font-size: 24px;
}

@keyframes fadeIn {
    0% {
    opacity: 0;
    }
    100% {
        opacity: 1;
    }
}

No arquivo JavaScript, referencie dois elementos HTML usando seus respectivos ID em variáveis diferentes.

  • A variável "inputPergunta" representa um elemento com id "inputPergunta" e será usada para ler o valor do input fornecido pelo usuário.
  • A variável "resultadoIA" representa um elemento com id "resultadoIA" e será usada para exibir o resultado da pergunta para o usuário.
const inputPergunta = document.getElementById("inputPergunta");
const resultadoIA = document.getElementById("resultadoIA");

Após essas duas variaveis precisamos criar a constante que vai obter a chave da API que você precisa retirar na documentação OPENAI, o link direto para a criação é:

const OPENAI_API_KEY = "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"

Essa chave está desativada

Agora chegamos em um momento importante do código!!!

Precisamos criar uma função que vai ser necessário:

  • Armazenar o valor da pergunta em uma variável
  • Fazer o fetch com a API da documentação OPENAI
  • Posteriamos utilizamos o then para transformar a resposta em um JSON
  • Depois vamos pegar o json no proximo then e fazer algumas validações
    • Primeiro vamos validar se o resultadoIA possui algum valor, se pussir ele vai quebrar uma linha
    • Também precisamos verificar se ocorre algum erro com o JSON, assim imprimindo em tela
    • Se não possuir o erro vamos exibir a resposta enviada pela api que vem em um array, se ele estiver vazio vai aparecer “Sem resposta”
    • Sempre que eu enviar uma questão eu vou pegar o scroll da resposta e enviar la para baixo
    • Essa condição der algum erro vamos chamar no catch imprimindo o erro no console
    • E no finally
      • Vamos zerar a string de Carregando do inputPergunta
      • Vamos habilitar o inputPergunta
      • E dar focus nele

O trecho de código a seguir adiciona um novo texto ao conteúdo de um elemento HTML com o ID "resultadoIA". Ele começa verificando se o elemento já possui algum valor e, em caso afirmativo, adiciona três linhas em branco. Em seguida, adiciona uma nova linha de texto que começa com "Eu:" seguido pelo conteúdo da variável "valorPergunta". Depois, o valor do elemento HTML com o ID "inputPergunta" é alterado para "Carregando..." e ele é desabilitado. Por fim, a rolagem do elemento "resultadoIA" é movida para o final da página.

if (result.value) result.value += “\n\n\n”

result.value += `Eu ${sQuestion}`
inputQuestion.value = "Carregando..."
inputQuestion.disabled = true

result.scrollTop = result.scrollHeight

E pra finalizar vamos adicionar a lógica de chamar a função do Botão de Enviar Mensagem!

document.getElementById("EnviarPergunta").addEventListener("click", EnviarPergunta)

E por fim o código final do script.js

const inputPergunta = document.getElementById("inputPergunta");
const resultadoIA = document.getElementById("resultadoIA");

const OPENAI_API_KEY = "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";

function EnviarPergunta() {
	var valorPergunta = inputPergunta.value;

  fetch("https://api.openai.com/v1/completions", {
    method: "POST",
    headers: {
      Accept: "application/json",
      "Content-Type": "application/json", 
      Authorization: "Bearer " + OPENAI_API_KEY,
    },
    body: JSON.stringify({
      model: "text-davinci-003",
      prompt: valorPergunta,
      max_tokens: 2048, // tamanho da resposta
      temperature: 0.7, // criatividade na resposta
    }),
  })
    .then((response) => response.json())
    .then((json) => {
      if (resultadoIA.value) resultadoIA.value += "\n";

      if(json.error?.message){
        resultadoIA.value += `Error: ${json.error.message}`;
      } else if (json.choices?.[0].text) {
        var text = json.choices[0].text || "Sem resposta";

        resultadoIA.value += "Chat GPT: " + text;
      }

      resultadoIA.scrollTop = resultadoIA.scrollHeight;
    })
    .catch((error) => console.error("Error:", error))
    .finally(() => {
      inputPergunta.value = "";
      inputPergunta.disabled = false;
      inputPergunta.focus();
    });

	if (resultadoIA.value) resultadoIA.value += "\n\n\n";

	resultadoIA.value += `Eu: ${valorPergunta}`;
	inputPergunta.value = "Carregando...";
	inputPergunta.disabled = true;

  resultadoIA.scrollTop = resultadoIA.scrollHeight;
}

document.getElementById("EnviarPergunta").addEventListener("click", EnviarPergunta)

Qualquer dúvida sobre o conteúdo pode entrar em contato, e se quiser dar uma moralzinho no linkedin:

- Linkedin - Github

Top brother parabéns pelo conteúdo, se der tempo vou fazer ainda hoje!! 👏👏👏

Boaa, consegue sim é rapidinho!
Fala Brother! tudo certo? Estava testando ele porém da o seguinte erro para mim na hora de testar: "Error: You exceeded your current quota, please check your plan and billing details." Além de criar a chave API precisa fazer mais alguma coisa?
Precisa não, provavelmente ele coloca um intervalo de tempo curto para você nao fazer chamada em loop! Conseguiu já?
Não consegui ainda

Cara, muito obrigado!, Eu tinha essa tarefa pendente rs, justamente porque as vezes eu preciso consultar o ChatGPT e ele está fora do ar, E isso facilitou, eu estava usando o postman pra fazer perguntas quando o chat estava fora, valeu pelo código 👍, Depois dou uma refinada, por exemplo exibir bloco de códigos de exemplos em um formato melhor, igual a page original.

Excelente trabalho 👍

Boa, ótima dica! Obrigado você pelo apoio.

Parabéns, Incrível!

Nossa brother, muito bom! Vou fazer assim que possível!

Boa, se tiver alguma dúvida no projeto compartilha comigo! Estou aqui para ajudar