Files
microdao-daarion/CHAT-MESSAGE-FIX.md
Apple 744c149300
Some checks failed
Build and Deploy Docs / build-and-deploy (push) Has been cancelled
Add automated session logging system
- Created logs/ structure (sessions, operations, incidents)
- Added session-start/log/end scripts
- Installed Git hooks for auto-logging commits/pushes
- Added shell integration for zsh
- Created CHANGELOG.md
- Documented today's session (2026-01-10)
2026-01-10 04:53:17 -08:00

5.6 KiB
Raw Permalink 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

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