Sfoglia il codice sorgente

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

Daniel 1 settimana fa
parent
commit
b7bd859473

+ 2 - 1
src/core/task/Task.ts

@@ -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)

+ 2 - 1
src/i18n/locales/ca/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/de/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/en/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/es/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/fr/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/hi/common.json

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

+ 2 - 1
src/i18n/locales/id/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/it/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/ja/common.json

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

+ 2 - 1
src/i18n/locales/ko/common.json

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

+ 2 - 1
src/i18n/locales/nl/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/pl/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/pt-BR/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/ru/common.json

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

+ 2 - 1
src/i18n/locales/tr/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/vi/common.json

@@ -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",

+ 2 - 1
src/i18n/locales/zh-CN/common.json

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

+ 2 - 1
src/i18n/locales/zh-TW/common.json

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