Accueil Commencer
Documentation

Documentation

Trois choses : comment brancher, comment lire les chiffres, et ce que le produit refuse de faire.

Brancher vos agents

Lematev parle l’API d’OpenAI. Tout client qui accepte une URL de base fonctionne — aucun SDK à installer, rien à réécrire.

python
# before
client = OpenAI(api_key=OPENAI_KEY)

# after
client = OpenAI(
    base_url="https://gw.lematev.dev/v1",
    api_key=LEMATEV_KEY,
)

Idem pour les modèles Anthropic, Mistral, Groq et DeepSeek du catalogue : vous continuez d’appeler au format OpenAI, et Lematev parle au fournisseur. Votre propre clé fournisseur se met dans les paramètres ; la facture reste la vôtre, à vos tarifs.

Nommer vos agents

C’est l’en-tête qui transforme une facture en ventilation. Sans lui, tout atterrit sous « default » et vous voyez un seul bloc — c’est-à-dire le problème que vous vouliez résoudre.

python
client.chat.completions.create(
    model="gpt-5",
    messages=messages,
    extra_headers={
        "x-lematev-agent": "support-triage",
        "x-lematev-run":   run_id,
    },
)

Nous dire quand une tâche a échoué

Par défaut, un appel compte comme réussi dès que le fournisseur répond. Cela mesure si l’appel HTTP a fonctionné, pas si la réponse était bonne — le routage apprend donc sur un signal faible tant que vous ne fermez pas la boucle.

python
requests.post(
    "https://gw.lematev.dev/v1/feedback",
    headers={"x-lematev-key": LEMATEV_KEY},
    json={"call_id": call_id, "success": False},
)

Un appel après un échec suffit. Il révise l’observation au lieu d’en ajouter une seconde, et le routeur cesse de préférer un modèle qui paraissait bon marché parce que ses échecs n’étaient jamais comptés.

Streaming

Passez `stream=True` comme vous le feriez au fournisseur. Vous recevez ses propres fragments, dans son format, donc le temps jusqu’au premier token n’est pas quelque chose que nous allongeons.

python
stream = client.chat.completions.create(
    model="gpt-5", messages=messages, stream=True,
    extra_headers={"x-lematev-agent": "support-triage"},
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

Deux différences à connaître. La comptabilisation a lieu à la fin du flux — ou si votre client s’en va en cours de réponse, car les tokens ont été dépensés que quelqu’un les lise ou non. Et là où un fournisseur ne parle pas nativement le format de streaming OpenAI, nous tamponnons sa réponse et la réémettons en flux valide : le premier token arrive donc plus tard pour ces modèles. Le tableau de bord indique quels appels ont été réémis.

Lire les chiffres

Quatre chiffres, et ils ne veulent pas dire la même chose.

Économisé et Évité ne sont jamais additionnés. L’un est une réduction vérifiable sur une facture ; l’autre est de l’argent qui n’a jamais été dépensé.

Coût par tâche réussie

La colonne qui compte. Un modèle bon marché qui échoue et repart en retry coûte plus cher qu’un seul appel premium qui aboutit, et un prix par appel masque précisément cela.

C’est aussi pourquoi le routeur ne prend pas simplement le modèle le moins cher : il chiffre le coût espéré pour obtenir une tâche terminée, échecs compris. Sur certains agents, cela veut dire garder le modèle cher — et il le dit.

Rapprocher de votre facture fournisseur

La première chose que fait une équipe finance, c’est additionner la facture et comparer. Deux sommes doivent tomber juste, et le tableau de bord montre les deux.

reconciliation
  your agents                     $ 81.72
+ counterfactual replays          $  2.34
  ──────────────────────────────────────
= what your provider bills        $ 84.06

  baseline (what you would have paid)   $127.96
− savings                               $ 46.24
  ──────────────────────────────────────
= your agents                           $ 81.72

Est-ce devenu plus lent ?

L’autre moitié de ce que coûtent les économies, et la première question de vos ingénieurs. Basculer du trafic sur un modèle moins cher ne vaut rien si vos utilisateurs attendent désormais.

Regarder un mois, ou une année

Les fenêtres glissantes répondent à « où en sommes-nous ». Elles ne répondent pas à « l’an dernier s’est-il remboursé », qui est la question dont dépend un renouvellement.

Les écrans

Les règles que vous posez par agent

Le routage est automatique ; voici où vous le contredisez. Chacune est par agent, parce que l’agent qui traite les remboursements et celui qui rédige les notes de version ne méritent pas le même traitement.

Un modèle épinglé dans un en-tête de requête est quand même confronté à vos règles. Un épinglage est une sortie de secours, pas un moyen de contourner une politique que vous avez posée.

Budgets et alertes

Un plafond mensuel de dépense modèle, par espace de travail. Le seul contrôle ici qui puisse réellement empêcher l’argent de sortir.

webhook payload
{
  "event":     "budget.exceeded",
  "workspace": "Production",
  "agent":     "support-triage",
  "spent_usd": 412.80,
  "budget_usd": 400.00
}

D’où viennent les économies

Quatre mécanismes, affichés séparément plutôt qu’en un seul chiffre, pour que vous sachiez lequel travaille pour vous.

Mesuré, pas modélisé

Le point faible de toute promesse d’économie dans cette catégorie, c’est que la référence est un modèle : « vous auriez payé X » est une affirmation. Nous mettons de la preuve dessous.

Ce qu’il refuse de faire

Lematev est dans votre chemin de requête, donc il peut arrêter un appel plutôt que le signaler. Trois choses renvoient une erreur au lieu d’une réponse.

Aucun de ces cas n’est silencieux : chacun porte un code exploitable par machine et une phrase disant ce qui s’est passé, pour que votre gestion d’erreurs les distingue d’une panne fournisseur.

Gérer les erreurs

Un refus n’est pas une panne fournisseur, et votre code ne doit pas le traiter comme tel. Chacun porte un code exploitable et une phrase, à côté du format d’erreur OpenAI standard que votre client sait déjà lire.

json
{
  "error": {
    "message": "3 identical calls detected in this run…",
    "type":    "lematev_execution_stopped",
    "code":    "identical_repeat"
  },
  "lematev": {
    "run_id": "run_9f2c…",
    "estimated_usd_saved": 0.58
  }
}

Deux codes sont les nôtres. 409 signifie qu’une exécution a été arrêtée — la relancer est exactement ce qu’il ne faut pas faire. 402 signifie qu’un plafond est atteint : la requête n’a rien d’invalide, le compte a atteint ce qu’il paie.

python
except openai.APIStatusError as e:
    body = e.response.json()
    # 409 is ours: the run was stopped, not the provider failing.
    if e.status_code == 409:
        alert("agent looping", body["lematev"]["run_id"])
    elif e.status_code == 402:
        alert("limit reached", body["error"]["code"])
    else:
        raise

Comptes, espaces de travail et équipe

Un compte est une personne. Un espace de travail est un ensemble d’agents avec ses propres chiffres. Ce n’est pas la même chose, et la différence compte le jour où quelqu’un s’en va.

Applications mobiles et tout ce que vous ne contrôlez pas

Un téléphone ne peut pas garder de clé permanente — n’importe qui peut dézipper un paquet d’application. Émettez plutôt un jeton de courte durée depuis votre propre serveur.

your server
token = requests.post(
    "https://gw.lematev.dev/v1/client-tokens",
    headers={"authorization": f"Bearer {LEMATEV_KEY}"},
    json={"agent": "chat-mobile",
          "ttl_seconds": 600,
          "max_calls": 20},
).json()["token"]        # lmc_… — hand this to the phone

Vos données

Avant de brancher la production

Ce qu’il ne fait pas

Écrit noir sur blanc pour que vous l’appreniez ici plutôt qu’au milieu d’une intégration.

Quelque chose d’obscur, ou qui manque ? support@lematev.dev