enhancement
major
minor
defect
critical
major
minor
major
#30128
Ein Aufruf ohne Anmeldedaten des Anbieters führt zu einem Authentifizierungsfehler, und der HTTP-Code 402 bedeutet bei jedem Anbieter einen Abrechnungsfehler.
Ein KI-Lauf, dessen Modell einen Anbieter ohne den entsprechenden Schlüssel enthält, schlägt mit einer Ausnahme fehl, die als ERROR („unerwarteter Fehler“) protokolliert wird, anstatt wie jeder andere Anbieterfehler zu enden, und ein Konto ohne Guthaben (HTTP 402) wird von allen Anbietern außer Anthropic als fehlerhafte Anfrage gemeldet. Aufrufer, die bei einem fehlenden Schlüssel auf einen Fallback zurückgreifen möchten, müssen vor jedem Lauf die Verfügbarkeit prüfen. Abzweigung von #30083 (03.11.2026).
Problem
Beobachtet:
- Ein Lauf, der auf einem Modell gestartet wird, dessen Anbieter keinen Schlüssel hat (Geheimnis nicht festgelegt), löst eine „TopLogicException“ außerhalb von `AgentLoop.run` aus. Das Protokoll zeigt „Agent-Lauf … unerwartet fehlgeschlagen“ mit einem Stack-Trace an; das Ergebnis des Laufs enthält keinen `errorKind`.
- Ein Anbieter, der mit einem HTTP-402-Status (Zahlung erforderlich) antwortet, beendet den Lauf mit errorKind=INVALID_REQUEST, mit Ausnahme des Anthropic-Anbieters, der „BILLING“ angibt.
Erwartet: Ein Lauf ohne Schlüssel endet wie ein Lauf, dessen Schlüssel vom Anbieter abgelehnt wurde: „StopReason.ERROR“, „errorKind=AUTHENTICATION“, ein „ProviderError“-Ereignis und eine Meldung, die das bereitzustellende Geheimnis nennt – im Chat in der Sprache des Nutzers angezeigt, der sie liest. HTTP 402 ist bei jedem Anbieter „BILLING “.
So lässt sich der Fehler reproduzieren:
- Konfigurieren Sie einen Agenten für ein Modell, dessen Anbieter-Geheimnis (z. B. tl_anthropic_api_key) nicht festgelegt ist.
- Starten Sie einen Chat mit ihm.
- Das Protokoll enthält einen ERROR mit Stack-Trace; TL-Script-Aufrufer erhalten eine Ausnahme anstelle eines fehlgeschlagenen Ergebnisses.
Ursache
AgentLoop.callRouted löst eine neue TopLogicException(unavailable) aus, wenn kein Modell des Laufs über einen Provider mit entsprechenden Anmeldedaten verfügt; in der Schleife wird diese Ausnahme nicht abgefangen. ErrorClassifier ordnet 402 der Klasse INVALID_REQUEST zu; nur AnthropicMessagesProvider hat dies überschrieben.
Vorschlag
- `callRouted` löst eine `ProviderException` vom Typ ` AUTHENTICATION` aus, sodass der Lauf wie bei jedem Provider-Fehler beendet wird. *beschlossen*
- Die Nachricht, die das Geheimnis benennt, wird als Ressourcenschlüssel übertragen: ProviderException#errorKey() und AgentEvent.ProviderError#messageKey(); der Chat übersetzt sie, wenn er den Fehler anzeigt (ChatProcessor.providerErrorMessage). Protokolle, Transkripte und das Ergebnis des Durchlaufs enthalten den Text in der Sprache des Protokolls. *beschlossen* (Überprüfung von !2084, 03.11.2026)
- ErrorClassifier klassifiziert 402 für jeden Anbieter als „BILLING “. *beschlossen*
Erledigt, wenn
- TestInactiveProvider bestanden ist: Ein Durchlauf ohne Schlüssel endet mit ERROR / AUTHENTICATION, meldet einen ProviderError, dessen Schlüssel das Geheimnis benennt, und hinterlässt keine Zustandsmarkierung.
- „TestChatErrorMessage“ erfolgreich ist: Der Chat zeigt den Schlüssel eines Anbieterfehlers in der Sprache des Benutzers an.
- „TestErrorClassifier“ erfolgreich: 402 wird als „BILLING“ klassifiziert.
Verwandte Themen
- #30083 – die ursprüngliche Version.