Partager via


LanguageModelRateLimitingPlugin

Simule la limitation du débit basé sur les jetons pour les API du modèle de langage en suivant l’invite et la consommation de jetons d’achèvement dans les fenêtres de temps configurables.

Capture d’écran d’une invite de commandes avec le proxy de développement qui simule une réponse de limitation du débit de modèle de langage pour une demande d’API LLM.

Définition de l’instance de plug-in

{
  "name": "LanguageModelRateLimitingPlugin",
  "enabled": true,
  "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
  "configSection": "languageModelRateLimitingPlugin",
  "urlsToWatch": [
    "https://api.openai.com/*",
    "http://localhost:11434/*"
  ]
}

Configuration example

{
  "languageModelRateLimitingPlugin": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/languagemodelratelimitingplugin.schema.json",
    "promptTokenLimit": 5000,
    "completionTokenLimit": 5000,
    "resetTimeWindowSeconds": 60,
    "whenLimitExceeded": "Throttle",
    "headerRetryAfter": "retry-after"
  }
}

Configuration properties

Property Description Default
promptTokenLimit Nombre maximal de jetons d’invite autorisés dans la fenêtre de temps. 5000
completionTokenLimit Nombre maximal de jetons d’achèvement autorisés dans la fenêtre de temps. 5000
resetTimeWindowSeconds Fenêtre de temps en secondes après laquelle les limites de jeton sont réinitialisées. 60
whenLimitExceeded Comportement de réponse lorsque les limites de jeton sont dépassées. Peut être Throttle ou Custom. Throttle
headerRetryAfter Nom de l’en-tête HTTP à inclure les informations de nouvelle tentative après tentative. retry-after
customResponseFile Chemin d’accès au fichier contenant une réponse personnalisée lorsqu’il whenLimitExceeded est défini sur Custom. token-limit-response.json

Configuration de la réponse personnalisée

Quand whenLimitExceeded la valeur est définie Custom, vous pouvez définir une réponse personnalisée dans un fichier JSON distinct :

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v1.0.0/languagemodelratelimitingplugin.customresponsefile.schema.json",
  "statusCode": 429,
  "headers": [
    {
      "name": "retry-after",
      "value": "@dynamic"
    },
    {
      "name": "content-type",
      "value": "application/json"
    }
  ],
  "body": {
    "error": {
      "message": "You have exceeded your token quota. Please wait before making additional requests.",
      "type": "insufficient_quota",
      "code": "token_quota_exceeded"
    }
  }
}

Propriétés de réponse personnalisées

Property Description
statusCode Code d’état HTTP à retourner lorsque la limite de jeton est dépassée.
headers Tableau d’en-têtes HTTP à inclure dans la réponse. Utilisez cette option @dynamic pour effectuer une nouvelle tentative pour calculer automatiquement les secondes jusqu’à la réinitialisation.
body Objet corps de réponse sérialisé en JSON.

Fonctionnement

LanguageModelRateLimitingPlugin fonctionne par :

  1. Interception des demandes d’API OpenAI : surveille les requêtes POST aux URL configurées qui contiennent des corps de requête compatibles OpenAI
  2. Suivi de la consommation de jetons : analyse les réponses à extraire prompt_tokens et completion_tokens à partir de la section Utilisation
  3. Enforcing limits: Maintains running totals of consumed tokens within the configured time window
  4. Fourniture de réponses de limitation : lorsque les limites sont dépassées, retourne des réponses de limitation standard ou des réponses personnalisées

Types de requêtes pris en charge

Le plug-in prend en charge les demandes de saisie semi-automatique OpenAI et de saisie semi-automatique :

  • Completion requests: Requests with a prompt property
  • Demandes de saisie semi-automatique de conversation : demandes avec une messages propriété

Token tracking

La consommation de jetons est suivie séparément pour :

  • Prompt tokens: Input tokens consumed by the request
  • Completion tokens: Output tokens generated by the response

Lorsque l’une ou l’autre limite est dépassée, les requêtes suivantes sont limitées jusqu’à ce que la fenêtre de temps soit réinitialisée.

Comportement de la fenêtre de temps

  • Réinitialisation des limites de jeton après la configuration resetTimeWindowSeconds
  • Le minuteur de réinitialisation démarre lorsque la première requête est traitée
  • Lorsqu’une fenêtre de temps expire, les compteurs de jetons d’invite et d’achèvement sont réinitialisés à leurs limites configurées

Réponse de limitation par défaut

Lorsqu’il whenLimitExceeded est défini Throttlesur , le plug-in retourne une réponse d’erreur compatible OpenAI standard :

{
  "error": {
    "message": "You exceeded your current quota, please check your plan and billing details.",
    "type": "insufficient_quota",
    "param": null,
    "code": "insufficient_quota"
  }
}

La réponse inclut :

  • Code d’état HTTP : 429 Too Many Requests
  • retry-after en-tête avec secondes jusqu’à la réinitialisation des limites de jeton
  • En-têtes CORS lorsque la requête d’origine inclut un Origin en-tête

Use cases

LanguageModelRateLimitingPlugin est utile pour :

  • Test de la limitation du débit basé sur les jetons : simuler le comportement de votre application lorsque les fournisseurs de modèles de langage appliquent des quotas de jetons
  • Simulation des coûts de développement : Comprendre les modèles de consommation de jetons pendant le développement avant d’atteindre des limites d’API réelles
  • Resilience testing: Verify that your application properly handles token limit errors and implements appropriate retry logic
  • Test LLM local : tester des scénarios de limitation des jetons avec des modèles de langage local (comme Ollama) qui n’appliquent pas leurs propres limites

Example scenarios

Scénario 1 : Limitation des jetons de base

{
  "languageModelRateLimitingPlugin": {
    "promptTokenLimit": 1000,
    "completionTokenLimit": 500,
    "resetTimeWindowSeconds": 300
  }
}

Cette configuration permet jusqu’à 1 000 jetons d’invite et 500 jetons d’achèvement dans une fenêtre de 5 minutes.

Scénario 2 : Réponses d’erreur personnalisées

{
  "languageModelRateLimitingPlugin": {
    "promptTokenLimit": 2000,
    "completionTokenLimit": 1000,
    "resetTimeWindowSeconds": 60,
    "whenLimitExceeded": "Custom",
    "customResponseFile": "custom-token-error.json"
  }
}

Cette configuration utilise un fichier de réponse personnalisé pour fournir des messages d’erreur spécialisés lorsque les limites de jeton sont dépassées.

Next step