diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index 2b576c07428..2c7b10f2057 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -296,21 +296,6 @@ export class GeminiHandler extends BaseProvider implements SingleCompletionHandl } } - // If we had reasoning but no content, emit a placeholder text to prevent "Empty assistant response" errors. - // This typically happens when the model hits max output tokens while reasoning. - if (hasReasoning && !hasContent) { - let message = t("common:errors.gemini.thinking_complete_no_output") - if (finishReason === "MAX_TOKENS") { - message = t("common:errors.gemini.thinking_complete_truncated") - } else if (finishReason === "SAFETY") { - message = t("common:errors.gemini.thinking_complete_safety") - } else if (finishReason === "RECITATION") { - message = t("common:errors.gemini.thinking_complete_recitation") - } - - yield { type: "text", text: message } - } - if (finalResponse?.responseId) { // Capture responseId so Task.addToApiConversationHistory can store it // alongside the assistant message in api_history.json. diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 1bc19c15945..92fbd882411 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -309,6 +309,7 @@ export class Task extends EventEmitter implements TaskLike { consecutiveMistakeCount: number = 0 consecutiveMistakeLimit: number consecutiveMistakeCountForApplyDiff: Map = new Map() + consecutiveNoToolUseCount: number = 0 toolUsage: ToolUsage = {} // Checkpoints @@ -1981,6 +1982,9 @@ export class Task extends EventEmitter implements TaskLike { this.abort = true + // Reset consecutive error counters on abort (manual intervention) + this.consecutiveNoToolUseCount = 0 + // Force final token usage update before abort event this.emitFinalTokenUsageUpdate() @@ -2235,7 +2239,6 @@ export class Task extends EventEmitter implements TaskLike { } else { // Use the task's locked protocol, NOT the current settings (fallback to xml if not set) nextUserContent = [{ type: "text", text: formatResponse.noToolsUsed(this._taskToolProtocol ?? "xml") }] - this.consecutiveMistakeCount++ } } } @@ -3236,12 +3239,24 @@ export class Task extends EventEmitter implements TaskLike { ) if (!didToolUse) { + // Increment consecutive no-tool-use counter + this.consecutiveNoToolUseCount++ + + // Only show error and count toward mistake limit after 2 consecutive failures + if (this.consecutiveNoToolUseCount >= 2) { + await this.say("error", "MODEL_NO_TOOLS_USED") + // Only count toward mistake limit after second consecutive failure + this.consecutiveMistakeCount++ + } + // Use the task's locked protocol for consistent behavior this.userMessageContent.push({ type: "text", text: formatResponse.noToolsUsed(this._taskToolProtocol ?? "xml"), }) - this.consecutiveMistakeCount++ + } else { + // Reset counter when tools are used successfully + this.consecutiveNoToolUseCount = 0 } // Push to stack if there's content OR if we're paused waiting for a subtask. diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index fa88e54912d..e6fd26a3801 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -1259,7 +1259,22 @@ export const ChatRowContent = ({ ) case "error": - return + // Check if this is a model response error based on marker strings from backend + const isNoToolsUsedError = message.text === "MODEL_NO_TOOLS_USED" + + if (isNoToolsUsedError) { + return ( + + ) + } + + // Fallback for generic errors + return case "completion_result": return ( <> diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 07032131996..4def5b58283 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -258,6 +258,11 @@ "hasQuestion": "Roo té una pregunta" }, "taskCompleted": "Tasca completada", + "modelResponseIncomplete": "Resposta del model incompleta", + "modelResponseErrors": { + "noToolsUsed": "El model no ha utilitzat cap eina en la seva resposta. Això sol passar quan el model només proporciona text/raonament sense cridar les eines necessàries per completar la tasca.", + "noToolsUsedDetails": "El model ha proporcionat text/raonament però no ha cridat cap de les eines necessàries. Això sol indicar que el model ha entès malament la tasca o té dificultats per determinar quina eina utilitzar. El model ha estat sol·licitat automàticament per tornar-ho a provar amb l'ús adequat de les eines." + }, "errorDetails": { "title": "Detalls de l'error", "copyToClipboard": "Copiar al porta-retalls", diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 6a8e01d5ed4..1097cdfdc5e 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -258,6 +258,11 @@ "hasQuestion": "Roo hat eine Frage" }, "taskCompleted": "Aufgabe abgeschlossen", + "modelResponseIncomplete": "Modellantwort unvollständig", + "modelResponseErrors": { + "noToolsUsed": "Das Modell hat in seiner Antwort keine Tools verwendet. Dies passiert normalerweise, wenn das Modell nur Text/Überlegungen liefert, ohne die erforderlichen Tools aufzurufen, um die Aufgabe zu erledigen.", + "noToolsUsedDetails": "Das Modell hat Text/Überlegungen geliefert, aber keine der erforderlichen Tools aufgerufen. Dies deutet normalerweise darauf hin, dass das Modell die Aufgabe missverstanden hat oder Schwierigkeiten hat zu bestimmen, welches Tool verwendet werden soll. Das Modell wurde automatisch aufgefordert, es erneut mit der richtigen Tool-Verwendung zu versuchen." + }, "errorDetails": { "title": "Fehlerdetails", "copyToClipboard": "In Zwischenablage kopieren", diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 4ec1cc52aa0..5c8feb122bf 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -285,6 +285,11 @@ }, "taskCompleted": "Task Completed", "error": "Error", + "modelResponseIncomplete": "Model Response Incomplete", + "modelResponseErrors": { + "noToolsUsed": "The model failed to use any tools in its response. This typically happens when the model provides only text/reasoning without calling the required tools to complete the task.", + "noToolsUsedDetails": "The model provided text/reasoning but did not call any of the required tools. This usually indicates the model misunderstood the task or is having difficulty determining which tool to use. The model has been automatically prompted to retry with proper tool usage." + }, "errorDetails": { "title": "Error Details", "copyToClipboard": "Copy to Clipboard", diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index f807e27f1dc..c14939f77be 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -258,6 +258,11 @@ "hasQuestion": "Roo tiene una pregunta" }, "taskCompleted": "Tarea completada", + "modelResponseIncomplete": "Respuesta del modelo incompleta", + "modelResponseErrors": { + "noToolsUsed": "El modelo no utilizó ninguna herramienta en su respuesta. Esto suele ocurrir cuando el modelo solo proporciona texto/razonamiento sin llamar a las herramientas necesarias para completar la tarea.", + "noToolsUsedDetails": "El modelo proporcionó texto/razonamiento pero no llamó a ninguna de las herramientas necesarias. Esto generalmente indica que el modelo malinterpretó la tarea o tiene dificultades para determinar qué herramienta usar. El modelo ha sido solicitado automáticamente para reintentar con el uso adecuado de herramientas." + }, "errorDetails": { "title": "Detalles del error", "copyToClipboard": "Copiar al portapapeles", diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 6c2926f1d76..bbf41a58225 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -258,6 +258,11 @@ "hasQuestion": "Roo a une question" }, "taskCompleted": "Tâche terminée", + "modelResponseIncomplete": "Réponse du modèle incomplète", + "modelResponseErrors": { + "noToolsUsed": "Le modèle n'a utilisé aucun outil dans sa réponse. Cela se produit généralement lorsque le modèle fournit uniquement du texte/raisonnement sans appeler les outils nécessaires pour accomplir la tâche.", + "noToolsUsedDetails": "Le modèle a fourni du texte/raisonnement mais n'a appelé aucun des outils requis. Cela indique généralement que le modèle a mal compris la tâche ou a des difficultés à déterminer quel outil utiliser. Le modèle a été automatiquement invité à réessayer avec l'utilisation appropriée des outils." + }, "errorDetails": { "title": "Détails de l'erreur", "copyToClipboard": "Copier dans le presse-papiers", diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 05540bffe70..ca3bf0ab50c 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -258,6 +258,11 @@ "hasQuestion": "Roo का एक प्रश्न है" }, "taskCompleted": "कार्य पूरा हुआ", + "modelResponseIncomplete": "मॉडल प्रतिक्रिया अपूर्ण", + "modelResponseErrors": { + "noToolsUsed": "मॉडल ने अपनी प्रतिक्रिया में कोई टूल का उपयोग नहीं किया। यह आमतौर पर तब होता है जब मॉडल केवल टेक्स्ट/तर्क प्रदान करता है बिना कार्य पूरा करने के लिए आवश्यक टूल को कॉल किए।", + "noToolsUsedDetails": "मॉडल ने टेक्स्ट/तर्क प्रदान किया लेकिन किसी भी आवश्यक टूल को कॉल नहीं किया। यह आमतौर पर संकेत देता है कि मॉडल ने कार्य को गलत समझा या किस टूल का उपयोग करना है यह निर्धारित करने में कठिनाई हो रही है। मॉडल को स्वचालित रूप से उचित टूल उपयोग के साथ पुनः प्रयास करने के लिए कहा गया है।" + }, "errorDetails": { "title": "त्रुटि विवरण", "copyToClipboard": "क्लिपबोर्ड पर कॉपी करें", diff --git a/webview-ui/src/i18n/locales/id/chat.json b/webview-ui/src/i18n/locales/id/chat.json index 042dfae0fb7..1caea65b046 100644 --- a/webview-ui/src/i18n/locales/id/chat.json +++ b/webview-ui/src/i18n/locales/id/chat.json @@ -290,6 +290,11 @@ }, "taskCompleted": "Tugas Selesai", "error": "Error", + "modelResponseIncomplete": "Respons Model Tidak Lengkap", + "modelResponseErrors": { + "noToolsUsed": "Model gagal menggunakan alat apa pun dalam responsnya. Ini biasanya terjadi ketika model hanya memberikan teks/penalaran tanpa memanggil alat yang diperlukan untuk menyelesaikan tugas.", + "noToolsUsedDetails": "Model memberikan teks/penalaran tetapi tidak memanggil alat yang diperlukan. Ini biasanya menunjukkan bahwa model salah memahami tugas atau mengalami kesulitan menentukan alat mana yang akan digunakan. Model telah secara otomatis diminta untuk mencoba lagi dengan penggunaan alat yang tepat." + }, "diffError": { "title": "Edit Tidak Berhasil" }, diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index f09040f14e4..615f9281a97 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -258,6 +258,11 @@ "hasQuestion": "Roo ha una domanda" }, "taskCompleted": "Attività completata", + "modelResponseIncomplete": "Risposta del modello incompleta", + "modelResponseErrors": { + "noToolsUsed": "Il modello non ha utilizzato alcuno strumento nella sua risposta. Questo accade tipicamente quando il modello fornisce solo testo/ragionamento senza chiamare gli strumenti necessari per completare l'attività.", + "noToolsUsedDetails": "Il modello ha fornito testo/ragionamento ma non ha chiamato nessuno degli strumenti richiesti. Questo di solito indica che il modello ha frainteso l'attività o ha difficoltà a determinare quale strumento utilizzare. Il modello è stato automaticamente sollecitato a riprovare con l'uso appropriato degli strumenti." + }, "errorDetails": { "title": "Dettagli errore", "copyToClipboard": "Copia negli appunti", diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index 8e4a488daf7..be701e92fcc 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -258,6 +258,11 @@ "hasQuestion": "Rooは質問があります" }, "taskCompleted": "タスク完了", + "modelResponseIncomplete": "モデルの応答が不完全", + "modelResponseErrors": { + "noToolsUsed": "モデルは応答でツールを使用しませんでした。これは通常、モデルがタスクを完了するために必要なツールを呼び出さずに、テキスト/推論のみを提供する場合に発生します。", + "noToolsUsedDetails": "モデルはテキスト/推論を提供しましたが、必要なツールを呼び出しませんでした。これは通常、モデルがタスクを誤解したか、どのツールを使用するかを決定するのに苦労していることを示しています。モデルは適切なツールの使用で再試行するよう自動的に促されました。" + }, "errorDetails": { "title": "エラー詳細", "copyToClipboard": "クリップボードにコピー", diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 10d88091ec8..676e64f6db1 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -258,6 +258,11 @@ "hasQuestion": "Roo에게 질문이 있습니다" }, "taskCompleted": "작업 완료", + "modelResponseIncomplete": "모델 응답 불완전", + "modelResponseErrors": { + "noToolsUsed": "모델이 응답에서 도구를 사용하지 않았습니다. 이는 일반적으로 모델이 작업을 완료하는 데 필요한 도구를 호출하지 않고 텍스트/추론만 제공할 때 발생합니다.", + "noToolsUsedDetails": "모델이 텍스트/추론을 제공했지만 필요한 도구를 호출하지 않았습니다. 이는 일반적으로 모델이 작업을 잘못 이해했거나 어떤 도구를 사용할지 결정하는 데 어려움을 겪고 있음을 나타냅니다. 모델이 적절한 도구 사용으로 다시 시도하도록 자동으로 요청되었습니다." + }, "errorDetails": { "title": "오류 세부 정보", "copyToClipboard": "클립보드에 복사", diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json index cd2fa897d51..777f7812b61 100644 --- a/webview-ui/src/i18n/locales/nl/chat.json +++ b/webview-ui/src/i18n/locales/nl/chat.json @@ -254,6 +254,11 @@ }, "taskCompleted": "Taak voltooid", "error": "Fout", + "modelResponseIncomplete": "Modelrespons onvolledig", + "modelResponseErrors": { + "noToolsUsed": "Het model heeft geen tools gebruikt in zijn reactie. Dit gebeurt meestal wanneer het model alleen tekst/redenering levert zonder de vereiste tools aan te roepen om de taak te voltooien.", + "noToolsUsedDetails": "Het model heeft tekst/redenering geleverd maar heeft geen van de vereiste tools aangeroepen. Dit geeft meestal aan dat het model de taak verkeerd heeft begrepen of moeite heeft om te bepalen welke tool te gebruiken. Het model is automatisch gevraagd om opnieuw te proberen met correct gebruik van tools." + }, "diffError": { "title": "Bewerking mislukt" }, diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index 67a30448b89..3971b17bf01 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -258,6 +258,11 @@ "hasQuestion": "Roo ma pytanie" }, "taskCompleted": "Zadanie zakończone", + "modelResponseIncomplete": "Odpowiedź modelu niekompletna", + "modelResponseErrors": { + "noToolsUsed": "Model nie użył żadnych narzędzi w swojej odpowiedzi. Zwykle dzieje się tak, gdy model dostarcza tylko tekst/rozumowanie bez wywołania wymaganych narzędzi do wykonania zadania.", + "noToolsUsedDetails": "Model dostarczył tekst/rozumowanie, ale nie wywołał żadnego z wymaganych narzędzi. Zazwyczaj oznacza to, że model źle zrozumiał zadanie lub ma trudności z określeniem, którego narzędzia użyć. Model został automatycznie poproszony o ponowną próbę z odpowiednim użyciem narzędzi." + }, "errorDetails": { "title": "Szczegóły błędu", "copyToClipboard": "Kopiuj do schowka", diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 74507d2e29a..3d9f9a6f4bf 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -258,6 +258,11 @@ "hasQuestion": "Roo tem uma pergunta" }, "taskCompleted": "Tarefa concluída", + "modelResponseIncomplete": "Resposta do modelo incompleta", + "modelResponseErrors": { + "noToolsUsed": "O modelo falhou em usar qualquer ferramenta em sua resposta. Isso geralmente acontece quando o modelo fornece apenas texto/raciocínio sem chamar as ferramentas necessárias para completar a tarefa.", + "noToolsUsedDetails": "O modelo forneceu texto/raciocínio, mas não chamou nenhuma das ferramentas necessárias. Isso geralmente indica que o modelo entendeu mal a tarefa ou está tendo dificuldade em determinar qual ferramenta usar. O modelo foi automaticamente solicitado a tentar novamente com o uso adequado de ferramentas." + }, "errorDetails": { "title": "Detalhes do erro", "copyToClipboard": "Copiar para área de transferência", diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index 91a713705c0..1f2a70e0051 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -255,6 +255,11 @@ }, "taskCompleted": "Задача завершена", "error": "Ошибка", + "modelResponseIncomplete": "Неполный ответ модели", + "modelResponseErrors": { + "noToolsUsed": "Модель не использовала никаких инструментов в своем ответе. Обычно это происходит, когда модель предоставляет только текст/рассуждения без вызова необходимых инструментов для выполнения задачи.", + "noToolsUsedDetails": "Модель предоставила текст/рассуждения, но не вызвала ни одного из необходимых инструментов. Обычно это указывает на то, что модель неправильно поняла задачу или испытывает трудности с определением того, какой инструмент использовать. Модели автоматически предложено повторить попытку с правильным использованием инструментов." + }, "diffError": { "title": "Не удалось выполнить редактирование" }, diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index 886e7ed6a65..1f5d32f73c8 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -259,6 +259,11 @@ "hasQuestion": "Roo'nun bir sorusu var" }, "taskCompleted": "Görev Tamamlandı", + "modelResponseIncomplete": "Model yanıtı eksik", + "modelResponseErrors": { + "noToolsUsed": "Model yanıtında herhangi bir araç kullanamadı. Bu genellikle model, görevi tamamlamak için gerekli araçları çağırmadan yalnızca metin/akıl yürütme sağladığında olur.", + "noToolsUsedDetails": "Model metin/akıl yürütme sağladı ancak gerekli araçlardan hiçbirini çağırmadı. Bu genellikle modelin görevi yanlış anladığını veya hangi aracı kullanacağını belirlemekte zorlandığını gösterir. Model, uygun araç kullanımıyla yeniden denemesi için otomatik olarak istenmiştir." + }, "errorDetails": { "title": "Hata Detayları", "copyToClipboard": "Panoya Kopyala", diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index 633935d56dc..5574daddb21 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -259,6 +259,11 @@ "hasQuestion": "Roo có một câu hỏi" }, "taskCompleted": "Nhiệm vụ hoàn thành", + "modelResponseIncomplete": "Phản hồi của mô hình không đầy đủ", + "modelResponseErrors": { + "noToolsUsed": "Mô hình đã không sử dụng bất kỳ công cụ nào trong phản hồi của mình. Điều này thường xảy ra khi mô hình chỉ cung cấp văn bản/lý luận mà không gọi các công cụ cần thiết để hoàn thành tác vụ.", + "noToolsUsedDetails": "Mô hình đã cung cấp văn bản/lý luận nhưng không gọi bất kỳ công cụ bắt buộc nào. Điều này thường cho thấy mô hình đã hiểu sai tác vụ hoặc đang gặp khó khăn trong việc xác định công cụ nào sẽ sử dụng. Mô hình đã được tự động nhắc thử lại với việc sử dụng công cụ phù hợp." + }, "errorDetails": { "title": "Chi tiết lỗi", "copyToClipboard": "Sao chép vào clipboard", diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index 333d08735aa..e409b92c9af 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -259,6 +259,11 @@ "hasQuestion": "Roo有一个问题" }, "taskCompleted": "任务完成", + "modelResponseIncomplete": "模型响应不完整", + "modelResponseErrors": { + "noToolsUsed": "模型在响应中未使用任何工具。这通常发生在模型仅提供文本/推理而未调用完成任务所需的工具时。", + "noToolsUsedDetails": "模型提供了文本/推理,但未调用任何必需的工具。这通常表明模型误解了任务,或在确定使用哪个工具时遇到困难。系统已自动提示模型使用正确的工具重试。" + }, "errorDetails": { "title": "错误详情", "copyToClipboard": "复制到剪贴板", diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index f352bf3fdee..ceb7088388f 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -288,6 +288,11 @@ }, "taskCompleted": "工作完成", "error": "錯誤", + "modelResponseIncomplete": "模型回應不完整", + "modelResponseErrors": { + "noToolsUsed": "模型在回應中未使用任何工具。這通常發生在模型僅提供文字/推理而未呼叫完成工作所需的工具時。", + "noToolsUsedDetails": "模型提供了文字/推理,但未呼叫任何必需的工具。這通常表示模型誤解了工作,或在確定使用哪個工具時遇到困難。系統已自動提示模型使用正確的工具重試。" + }, "diffError": { "title": "編輯失敗" },