mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-23 23:28:17 +02:00
Merge pull request #115 from R0m1k3/claude/fix-note-overwrite-bug-01Rx2KMQBoF8XiWUyEHb4c1K
Fix: Amélioration des logs et gestion d'erreurs pour l'assistant IA O…
This commit is contained in:
2 files changed
+70
-13
No files matched your search
@@ -143,7 +143,10 @@ router.post('/chat', authenticateToken, async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const { model, messages } = req.body;
|
const { model, messages } = req.body;
|
||||||
|
|
||||||
|
logger.info(`[OPENROUTER CHAT] Début requête - model: "${model}", messages: ${messages?.length || 0}`);
|
||||||
|
|
||||||
if (!model || !messages || !Array.isArray(messages)) {
|
if (!model || !messages || !Array.isArray(messages)) {
|
||||||
|
logger.warn('[OPENROUTER CHAT] Requête invalide - modèle ou messages manquants');
|
||||||
return res.status(400).json({ error: 'Modèle et messages requis' });
|
return res.status(400).json({ error: 'Modèle et messages requis' });
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,11 +154,21 @@ router.post('/chat', authenticateToken, async (req, res) => {
|
|||||||
const setting = await getOne('SELECT value FROM settings WHERE key = $1', ['openrouter_api_key']);
|
const setting = await getOne('SELECT value FROM settings WHERE key = $1', ['openrouter_api_key']);
|
||||||
|
|
||||||
if (!setting || !setting.value) {
|
if (!setting || !setting.value) {
|
||||||
return res.status(400).json({ error: 'Clé API OpenRouter non configurée' });
|
logger.warn('[OPENROUTER CHAT] Clé API non configurée');
|
||||||
|
return res.status(400).json({ error: 'Clé API OpenRouter non configurée. Allez dans Paramètres pour la configurer.' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.info(`[OPENROUTER CHAT] Clé API trouvée, appel à OpenRouter...`);
|
||||||
|
|
||||||
// Appeler l'API OpenRouter
|
// Appeler l'API OpenRouter
|
||||||
const fetch = (await import('node-fetch')).default;
|
const fetch = (await import('node-fetch')).default;
|
||||||
|
const requestBody = {
|
||||||
|
model: model,
|
||||||
|
messages: messages
|
||||||
|
};
|
||||||
|
|
||||||
|
logger.info(`[OPENROUTER CHAT] Requête OpenRouter: ${JSON.stringify({ model, messageCount: messages.length })}`);
|
||||||
|
|
||||||
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
@@ -164,25 +177,40 @@ router.post('/chat', authenticateToken, async (req, res) => {
|
|||||||
'X-Title': 'NoteFlow',
|
'X-Title': 'NoteFlow',
|
||||||
'Content-Type': 'application/json'
|
'Content-Type': 'application/json'
|
||||||
},
|
},
|
||||||
body: JSON.stringify({
|
body: JSON.stringify(requestBody)
|
||||||
model: model,
|
|
||||||
messages: messages
|
|
||||||
})
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
logger.info(`[OPENROUTER CHAT] Réponse reçue - status: ${response.status} ${response.statusText}`);
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
const errorData = await response.json().catch(() => ({}));
|
const errorData = await response.json().catch(() => ({}));
|
||||||
logger.error(`Erreur API OpenRouter chat: ${response.status}`, errorData);
|
const errorMessage = errorData.error?.message || errorData.error || `Erreur ${response.status}: ${response.statusText}`;
|
||||||
|
|
||||||
|
logger.error(`[OPENROUTER CHAT] Erreur API OpenRouter:`, {
|
||||||
|
status: response.status,
|
||||||
|
statusText: response.statusText,
|
||||||
|
error: errorData
|
||||||
|
});
|
||||||
|
|
||||||
return res.status(response.status).json({
|
return res.status(response.status).json({
|
||||||
error: errorData.error?.message || 'Erreur lors de la communication avec l\'IA'
|
error: errorMessage
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
logger.info(`[OPENROUTER CHAT] Succès - réponse générée (${data.choices?.[0]?.message?.content?.length || 0} caractères)`);
|
||||||
|
|
||||||
res.json(data);
|
res.json(data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('Erreur lors du chat OpenRouter:', error);
|
logger.error('[OPENROUTER CHAT] Erreur exception:', {
|
||||||
res.status(500).json({ error: 'Erreur serveur' });
|
message: error.message,
|
||||||
|
stack: error.stack,
|
||||||
|
name: error.name
|
||||||
|
});
|
||||||
|
|
||||||
|
res.status(500).json({
|
||||||
|
error: `Erreur serveur: ${error.message || 'Erreur inconnue'}`
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,8 @@ class OpenRouterService {
|
|||||||
*/
|
*/
|
||||||
async sendMessage(model: string, messages: Array<{ role: string; content: string }>): Promise<string> {
|
async sendMessage(model: string, messages: Array<{ role: string; content: string }>): Promise<string> {
|
||||||
try {
|
try {
|
||||||
|
console.log(`[OpenRouter] Envoi requête - model: ${model}, messages: ${messages.length}`);
|
||||||
|
|
||||||
const response = await fetch('/api/openrouter/chat', {
|
const response = await fetch('/api/openrouter/chat', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
@@ -69,15 +71,42 @@ class OpenRouterService {
|
|||||||
body: JSON.stringify({ model, messages })
|
body: JSON.stringify({ model, messages })
|
||||||
});
|
});
|
||||||
|
|
||||||
|
console.log(`[OpenRouter] Réponse reçue - status: ${response.status}`);
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
const error = await response.json().catch(() => ({ error: 'Erreur inconnue' }));
|
const errorData = await response.json().catch(() => ({ error: 'Erreur inconnue' }));
|
||||||
throw new Error(error.error || 'Erreur lors de la communication avec l\'IA');
|
const errorMessage = errorData.error || `Erreur HTTP ${response.status}`;
|
||||||
|
|
||||||
|
console.error('[OpenRouter] Erreur:', errorMessage);
|
||||||
|
|
||||||
|
// Messages d'erreur plus clairs selon le code HTTP
|
||||||
|
if (response.status === 400) {
|
||||||
|
throw new Error(errorMessage);
|
||||||
|
} else if (response.status === 401) {
|
||||||
|
throw new Error('Clé API invalide. Vérifiez la configuration dans Paramètres.');
|
||||||
|
} else if (response.status === 402) {
|
||||||
|
throw new Error('Crédits OpenRouter épuisés. Rechargez votre compte.');
|
||||||
|
} else if (response.status === 429) {
|
||||||
|
throw new Error('Trop de requêtes. Attendez quelques instants.');
|
||||||
|
} else if (response.status === 502 || response.status === 503) {
|
||||||
|
throw new Error('Service OpenRouter temporairement indisponible. Réessayez dans quelques instants.');
|
||||||
|
} else {
|
||||||
|
throw new Error(errorMessage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
return data.choices?.[0]?.message?.content || 'Pas de réponse';
|
const content = data.choices?.[0]?.message?.content;
|
||||||
|
|
||||||
|
if (!content) {
|
||||||
|
console.error('[OpenRouter] Réponse vide:', data);
|
||||||
|
throw new Error('Aucune réponse générée par le modèle');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`[OpenRouter] Succès - ${content.length} caractères`);
|
||||||
|
return content;
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error('Erreur lors de l\'envoi du message:', error);
|
console.error('[OpenRouter] Erreur exception:', error);
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user