async function chat(model, message, retries = 3) {
for (let i = 0; i < retries; i++) {
const r = await fetch("https://www.ninjachat.ai/api/v1/chat", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.NINJACHAT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ model, messages: [{ role: "user", content: message }] }),
});
if (r.ok) return (await r.json()).choices[0].message.content;
if (r.status === 429) { // Rate limited — retry
await new Promise(r => setTimeout(r, (r.headers.get("Retry-After") || 2 ** i) * 1000));
continue;
}
if (r.status >= 500) { // Server error — retry
await new Promise(r => setTimeout(r, 2 ** i * 1000));
continue;
}
const err = await r.json();
throw new Error(`${r.status} ${err.code}: ${err.message}`);
}
throw new Error("Max retries exceeded");
}