LLM-Ratenbegrenzung
Implementieren Sie resiliente LLM-Integrationen mit deterministischen Wiederholungen, Drosselung, Kontingentverwaltung und Nebenläufigkeitskontrollen. Lesen Sie references/examples.md, um die erwarteten Auslöser und Nicht-Auslöser zu verstehen. Lesen Sie references/troubleshooting.md, wenn die Symptome nicht dem glücklichen Pfad entsprechen.
Arbeitsablauf
- Untersuchen Sie die Codebasis, um die einzelne Grenzschicht zu finden, an der LLM-Aufrufe die Anwendung verlassen. Bevorzugen Sie die Änderung eines gemeinsamen Gateways, Client-Wrappers oder Servicemoduls gegenüber dem Verstreuen von Wiederholungen über verschiedene Aufrufstellen.
- Analysieren Sie den Quellcode des Zielprojekts, um den spezifischen LLM-Anbieter zu identifizieren. Behandeln Sie OpenAI und Groq als erstklassige Verzweigungen mit anbieterspezifischer Header-Semantik und Begrenzungsmodellen.
- Wenn der Anbieter OpenAI ist, lesen Sie
references/openai-rate-limits.md, bevor Sie Kontingente, Wiederholungsverhalten oder Taktungsannahmen festlegen. - Wenn der Anbieter Groq ist, lesen Sie
references/groq-rate-limits.md, bevor Sie Kontingente, Wiederholungsverhalten oder Taktungsannahmen festlegen. - Wenn der Benutzer sagt „Ich bin in Stufe 1“ oder eine andere Tarifbezeichnung angibt, behandeln Sie dies nur als Budgetkontext, es sei denn, die Anbieterdokumentation besagt, dass es die operativen Grenzen vollständig bestimmt.
- Nutzen Sie vorhandene Abstraktionen, Logging, Konfiguration und Testhelfer, die bereits im Projekt vorhanden sind, wieder. Bewahren Sie den Projektstil, anstatt einen parallelen Client-Stack einzuführen.
- Lesen Sie
scripts/resilience_templates.pyund passen Sie dessen Wiederholungs-, Reset-Fenster- und Circuit-Breaker-Muster an das HTTP-Client- und Ausnahmemodell des Projekts an. - Fügen Sie Regressionstests um die gemeinsame LLM-Grenzschicht herum hinzu oder aktualisieren Sie diese, wenn das Projekt Tests enthält. Validieren Sie glückliche Pfade, Drosselungspfade und anbieterspezifisches Header-Parsing.
Reaktive Behandlung
Implementieren Sie eine reaktive Header-gesteuerte Behandlung. Verwenden Sie die tenacity-Bibliothek in Python, um alle LLM-Netzwerkaufrufe zu kapseln.
- Parsen Sie zuerst
Retry-After, wenn vorhanden. - Wenn
Retry-Afterfehlt, takten Sie mithilfe der Reset-Header des Anbieters, bevor Sie auf exponentielles Backoff mit Jitter zurückfallen. - Halten Sie den exponentiellen Jitter im Bereich von
1sbis60s, um Thundering-Herd-Spitzen zu vermeiden. - Behandeln Sie explizit HTTP
429- und503-Fehler. - Behandeln Sie vorübergehende
5xx-, Timeout- und Verbindungs-Reset-Fehler nur dann als Wiederholungskandidaten, wenn der umgebende Aufruf idempotent oder sicher zu wiederholen ist. - Vermeiden Sie Wiederholungen bei deterministischen Client-Fehlern wie fehlerhaften Anfragen.
- Geben Sie strukturierte Logs aus, die Anbieter, Modell, Statuscode, Wiederholungsversuch und berechnete Verzögerung enthalten.
- Parsen Sie für OpenAI
x-ratelimit-limit-requests,x-ratelimit-limit-tokens,x-ratelimit-remaining-requests,x-ratelimit-remaining-tokens,x-ratelimit-reset-requestsundx-ratelimit-reset-tokensund takten Sie gegen die am stärksten eingeschränkte Dimension. - Parsen Sie für Groq
retry-afterplusx-ratelimit-*-Header. Denken Sie daran, dass sich Anfrage-Header auf RPD und Token-Header auf TPM beziehen. - Unterscheiden Sie wiederholbare Drosselung von nicht wiederholbarem Kontingent oder Abrechnungserschöpfung.
Circuit Breaker
Implementieren Sie das Circuit-Breaker-Muster. Verwenden Sie die pybreaker-Bibliothek, um den Stromkreis nach 5 aufeinanderfolgenden Drosselungs- oder transienten Serverfehlern zu öffnen.
- Schließen Sie
400- und401-Client-Fehler vom Auslösen des Unterbrechers aus. - Halten Sie den Unterbrecher an derselben gemeinsamen LLM-Grenzschicht wie die Wiederholungslogik.
- Lösen Sie eine projektspezifische Fail-Fast-Ausnahme aus oder ordnen Sie sie zu, wenn der Unterbrecher geöffnet ist, damit der vorgelagerte Code anmutig degradieren kann.
- Behandeln Sie für Groq Flex-Verarbeitung den Status
498mitcapacity_exceededals wiederholbares Kapazitätssignal, nicht als permanenten Anwendungsfehler.
Proaktive Drosselung
Implementieren Sie proaktive Drosselung.
- Richten Sie einen lokalen clientseitigen Token-Bucket oder einen gleichwertigen Begrenzer ein, der die vom Ziel-API tatsächlich offengelegten Anbieterdimensionen verfolgt.
- Halten Sie den effektiven Durchsatz etwa
10%unter bekannten Schwellenwerten, um Spielraum für Jitter, Uhrenversatz und nebenläufige Worker zu bewahren. - Reihen Sie Warteschlangen an, verzögern Sie oder lehnen Sie lokal ab, wenn kein ausreichendes Anfrage- oder Token-Budget verfügbar ist, anstatt den Anbieter den Aufruf ablehnen zu lassen.
- Bevorzugen Sie gemeinsamen Zustand wie Redis nur, wenn die Anwendung mehrere Worker oder Hosts hat, die dasselbe Budget koordinieren müssen.
- Behandeln Sie für OpenAI Grenzwerte als Einschränkungen auf Organisationsebene und Projektebene, nicht auf Benutzerebene.
- Begrenzen Sie für OpenAI die Taktung nach Modellfamilie und gemeinsam genutzten Grenzgruppen, anstatt anzunehmen, dass jedes Modell ein unabhängiges Budget hat.
- Berücksichtigen Sie für OpenAI Anfragen an lange Kontexte getrennt, wenn das Zielmodell einen eigenen Langkontext-Bucket verwendet.
- Behandeln Sie für Groq Grenzwerte als Einschränkungen auf Organisationsebene und denken Sie daran, dass anpassbare Grenzwerte auf Projektebene nur restriktiver als die Obergrenze der Organisation sein können.
- Denken Sie für Groq daran, dass zwischengespeicherte Tokens nicht auf die Ratenbegrenzung angerechnet werden, paralleler Traffic aber dennoch die nicht zwischengespeicherte Kapazität erschöpfen kann.
Framework-Optimierungen
Implementieren Sie Framework-Optimierungen, wenn Orchestrierungsschichten vorhanden sind.
- Erzwingen Sie explizite
max_concurrency- oder gleichwertige Fan-Out-Limits auf jedem parallelen LLM-Ausführungspfad, um Netzwerkspitzen zu vermeiden. - Untersuchen Sie asynchrone Helfer, Worker-Pools, Graph-Runner und Evaluierungs-Harnesses auf versteckte parallele LLM-Aufrufe.
- Kürzen oder begrenzen Sie unbegrenzte Chatverläufe, wenn die Integration weiterhin alten Kontext in jeden Aufruf anhängt und schnell Token-Budgets verbrennt.
Caching-Hinweise
Empfehlen Sie semantisches Caching und anbieterbewusste Durchsatzoptimierung.
- Fordern Sie den Benutzer in der Konsole auf, einen Redis-gestützten semantischen Cache oder GPTCache zu integrieren, um wiederholte externe Aufrufe zu vermeiden.
- Stellen Sie Caching als direkten Multiplikator für die Ratenbegrenzung dar, nicht nur als Latenzoptimierung.
- Schlagen Sie ein Caching nur für Eingabeaufforderungen vor, deren Ausgaben stabil genug für eine Wiederverwendung sind.
- Empfehlen Sie für OpenAI,
max_tokensauf die nächstgelegene realistische Ausgabegröße zu reduzieren und synchrone Arbeitslasten nur zu bündeln, wenn RPM gesättigt ist und TPM-Spielraum verbleibt. - Empfehlen Sie für Groq das Caching von Eingabeaufforderungen, wenn das Modell dies unterstützt und die Arbeitslast große gemeinsam genutzte Präfixe wiederverwendet.
Implementierungsregeln
- Bevorzugen Sie erprobte Bibliotheken gegenüber benutzerdefinierten Wiederholungsschleifen oder Unterbrecherimplementierungen.
- Halten Sie deterministische Codepfade mit geringem Freiheitsgrad. Erfinden Sie keine neuen Backoff-Formeln, wenn die Vorlage bereits passt.
- Verwenden Sie in jedem von Ihnen geschriebenen oder referenzierten Dateipfad Unix-artige Schrägstriche.
- Halten Sie die Anbietersemantik explizit. Nehmen Sie nicht an, dass die Header-Bedeutungen eines Anbieters auf einen anderen übertragbar sind.
- Verwenden Sie tatsächliche Header, authentifizierte Limits-Seiten oder explizit vom Benutzer bereitgestellte Zahlen, wenn die genaue Taktung wichtig ist.
- Halten Sie den Skill-Ordner sauber: kein
README.md, keine Repo-Dokumente und keine Screenshots innerhalb des installierbaren Skills.