Files
crm.clientright.ru/test_direct_response.html

313 lines
12 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Тест прямого ответа</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background: white;
border-radius: 10px;
padding: 20px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.test-section {
background: #e3f2fd;
padding: 15px;
border-radius: 8px;
margin: 15px 0;
}
.result {
background: #f3e5f5;
padding: 10px;
border-radius: 5px;
margin: 10px 0;
white-space: pre-wrap;
font-family: monospace;
font-size: 12px;
}
.error {
background: #ffebee;
color: #c62828;
}
.success {
background: #e8f5e8;
color: #2e7d32;
}
button {
background: #2196f3;
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
margin: 5px;
}
button:hover {
background: #1976d2;
}
input[type="text"] {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
margin: 5px 0;
}
.chat-log {
background: #f8f9fa;
padding: 15px;
border-radius: 8px;
margin: 15px 0;
max-height: 400px;
overflow-y: auto;
border: 1px solid #dee2e6;
}
.message {
margin: 10px 0;
padding: 10px;
border-radius: 5px;
}
.message.user {
background: #007bff;
color: white;
text-align: right;
}
.message.bot {
background: #e9ecef;
color: #333;
}
.message.system {
background: #fff3cd;
color: #856404;
font-style: italic;
}
</style>
</head>
<body>
<div class="container">
<h1>🚀 Тест прямого ответа</h1>
<div class="test-section">
<h3>💬 Тест без лишних сообщений</h3>
<p><strong>Цель:</strong> Проверить, что ответ от n8n показывается сразу без "Обрабатываю ваш запрос..."</p>
<input type="text" id="testMessage" placeholder="Введите вопрос..." value="как вернуть деньги за испорченный отдых">
<button onclick="sendMessage()">Отправить вопрос</button>
<button onclick="clearChat()">Очистить чат</button>
<div id="chatLog" class="chat-log"></div>
</div>
<div class="test-section">
<h3>📊 Результаты тестов</h3>
<div id="testResults" class="result"></div>
</div>
</div>
<script>
let sessionId = null;
const PROXY_URL = '/aiassist/typebot_proxy.php';
function addMessage(text, isUser = false, isSystem = false) {
const chatLog = document.getElementById('chatLog');
const messageDiv = document.createElement('div');
messageDiv.className = `message ${isUser ? 'user' : (isSystem ? 'system' : 'bot')}`;
messageDiv.textContent = text;
chatLog.appendChild(messageDiv);
chatLog.scrollTop = chatLog.scrollHeight;
}
function logResult(message, isError = false) {
const resultsDiv = document.getElementById('testResults');
const timestamp = new Date().toLocaleTimeString();
const logEntry = `[${timestamp}] ${message}\n`;
resultsDiv.textContent += logEntry;
if (isError) {
resultsDiv.className = 'result error';
} else {
resultsDiv.className = 'result success';
}
}
function clearChat() {
document.getElementById('chatLog').innerHTML = '';
sessionId = null;
logResult('Чат очищен, сессия сброшена');
}
async function sendMessage() {
const message = document.getElementById('testMessage').value.trim();
if (!message) {
alert('Введите сообщение');
return;
}
addMessage(message, true);
logResult(`Отправка сообщения: "${message}"`);
try {
const action = sessionId ? 'continueChat' : 'startChat';
logResult(`Действие: ${action}, SessionId: ${sessionId || 'новый'}`);
const response = await fetch(PROXY_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
action: action,
message: message,
sessionId: sessionId,
context: {
projectId: 'test-123',
module: 'Test',
view: 'Test',
userId: 'test-user'
}
})
});
const result = await response.json();
logResult(`Ответ прокси: ${JSON.stringify(result, null, 2)}`);
if (result.success) {
const data = result.data;
// Обновляем sessionId если он есть
if (data.sessionId) {
sessionId = data.sessionId;
logResult(`SessionId обновлен: ${sessionId}`);
}
// Проверяем, есть ли clientSideActions (webhook к n8n)
if (data.clientSideActions && data.clientSideActions.length > 0) {
logResult(`Найдено ${data.clientSideActions.length} clientSideActions`);
for (const action of data.clientSideActions) {
if (action.type === 'httpRequestToExecute') {
logResult(`Выполнение HTTP запроса: ${action.httpRequestToExecute.url}`);
const webhookResult = await executeHttpRequest(action.httpRequestToExecute);
if (webhookResult && webhookResult.length > 0 && webhookResult[0].output) {
logResult(`✅ n8n ответ получен и показан`);
return; // Ответ уже показан
} else {
logResult(`❌ n8n не ответил`);
addMessage('Извините, сервис временно недоступен. Попробуйте позже.', false);
return;
}
}
}
}
// Обрабатываем сообщения
if (data.messages && data.messages.length > 0) {
const lastMessage = data.messages[data.messages.length - 1];
let messageText = '';
if (lastMessage.content && lastMessage.content.richText) {
messageText = extractTextFromRichText(lastMessage.content.richText);
} else {
messageText = lastMessage.content || '';
}
// Пропускаем приветствие
if (messageText.toLowerCase().includes('привет') || messageText.toLowerCase().includes('hello')) {
logResult('Пропускаем приветствие');
return;
}
addMessage(messageText, false);
logResult(`Добавлено сообщение бота: "${messageText}"`);
}
// Проверяем input блок
if (data.input) {
logResult('Бот ждет ввода пользователя');
addMessage('Бот ждет ваш ответ...', false);
}
// Если нет сообщений и действий
if (!data.messages && !data.clientSideActions && !data.input) {
logResult('Нет сообщений, действий или input блока');
addMessage('Получен ответ от бота', false);
}
} else {
logResult(`Ошибка прокси: ${result.error}`, true);
addMessage('Ошибка: ' + result.error, false);
}
} catch (error) {
logResult(`Ошибка: ${error.message}`, true);
addMessage('Ошибка: ' + error.message, false);
}
}
function extractTextFromRichText(richText) {
if (!richText || !Array.isArray(richText)) {
return '';
}
let text = '';
for (const item of richText) {
if (item.type === 'p' && item.children) {
for (const child of item.children) {
if (child.text) {
text += child.text;
}
}
text += '\n';
} else if (item.text) {
text += item.text;
}
}
return text.trim();
}
async function executeHttpRequest(httpRequest) {
try {
logResult(`Выполнение HTTP запроса: ${httpRequest.url}`);
const response = await fetch(httpRequest.url, {
method: httpRequest.method || 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(httpRequest.body)
});
const result = await response.json();
logResult(`HTTP запрос выполнен: ${JSON.stringify(result, null, 2)}`);
// Если n8n вернул ответ, показываем его
if (result && result.length > 0 && result[0].output) {
addMessage(result[0].output, false);
logResult(`✅ Ответ от n8n показан: "${result[0].output}"`);
}
return result;
} catch (error) {
logResult(`Ошибка HTTP запроса: ${error.message}`, true);
return null;
}
}
// Автоматический тест при загрузке
window.onload = function() {
logResult('Тест прямого ответа запущен');
addMessage('Привет! Я AI ассистент вашей CRM системы. Задавайте любые вопросы - я сразу на них отвечу!', false);
};
</script>
</body>
</html>