Scrydon

Facturation et mesure de l'utilisation

Attribution des coûts par capacité, estimations CO₂ et rapports de rétrofacturation — disponibles pour les administrateurs d'organisation via client.billing.*

Chaque appel à une capacité IA — complétion LLM, transcription vocale, embedding, synthèse TTS, OCR, génération d'images, analyse vidéo — produit un événement d'utilisation mesuré. L'API billing.* permet aux administrateurs d'organisation d'interroger les coûts, les tokens, les exécutions et les estimations CO₂ selon toute combinaison d'espace de travail, d'équipe, d'utilisateur, de capacité, de fournisseur, de modèle ou de région.

La mesure de facturation est en lecture seule. Un échec d'écriture de facturation ne bloque jamais l'appel de capacité. Les chiffres étiquetés CO₂ sont des estimations modélisées, pas des relevés de compteur d'énergie — voir Méthodologie carbone ci-dessous.


Aperçu de l'API

Toutes les méthodes billing.* sont disponibles sur le client admin Better Auth (getAdminClient()) depuis @scrydon/multi-tenancy/auth/client.

MéthodeAuthentification requiseCe qu'elle retourne
billing.log(...)M2M interne (billing:admin)Enregistre un événement d'utilisation. Appelé par le runtime de capacité — pas directement par le code produit.
billing.summary(...)Session administrateur d'orgTotaux + ventilation groupée optionnelle
billing.timeseries(...)Session administrateur d'orgSérie jour par jour
billing.topN(...)Session administrateur d'orgTop N clés par métrique
billing.chargeback(...)Session administrateur d'orgCoût + part du total org par clé
billing.carbonFactors(...)Session administrateur d'orgTable complète des facteurs carbone (pour les auditeurs)

Champs des événements d'utilisation

Chaque événement mesuré capture :

ChampTypeDescription
organizationIdstringOrganisation propriétaire de l'événement
occurredAtstring (ISO)Moment où l'appel de capacité s'est terminé
workspaceIdstring | nullEspace de travail à l'origine de l'appel, si connu
teamIdstring | nullÉquipe à l'origine de l'appel, si connue
userIdstring | nullUtilisateur ayant déclenché l'appel, si connu
source"workflow" | "copilot" | "chat" | "wand" | "kb_ingest" | "api"Surface produit
capability"llm" | "stt" | "embedding" | "tts" | "ocr" | "video" | "image"Catégorie de capacité
vendorstringSlug du fournisseur (ex. openai, anthropic)
modelstringIdentifiant du modèle (ex. gpt-4o, whisper-1)
regionstring | nullRégion d'hébergement utilisée pour l'estimation carbone
tokensInnumberTokens d'entrée consommés
tokensOutnumberTokens de sortie produits
unitsnumber | nullUtilisation non-token (secondes audio, pages, images, secondes vidéo)
durationMsnumberDurée réelle de l'appel de capacité
successbooleanSi l'appel a réussi
costUsdnumberCoût figé au moment de l'écriture (USD)
co2GramsnumberEstimation CO₂ figée au moment de l'écriture (grammes CO₂e)
pricingVersionstringVersion du catalogue de tarification utilisée pour calculer costUsd
carbonVersionstringVersion de la table des facteurs carbone utilisée pour calculer co2Grams
executionIdstring | nullExécution de workflow ayant déclenché l'appel, le cas échéant
workflowIdstring | nullDéfinition de workflow ayant déclenché l'appel, le cas échéant

Résumé

Retourne les totaux agrégés pour l'organisation sur une plage de dates, avec une ventilation optionnelle par dimension.

const { data, error } = await getAdminClient().billing.summary({
  organizationId: "org_abc123",
  range: { from: "2026-06-01T00:00:00Z", to: "2026-07-01T00:00:00Z" },
  groupBy: "workspace",            // optionnel
  filters: { capability: "llm" }, // filtre de dimension optionnel
})

Requête

ChampTypeRequisDescription
organizationIdstringOuiOrganisation à interroger
range.fromstring (ISO)OuiDébut de la plage (inclusif)
range.tostring (ISO)OuiFin de la plage (exclusif)
groupByUsageDimensionNonRegrouper la ventilation par cette dimension
filtersPartial<Record<UsageDimension, string>>NonRestreindre les résultats à une seule valeur de dimension

UsageDimension est l'une des valeurs suivantes : workspace, team, user, source, capability, vendor, model, region.

Réponse (UsageSummary)

{
  costUsd: number,       // coût total sur la plage
  co2Grams: number,      // estimation COtotale (grammes CO₂e)
  tokensIn: number,
  tokensOut: number,
  runs: number,          // total des appels de capacité
  successes: number,
  groups: Array<{
    key: string,         // valeur de la dimension (ex. id d'espace de travail)
    costUsd: number,
    co2Grams: number,
    tokens: number,
    runs: number,
  }>,
}

Série temporelle

Retourne une série jour par jour pour visualiser la consommation dans le temps.

const { data, error } = await getAdminClient().billing.timeseries({
  organizationId: "org_abc123",
  range: { from: "2026-06-01T00:00:00Z", to: "2026-07-01T00:00:00Z" },
  granularity: "day",
  groupBy: "capability",  // optionnel
})

Requête

ChampTypeRequisDescription
organizationIdstringOuiOrganisation à interroger
range.fromstring (ISO)OuiDébut (inclusif)
range.tostring (ISO)OuiFin (exclusif)
granularity"day"OuiSeule la granularité journalière est supportée en v1
groupByUsageDimensionNonClé de regroupement supplémentaire par bucket

Réponse

{
  points: Array<{
    bucket: string,      // jour ISO (YYYY-MM-DD)
    costUsd: number,
    co2Grams: number,
    tokens: number,
    runs: number,
  }>,
}

Top-N

Retourne les N premières clés selon une métrique choisie sur une plage de dates — utile pour identifier les espaces de travail, modèles ou fournisseurs les plus coûteux.

const { data, error } = await getAdminClient().billing.topN({
  organizationId: "org_abc123",
  range: { from: "2026-06-01T00:00:00Z", to: "2026-07-01T00:00:00Z" },
  dimension: "model",
  metric: "cost_usd",
  limit: 10,
})

Requête

ChampTypeRequisDescription
organizationIdstringOuiOrganisation à interroger
rangeUsageRangeOuiPlage de dates
dimensionUsageDimensionOuiCe qu'il faut classer
metricUsageMetricOuiSelon quoi classer : cost_usd, co2_grams, tokens, runs
limitnumber (1–100)OuiNombre de lignes à retourner

Réponse

{
  rows: Array<{
    key: string,    // valeur de la dimension
    value: number,  // total de la métrique
  }>,
}

Rétrofacturation

Retourne les totaux de coût, CO₂, tokens et exécutions par clé, ainsi que la part du total de l'organisation pour chaque clé. Utilisez ceci pour l'allocation interne des coûts.

const { data, error } = await getAdminClient().billing.chargeback({
  organizationId: "org_abc123",
  range: { from: "2026-06-01T00:00:00Z", to: "2026-07-01T00:00:00Z" },
  dimension: "workspace",
})

Réponse (ChargebackRow[])

Array<{
  key: string,        // valeur de la dimension (ex. id d'espace de travail)
  costUsd: number,
  co2Grams: number,
  tokens: number,
  runs: number,
  share: number,      // 0..1 — fraction du coût total de l'org
}>

Les valeurs de share sur toutes les lignes totalisent approximativement 1. Les événements sans valeur pour la dimension choisie sont regroupés sous "(unattributed)".


Facteurs carbone

Retourne la table complète des facteurs carbone utilisée pour calculer co2Grams sur chaque événement. Destiné aux auditeurs et aux rapports ESG.

const { data, error } = await getAdminClient().billing.carbonFactors({
  organizationId: "org_abc123",
})

Réponse

{
  version: string,                    // ex. "2026.06.0" — correspond à usage_event.carbon_version
  regionFallback: string,             // région utilisée quand la région du fournisseur est inconnue
  gridGco2PerKwh: Record<string, number>,    // gCO₂e par kWh par région
  energyWhPer1k: Record<string, number>,     // Wh pour 1k tokens/unités par classe de modèle
  pue: number,                        // multiplicateur d'efficacité de l'utilisation de l'énergie
  citation: string,                   // chaîne de provenance pour l'audit
}

Méthodologie carbone

Les chiffres CO₂ sont des estimations modélisées, pas des relevés de compteur d'énergie. Présentez-les comme des estimations dans tout rapport externe.

Scrydon estime l'empreinte carbone des capacités IA à l'aide d'un modèle à trois facteurs :

CO₂ (g) = energy_per_1k_units_Wh × (total_tokens_or_units / 1000) × PUE × (grid_gco2_per_kwh / 1000)
  • Énergie par 1k tokens (Wh) : Regroupée par classe de modèle (llm_large, llm_small, embedding, stt, etc.) en utilisant des estimations d'énergie par token publiées. Les classes non-token (STT, OCR, image, vidéo) utilisent des dénominateurs par seconde audio, par page ou par image.
  • PUE (Power-Usage Effectiveness) : Un multiplicateur fixe de 1,12 — une valeur médiane dans la fourchette 1,1–1,2 publiée par les grands hyperscalers.
  • Intensité carbone du réseau électrique (gCO₂e/kWh) : Valeurs spécifiques à la région issues de bases de données publiques d'intensité carbone du réseau électrique. Les requêtes sans région d'hébergement connue utilisent la moyenne mondiale en repli (436 gCO₂e/kWh).

La table des facteurs est versionnée (carbon_version). Chaque ligne usage_event enregistre la version en vigueur au moment de l'écriture, de sorte que les totaux historiques restent reproductibles après les mises à jour des facteurs. Récupérez la table courante et sa chaîne de provenance via billing.carbonFactors(...).


Rôle requis

Tous les appels billing.summary, billing.timeseries, billing.topN, billing.chargeback et billing.carbonFactors nécessitent une session administrateur d'organisation pour l'organizationId interrogé. Un membre non-administrateur reçoit une réponse 403 Forbidden.

billing.log est un endpoint M2M interne protégé par la capacité billing:admin. Il est appelé par le runtime de capacité — pas par le code produit ni par les consommateurs du SDK.


Voir aussi

Sur cette page

Sur cette page