Por que Go e ChatGPT são a combinação ideal?
\nVocê já pensou em como pode "ensinar" rapidamente seu programa Go a conversar com o usuário como uma pessoa real? Ou talvez você queira automatizar a geração de conteúdo, criar um assistente inteligente ou simplesmente adicionar um "toque especial" ao seu serviço? A integração com a API ChatGPT em Go não é apenas uma tendência moderna, mas uma ferramenta poderosa que abre portas para o mundo da inteligência artificial. Go, com sua velocidade e simplicidade, é ideal para criar requisições rápidas e confiáveis para redes neurais. Neste artigo, não vamos apenas analisar a teoria, mas escrever código real que pode ser usado imediatamente em seus projetos.
\n\nPreparando o terreno: o que é necessário para começar?
\nAntes de mergulharmos no código, vamos garantir que temos tudo o que é necessário. Você vai precisar de:
\n- \n
- Go instalado (versão 1.21 ou superior, para usar todos os recursos modernos). \n
- Chave da API OpenAI. Você pode obtê-la na plataforma OpenAI. Trate-a como a senha do seu cartão bancário — mantenha-a em segredo! \n
- Compreensão básica de requisições HTTP e estruturas de dados em Go. \n
Todo o código do artigo será escrito em um único arquivo main.go, para não complicar a estrutura. Vamos lá!
Passo 1: Criando o cliente HTTP e enviando a primeira requisição
\nO coração da nossa integração será o pacote padrão net/http. Ele é leve, rápido e não requer dependências externas. Nossa tarefa é enviar uma requisição POST para o endpoint https://api.openai.com/v1/chat/completions com o corpo e cabeçalhos corretos.
Estrutura da requisição
\nA API ChatGPT espera um JSON de formato específico. Vamos criar estruturas Go que correspondam exatamente a esse formato:
\npackage main\n\nimport (\n "bytes"\n "encoding/json"\n "fmt"\n "io"\n "net/http"\n "os"\n)\n\ntype ChatMessage struct {\n Role string `json:"role"`\n Content string `json:"content"`\n}\n\ntype ChatRequest struct {\n Model string `json:"model"`\n Messages []ChatMessage `json:"messages"`\n}\n\ntype ChatResponse struct {\n Choices []struct {\n Message ChatMessage `json:"message"`\n } `json:"choices"`\n}\nObserve as tags json:"...". Elas garantem que o Go "empacote" (serialize) corretamente nossos dados no JSON que a OpenAI entenderá.
Função de envio
\nAgora vamos escrever uma função que cuida de todo o "trabalho pesado": monta a requisição, envia e analisa a resposta.
\nfunc askChatGPT(apiKey, prompt string) (string, error) {\n reqBody := ChatRequest{\n Model: "gpt-3.5-turbo",\n Messages: []ChatMessage{\n {Role: "user", Content: prompt},\n },\n }\n\n jsonData, err := json.Marshal(reqBody)\n if err != nil {\n return "", fmt.Errorf("erro de marshalling: %w", err)\n }\n\n request, err := http.NewRequest("POST", "https://api.openai.com/v1/chat/completions", bytes.NewBuffer(jsonData))\n if err != nil {\n return "", fmt.Errorf("erro ao criar requisição: %w", err)\n }\n\n request.Header.Set("Content-Type", "application/json")\n request.Header.Set("Authorization", "Bearer "+apiKey)\n\n client := &http.Client{}\n response, err := client.Do(request)\n if err != nil {\n return "", fmt.Errorf("erro ao executar requisição: %w", err)\n }\n defer response.Body.Close()\n\n body, err := io.ReadAll(response.Body)\n if err != nil {\n return "", fmt.Errorf("erro ao ler resposta: %w", err)\n }\n\n // Verifica o código de status\n if response.StatusCode != http.StatusOK {\n return "", fmt.Errorf("API retornou erro: %s, corpo: %s", response.Status, string(body))\n }\n\n var chatResp ChatRes