← Guides pour développeurs

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.