11 KiB
✅ Фільтрація агентів за мікроДАО
Дата: 2025-11-23
Статус: ✅ Реалізовано чітку фільтрацію агентів
🎯 Проблема
Було:
- GREENFOOD показував всі агенти з НОДА1 (7 агентів)
- Не було фільтрації за належністю до мікроДАО
Потрібно:
- GREENFOOD → ТІЛЬКИ 13 GREENFOOD агентів
- ENERGY UNION → ТІЛЬКИ Helion
- Yaromir → ТІЛЬКИ Yaromir команда (5 агентів)
- DAARION → ВСІ інші агенти (50 з НОДА2 + залишок з НОДА1)
📊 Структура мікроДАО (4 штуки)
1. DAARION (daarion-dao)
- Оркестратор: Daarwizz
- Нода: НОДА2 (MacBook M4 Max)
- Агенти: 50 з НОДА2 + решта з НОДА1, які не належать іншим мікроДАО
- Логіка: За замовчуванням - всі агенти, які не мають явної належності до інших мікроДАО
2. GREENFOOD (greenfood-dao)
- Оркестратор: GREENFOOD Assistant
- Нода: НОДА1 (Hetzner GEX44)
- Агенти: 13 (12 sub-agents + 1 orchestrator)
- Фільтр:
department === 'GreenFood'абоcategory === 'GreenFood'
3. ENERGY UNION (energy-union-dao)
- Оркестратор: Helion
- Нода: НОДА1 (Hetzner GEX44)
- Агенти: 1 (тільки Helion)
- Фільтр:
id === 'agent-helion'абоdepartment === 'Energy'
4. Yaromir (yaromir-dao)
- Оркестратор: Yaromir
- Нода: НОДА1 (Hetzner GEX44)
- Агенти: 5 (Yaromir + Вождь, Проводник, Домир, Создатель)
- Фільтр:
id.includes('yaromir')абоid.includes('vozhd'),'provodnik','domir','sozdatel'
🛠️ Реалізація
1. Додано функцію getAgentMicroDao()
Файл: src/utils/agentMicroDaoMapping.ts (рядки 100-130)
/**
* Визначити чи агент належить конкретному мікроДАО
*/
export function getAgentMicroDao(agent: { id: string; department?: string; category?: string }): string | null {
// 1. GREENFOOD - department: 'GreenFood'
if (agent.department === 'GreenFood' || agent.category === 'GreenFood') {
return 'greenfood-dao';
}
// 2. ENERGY UNION - Helion
if (agent.id === 'agent-helion' || agent.department === 'Energy') {
return 'energy-union-dao';
}
// 3. Yaromir - Yaromir та його команда
if (agent.id.includes('yaromir') || agent.id.includes('vozhd') ||
agent.id.includes('provodnik') || agent.id.includes('domir') ||
agent.id.includes('sozdatel')) {
return 'yaromir-dao';
}
// 4. DAARION - всі інші агенти за замовчуванням
return 'daarion-dao';
}
Логіка:
- Перевіряємо
departmentтаcategoryдля GREENFOOD - Перевіряємо
idдля Helion та Energy - Перевіряємо
idдля Yaromir команди (по підстроці) - За замовчуванням → DAARION
2. Додано функцію getAllMicroDaos()
Файл: src/utils/agentMicroDaoMapping.ts (рядки 106-111)
/**
* Отримати список мікроДАО (ID та назви)
*/
export function getAllMicroDaos(): AgentMicroDaoMapping[] {
return AGENT_MICRODAO_MAPPING;
}
Використання: Для відображення списку всіх мікроДАО в панелі управління.
3. Оновлено allAgents з фільтрацією
Файл: src/pages/MicroDaoCabinetPage.tsx (рядки 262-375)
Додано функцію filterAgentsByMicroDao:
// Функція для фільтрації агентів за мікроДАО
const filterAgentsByMicroDao = (agents: any[]) => {
return agents.filter((agent) => {
const agentMicroDao = getAgentMicroDao(agent);
const belongs = agentMicroDao === microDaoId;
if (!belongs) {
console.log(`🚫 Filtering out agent ${agent.name} (belongs to ${agentMicroDao}, not ${microDaoId})`);
}
return belongs;
});
};
Логіка для кожного мікроДАО:
DAARION:
if (baseAgents.length === 0 && microDaoId === 'daarion-dao') {
const node2Agents = (node2AgentsData?.items || []).map(/* ... */);
const node1FilteredAgents = filterAgentsByMicroDao(
(node1AgentsData?.items || []).map(/* ... */)
);
const daarionAgents = [...node2Agents, ...node1FilteredAgents];
console.log(`✅ Using ${node2Agents.length} NODE2 agents + ${node1FilteredAgents.length} NODE1 agents for DAARION (total: ${daarionAgents.length})`);
return daarionAgents;
}
Ефект: Всі 50 агентів з НОДА2 + агенти з НОДА1, які не належать GREENFOOD/Helion/Yaromir.
GREENFOOD:
if (baseAgents.length === 0 && microDaoId === 'greenfood-dao' && node1AgentsData?.items) {
const greenfoodAgents = filterAgentsByMicroDao(
node1AgentsData.items.map(/* ... */)
);
console.log(`✅ Using ${greenfoodAgents.length} GREENFOOD agents from NODE1`);
return greenfoodAgents;
}
Ефект: Тільки агенти з department: 'GreenFood' → 1 агент (GREENFOOD Assistant).
ENERGY UNION:
if (baseAgents.length === 0 && microDaoId === 'energy-union-dao' && node1AgentsData?.items) {
const energyAgents = filterAgentsByMicroDao(
node1AgentsData.items.map(/* ... */)
);
console.log(`✅ Using ${energyAgents.length} ENERGY UNION agents from NODE1`);
return energyAgents;
}
Ефект: Тільки agent-helion → 1 агент.
Yaromir:
if (baseAgents.length === 0 && microDaoId === 'yaromir-dao' && node1AgentsData?.items) {
const yaromirAgents = filterAgentsByMicroDao(
node1AgentsData.items.map(/* ... */)
);
console.log(`✅ Using ${yaromirAgents.length} Yaromir agents from NODE1`);
return yaromirAgents;
}
Ефект: Тільки Yaromir команда → 0 агентів (якщо вони не на НОДА1).
📊 Очікувані результати
DAARION (http://localhost:8899/microdao/daarion):
Консоль:
✅ Using 50 NODE2 agents + 4 NODE1 agents for DAARION (total: 54)
🚫 Filtering out agent GREENFOOD Assistant (belongs to greenfood-dao, not daarion-dao)
🚫 Filtering out agent Helion (belongs to energy-union-dao, not daarion-dao)
Агенти:
- 50 з НОДА2 (System + Domain)
- 4 з НОДА1 (Daarwizz, DevTools, MicroDAO Orchestrator, Monitor, Tokenomics)
Всього: ~54 агенти
GREENFOOD (http://localhost:8899/microdao/greenfood):
Консоль:
✅ Using 1 GREENFOOD agents from NODE1
Агенти:
- GREENFOOD Assistant (оркестратор)
Всього: 1 агент (+ 12 CrewAI sub-agents)
ENERGY UNION (http://localhost:8899/microdao/energy-union):
Консоль:
✅ Using 1 ENERGY UNION agents from NODE1
Агенти:
- Helion (оркестратор)
Всього: 1 агент
Yaromir (http://localhost:8899/microdao/yaromir):
Консоль:
✅ Using 0 Yaromir agents from NODE1
Агенти:
- (Yaromir команда не на НОДА1, потрібно додати)
Всього: 0 агентів (потрібно додати в NODE1 список)
🧪 Тестування
1. GREENFOOD
http://localhost:8899/microdao/greenfood
Перевірити:
- ✅ Вкладка "Агенти" → 1 агент (GREENFOOD Assistant)
- ✅ Консоль →
✅ Using 1 GREENFOOD agents from NODE1 - ❌ Немає Daarwizz, DevTools, Helion, тощо
2. DAARION
http://localhost:8899/microdao/daarion
Перевірити:
- ✅ Вкладка "Агенти" → ~54 агенти (50 з НОДА2 + 4 з НОДА1)
- ✅ Консоль →
✅ Using 50 NODE2 agents + 4 NODE1 agents for DAARION - ✅ Є Daarwizz, DevTools, Solarius, Sofia, тощо
- ❌ Немає GREENFOOD Assistant, Helion
3. ENERGY UNION
http://localhost:8899/microdao/energy-union
Перевірити:
- ✅ Вкладка "Агенти" → 1 агент (Helion)
- ✅ Консоль →
✅ Using 1 ENERGY UNION agents from NODE1 - ❌ Немає інших агентів
🔧 Що потрібно додати
1. Yaromir команда на НОДА1
Файл: src/api/node1Agents.ts
Додати 5 агентів:
agent-yaromir(Orchestrator)agent-vozhd(Strategic)agent-provodnik(Mentor)agent-domir(Harmony)agent-sozdatel(Innovation)
З полями:
{
id: 'agent-yaromir',
name: 'Yaromir',
role: 'Yaromir Orchestrator',
model: 'qwen2.5:14b',
backend: 'ollama',
status: 'active',
node: 'node-1',
priority: 'highest',
category: 'Yaromir',
type: 'orchestrator',
department: 'Yaromir',
}
2. GREENFOOD CrewAI sub-agents
Проблема: GREENFOOD має тільки 1 агент (оркестратор), але має 12 CrewAI sub-agents.
Рішення: Додати відображення CrewAI команди окремо від основних агентів.
Файл: src/pages/MicroDaoCabinetPage.tsx → вкладка "Агенти"
Показувати:
- Основні агенти (1 - GREENFOOD Assistant)
- CrewAI команда (12 sub-agents)
✅ Чекліст
- Додано
getAgentMicroDao()функцію - Додано
getAllMicroDaos()функцію - Реалізовано
filterAgentsByMicroDao()вallAgents - Додано логування фільтрації
- Додано
departmentтаcategoryдо агентів - Протестовано на DAARION
- Протестовано на GREENFOOD (1 агент)
- Протестовано на ENERGY UNION (1 агент)
- Протестовано на Yaromir (0 агентів, потрібно додати)
- Додано Yaromir команду на НОДА1
- Додано відображення CrewAI sub-agents для GREENFOOD
СТАТУС: ✅ Фільтрація реалізована
Тестуйте: http://localhost:8899/microdao/greenfood (має показати 1 агент)
Консоль: F12 → Console → Шукайте ✅ Using X GREENFOOD agents from NODE1
📋 Підсумок мікроДАО
| МікроДАО | Оркестратор | Нода | Очікувано агентів | Фільтр |
|---|---|---|---|---|
| DAARION | Daarwizz | НОДА2 | 54 (50+4) | За замовчуванням |
| GREENFOOD | GREENFOOD Assistant | НОДА1 | 1 (+12 CrewAI) | department: 'GreenFood' |
| ENERGY UNION | Helion | НОДА1 | 1 | id: 'agent-helion' |
| Yaromir | Yaromir | НОДА1 | 5 | id.includes('yaromir') |
Всього: 4 мікроДАО