feat(node2): Full DAGI integration - 50 agents synced

- 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
This commit is contained in:
Apple
2025-12-01 08:31:25 -08:00
parent a818f2ac2f
commit 2f8e471e03
4 changed files with 778 additions and 52 deletions

View File

@@ -0,0 +1,370 @@
# 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.md`
- `docs/users/nodes/NODE_STATE_node-1-hetzner-gex44.md` (для порівняння)
- `docs/users/nodes/walkthrough.md` (якщо існує)
- `docs/users/nodes/NODE_GUARDIAN_AND_STEWARD.md`
- `docs/tasks/TASK_PHASE_SWAPPER_NODE_METRICS_AND_UI_v1.md`
- `docs/tasks/TASK_PHASE_NODE2_ROUTER_SWAPPER_ISOLATION_AND_AGENT_DISCOVERY_v1.md`
Конфігурація DAGI на NODE2 (знайти й використати, не вигадувати заново):
- `swapper_config_node2.yaml`
- `router_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, але МВП не бачить агентів/моделей повністю.
- NODE1:
- Swapper + Router вже інтегровані в MVP й працюють як еталон.
---
## 2. Scope
### Включено
1. **Swapper NODE2 → city-service**
- коректні метрики per-node (healthy, models_loaded/total, swapper_state).
2. **DAGI Router NODE2 → city-service**
- статус роутера (up/down);
- кількість агентів, список агентів з Router API.
3. **Agent Registry NODE2**
- записати 50 DAGI-агентів у БД (таблиця `agents` / `node_agents` / аналогічна);
- прив'язка до NODE2 та відповідних MicroDAO.
4. **API для Node Cabinet**
- `/internal/node/{node_id}/models`
- `/internal/node/{node_id}/router`
- `/internal/node/{node_id}/agents`
(або адаптація існуючих, якщо вони вже є).
5. **UI Node Cabinet**
- NODE2 має показувати свої:
- Swapper моделі;
- Router статус;
- список агентів (хоча б з іменем, типом і MicroDAO).
### Виключено
- CrewAI-кімнати, групові чати, кнопки створення кімнат — це **окремий таск**.
- Авто-самолікування роутера / свопера.
- Веб-інтерфейс кар'єру/налаштувань для кожного агента.
---
## 3. Swapper інтеграція NODE2
### 3.1. Перевірити конфіг
- підтвердити точний Swapper URL для NODE2:
- `http://localhost:8890/health`
- `http://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-метрик повинна:
- витягнути **реальний список моделей**;
- порахувати `models_total`, `models_loaded`;
- скласти `swapper_state` (JSON) з полями:
- `name`
- `backend` (ollama / hf / інше)
- `type` (llm / code / vision / reasoning)
- `loaded`
- `vram_gb` (якщо відомо).
Передавати ці значення в `POST /internal/node/{node_id}/metrics/update`.
### 3.3. Перевірити fn_node_heartbeat та `node_cache`
- переконатися, що `fn_node_heartbeat` оновлює **тільки один запис** по `node_id` і не перетирає дані іншої ноди;
- стовпці:
- `swapper_healthy`
- `swapper_models_loaded`
- `swapper_models_total`
- `swapper_state`
Перевірити руками:
```sql
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`:
```python
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 boolean`
* `router_agents_total integer`
* `router_state jsonb`
Оновити `repo_city.py` / `models_city.py` / `routes_city.py`, щоб ці поля поверталися для:
* `GET /internal/node/{node_id}/metrics/current`
* `GET /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` / `slug`
* `node_id` (node-1 / node-2)
* `name`
* `role` / `district` / `team`
* `microdao_slug` (якщо прив'язано)
* `is_core` / `is_system` / `is_microdao` (флаги)
* `model_name` / `model_backend` (ollama / hf / інше)
Потрібно:
1. Створити окремий **sync-скрипт** для NODE2, напр.:
`scripts/sync-node2-dagi-agents.py`
Він повинен:
* прочитати `agents_city_mapping.yaml` та `agents/`;
* для кожного агента:
* вставити/оновити запис у БД з `node_id = 'node-2-macbook-m4max'`;
* не чіпати агентів NODE1.
2. Перед запуском — зробити dry-run (print summary), потім запустити реально.
---
## 6. API для Node Cabinet (тільки те, що потрібно зараз)
### 6.1. Agents
Endpoint:
* `GET /internal/node/{node_id}/agents`
Повертає:
```json
{
"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
Після завершення таска:
1. **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`.
2. **DAGI Router (NODE2)**:
* статус: `Up` (якщо сервіс запущений);
* `Agents: 50` (або актуальна кількість);
* кнопка "Агенти цієї ноди" відкриває список з усіма 50 агентами.
3. **Ізоляція по node_id**:
* NODE1 показує свої 9 агентів і 7 моделей;
* NODE2 показує свої 50 агентів і 8 моделей, але **через свій Swapper/Router**;
* дані не змішуються.
---
## 8. Acceptance Criteria
1. `scripts/discover_node_state.py` (якщо є) показує різні Router/Swapper-дані для NODE1 та NODE2 (і вони збігаються з Node Cabinet).
2. `GET /internal/node/node-2-macbook-m4max/metrics/current` показує:
* `swapper_healthy = true`,
* `swapper_models_total = 8`,
* `router_healthy = true`,
* `router_agents_total >= 40`.
3. `GET /internal/node/node-2-macbook-m4max/agents` повертає список із ~50 агентів.
4. На UI:
* Node Cabinet для NODE2 показує коректні Swapper-метрики й Router-агентів;
* при перезапуску node-guardian дані оновлюються без ручних SQL.
5. Жоден 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-команди).