Files
microdao-daarion/CHAT-MESSAGE-FIX.md
Apple fca48b3eb0 feat(node2): Complete NODE2 setup - guardian, agents, swapper models
- 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
2025-12-02 07:07:58 -08:00

5.6 KiB
Raw Blame History

Виправлення відправки повідомлень у чаті

Дата: 2025-11-23
Статус: Виправлено


🐛 Проблема

Користувач писав повідомлення у чат з оркестратором, але відповіді не було. Спінер крутився нескінченно.

Симптоми

  1. Повідомлення відображається в чаті
  2. Спінер завантаження крутиться
  3. Відповідь ніколи не приходить
  4. У логах Router: "Provider error: No message provided"
  5. 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 вже порожній!!!
};

Що відбувалося

  1. Користувач вводить текст: "ти хто?"
  2. input = "ти хто?"
  3. Створюється userMessage з текстом "ти хто?"
  4. setInput('') очищує input → input = ""
  5. sendMessageMutation.mutate(input) відправляє порожній рядок ""
  6. 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);  // ✅ Передаємо збережений текст
};

Що змінилося

  1. Додано const messageText = input.trim() перед очищенням
  2. Використовується messageText замість input в мутації
  3. Текст гарантовано передається в 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 агент..."
    }
  }
}

🐛 Чому це не було помічено раніше?

  1. Тестували через curl - там message передавався явно
  2. Логи показували "Matched rule" - але запит не доходив до LLM
  3. 502 помилки - змішувалися з іншими мережними помилками
  4. React state асинхронність - setInput('') спрацьовувала миттєво

Перевірка

Після виправлення перезавантажте сторінку та спробуйте написати будь-яке повідомлення:

  1. Напишіть "привіт" або "ти хто?"
  2. Натисніть Enter або кнопку відправки
  3. Почекайте 8-15 секунд
  4. Отримаєте відповідь від агента

📝 Уроки

  1. Завжди зберігайте значення перед мутацією state якщо воно використовується далі
  2. Тестуйте не тільки API, але й весь flow від UI до backend
  3. Логи Router корисні - "No message provided" одразу вказав на проблему
  4. React state оновлюється асинхронно - не покладайтеся на старі значення після setState

Висновок

Критична помилка виправлена. Тепер всі агенти-оркестратори працюють коректно:

  • GREENFOOD
  • Helion
  • Yaromir
  • DAARWIZZ

Чат з оркестраторами повністю функціональний!