diff --git a/frontend/js/ai.js b/frontend/js/ai.js index f31bc0f..f3d3ab4 100644 --- a/frontend/js/ai.js +++ b/frontend/js/ai.js @@ -239,7 +239,10 @@ export async function createAIToolbar(container, getEditorView) { try { const result = await aiAction('inline-complete', text); replaceSelection(v, result, 'append'); - } catch (e) { showToast('AI: ' + e.message, 'error'); } + showToast('AI: complétion ajoutée', 'success'); + } catch (e) { + showToast('AI: ' + (String(e.message || e).includes('401') ? 'clé API invalide' : e.message), 'error'); + } }); // ── Edit menu ── @@ -296,7 +299,10 @@ export async function createAIToolbar(container, getEditorView) { try { const result = await aiAction('rewrite', text, { instruction }); replaceSelection(v, result); - } catch (e) { showToast('AI: ' + e.message, 'error'); } + showToast('AI: texte réécrit', 'success'); + } catch (e) { + showToast('AI: ' + (String(e.message || e).includes('401') ? 'clé API invalide' : e.message), 'error'); + } }); // ── Toolbox menu ── @@ -324,11 +330,24 @@ export async function createAIToolbar(container, getEditorView) { const v = ev(); if (!v) return; const text = getSelection(v); - if (!text.trim()) return; + if (!text.trim()) { + showToast('AI: sélectionnez du texte à traiter', 'warning'); + return; + } try { const result = await aiAction(endpoint, text, extra); replaceSelection(v, result, mode); - } catch (e) { showToast('AI: ' + e.message, 'error'); } + showToast('AI: texte traité', 'success'); + } catch (e) { + const msg = String(e.message || e); + if (msg.includes('401')) { + showToast('AI: clé API invalide. Vérifiez DEEPSEEK_API_KEY dans .env', 'error'); + } else if (msg.includes('402') || msg.includes('429')) { + showToast('AI: quota dépassé ou paiement requis', 'error'); + } else { + showToast('AI: ' + msg, 'error'); + } + } } // ── Keyboard shortcut Ctrl+J for inline completion ──