- Created sync-node2-dagi-agents.py script to sync agents from agents_city_mapping.yaml - Synced 50 DAGI agents across 10 districts: - Leadership Hall (4): Solarius, Sofia, PrimeSynth, Nexor - System Control (6): Monitor, Strategic Sentinels, Vindex, Helix, Aurora, Arbitron - Engineering Lab (5): ByteForge, Vector, ChainWeaver, Cypher, Canvas - Marketing Hub (6): Roxy, Mira, Tempo, Harmony, Faye, Storytelling - Finance Office (4): Financial Analyst, Accountant, Budget Planner, Tax Advisor - Web3 District (5): Smart Contract Dev, DeFi Analyst, Tokenomics Expert, NFT Specialist, DAO Governance - Security Bunker (7): Shadelock, Exor, Penetration Tester, Security Monitor, Incident Responder, Shadelock Forensics, Exor Forensics - Vision Studio (4): Iris, Lumen, Spectra, Video Analyzer - R&D Lab (6): ProtoMind, LabForge, TestPilot, ModelScout, BreakPoint, GrowCell - Memory Vault (3): Somnia, Memory Manager, Knowledge Indexer - Fixed Swapper config to use swapper_config_node2.yaml with 8 models - Created TASK_PHASE_NODE2_FULL_DAGI_INTEGRATION_v1.md NODE2 now shows: - 50 agents in DAGI Router Card - 8 models in Swapper Service (gpt-oss, phi3, starcoder2, mistral-nemo, gemma2, deepseek-coder, qwen2.5-coder, deepseek-r1) - Full isolation from NODE1
12 KiB
TASK_PHASE_NODE2_FULL_DAGI_INTEGRATION_v1
Проєкт: DAARION.city
Нода: NODE2 (MacBook M4 Max)
Мета: зробити так, щоб DAARION MVP бачив реальний DAGI-стек NODE2:
- Swapper з локальними моделями (Ollama, HF);
- DAGI Router та Gateway;
- усі ~50 DAGI-агентів у районах міста;
- коректні метрики в Node Cabinet.
0. Джерела істини (OBLIGATORY READ)
Спочатку прочитати, не редагувати:
docs/users/nodes/NODE_STATE_node-2-macbook-m4max.mddocs/users/nodes/NODE_STATE_node-1-hetzner-gex44.md(для порівняння)docs/users/nodes/walkthrough.md(якщо існує)docs/users/nodes/NODE_GUARDIAN_AND_STEWARD.mddocs/tasks/TASK_PHASE_SWAPPER_NODE_METRICS_AND_UI_v1.mddocs/tasks/TASK_PHASE_NODE2_ROUTER_SWAPPER_ISOLATION_AND_AGENT_DISCOVERY_v1.md
Конфігурація DAGI на NODE2 (знайти й використати, не вигадувати заново):
swapper_config_node2.yamlrouter_config_node2.yaml(або подібний)agents_city_mapping.yaml/agents/- логи в
logs/node2_*
Мета цього таска — під'єднати існуючий стек, а не створювати новий.
1. Поточний стан (узагальнення)
Зафіксувати в коментарях до MR (або в кінці файлу), але орієнтовно:
-
NODE2:
- Swapper: працює на
http://localhost:8890, статус healthy, 8 моделей; - DAGI Router: працює на
http://localhost:9102; - LLM Proxy:
http://localhost:7007; - Gateway з 5 агентами (daarwizz, helion, greenfood, nutra, druid);
- ~50 DAGI-агентів, розкладених по районах (Leadership Hall, System Control, Engineering Lab, Marketing Hub, Finance Office, Web3 District, Security Bunker, Vision Studio, R&D Lab, Memory Vault);
- node-guardian вже шле heartbeat, але МВП не бачить агентів/моделей повністю.
- Swapper: працює на
-
NODE1:
- Swapper + Router вже інтегровані в MVP й працюють як еталон.
2. Scope
Включено
-
Swapper NODE2 → city-service
- коректні метрики per-node (healthy, models_loaded/total, swapper_state).
-
DAGI Router NODE2 → city-service
- статус роутера (up/down);
- кількість агентів, список агентів з Router API.
-
Agent Registry NODE2
- записати 50 DAGI-агентів у БД (таблиця
agents/node_agents/ аналогічна); - прив'язка до NODE2 та відповідних MicroDAO.
- записати 50 DAGI-агентів у БД (таблиця
-
API для Node Cabinet
/internal/node/{node_id}/models/internal/node/{node_id}/router/internal/node/{node_id}/agents(або адаптація існуючих, якщо вони вже є).
-
UI Node Cabinet
- NODE2 має показувати свої:
- Swapper моделі;
- Router статус;
- список агентів (хоча б з іменем, типом і MicroDAO).
- NODE2 має показувати свої:
Виключено
- CrewAI-кімнати, групові чати, кнопки створення кімнат — це окремий таск.
- Авто-самолікування роутера / свопера.
- Веб-інтерфейс кар'єру/налаштувань для кожного агента.
3. Swapper інтеграція NODE2
3.1. Перевірити конфіг
- підтвердити точний Swapper URL для NODE2:
http://localhost:8890/healthhttp://localhost:8890/models(або фактичний endpoint; див.swapper_config_node2.yamlтаlogs/node2_swapper_models.json).
3.2. Оновити node-guardian-loop (NODE2)
У scripts/node-guardian-loop.py:
-
переконатися, що при запуску з NODE2:
- використовується локальний Swapper URL (
localhost, а неswapper-service); - логуються
node_idіswapper_url(для дебагу в майбутньому).
- використовується локальний Swapper URL (
-
функція збору Swapper-метрик повинна:
- витягнути реальний список моделей;
- порахувати
models_total,models_loaded; - скласти
swapper_state(JSON) з полями:namebackend(ollama / hf / інше)type(llm / code / vision / reasoning)loadedvram_gb(якщо відомо).
Передавати ці значення в POST /internal/node/{node_id}/metrics/update.
3.3. Перевірити fn_node_heartbeat та node_cache
-
переконатися, що
fn_node_heartbeatоновлює тільки один запис поnode_idі не перетирає дані іншої ноди; -
стовпці:
swapper_healthyswapper_models_loadedswapper_models_totalswapper_state
Перевірити руками:
select node_id, swapper_healthy, swapper_models_loaded, swapper_models_total
from node_cache
order by node_id;
4. DAGI Router інтеграція NODE2
4.1. Виявити Router API
З логів і конфігів (NODE2):
- підтвердити базовий URL:
http://localhost:9102(наприклад,/health,/status,/agents).
Зробити невеликий helper (окрема функція) у node-guardian-loop.py:
def collect_router_metrics(router_base_url: str) -> dict:
# router_healthy (bool)
# router_agents_total (int)
# router_agents_active (int / optional)
# router_state (json: список агентів з базовою інформацією)
Передавати ці дані в metrics/update.
4.2. Розширити схему БД (якщо потрібно)
Міграція, наприклад migrations/041_node_cache_router_metrics.sql:
router_healthy booleanrouter_agents_total integerrouter_state jsonb
Оновити repo_city.py / models_city.py / routes_city.py, щоб ці поля поверталися для:
GET /internal/node/{node_id}/metrics/currentGET /internal/node/{node_id}(якщо є short summary).
5. Node2 Agent Registry (50 DAGI-агентів)
5.1. Зчитати конфіги
Знайти та використати (тільки читання):
agents_city_mapping.yaml- директорію
agents/(конфіги окремих агентів) - звіт discovery (walkthrough / NODE_STATE)
Не створювати агентів "із голови": брати тільки те, що описано в цих файлах.
5.2. Оновити таблиці БД
Залежно від існуючої схеми, але логіка така:
- таблиця
agents/node_agentsповинна мати:id/slugnode_id(node-1 / node-2)namerole/district/teammicrodao_slug(якщо прив'язано)is_core/is_system/is_microdao(флаги)model_name/model_backend(ollama / hf / інше)
Потрібно:
-
Створити окремий sync-скрипт для NODE2, напр.:
scripts/sync-node2-dagi-agents.pyВін повинен:
- прочитати
agents_city_mapping.yamlтаagents/; - для кожного агента:
- вставити/оновити запис у БД з
node_id = 'node-2-macbook-m4max';
- вставити/оновити запис у БД з
- не чіпати агентів NODE1.
- прочитати
-
Перед запуском — зробити dry-run (print summary), потім запустити реально.
6. API для Node Cabinet (тільки те, що потрібно зараз)
6.1. Agents
Endpoint:
GET /internal/node/{node_id}/agents
Повертає:
{
"node_id": "node-2-macbook-m4max",
"total": 50,
"agents": [
{
"id": "helix",
"name": "Helix",
"role": "CTO",
"district": "System Control",
"microdao": "daarion-dao",
"model_name": "qwen2.5-coder:32b",
"kind": "core"
},
...
]
}
Node Cabinet на фронтенді вже має секцію "Агенти цієї ноди" — під'єднати її до цього endpoint (без змін дизайну).
6.2. Models (опційно, але бажано)
GET /internal/node/{node_id}/models
Повертає агреговані дані з swapper_state:
- скільки моделей,
- які backend'и,
- який тип.
Це потрібно, щоб у Node Cabinet список моделей точно відповідав тому, що Swapper бачить на NODE2.
7. UI Node Cabinet — очікуваний результат для NODE2
Після завершення таска:
-
Swapper Service (NODE2):
- статус:
Healthy; Models Loaded: X / 8(від Swapper, а не від NODE1);- у списку моделей показуються саме локальні:
deepseek-r1:70b,qwen2.5-coder:32b,gemma2:27b,mistral-nemo,phi3,starcoder2,gpt-oss,deepseek-coder:33b.
- статус:
-
DAGI Router (NODE2):
- статус:
Up(якщо сервіс запущений); Agents: 50(або актуальна кількість);- кнопка "Агенти цієї ноди" відкриває список з усіма 50 агентами.
- статус:
-
Ізоляція по node_id:
- NODE1 показує свої 9 агентів і 7 моделей;
- NODE2 показує свої 50 агентів і 8 моделей, але через свій Swapper/Router;
- дані не змішуються.
8. Acceptance Criteria
-
scripts/discover_node_state.py(якщо є) показує різні Router/Swapper-дані для NODE1 та NODE2 (і вони збігаються з Node Cabinet). -
GET /internal/node/node-2-macbook-m4max/metrics/currentпоказує:swapper_healthy = true,swapper_models_total = 8,router_healthy = true,router_agents_total >= 40.
-
GET /internal/node/node-2-macbook-m4max/agentsповертає список із ~50 агентів. -
На UI:
- Node Cabinet для NODE2 показує коректні Swapper-метрики й Router-агентів;
- при перезапуску node-guardian дані оновлюються без ручних SQL.
-
Жоден endpoint / UI-блок для NODE1 не зламаний.
9. Район-агент маппінг (50 агентів NODE2)
Leadership Hall (4)
- Solarius (CEO)
- Sofia
- PrimeSynth
- Nexor
System Control (6)
- monitor-node2
- vindex
- helix
- aurora
- та інші...
Engineering Lab (5)
- byteforge
- vector
- chainweaver
- cypher
- canvas
Marketing Hub (6)
- roxy
- mira
- tempo
- harmony
- faye
- та інші...
Finance Office (4)
- financial-analyst
- accountant
- budget-planner
- та інші...
Web3 District (5)
- smart-contract-dev
- defi-analyst
- tokenomics-expert
- та інші...
Security Bunker (7)
- shadelock
- exor
- penetration-tester
- та інші...
Vision Studio (4)
- iris
- lumen
- spectra
- video-analyzer
R&D Lab (6)
- protomind
- labforge
- testpilot
- modelscout
- та інші...
Memory Vault (3)
- somnia
- memory-manager
- knowledge-indexer
Як тільки цей крок буде виконаний і задеплоєний, далі можемо рухатись:
- крок 2: кімнати/чати MicroDAO + публічний головний чат;
- крок 3: кнопки створення/видалення агента й групи (CrewAI-команди).