feat: improve error messaging for stream termination errors from provider (#10548)

This commit is contained in:
Daniel 2026-01-09 10:03:12 -05:00 committed by GitHub
parent 7b771a209e
commit b7bd859473
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 38 additions and 19 deletions

View file

@ -3257,9 +3257,10 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
// Determine cancellation reason
const cancelReason: ClineApiReqCancelReason = this.abort ? "user_cancelled" : "streaming_failed"
const rawErrorMessage = error.message ?? JSON.stringify(serializeError(error), null, 2)
const streamingFailedMessage = this.abort
? undefined
: (error.message ?? JSON.stringify(serializeError(error), null, 2))
: `${t("common:interruption.streamTerminatedByProvider")}: ${rawErrorMessage}`
// Clean up partial state
await abortStream(cancelReason, streamingFailedMessage)

View file

@ -176,7 +176,8 @@
},
"interruption": {
"responseInterruptedByUser": "Resposta interrompuda per l'usuari",
"responseInterruptedByApiError": "Resposta interrompuda per error d'API"
"responseInterruptedByApiError": "Resposta interrompuda per error d'API",
"streamTerminatedByProvider": "El proveïdor ha finalitzat la sol·licitud"
},
"storage": {
"prompt_custom_path": "Introdueix una ruta d'emmagatzematge personalitzada per a l'historial de converses o deixa-ho buit per utilitzar la ubicació predeterminada",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Antwort vom Benutzer unterbrochen",
"responseInterruptedByApiError": "Antwort durch API-Fehler unterbrochen"
"responseInterruptedByApiError": "Antwort durch API-Fehler unterbrochen",
"streamTerminatedByProvider": "Der Anbieter hat die Anfrage beendet"
},
"storage": {
"prompt_custom_path": "Gib den benutzerdefinierten Speicherpfad für den Gesprächsverlauf ein, leer lassen für Standardspeicherort",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Response interrupted by user",
"responseInterruptedByApiError": "Response interrupted by API error"
"responseInterruptedByApiError": "Response interrupted by API error",
"streamTerminatedByProvider": "Provider ended the request"
},
"storage": {
"prompt_custom_path": "Enter custom conversation history storage path, leave empty to use default location",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Respuesta interrumpida por el usuario",
"responseInterruptedByApiError": "Respuesta interrumpida por error de API"
"responseInterruptedByApiError": "Respuesta interrumpida por error de API",
"streamTerminatedByProvider": "El proveedor finalizó la solicitud"
},
"storage": {
"prompt_custom_path": "Ingresa la ruta de almacenamiento personalizada para el historial de conversaciones, déjala vacía para usar la ubicación predeterminada",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Réponse interrompue par l'utilisateur",
"responseInterruptedByApiError": "Réponse interrompue par une erreur d'API"
"responseInterruptedByApiError": "Réponse interrompue par une erreur d'API",
"streamTerminatedByProvider": "Le fournisseur a terminé la demande"
},
"storage": {
"prompt_custom_path": "Entrez le chemin de stockage personnalisé pour l'historique des conversations, laissez vide pour utiliser l'emplacement par défaut",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "उपयोगकर्ता द्वारा प्रतिक्रिया बाधित",
"responseInterruptedByApiError": "API त्रुटि द्वारा प्रतिक्रिया बाधित"
"responseInterruptedByApiError": "API त्रुटि द्वारा प्रतिक्रिया बाधित",
"streamTerminatedByProvider": "प्रदाता ने अनुरोध समाप्त किया"
},
"storage": {
"prompt_custom_path": "वार्तालाप इतिहास के लिए कस्टम स्टोरेज पाथ दर्ज करें, डिफ़ॉल्ट स्थान का उपयोग करने के लिए खाली छोड़ दें",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Respons diinterupsi oleh pengguna",
"responseInterruptedByApiError": "Respons diinterupsi oleh error API"
"responseInterruptedByApiError": "Respons diinterupsi oleh error API",
"streamTerminatedByProvider": "Penyedia mengakhiri permintaan"
},
"storage": {
"prompt_custom_path": "Masukkan path penyimpanan riwayat percakapan kustom, biarkan kosong untuk menggunakan lokasi default",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Risposta interrotta dall'utente",
"responseInterruptedByApiError": "Risposta interrotta da errore API"
"responseInterruptedByApiError": "Risposta interrotta da errore API",
"streamTerminatedByProvider": "Il provider ha terminato la richiesta"
},
"storage": {
"prompt_custom_path": "Inserisci il percorso di archiviazione personalizzato per la cronologia delle conversazioni, lascia vuoto per utilizzare la posizione predefinita",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "ユーザーによって応答が中断されました",
"responseInterruptedByApiError": "APIエラーによって応答が中断されました"
"responseInterruptedByApiError": "APIエラーによって応答が中断されました",
"streamTerminatedByProvider": "プロバイダーがリクエストを終了しました"
},
"storage": {
"prompt_custom_path": "会話履歴のカスタムストレージパスを入力してください。デフォルトの場所を使用する場合は空のままにしてください",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "사용자에 의해 응답이 중단됨",
"responseInterruptedByApiError": "API 오류로 인해 응답이 중단됨"
"responseInterruptedByApiError": "API 오류로 인해 응답이 중단됨",
"streamTerminatedByProvider": "제공자가 요청을 종료함"
},
"storage": {
"prompt_custom_path": "대화 내역을 위한 사용자 지정 저장 경로를 입력하세요. 기본 위치를 사용하려면 비워두세요",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Reactie onderbroken door gebruiker",
"responseInterruptedByApiError": "Reactie onderbroken door API-fout"
"responseInterruptedByApiError": "Reactie onderbroken door API-fout",
"streamTerminatedByProvider": "Provider heeft het verzoek beëindigd"
},
"storage": {
"prompt_custom_path": "Voer een aangepast opslagpad voor gespreksgeschiedenis in, laat leeg voor standaardlocatie",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Odpowiedź przerwana przez użytkownika",
"responseInterruptedByApiError": "Odpowiedź przerwana przez błąd API"
"responseInterruptedByApiError": "Odpowiedź przerwana przez błąd API",
"streamTerminatedByProvider": "Dostawca zakończył żądanie"
},
"storage": {
"prompt_custom_path": "Wprowadź niestandardową ścieżkę przechowywania dla historii konwersacji lub pozostaw puste, aby użyć lokalizacji domyślnej",

View file

@ -176,7 +176,8 @@
},
"interruption": {
"responseInterruptedByUser": "Resposta interrompida pelo usuário",
"responseInterruptedByApiError": "Resposta interrompida por erro da API"
"responseInterruptedByApiError": "Resposta interrompida por erro da API",
"streamTerminatedByProvider": "Provedor encerrou a solicitação"
},
"storage": {
"prompt_custom_path": "Digite o caminho de armazenamento personalizado para o histórico de conversas, deixe em branco para usar o local padrão",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Ответ прерван пользователем",
"responseInterruptedByApiError": "Ответ прерван ошибкой API"
"responseInterruptedByApiError": "Ответ прерван ошибкой API",
"streamTerminatedByProvider": "Провайдер завершил запрос"
},
"storage": {
"prompt_custom_path": "Введите пользовательский путь хранения истории разговоров, оставьте пустым для использования расположения по умолчанию",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Yanıt kullanıcı tarafından kesildi",
"responseInterruptedByApiError": "Yanıt API hatası nedeniyle kesildi"
"responseInterruptedByApiError": "Yanıt API hatası nedeniyle kesildi",
"streamTerminatedByProvider": "Sağlayıcı isteği sonlandırdı"
},
"storage": {
"prompt_custom_path": "Konuşma geçmişi için özel depolama yolunu girin, varsayılan konumu kullanmak için boş bırakın",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "Phản hồi bị gián đoạn bởi người dùng",
"responseInterruptedByApiError": "Phản hồi bị gián đoạn bởi lỗi API"
"responseInterruptedByApiError": "Phản hồi bị gián đoạn bởi lỗi API",
"streamTerminatedByProvider": "Nhà cung cấp đã kết thúc yêu cầu"
},
"storage": {
"prompt_custom_path": "Nhập đường dẫn lưu trữ tùy chỉnh cho lịch sử hội thoại, để trống để sử dụng vị trí mặc định",

View file

@ -177,7 +177,8 @@
},
"interruption": {
"responseInterruptedByUser": "响应被用户中断",
"responseInterruptedByApiError": "响应被 API 错误中断"
"responseInterruptedByApiError": "响应被 API 错误中断",
"streamTerminatedByProvider": "提供方终止了请求"
},
"storage": {
"prompt_custom_path": "输入自定义会话历史存储路径,留空以使用默认位置",

View file

@ -172,7 +172,8 @@
},
"interruption": {
"responseInterruptedByUser": "回應被使用者中斷",
"responseInterruptedByApiError": "回應被 API 錯誤中斷"
"responseInterruptedByApiError": "回應被 API 錯誤中斷",
"streamTerminatedByProvider": "提供方終止了請求"
},
"storage": {
"prompt_custom_path": "輸入自訂會話歷史儲存路徑,留空以使用預設位置",