Consumindo Modelos de IA
Primeira Chamada ao LLM
Exemplos práticos em Node.js, Python e PHP — enviar pergunta e receber resposta via código.
Nesta aula você vai
- Implementar chamada HTTP ao LLM em pelo menos uma linguagem
- Extrair texto da resposta JSON
- Configurar variável de ambiente para API key
Primeira Chamada ao LLM
Objetivos
- Consumir um LLM via código — não via interface web
- Replicar o padrão na sua stack (Node, Python ou PHP)
Node.js (fetch nativo)
// chat.js — Node 18+
const API_KEY = process.env.OPENAI_API_KEY;
async function ask(question) {
const res = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
Authorization: `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: question }],
temperature: 0.3,
max_tokens: 500,
}),
});
if (!res.ok) {
const err = await res.json();
throw new Error(err.error?.message ?? res.statusText);
}
const data = await res.json();
return data.choices[0].message.content;
}
ask('O que é REST em uma frase?').then(console.log);
Execute: OPENAI_API_KEY=sk-... node chat.js
Python (requests)
import os
import requests
API_KEY = os.environ["OPENAI_API_KEY"]
URL = "https://api.openai.com/v1/chat/completions"
def ask(question: str) -> str:
response = requests.post(
URL,
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": question}],
"temperature": 0.3,
"max_tokens": 500,
},
timeout=60,
)
response.raise_for_status()
data = response.json()
return data["choices"][0]["message"]["content"]
print(ask("O que é REST em uma frase?"))
PHP (cURL)
<?php
$apiKey = getenv('OPENAI_API_KEY');
$payload = json_encode([
'model' => 'gpt-4o-mini',
'messages' => [['role' => 'user', 'content' => 'O que é REST em uma frase?']],
'temperature' => 0.3,
'max_tokens' => 500,
]);
$ch = curl_init('https://api.openai.com/v1/chat/completions');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => $payload,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
throw new RuntimeException("API error: $response");
}
$data = json_decode($response, true);
echo $data['choices'][0]['message']['content'];
Exercício
- Escolha uma linguagem acima
- Envie: "Explique idempotência em APIs REST com exemplo HTTP"
- Logue
usage.total_tokensno console - Altere
temperaturede 0 para 0.9 e compare
Wrapper mínimo (padrão recomendado)
Centralize em um módulo llmClient.js / LlmClient.php:
export async function chat(messages, options = {}) {
// uma função, um lugar para timeout, retry, logging
}
Todo endpoint do seu app chama chat() — nunca fetch espalhado.
Resumo
- Três linguagens, mesmo contrato JSON
choices[0].message.content= resposta- API key via
process.env/os.environ/getenv - Encapsule em cliente reutilizável desde o dia 1