Passer au contenu principal

Installation

npm install @avala-ai/sdk

Démarrage rapide

import Avala from "@avala-ai/sdk";

const avala = new Avala({ apiKey: "your-api-key" });

const datasets = await avala.datasets.list();
for (const dataset of datasets.items) {
  console.log(dataset.name, dataset.uid);
}

Créer un compte

La fonction signup crée un nouveau compte Avala et retourne une clé API. Elle ne nécessite pas d’authentification.
import { signup } from "@avala-ai/sdk";

const result = await signup({
  email: "dev@acme.com",
  password: "SecurePass123!",
  firstName: "Jane",       // optional
  lastName: "Doe",         // optional
});

console.log(`User: ${result.user.email}`);
console.log(`API Key: ${result.apiKey}`);
Utilisez la clé API retournée pour initialiser le client :
import Avala, { signup } from "@avala-ai/sdk";

const { apiKey } = await signup({ email: "dev@acme.com", password: "SecurePass123!" });
const avala = new Avala({ apiKey });

Authentification

Le SDK s’authentifie en utilisant votre clé API Avala, qui est envoyée via l’en-tête X-Avala-Api-Key à chaque requête. Vous pouvez fournir la clé directement ou laisser le SDK la lire depuis l’environnement. Option 1 : Passer la clé directement
import Avala from "@avala-ai/sdk";

const avala = new Avala({ apiKey: "your-api-key" });
Option 2 : Utiliser une variable d’environnement
export AVALA_API_KEY="your-api-key"
import Avala from "@avala-ai/sdk";

// Automatically reads AVALA_API_KEY from the environment
const avala = new Avala();

Travailler avec les jeux de données

Le TypeScript SDK est actuellement en lecture seule pour les jeux de données — vous pouvez lister et récupérer les jeux de données mais pas les créer, les mettre à jour ou les supprimer. Utilisez la REST API pour les téléchargements et les mutations.

Lister les jeux de données

const datasets = await avala.datasets.list();

for (const dataset of datasets.items) {
  console.log(`${dataset.name} (${dataset.uid})`);
  console.log(`  Items: ${dataset.itemCount}`);
  console.log(`  Created: ${dataset.createdAt}`);
}

Obtenir un jeu de données

const dataset = await avala.datasets.get("550e8400-e29b-41d4-a716-446655440000");

console.log(dataset.name);
console.log(dataset.slug);
console.log(dataset.itemCount);

Travailler avec les projets

Lister les projets

const projects = await avala.projects.list();

for (const project of projects.items) {
  console.log(`${project.name} (${project.uid})`);
  console.log(`  Status: ${project.status}`);
  console.log(`  Created: ${project.createdAt}`);
}

Obtenir un projet

const project = await avala.projects.get("770a9600-a40d-63f6-c938-668877660000");

console.log(project.name);
console.log(project.status);

Travailler avec les tâches

Lister les tâches

const tasks = await avala.tasks.list({
  project: "770a9600-a40d-63f6-c938-668877660000",
  status: "pending",
});

for (const task of tasks.items) {
  console.log(`${task.uid}${task.name} (${task.status})`);
}

Obtenir une tâche

const task = await avala.tasks.get("990c1800-b62f-85a8-e150-880099880000");

console.log(task.name);
console.log(task.status);

Travailler avec les exports

Créer un export

const exportJob = await avala.exports.create({
  project: "770a9600-a40d-63f6-c938-668877660000",
});

console.log(`Export started: ${exportJob.uid}`);
console.log(`Status: ${exportJob.status}`);

Attendre la fin

let exportJob = await avala.exports.create({
  project: "770a9600-a40d-63f6-c938-668877660000",
});

while (exportJob.status !== "completed") {
  await new Promise((resolve) => setTimeout(resolve, 2000));
  exportJob = await avala.exports.get(exportJob.uid);
  console.log(`Status: ${exportJob.status}`);
}

console.log(`Download: ${exportJob.downloadUrl}`);

Types TypeScript

Le SDK exporte des interfaces TypeScript complètes pour tous les objets API. Utilisez-les pour typer vos fonctions et variables.
import Avala from "@avala-ai/sdk";
import type { Dataset, Project, Export, Task, CursorPage } from "@avala-ai/sdk";

function processDataset(dataset: Dataset): void {
  console.log(dataset.name);       // string
  console.log(dataset.uid);        // string
  console.log(dataset.itemCount);  // number
  console.log(dataset.createdAt);  // string | null
}

function processTask(task: Task): void {
  console.log(task.uid);           // string
  console.log(task.name);          // string | null
  console.log(task.status);        // string | null
  console.log(task.project);       // string | null
}

Gestion des erreurs

Le SDK lève des erreurs typées pour que vous puissiez gérer précisément les différents modes de défaillance.
import Avala, { AvalaError, NotFoundError, RateLimitError } from "@avala-ai/sdk";

const avala = new Avala();

try {
  const dataset = await avala.datasets.get("nonexistent");
} catch (error) {
  if (error instanceof NotFoundError) {
    console.log(`Dataset not found: ${error.message}`);
  } else if (error instanceof RateLimitError) {
    console.log(`Rate limited. Retry after ${error.retryAfter} seconds.`);
  } else if (error instanceof AvalaError) {
    console.log(`API error (${error.statusCode}): ${error.message}`);
  } else {
    throw error;
  }
}
ExceptionDescription
AvalaErrorClasse d’erreur de base pour toutes les erreurs de l’API Avala.
AuthenticationErrorClé API invalide ou manquante (HTTP 401).
NotFoundErrorLa ressource demandée n’existe pas (HTTP 404).
RateLimitErrorVous avez dépassé la limite de débit de l’API (HTTP 429). Inclut une propriété retryAfter.
ValidationErrorLa charge utile de la requête a échoué la validation (HTTP 400/422).
ServerErrorLe serveur a retourné une erreur interne (HTTP 5xx).

Pagination

Les méthodes de liste retournent un objet CursorPage<T> avec une pagination basée sur les curseurs.
// Access items on the current page
const page = await avala.datasets.list({ limit: 10 });
for (const dataset of page.items) {
  console.log(dataset.name);
}

// Fetch the next page
if (page.hasMore) {
  const nextPage = await avala.datasets.list({
    limit: 10,
    cursor: page.nextCursor!,
  });
}

Travailler avec les agents

Créer un agent

const agent = await avala.agents.create({
  name: "QA Bot",
  events: ["task.completed"],
  callbackUrl: "https://example.com/webhook",
  taskTypes: ["annotation"],
});

Lister les exécutions d’un agent

const executions = await avala.agents.listExecutions(agent.uid);
for (const exec of executions.items) {
  console.log(`${exec.eventType}${exec.status}`);
}

Travailler avec les webhooks

Créer un webhook

const webhook = await avala.webhooks.create({
  targetUrl: "https://example.com/webhook",
  events: ["task.completed", "export.ready"],
});

Inspecter les livraisons

const deliveries = await avala.webhookDeliveries.list();
for (const d of deliveries.items) {
  console.log(`${d.eventType}${d.status} (attempts: ${d.attempts})`);
}

Travailler avec la qualité et le consensus

Créer un objectif de qualité

const target = await avala.qualityTargets.create("proj_uid", {
  name: "Accuracy",
  metric: "accuracy",
  operator: "gte",
  threshold: 0.95,
  notifyEmails: ["alerts@example.com"],
});

Vérifier le consensus

const summary = await avala.consensus.getSummary("proj_uid");
console.log(`Mean score: ${summary.meanScore}`);
console.log(`Coverage: ${summary.itemsWithConsensus}/${summary.totalItems}`);

Gestion de flotte

La gestion de flotte est en aperçu. Les APIs décrites ici peuvent changer.
L’espace de noms fleet fournit l’accès au registre d’appareils, aux enregistrements, événements, règles et alertes.
// List online devices
const devices = await avala.fleet.devices.list({ status: "online" });

// Create a timeline event on a recording
const event = await avala.fleet.events.create({
  recordingId: "rec_abc123",
  timestamp: "2026-01-15T10:30:00Z",
  type: "anomaly",
  label: "Gripper force spike",
  metadata: { force_n: 45.2 },
});

// Create a recording rule
const rule = await avala.fleet.rules.create({
  name: "High Latency Alert",
  condition: { type: "threshold", topic: "/diagnostics/latency", field: "data.value", operator: "gt", value: 100 },
  actions: [{ type: "tag", value: "high-latency" }, { type: "notify", channelId: "ch_your_channel_id" }],
});
Consultez le guide Tableau de bord de flotte pour des exemples complets.

Configuration

Vous pouvez personnaliser le comportement du client lors de l’initialisation.
import Avala from "@avala-ai/sdk";

const avala = new Avala({
  apiKey: "your-api-key",
  baseUrl: "https://api.avala.ai/api/v1", // Default
  timeout: 60_000,    // Request timeout in ms (default: 30000)
});
ParamètreTypeDéfautDescription
apiKeystringVariable d’env AVALA_API_KEYVotre clé API Avala.
baseUrlstringhttps://api.avala.ai/api/v1L’URL de base de l’API.
timeoutnumber30000Délai d’attente de requête en millisecondes.

Zéro dépendance

Le package @avala-ai/sdk a zéro dépendance runtime. Il utilise l’API fetch native disponible dans Node.js 18+, Deno et Bun.

Exemples de framework

Next.js (App Router)

// app/api/datasets/route.ts
import Avala from "@avala-ai/sdk";
import { NextResponse } from "next/server";

const avala = new Avala({ apiKey: process.env.AVALA_API_KEY! });

export async function GET() {
  const datasets = await avala.datasets.list();
  return NextResponse.json(datasets);
}

Express

import express from "express";
import Avala from "@avala-ai/sdk";

const app = express();
const avala = new Avala(); // Reads AVALA_API_KEY from env

app.get("/datasets", async (req, res) => {
  try {
    const datasets = await avala.datasets.list();
    res.json(datasets);
  } catch (error) {
    res.status(500).json({ error: "Failed to fetch datasets" });
  }
});

app.listen(3000, () => {
  console.log("Server running on port 3000");
});