Intégrez dans votre propre serveur
Ajoutez un endpoint de création de token à votre backend pour que le SDK du navigateur obtienne un session JWT de courte durée — aucun secret n'atteint jamais le client.
Voici concrètement le schéma de Choisissez votre mode d’authentification : un endpoint de création de token sur votre serveur, et une page de navigateur qui l’appelle avant d’appeler le SDK.
1. Ajoutez un endpoint de token à votre backend
import jwt from "jsonwebtoken";
const SECRET = process.env.QURAVIN_SIGNING_SECRET; // depuis Obtenez votre clé API
const APP_ID = "your-app-id"; // l'id enregistré de votre application
app.get("/ai-token", requireUserLogin, (req, res) => {
const token = jwt.sign(
{
iss: APP_ID,
sub: req.user.id, // l'id utilisateur de votre application
aud: "quravin",
pipelines: ["translate-string"], // les pipelines que cet utilisateur peut appeler
rate_limit: { rpm: 30 },
},
SECRET,
{ algorithm: "HS256", expiresIn: "15m" },
);
res.json({ token, expires_in: 15 * 60 });
});
requireUserLogin est votre propre middleware d’authentification — le token n’est délivré qu’à un
utilisateur que votre serveur a déjà authentifié.
2. Récupérez le token et appelez le SDK depuis le navigateur
<input id="text" />
<button id="go">Translate</button>
<span id="result"></span>
<script src="https://js.quravin.com/v1.js"></script>
<script>
const fetchToken = async () => {
const r = await fetch("/ai-token", { credentials: "include" });
if (!r.ok) throw new Error("Token fetch failed");
return (await r.json()).token;
};
const ai = new Quravin.Quravin({
endpoint: "https://api.example.com/ai-pipeline",
sessionToken: await fetchToken(),
onTokenExpired: fetchToken, // se rafraîchit automatiquement quand l'API retourne 401
});
document.getElementById("go").onclick = async () => {
const out = await ai.run({
pipeline: "translate-string",
inputs: { text: document.getElementById("text").value, target_language: "German" },
});
document.getElementById("result").textContent = out.translation;
};
</script>
3. Gérez les erreurs
Un quota ou une limite de débit atteint retourne une erreur typée — affichez à l’utilisateur un message clair et un lien vers pricing :
try {
const out = await ai.run({ pipeline: "translate-string", inputs: { /* ... */ } });
} catch (err) {
showToast("Translation failed: " + err.message);
}
Voilà toute la boucle : votre serveur crée les tokens, le navigateur ne voit jamais de secret, et
chaque appel est attribué à l’utilisateur qui l’a effectué. Le SDK dispose aussi d’une référence
plus complète — traitement par lots avec ai.runMany, la liaison DOM ai.button, le mode
raw-prompt, et un tableau de dépannage complet — demandez-la à votre contact plateforme si vous
avez besoin d’aller plus loin.