Last 20% — API

Référence API

Le proxy transparent last20 s'intercale entre ton code et les fournisseurs IA (OpenAI, Anthropic, Google, Mistral) pour analyser chaque réponse en arrière-plan — sans modifier ton code applicatif.

Introduction

last20 fournit un proxy HTTP qui relaye les requêtes vers les API LLM des grands fournisseurs. Tu remplaces simplement la baseURL de ton SDK et tu ajoutes deux headers : ta clé last20 (qui authentifie ton compte) et ta clé provider (qui authentifie auprès du fournisseur).

Le proxy renvoie la réponse inchangée, et déclenche en parallèle une analyse pour détecter hallucinations, dérives qualité, artefacts et coûts excessifs. Streaming SSE supporté nativement.

Base URL

https://www.last20.fr/api/proxy

Authentification

Chaque requête doit inclure le header X-Last20-Key avec ta clé last20 (préfixée l20_). Tu la génères depuis /dashboard/settings.

La clé est hashée (SHA-256) avant stockage : on ne peut donc pas la lire en clair côté serveur, même nous. Si tu la perds, tu peux la régénérer — l'ancienne sera révoquée immédiatement.

En plus de X-Last20-Key, ajoute la clé du fournisseur ciblé selon l'endpoint :

  • X-OpenAI-Key — pour /chat/completions
  • X-Anthropic-Key — pour /anthropic
  • X-Google-Key — pour /google
  • X-Mistral-Key — pour /mistral

Confidentialité : ta clé provider n'est jamais persistée par last20. Elle transite uniquement dans le header de ta requête vers le provider.

Quickstart par provider

Tu utilises déjà OpenAI, Anthropic, Google Gemini ou Mistral ? Choisis ton provider, copie le bloc « Après », remplace ton code existant. Trois étapes, deux minutes — le reste de ton application fonctionne à l'identique (tools, streaming, structured outputs).

Quel provider utilises-tu ?

Tu utilises OpenAI ?

Trois étapes, deux minutes, et ton agent est sous monitoring.

Tu n'as pas de clé OpenAI ? Crée-en une gratuitement → platform.openai.com/api-keys
1

Trouve ce fichier dans ton code

C'est là où tu as écrit `new OpenAI(...)`.

Chemins typiques

lib/openai.tslib/ai.tsapp/api/chat/route.ts
2

Remplace par ça

Les seuls vrais changements : la baseURL et deux headers.

AvantPas de monitoring
const openai = new OpenAI({
  apiKey: "sk-ta-clé-openai",
})
Après
const openai = new OpenAI({
  apiKey: "ignored",
  baseURL: "https://www.last20.fr/api/proxy",
  defaultHeaders: {
    "X-Last20-Key": "l20_ta-clé-last20",
    "X-OpenAI-Key": "sk-ta-clé-openai",
  },
})
Remplace l20_ta-clé-last20 par ta clé générée depuis /dashboard/settings.

C'est tout !

✓ Ton agent est surveillé dès que tu envoies ta première requête.

Au prochain appel, l'analyse apparaît automatiquement dans /dashboard/agents et /dashboard/analytics — hallucinations, dérives qualité, coûts tokens, le tout en temps réel. Tools, streaming, structured outputs et function calling passent à travers comme avant.

Ne partage jamais ta clé last20 publiquement

Elle donne accès à ton quota d'analyses. Garde-la dans ton .env.local / variables d'environnement Vercel — jamais dans du code commité, jamais dans un bundle client. Si tu penses qu'elle a fuité, régénère-la depuis /dashboard/settings — l'ancienne est révoquée immédiatement.

Tu bloques quelque part ?

Écris-nous à contact@last20.fr avec ton message d'erreur ou un screenshot — réponse sous 24h, ou plus rapide si tu es sur le plan Pro/Scale.

Endpoints supportés

POST/api/proxy/chat/completions

Compatible OpenAI Chat Completions. Forwarde vers api.openai.com/v1/chat/completions.

Headers : X-Last20-Key, X-OpenAI-Key

Champ optionnel agent_id dans le body pour rattacher l'analyse à un agent monitoré.

POST/api/proxy/anthropic

Compatible Anthropic Messages. Forwarde vers api.anthropic.com/v1/messages.

Headers : X-Last20-Key, X-Anthropic-Key

POST/api/proxy/google

Google Gemini generateContent. Le champ model du body est requis et est extrait pour construire l'URL upstream.

Headers : X-Last20-Key, X-Google-Key

POST/api/proxy/mistral

Compatible Mistral Chat Completions. Forwarde vers api.mistral.ai/v1/chat/completions.

Headers : X-Last20-Key, X-Mistral-Key

Exemples avancés

Pour aller plus loin : Python, cURL, mode mock, Anthropic en raw HTTP. Pour le quickstart par provider, voir ci-dessus.

javascript
import OpenAI from "openai";

const openai = new OpenAI({
  apiKey: "ignored",
  baseURL: "https://www.last20.fr/api/proxy",
  defaultHeaders: {
    "X-Last20-Key": "l20_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "X-OpenAI-Key": "sk-...",
  },
});

const completion = await openai.chat.completions.create({
  model: "gpt-4o",
  messages: [{ role: "user", content: "Hello" }],
});

console.log(completion.choices[0].message.content);

Anthropic

curl
curl https://www.last20.fr/api/proxy/anthropic \
  -H "Content-Type: application/json" \
  -H "X-Last20-Key: l20_..." \
  -H "X-Anthropic-Key: sk-ant-..." \
  -d '{
    "model": "claude-3-5-sonnet-20241022",
    "max_tokens": 1024,
    "messages": [{"role": "user", "content": "Hello"}]
  }'

Mode mock (test sans clé)

Passe la valeur mock dans le header provider pour recevoir une réponse canned — utile pour tester l'intégration et l'analyse sans consommer de tokens réels.

bash
# X-OpenAI-Key: mock → réponse fictive sans appel à OpenAI
curl https://www.last20.fr/api/proxy/chat/completions \
  -H "X-Last20-Key: l20_..." \
  -H "X-OpenAI-Key: mock" \
  -d '{"model":"any","messages":[{"role":"user","content":"test"}]}'

Codes d'erreur

CodeTypeQuand
401authentication_errorClé last20 manquante, invalide ou révoquée. Clé provider absente.
429rate_limit_errorQuota mensuel d'analyses dépassé sur le plan free. Upgrade vers pro.
502proxy_errorLe provider upstream est injoignable.
503service_unavailableMaintenance ou indisponibilité temporaire du proxy.

Les erreurs upstream du provider (rate limit OpenAI, modèle inconnu, etc.) sont relayées telles quelles, status code et body inclus.

Limites par plan

PlanAgentsAnalyses / moisHistorique
Free11007 jours
Pro5illimité30 jours
Scaleillimitéillimité90 jours

Voir /pricing pour le détail des fonctionnalités (alertes, équipe, support, etc.).

Prêt à brancher ton premier agent ?

Commencer l'onboarding