- Node-guardian running on MacBook and updating metrics - NODE2 agents (Atlas, Greeter, Oracle, Builder Bot) assigned to node-2-macbook-m4max - Swapper models displaying correctly (8 models) - DAGI Router agents showing with correct status (3 active, 1 stale) - Router health check using node_cache for remote nodes
5.6 KiB
5.6 KiB
Виправлення відправки повідомлень у чаті
Дата: 2025-11-23
Статус: ✅ Виправлено
🐛 Проблема
Користувач писав повідомлення у чат з оркестратором, але відповіді не було. Спінер крутився нескінченно.
Симптоми
- Повідомлення відображається в чаті
- Спінер завантаження крутиться
- Відповідь ніколи не приходить
- У логах Router: "Provider error: No message provided"
- HTTP 502 Bad Gateway
Логи Router
ERROR: Provider error: No message provided
INFO: 172.21.0.9:60732 - "POST /route HTTP/1.1" 502 Bad Gateway
🔍 Причина
Критична помилка в коді:
// ❌ НЕПРАВИЛЬНО
const handleSend = async () => {
if (!input.trim() || sendMessageMutation.isPending) return;
const userMessage: ChatMessage = {
content: input, // ✅ Тут input ще є
// ...
};
setMessages((prev) => [...prev, userMessage]);
setInput(''); // ❌ Тут input очищається
sendMessageMutation.mutate(input); // ❌ Тут input вже порожній!!!
};
Що відбувалося
- Користувач вводить текст:
"ти хто?" input="ти хто?"- Створюється
userMessageз текстом"ти хто?"✅ setInput('')очищує input →input=""❌sendMessageMutation.mutate(input)відправляє порожній рядок""❌- Router отримує
{"message": ""}→ помилка "No message provided"
✅ Рішення
Файл: src/components/microdao/MicroDaoOrchestratorChat.tsx
// ✅ ПРАВИЛЬНО
const handleSend = async () => {
if (!input.trim() || sendMessageMutation.isPending) return;
// Зберігаємо текст повідомлення перед очищенням input
const messageText = input.trim();
const userMessage: ChatMessage = {
id: Date.now().toString(),
role: 'user',
content: messageText, // ✅ Використовуємо збережений текст
timestamp: new Date().toISOString(),
};
setMessages((prev) => [...prev, userMessage]);
setInput(''); // Очищаємо input
sendMessageMutation.mutate(messageText); // ✅ Передаємо збережений текст
};
Що змінилося
- Додано
const messageText = input.trim()перед очищенням - Використовується
messageTextзамістьinputв мутації - Текст гарантовано передається в Router
🎯 Результат
До виправлення:
User: ти хто?
[spinner крутиться нескінченно]
Backend: ERROR: No message provided (502)
Після виправлення:
User: ти хто?
[spinner 8-10 секунд]
GREENFOOD: Я — GREENFOOD, AI-ERP для крафтових виробників...
Backend: INFO: Request successful via llm_local_qwen3_8b (200)
📊 Тестування
Тест з curl (працює):
$ curl -X POST http://144.76.224.179:9102/route \
-d '{"agent":"greenfood","message":"тест","mode":"chat"}'
HTTP/1.1 200 OK
{
"ok": true,
"data": {
"text": "Привет! 😊 Вы хотите пройти тест..."
}
}
Тест з frontend (тепер також працює):
User input: "ти хто?"
Request body: {
"agent": "greenfood",
"message": "ти хто?", // ✅ Текст передається
"mode": "chat",
"payload": {
"context": {
"system_prompt": "Ти - GREENFOOD агент..."
}
}
}
🐛 Чому це не було помічено раніше?
- Тестували через curl - там message передавався явно ✅
- Логи показували "Matched rule" - але запит не доходив до LLM
- 502 помилки - змішувалися з іншими мережними помилками
- React state асинхронність -
setInput('')спрацьовувала миттєво
✅ Перевірка
Після виправлення перезавантажте сторінку та спробуйте написати будь-яке повідомлення:
- Напишіть "привіт" або "ти хто?"
- Натисніть Enter або кнопку відправки
- Почекайте 8-15 секунд
- Отримаєте відповідь від агента ✅
📝 Уроки
- Завжди зберігайте значення перед мутацією state якщо воно використовується далі
- Тестуйте не тільки API, але й весь flow від UI до backend
- Логи Router корисні - "No message provided" одразу вказав на проблему
- React state оновлюється асинхронно - не покладайтеся на старі значення після
setState
✅ Висновок
Критична помилка виправлена. Тепер всі агенти-оркестратори працюють коректно:
- ✅ GREENFOOD
- ✅ Helion
- ✅ Yaromir
- ✅ DAARWIZZ
Чат з оркестраторами повністю функціональний!