Files
microdao-daarion/DAARION-AGENTS-FIX.md
Apple 3de3c8cb36 feat: Add presence heartbeat for Matrix online status
- matrix-gateway: POST /internal/matrix/presence/online endpoint
- usePresenceHeartbeat hook with activity tracking
- Auto away after 5 min inactivity
- Offline on page close/visibility change
- Integrated in MatrixChatRoom component
2025-11-27 00:19:40 -08:00

10 KiB
Raw Permalink Blame History

Виправлено: Агенти не відображалися в DAARION

Дата: 2025-11-23
Проблема: http://localhost:8899/microdao/daarion не показує агентів
Статус: ВИПРАВЛЕНО


🔍 Діагностика

Проблема 1: API повертає HTML замість JSON

curl http://localhost:8899/api/microDAO/daarion
# Результат: HTML сторінка (Vite dev server)

Причина: Backend API не запущений або Vite проксі не налаштований.

Проблема 2: Agent Cabinet Service не працює

curl http://localhost:8898/health
# Результат: Connection refused (exit code 7)

Причина: Сервіс на порту 8898 не запущений.

Проблема 3: Агенти завантажуються, але не відображаються

У коді:

  • node1AgentsData завантажується (7 агентів з NODE1)
  • orchestratorFromNode1 знаходить agent-daarwizz
  • agentsData порожній (API не працює)
  • allAgents не включає агенти з NODE1

🛠️ Виправлення

1. Додано error handling для getAgents()

Файл: src/pages/MicroDaoCabinetPage.tsx (рядки 110-123)

Було:

const { data: agentsData } = useQuery({
  queryKey: ['agents', microDaoId],
  queryFn: async () => {
    const result = await getAgents(microDaoId);
    return result;
  },
  enabled: !!microDaoId,
  staleTime: 60000,
  gcTime: 300000,
  refetchOnWindowFocus: false,
  retry: false,
});

Стало:

const { data: agentsData } = useQuery({
  queryKey: ['agents', microDaoId],
  queryFn: async () => {
    try {
      const result = await getAgents(microDaoId);
      console.log('📥 Agents from API for', microDaoId, ':', result);
      return result;
    } catch (error) {
      console.warn('⚠️ Failed to fetch agents from API, will use NODE1 fallback:', error);
      // Повертаємо порожній список, щоб використати fallback з NODE1
      return { items: [] };
    }
  },
  enabled: !!microDaoId,
  staleTime: 60000,
  gcTime: 300000,
  refetchOnWindowFocus: false,
  retry: false,
});

Ефект: Тепер замість помилки повертається { items: [] }, що дозволяє fallback логіці спрацювати.


2. Додано логування для orchestratorFromNode1

Файл: src/pages/MicroDaoCabinetPage.tsx (рядки 208-232)

Додано:

const orchestratorFromNode1 = useMemo(() => {
  if (!node1AgentsData?.items || !orchestratorAgentId) {
    console.log('❌ No node1AgentsData or orchestratorAgentId:', { 
      hasData: !!node1AgentsData?.items, 
      orchestratorAgentId 
    });
    return undefined;
  }
  
  const found = node1AgentsData.items.find(/* ... */);
  
  console.log('🔍 Found orchestrator from NODE1:', found ? found.name : 'NOT FOUND');
  return found;
}, [node1AgentsData, orchestratorAgentId, orchestratorMapping]);

Ефект: Діагностика в консолі браузера для відслідковування проблем.


3. Реалізовано fallback на агенти з NODE1

Файл: src/pages/MicroDaoCabinetPage.tsx (рядки 226-270)

Було:

const allAgents = useMemo(() => {
  const baseAgents = agentsData?.items || [];
  if (!orchestratorFromNode1) return baseAgents;
  
  // Перевіряємо чи оркестратор вже є в списку
  const orchestratorExists = baseAgents.some((a: any) => a.id === orchestratorFromNode1.id);
  if (orchestratorExists) return baseAgents;
  
  return [
    ...baseAgents,
    {
      id: orchestratorFromNode1.id,
      name: orchestratorFromNode1.name,
      // ... тільки оркестратор
    },
  ];
}, [agentsData?.items, orchestratorFromNode1]);

Стало:

const allAgents = useMemo(() => {
  const baseAgents = agentsData?.items || [];
  
  console.log('🔄 Combining agents:', {
    baseAgents: baseAgents.length,
    hasOrchestrator: !!orchestratorFromNode1,
    orchestratorName: orchestratorFromNode1?.name,
    totalNode1Agents: node1AgentsData?.items?.length || 0,
  });
  
  // Якщо немає агентів з API, але є агенти з NODE1 - використовуємо їх
  if (baseAgents.length === 0 && node1AgentsData?.items) {
    console.log('✅ Using NODE1 agents as fallback');
    return node1AgentsData.items.map((agent: Node1Agent) => ({
      id: agent.id,
      name: agent.name,
      role: agent.role || 'Агент',
      language: 'uk',
      focus: agent.category || agent.department || 'Core',
      enabled: agent.status === 'active' || agent.deployment_status?.deployed === true,
      type: (agent.type || 'worker') as 'worker' | 'orchestrator',
      node1Agent: agent,
    }));
  }
  
  // Якщо є оркестратор, додаємо його до списку (якщо ще немає)
  if (orchestratorFromNode1) {
    const orchestratorExists = baseAgents.some((a: any) => a.id === orchestratorFromNode1.id);
    if (!orchestratorExists) {
      console.log(' Adding orchestrator to agents list:', orchestratorFromNode1.name);
      return [
        ...baseAgents,
        {
          id: orchestratorFromNode1.id,
          name: orchestratorFromNode1.name,
          role: orchestratorFromNode1.role || 'Оркестратор мікроДАО',
          language: 'uk',
          focus: orchestratorFromNode1.category || 'Оркестрація',
          enabled: orchestratorFromNode1.status === 'active' || orchestratorFromNode1.deployment_status?.deployed === true,
          type: 'orchestrator' as const,
          node1Agent: orchestratorFromNode1,
        },
      ];
    }
  }
  
  return baseAgents;
}, [agentsData?.items, orchestratorFromNode1, node1AgentsData?.items]);

Ключові зміни:

  1. Fallback на NODE1: Якщо baseAgents.length === 0, використовуються всі агенти з node1AgentsData.
  2. Логування: Додано console.log для діагностики.
  3. Dependency: Додано node1AgentsData?.items до useMemo dependencies.

🎯 Результат

Тепер на http://localhost:8899/microdao/daarion:

Агенти (з NODE1):

  1. agent-daarwizz (Daarwizz) - Оркестратор DAARION
  2. agent-devtools (DevTools Agent)
  3. agent-microdao-orchestrator (MicroDAO Orchestrator)
  4. agent-monitor-node1 (Monitor Agent)
  5. agent-tokenomics-advisor (Tokenomics Advisor)
  6. agent-greenfood-assistant (GREENFOOD Assistant)
  7. agent-helion (Helion)

Всього: 7 агентів з NODE1


📊 Логування в консолі

При завантаженні сторінки http://localhost:8899/microdao/daarion:

📥 Agents from API for daarion-dao : { items: [] }  // API не працює, fallback
❌ No node1AgentsData or orchestratorAgentId: { hasData: false, orchestratorAgentId: 'daarwizz' }  // Перша ітерація
🔍 Found orchestrator from NODE1: Daarwizz  // Знайдено оркестратора
🔄 Combining agents: { baseAgents: 0, hasOrchestrator: true, orchestratorName: 'Daarwizz', totalNode1Agents: 7 }
✅ Using NODE1 agents as fallback  // Використано fallback

🧪 Тестування

1. Відкрити DAARION кабінет

http://localhost:8899/microdao/daarion

2. Перевірити консоль браузера (F12)

Має бути:

  • ✅ Using NODE1 agents as fallback
  • Список з 7 агентів

3. Перевірити вкладку "Агенти"

Має відображатися:

  • Daarwizz (оркестратор)
  • DevTools Agent
  • MicroDAO Orchestrator
  • Monitor Agent (НОДА1)
  • Tokenomics Advisor
  • GREENFOOD Assistant
  • Helion

🔧 Майбутні покращення

1. Запустити Agent Cabinet Service

Порт: 8898
Сервіс: services/agent-cabinet-service/

cd /Users/apple/github-projects/microdao-daarion/services/agent-cabinet-service
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8898 --reload

Після запуску:

  • API /api/v1/agents?team_id=daarion-dao повертатиме реальні дані
  • Fallback на NODE1 не потрібен

2. Налаштувати Vite проксі

Файл: vite.config.ts

export default defineConfig({
  server: {
    port: 8899,
    proxy: {
      '/api/v1': {
        target: 'https://api.microdao.xyz',
        changeOrigin: true,
        secure: false,
      },
      '/api/agent': {
        target: 'http://localhost:8898',
        changeOrigin: true,
        secure: false,
      },
    },
  },
});

Ефект: Всі /api/* запити будуть проксуватися на відповідні backend сервіси.

3. Додати реальні метрики агентів

Endpoint: http://localhost:8898/api/agent/{agentId}/metrics

Дані:

  • Uptime
  • Total requests
  • Avg response time
  • Last active

4. Інтеграція з CrewAI

Для Daarwizz:

  • Команда агентів (якщо є)
  • Статус команди
  • Останні виконання завдань

Чекліст

  • Додано error handling для getAgents()
  • Додано логування для orchestratorFromNode1
  • Реалізовано fallback на агенти з NODE1
  • Додано node1AgentsData?.items до useMemo dependencies
  • Протестовано на http://localhost:8899/microdao/daarion
  • Запущено Agent Cabinet Service (порт 8898)
  • Налаштовано Vite проксі
  • Додано реальні метрики агентів
  • Інтеграція з CrewAI для команд

СТАТУС: ГОТОВО (fallback працює)
Тестуйте: http://localhost:8899/microdao/daarion
Консоль: F12 → Console → Шукайте ✅ Using NODE1 agents as fallback