252 lines
10 KiB
HTML
252 lines
10 KiB
HTML
|
|
<!DOCTYPE html>
|
||
|
|
<html>
|
||
|
|
<head>
|
||
|
|
<title>AI Drawer Response Debug</title>
|
||
|
|
<style>
|
||
|
|
body { font-family: Arial, sans-serif; margin: 20px; }
|
||
|
|
.test-section { margin: 20px 0; padding: 15px; border: 1px solid #ccc; }
|
||
|
|
.result { background: #f5f5f5; padding: 10px; margin: 10px 0; }
|
||
|
|
.error { background: #ffebee; color: #c62828; }
|
||
|
|
.success { background: #e8f5e8; color: #2e7d32; }
|
||
|
|
button { padding: 10px 20px; margin: 5px; }
|
||
|
|
</style>
|
||
|
|
</head>
|
||
|
|
<body>
|
||
|
|
<h1>AI Drawer Response Debug</h1>
|
||
|
|
|
||
|
|
<div class="test-section">
|
||
|
|
<h3>Тест 1: Прямой запрос к n8n прокси</h3>
|
||
|
|
<button onclick="testN8NProxy()">Тест n8n прокси</button>
|
||
|
|
<div id="n8n-result" class="result"></div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="test-section">
|
||
|
|
<h3>Тест 2: Локальный AI</h3>
|
||
|
|
<button onclick="testLocalAI()">Тест локальный AI</button>
|
||
|
|
<div id="local-result" class="result"></div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div class="test-section">
|
||
|
|
<h3>Тест 3: Симуляция AI Drawer</h3>
|
||
|
|
<button onclick="testAIDrawer()">Тест AI Drawer логика</button>
|
||
|
|
<div id="drawer-result" class="result"></div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<script>
|
||
|
|
const AI_CONFIG = {
|
||
|
|
n8n: {
|
||
|
|
enabled: true,
|
||
|
|
proxyUrl: '/aiassist/n8n_proxy.php'
|
||
|
|
},
|
||
|
|
local: {
|
||
|
|
enabled: false,
|
||
|
|
url: '/aiassist/crm_endpoint.php'
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
async function testN8NProxy() {
|
||
|
|
const resultDiv = document.getElementById('n8n-result');
|
||
|
|
resultDiv.innerHTML = 'Тестируем...';
|
||
|
|
|
||
|
|
try {
|
||
|
|
const response = await fetch(AI_CONFIG.n8n.proxyUrl, {
|
||
|
|
method: 'POST',
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json',
|
||
|
|
},
|
||
|
|
body: JSON.stringify({
|
||
|
|
message: 'тест сообщение',
|
||
|
|
context: {
|
||
|
|
module: 'Project',
|
||
|
|
projectId: '390681'
|
||
|
|
},
|
||
|
|
sessionId: 'test-session-' + Date.now()
|
||
|
|
})
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!response.ok) {
|
||
|
|
throw new Error(`HTTP ${response.status}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
const data = await response.json();
|
||
|
|
resultDiv.className = 'result success';
|
||
|
|
resultDiv.innerHTML = `
|
||
|
|
<strong>✅ n8n прокси работает!</strong><br>
|
||
|
|
<strong>Ответ:</strong> ${data.response}<br>
|
||
|
|
<strong>Источник:</strong> ${data.source}<br>
|
||
|
|
<strong>Сырой ответ:</strong> <pre>${JSON.stringify(data.rawResponse, null, 2)}</pre>
|
||
|
|
`;
|
||
|
|
} catch (error) {
|
||
|
|
resultDiv.className = 'result error';
|
||
|
|
resultDiv.innerHTML = `<strong>❌ Ошибка n8n прокси:</strong> ${error.message}`;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function testLocalAI() {
|
||
|
|
const resultDiv = document.getElementById('local-result');
|
||
|
|
resultDiv.innerHTML = 'Тестируем...';
|
||
|
|
|
||
|
|
try {
|
||
|
|
const response = await fetch(AI_CONFIG.local.url, {
|
||
|
|
method: 'POST',
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json',
|
||
|
|
},
|
||
|
|
body: JSON.stringify({
|
||
|
|
message: 'тест сообщение',
|
||
|
|
context: {
|
||
|
|
module: 'Project',
|
||
|
|
projectId: '390681'
|
||
|
|
},
|
||
|
|
sessionId: 'test-session-' + Date.now()
|
||
|
|
})
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!response.ok) {
|
||
|
|
throw new Error(`HTTP ${response.status}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
const data = await response.json();
|
||
|
|
resultDiv.className = 'result success';
|
||
|
|
resultDiv.innerHTML = `
|
||
|
|
<strong>✅ Локальный AI работает!</strong><br>
|
||
|
|
<strong>Ответ:</strong> ${data.response}<br>
|
||
|
|
<strong>Время:</strong> ${data.timestamp}
|
||
|
|
`;
|
||
|
|
} catch (error) {
|
||
|
|
resultDiv.className = 'result error';
|
||
|
|
resultDiv.innerHTML = `<strong>❌ Ошибка локального AI:</strong> ${error.message}`;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function testAIDrawer() {
|
||
|
|
const resultDiv = document.getElementById('drawer-result');
|
||
|
|
resultDiv.innerHTML = 'Тестируем...';
|
||
|
|
|
||
|
|
try {
|
||
|
|
// Симулируем логику AI Drawer
|
||
|
|
const message = 'тест сообщение';
|
||
|
|
const context = {
|
||
|
|
module: 'Project',
|
||
|
|
projectId: '390681'
|
||
|
|
};
|
||
|
|
|
||
|
|
console.log('AI Drawer: sendToAI called with message:', message);
|
||
|
|
console.log('AI Drawer: context:', context);
|
||
|
|
console.log('AI Drawer: AI_CONFIG:', AI_CONFIG);
|
||
|
|
|
||
|
|
// Пробуем n8n если включен
|
||
|
|
if (AI_CONFIG.n8n.enabled) {
|
||
|
|
console.log('AI Drawer: Using n8n');
|
||
|
|
try {
|
||
|
|
const result = await sendToN8N(message, context);
|
||
|
|
resultDiv.className = 'result success';
|
||
|
|
resultDiv.innerHTML = `
|
||
|
|
<strong>✅ AI Drawer использует n8n!</strong><br>
|
||
|
|
<strong>Результат:</strong> ${JSON.stringify(result, null, 2)}<br>
|
||
|
|
<strong>Текст ответа:</strong> ${result.response || result}
|
||
|
|
`;
|
||
|
|
return;
|
||
|
|
} catch (error) {
|
||
|
|
console.error('AI Drawer: n8n error, falling back to local AI:', error);
|
||
|
|
// Fallback на локальный AI при ошибке n8n
|
||
|
|
const result = await sendToLocalAI(message, context);
|
||
|
|
resultDiv.className = 'result error';
|
||
|
|
resultDiv.innerHTML = `
|
||
|
|
<strong>⚠️ AI Drawer использует локальный AI (fallback)</strong><br>
|
||
|
|
<strong>Ошибка n8n:</strong> ${error.message}<br>
|
||
|
|
<strong>Результат локального AI:</strong> ${result}
|
||
|
|
`;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Fallback на локальный AI ассистент
|
||
|
|
console.log('AI Drawer: Using local AI');
|
||
|
|
const result = await sendToLocalAI(message, context);
|
||
|
|
resultDiv.className = 'result success';
|
||
|
|
resultDiv.innerHTML = `
|
||
|
|
<strong>✅ AI Drawer использует локальный AI</strong><br>
|
||
|
|
<strong>Результат:</strong> ${result}
|
||
|
|
`;
|
||
|
|
|
||
|
|
} catch (error) {
|
||
|
|
resultDiv.className = 'result error';
|
||
|
|
resultDiv.innerHTML = `<strong>❌ Ошибка AI Drawer:</strong> ${error.message}`;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function sendToN8N(message, context) {
|
||
|
|
console.log('AI Drawer: sendToN8N called with message:', message);
|
||
|
|
console.log('AI Drawer: sendToN8N context:', context);
|
||
|
|
|
||
|
|
const sessionId = 'n8n-session-' + Date.now();
|
||
|
|
|
||
|
|
try {
|
||
|
|
const response = await fetch(AI_CONFIG.n8n.proxyUrl, {
|
||
|
|
method: 'POST',
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json',
|
||
|
|
},
|
||
|
|
body: JSON.stringify({
|
||
|
|
message: message,
|
||
|
|
context: context,
|
||
|
|
sessionId: sessionId
|
||
|
|
})
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!response.ok) {
|
||
|
|
throw new Error(`N8N Proxy error: ${response.status}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
const data = await response.json();
|
||
|
|
console.log('AI Drawer: n8n response:', data);
|
||
|
|
|
||
|
|
if (data.error) {
|
||
|
|
throw new Error(data.error);
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
response: data.response,
|
||
|
|
sessionId: data.sessionId,
|
||
|
|
source: 'n8n'
|
||
|
|
};
|
||
|
|
} catch (error) {
|
||
|
|
throw error;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
async function sendToLocalAI(message, context) {
|
||
|
|
try {
|
||
|
|
const response = await fetch(AI_CONFIG.local.url, {
|
||
|
|
method: 'POST',
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json',
|
||
|
|
},
|
||
|
|
body: JSON.stringify({
|
||
|
|
message: message,
|
||
|
|
context: context,
|
||
|
|
sessionId: 'crm-session-' + Date.now()
|
||
|
|
})
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!response.ok) {
|
||
|
|
throw new Error(`Local AI error: ${response.status}`);
|
||
|
|
}
|
||
|
|
|
||
|
|
const data = await response.json();
|
||
|
|
console.log('AI Drawer: Local AI response:', data);
|
||
|
|
|
||
|
|
return data.response || data.message || 'Получен ответ от AI ассистента.';
|
||
|
|
|
||
|
|
} catch (error) {
|
||
|
|
console.error('AI Drawer: Local AI error:', error);
|
||
|
|
// Простой fallback ответ
|
||
|
|
return `Я получил ваше сообщение: "${message}". Сейчас работаю в режиме локального AI ассистента. Контекст: модуль ${context.module}, запись ${context.projectId}.`;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
</script>
|
||
|
|
</body>
|
||
|
|
</html>
|
||
|
|
|