Notes liées
Le problème
À la fin du mois, la facture Mistral / OpenAI / GCP arrive avec un montant agrégé. Sans cost attribution, l’origine du coût reste opaque, et l’optimisation impossible.
Au-delà de “cost per model”
L’attribution naïve : “Mistral Large = 200k”. Cette granularité ne fournit aucune information actionnable.
Granularités utiles :
- Quelle feature coûte combien ? (chat, summarize, semantic search, agent X)
- Quel workflow coûte combien ? (un agent qui fait N calls vs single-shot)
- Quel tenant coûte combien ? (et est-ce aligné avec ce qu’il paie ?)
- Quel user journey coûte combien ? (un onboarding flow vs un power user habituel)
- Quel prompt template coûte combien et combien de tokens consomme ?
Comment attribuer
On attache des tags structurés à chaque appel modèle :
const response = await mistral.chat.complete({
model: "mistral-large",
messages,
metadata: {
tenant_id,
user_id,
session_id,
feature: "support_chat",
workflow: "agent_v2",
step: "tool_decision",
prompt_template: "v3.1",
}
});Puis, dans l’observability platform (23-llm-observability), on agrège :
SELECT feature, SUM(cost) GROUP BY featureSELECT tenant, SUM(cost), COUNT(*) GROUP BY tenant ORDER BY 2 DESCSELECT prompt_template, AVG(prompt_tokens) GROUP BY prompt_template
Cost models à comprendre
Per-token pricing : cost = input_tokens × input_price + output_tokens × output_price.
Détail souvent négligé : input typiquement 3-5x moins cher que output. Une feature avec long context + court output peut donc être moins chère que ne le suggère l’intuition (et inversement).
Cached tokens : Anthropic / OpenAI / Mistral facturent les cached tokens à 0.1x du prix input. À intégrer dans l’attribution. Voir 15-prompt-vs-semantic-caching.
Self-hosted : pas de per-token, mais cost = GPU_hours × GPU_hourly_rate. Ces GPU_hours doivent être imputés aux features. Typiquement : cost_per_request = GPU_hourly / (requests_per_hour).
Egress / network : non-négligeable à grande échelle (streaming, embeddings storage).
Insights typiques
- 20% des features = 80% du cost (Pareto). Cibler.
- Un workflow agent peut faire 10-50 calls par session → c’est lui qui coûte, pas le “chat one-shot” simple.
- Un tenant power user peut représenter 50% du cost d’un produit B2B → enjeu pricing.
- Un prompt template avec un bug (ex : tools redéfinis à chaque tour au lieu d’être cached) peut multiplier les coûts par 3-5x sans signal visible dans les graphs agrégés.
Cost per session vs cost per user
Distinction utile :
- Cost per request : juste le call modèle.
- Cost per session : tous les calls dans une session conversation.
- Cost per user-day : tous les sessions d’un user dans 24h.
- Cost per LTV : sur la durée de vie d’un user.
Le cost per LTV est celui qui doit s’aligner sur l’ARPU.
Budget per workflow / per tenant
Au-delà du tracking, on peut enforcer des budgets :
- Tenant free : $0.05 max/jour. Au-delà : refus + upgrade prompt.
- Workflow agent : $0.20 max/session. Au-delà : termination (18-agent-guardrails).
- Feature beta : $1000 max/jour pour la feature. Au-delà : feature flag off.
Failure modes
- Cardinality explosion : tagger avec
user_idpeut saturer le observability backend en cas de millions d’users. Utilisertenant_id+user_segment. - Missing tags : un endpoint nouvellement ajouté oublie le tag
feature→ blackhole dans le cost dashboard. - Wrong attribution : un wrapper qui hardcode
feature=chatpeut tout matcher à la mauvaise dimension. - Cached tokens non comptés : économie supposée non réelle. Vérifier le response usage.
Vocabulaire clé
cost attribution, cost per feature, cost per workflow, cost per tenant, cost per session, cost per request, unit economics, LTV/CAC, chargeback, tag cardinality, budget enforcement, tenant tier.
Synthèse
Le cost attribution dépasse le simple “cost per model”. On tagge chaque call modèle avec feature, workflow, step, prompt_template, tenant, user, session. On agrège par dimension dans l’observability platform pour identifier qui coûte quoi. Insights typiques : 20% des features = 80% du coût, un workflow agent fait 10-50 calls par session donc c’est lui qui coûte vraiment, un tenant power user peut représenter 50% du coût d’un produit B2B. Le cost per LTV doit s’aligner sur l’ARPU. On peut aussi enforcer des budgets par workflow ou par tenant — tenant free 0.20 max par session, au-delà kill switch. Failure modes : cardinality explosion si on tagge par user_id, missing tags sur les nouveaux endpoints qui créent un blackhole, et cached tokens non comptés dans les calculs.