Bibliothèque JavaScript
npm install @spavik/clientimport { Spavik } from '@spavik/client';
const spavik = new Spavik(); // lit SPAVIK_API_KEY
const model = await spavik.train('churn.csv', { target: 'churn' });
console.log(await model.predict({ plan: 'pro', seats: 12 }));Aucune dépendance en production. Node 18 ou plus, ainsi que les environnements edge qui fournissent fetch et WebCrypto. Livrée en ESM comme en CommonJS.
Les opérations
| Appel | Coût |
|---|---|
spavik.validate(data, { target }) | gratuit |
spavik.train(data, { target }) | gratuit |
spavik.backtest(data, { target, horizon }) | gratuit |
spavik.forecast(data, { target, horizon }) | horizon x séries |
spavik.models() | gratuit |
spavik.usage() | gratuit |
model.predict(rows) | les crédits du moteur par ligne, 1 sur le moteur par défaut |
model.submitOutcomes(outcomes) | gratuit |
model.performance(days) | gratuit |
model.refresh() | gratuit |
model.predictions() | gratuit |
model.archive(), spavik.archive(modelId) | gratuit |
spavik.restore(modelId) | gratuit |
models() est un itérateur asynchrone ; models({ status: 'archived' }) liste ce qui a été mis de côté. Un modèle connaît son engine, sa target et ses features, les colonnes que predict attend.
for await (const model of spavik.models()) console.log(model.id, model.name, model.features);validate() et backtest() disent, gratuitement, si une table vaut un entraînement et si une série vaut une prévision, chacun avec un verdict et la première chose à corriger. archive() libère la place d'un modèle dans le plan sans rien perdre ; spavik.restore(modelId) le remet en service, par identifiant. Même comportement et mêmes champs que la bibliothèque Python.
Vos données, telles qu'elles sont
Tableau d'objets, chemin de fichier CSV ou JSON, CSV brut, ou un objet seul : la bibliothèque accepte les quatre et rend aux nombres leur type.
Les types
Les définitions TypeScript sont livrées avec le paquet. L'autocomplétion couvre toutes les opérations, leurs options et les classes d'erreur, sans rien configurer.
Les mêmes refus qu'en Python
Ce que la bibliothèque Python refuse, celle-ci le refuse aussi, avec le même message et au même moment. Une suite de conformité rejoue le même scénario sur les deux, et sur le serveur MCP.
await spavik.train(huitLignes, { target: 'churn' });
// SpavikDataError: training needs at least 10 rows, 8 provided. Nothing was sent.Les erreurs
import { SpavikCreditsExhausted } from '@spavik/client';
try {
await model.predict(rows);
} catch (exc) {
if (exc instanceof SpavikCreditsExhausted) {
console.error(exc.code, exc.balance, exc.requestId);
}
}Ce sont les mêmes classes qu'en Python, sous les mêmes noms.
La prévision
L'API répond en CSV. points() vous rend des lignes exploitables, csv le texte d'origine.
const p = await spavik.forecast('ventes.csv', { target: 'ventes', horizon: 7 });
await p.points(); // [{ date: '2026-08-01', ventes_prediction: 118.4, ... }]
p.csv; // le CSV tel que l'API l'a rendu
p.cout; // 7Webhooks
import { verifier } from '@spavik/client';
const evenement = await verifier(corpsBrut, request.headers, secret);Avec Express :
app.post('/webhooks/spavik', express.raw({ type: 'application/json' }), async (req, res) => {
try {
await verifier(req.body, req.headers, process.env.SPAVIK_WEBHOOK_SECRET);
res.sendStatus(200);
} catch {
res.sendStatus(400);
}
});Avec Hono :
app.post('/webhooks/spavik', async (c) => {
const corps = await c.req.arrayBuffer();
await verifier(corps, c.req.raw.headers, c.env.SPAVIK_WEBHOOK_SECRET);
return c.body(null, 200);
});Passez les octets reçus tels quels : un corps analysé puis réécrit ne produit plus la même signature.
Les tentatives suivantes
new Spavik({ maxRetries: 1 }); // aucune nouvelle tentative
new Spavik({ backoff: (n) => n * 1000 }); // attente linéaireComprendre ce qui se passe
SPAVIK_LOG=debug node mon-script.jsLa clé est masquée dans la trace.