Helpers para acessar os endpoints do backend que intermediam chamadas à OpenAI.
Este arquivo documenta a API cliente localizada em src/utils/gptRequests.ts e traz exemplos, recomendações de uso e tratamento de erros.
generateItinerary(prompt: string): Promise<string>- Envia
{ prompt }para o endpoint e retornadata.messagecom o itinerário (texto).
- Envia
generateChatAnswers(prompt: string): Promise<string>- Envia
{ prompt }e retornadata.messagecom a resposta do chat (texto).
- Envia
Observação: a forma exata do
dataretornado depende do backend; adapte os parsers caso o formato seja diferente (ex.:data.resultoudata.choices[0].text).
Arquivo sugerido: src/utils/gptRequests.ts
import { API_URL } from "@config"; // ou './config'
type ApiResponse = {
ok: boolean;
message?: string;
error?: string;
};
async function postJson(path: string, body: object, signal?: AbortSignal) {
const res = await fetch(`${API_URL}${path}`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
signal,
});
const data: ApiResponse = await res.json().catch(() => ({ ok: false, error: "invalid_json" }));
if (!res.ok) {
const errMsg = data?.error || `HTTP ${res.status}`;
const error: any = new Error(errMsg);
error.status = res.status;
throw error;
}
return data;
}
export async function generateItinerary(prompt: string, signal?: AbortSignal): Promise<string> {
const data = await postJson("/api/generateItinerary", { prompt }, signal);
if (!data.message) throw new Error("Resposta inválida do servidor");
return data.message;
}
export async function generateChatAnswers(prompt: string, signal?: AbortSignal): Promise<string> {
const data = await postJson("/api/justchat", { prompt }, signal);
if (!data.message) throw new Error("Resposta inválida do servidor");
return data.message;
}import { generateItinerary, generateChatAnswers } from "@utils/gptRequests";
async function run() {
try {
const itinerary = await generateItinerary("3 dias em Salvador focando em cultura e gastronomia");
console.log(itinerary);
const answer = await generateChatAnswers("Quais os melhores meses para visitar Floripa?");
console.log(answer);
} catch (err) {
console.error("Erro na chamada GPT:", err);
}
}- centralize a URL da API em
src/config.ts(exportarAPI_URL) e use-a emgptRequests.ts. - trate
response.okedatacom validação — não confie apenas nores.json(). - HTTP 429: indique ao usuário que a cota foi atingida e ofereça retry exponencial ou uma mensagem amigável.
- timeouts: use
AbortControllerpara cancelar requisições longas (ex.: timeout em 15s). - retries: em erros transientes (timeout, 502, 503), implemente retry com backoff.
- logs: registre
statusebodyem ambiente de desenvolvimento para debug. - CORS: se o backend estiver em domínio diferente, verifique as configurações CORS do servidor.
- URL inválida/hardcode: troque por
API_URL— verifiquesrc/config.ts. - 429 (rate limit): exiba mensagem e desabilite ação temporariamente; registre para investigar.
- 500 / 502 / 503: retry com backoff e alertar manutenção.
- resposta sem
message: confirme o contrato da API e ajuste o parser.