docs: add missing migrations and documentation (NODE2, DAIS, infra)

This commit is contained in:
Apple
2025-11-28 05:18:45 -08:00
parent e7aff95408
commit 41b23537c9
12 changed files with 2371 additions and 0 deletions

View File

@@ -0,0 +1,315 @@
# DAIS: Agent Profile Standard v1.0
**Date:** 2025-11-28
**Status:** Active
**Version:** 1.0.0
---
## Overview
DAIS (Decentralized AI Agent Standard) визначає структуру профілю AI-агента в екосистемі DAARION. Кожен агент має 4 основні модулі:
1. **CORE (META)** — "Хто я?" — ідентичність, роль, місія
2. **VIS (Visual Kernel)** — "Як я виглядаю?" — аватар, стиль, візуальний образ
3. **COG (Cognitive Engine)** — "Як я думаю?" — модель, пам'ять, контекст
4. **ACT (Action Interface)** — "Що я можу робити?" — інструменти, інтерфейси
---
## Agent Identity
```json
{
"agent_id": "string",
"display_name": "string",
"kind": "string",
"status": "online|offline|degraded|training|maintenance",
"node_id": "string",
"roles": ["string"],
"tags": ["string"]
}
```
### Agent Kinds
| Kind | Description |
|------|-------------|
| `orchestrator` | Координує інших агентів |
| `coordinator` | Управляє workflow |
| `specialist` | Експерт у вузькій області |
| `developer` | Розробка коду |
| `architect` | Системна архітектура |
| `marketing` | Маркетинг і комунікації |
| `finance` | Фінанси і аналітика |
| `security` | Безпека і аудит |
| `forensics` | Форензика і розслідування |
| `vision` | Обробка зображень/відео |
| `research` | Дослідження і аналіз |
| `memory` | Управління пам'яттю |
| `web3` | Blockchain і криптовалюти |
| `strategic` | Стратегічне планування |
| `mediator` | Вирішення конфліктів |
| `innovation` | Інновації та R&D |
| `civic` | Громадські справи |
| `oracle` | Зовнішні дані |
| `builder` | Створення контенту |
| `social` | Соціальна взаємодія |
---
## DAIS Modules
### 1. CORE (META) — Identity
```json
{
"core": {
"title": "string",
"bio": "string",
"mission": "string",
"version": "string",
"created_at": "ISO8601",
"updated_at": "ISO8601"
}
}
```
### 2. VIS (Visual Kernel) — Appearance
```json
{
"vis": {
"avatar_url": "string",
"avatar_style": "anime|realistic|abstract|cyberpunk",
"color_primary": "#hex",
"color_secondary": "#hex",
"lora_refs": ["string"],
"checkpoint_refs": ["string"],
"second_me_id": "string"
}
}
```
### 3. COG (Cognitive Engine) — Brain
```json
{
"cog": {
"base_model": "string",
"provider": "ollama|openai|anthropic|custom",
"node_id": "string",
"context_window": 8192,
"temperature": 0.7,
"system_prompt": "string",
"memory": {
"type": "RAG|long-term|episodic",
"store": "qdrant|chroma|postgres",
"collections": ["string"],
"max_tokens": 160000
},
"tools_enabled": ["string"]
}
}
```
### 4. ACT (Action Interface) — Capabilities
```json
{
"act": {
"matrix": {
"user_id": "@agent:daarion.space",
"rooms": ["!room:daarion.space"]
},
"tools": ["tool_id"],
"apis": ["api_endpoint"],
"web3": {
"wallet_address": "0x...",
"chains": ["ethereum", "polygon"]
},
"social": {
"twitter": "@handle",
"telegram": "@handle"
}
}
}
```
---
## City Presence
Агент може бути присутнім у City Rooms:
```json
{
"city_presence": {
"primary_room_slug": "string",
"district": "string",
"rooms": [
{
"room_id": "string",
"slug": "string",
"name": "string",
"role": "resident|moderator|owner"
}
]
}
}
```
---
## Metrics
Runtime метрики агента:
```json
{
"metrics": {
"tasks_1h": 42,
"tasks_24h": 320,
"errors_1h": 0,
"errors_24h": 1,
"avg_latency_ms_1h": 180,
"success_rate_24h": 0.99,
"tokens_24h": 2400000,
"last_task_at": "ISO8601"
}
}
```
---
## Full Agent Profile Example
```json
{
"agent_id": "iris",
"display_name": "Iris",
"kind": "vision",
"status": "online",
"node_id": "node-2-macbook-m4max",
"roles": ["vision", "highlights", "safety"],
"tags": ["video", "frames", "clips"],
"dais": {
"core": {
"title": "Multimodal Vision Analyst",
"bio": "Iris analyzes video frames, extracts highlights and detects key scenes.",
"mission": "Make video content accessible and searchable",
"version": "1.0.0"
},
"vis": {
"avatar_url": "/assets/agents/iris.png",
"avatar_style": "anime-cyberpunk",
"color_primary": "#22D3EE",
"color_secondary": "#0891B2",
"lora_refs": ["hf://daarion/iris-lora"],
"second_me_id": "secondme_iris_v1"
},
"cog": {
"base_model": "llava:13b",
"provider": "ollama",
"node_id": "node-2-macbook-m4max",
"context_window": 8192,
"temperature": 0.7,
"memory": {
"type": "RAG",
"store": "qdrant",
"collections": ["iris_sessions", "video_highlights"],
"max_tokens": 160000
},
"tools_enabled": ["video_cut", "thumbnail_gen", "safety_scan"]
},
"act": {
"matrix": {
"user_id": "@iris:daarion.space",
"rooms": ["!vision_lab:daarion.space", "!central_square:daarion.space"]
},
"tools": ["video_cut", "thumbnail_gen", "safety_scan"],
"web3": null
}
},
"city_presence": {
"primary_room_slug": "vision-lab",
"district": "creators",
"rooms": [
{"room_id": "city_vision_lab", "slug": "vision-lab", "name": "Vision Lab", "role": "resident"},
{"room_id": "city_central_square", "slug": "central-square", "name": "Central Square", "role": "resident"}
]
},
"metrics": {
"tasks_1h": 42,
"tasks_24h": 320,
"errors_24h": 1,
"avg_latency_ms_1h": 180,
"success_rate_24h": 0.99,
"tokens_24h": 2400000,
"last_task_at": "2025-11-27T09:01:23Z"
}
}
```
---
## Agent Dashboard API
### Endpoints
```http
GET /api/v1/agents/{agent_id}/dashboard
GET /api/v1/agents/{agent_id}/profile
PUT /api/v1/agents/{agent_id}/profile (admin only)
```
### Dashboard Response
```json
{
"profile": { /* Agent Profile */ },
"node": {
"node_id": "string",
"status": "online",
"gpu": { "name": "string", "vram_gb": 20 }
},
"runtime": {
"router_endpoint": "http://node:9102",
"health": "healthy",
"last_success_at": "ISO8601",
"last_error_at": null
},
"metrics": { /* Metrics */ },
"recent_activity": [
{
"timestamp": "ISO8601",
"type": "task_completed|chat_reply|error",
"room_slug": "string",
"summary": "string"
}
]
}
```
---
## Database Schema
### agents table (extended)
```sql
ALTER TABLE agents ADD COLUMN IF NOT EXISTS dais_core JSONB DEFAULT '{}';
ALTER TABLE agents ADD COLUMN IF NOT EXISTS dais_vis JSONB DEFAULT '{}';
ALTER TABLE agents ADD COLUMN IF NOT EXISTS dais_cog JSONB DEFAULT '{}';
ALTER TABLE agents ADD COLUMN IF NOT EXISTS dais_act JSONB DEFAULT '{}';
```
---
## Changelog
- **v1.0.0** (2025-11-28): Initial DAIS standard based on 4-module architecture

View File

@@ -0,0 +1,236 @@
# Node Dashboard API v1.0
**Date:** 2025-11-28
**Status:** Active
**Service:** node-registry
**Base URL:** `/api/v1/nodes`
---
## Overview
Node Dashboard API — агрегуючий API для отримання повної інформації про ноду, включаючи:
- Базовий профіль (roles, modules, GPU)
- Інфраструктурні метрики (CPU, RAM, Disk, GPU)
- Статус AI-сервісів (Swapper, Router, STT, Vision, OCR)
- Агенти на ноді
- Matrix інтеграція
- Моніторинг
---
## Endpoints
### 1. Get Node Dashboard (Admin)
```http
GET /api/v1/nodes/{node_id}/dashboard
Authorization: Bearer <admin_token>
```
Повертає повну інформацію про ноду для адміністратора.
### 2. Get Self Dashboard (Node Owner)
```http
GET /api/v1/nodes/self/dashboard
Authorization: Bearer <node_token>
```
Повертає інформацію про поточну ноду (node_id з JWT claims).
---
## Response Schema
```json
{
"node": {
"node_id": "string",
"name": "string",
"roles": ["string"],
"status": "online|offline|degraded|maintenance",
"public_hostname": "string",
"environment": "production|development",
"gpu": {
"vendor": "string",
"model": "string",
"vram_gb": "number",
"unified_memory_gb": "number (optional, for Apple Silicon)"
},
"modules": [
{
"id": "string",
"status": "up|down|degraded|unknown",
"port": "number (optional)",
"error": "string (optional)"
}
]
},
"infra": {
"cpu_usage_pct": "number",
"ram": {
"total_gb": "number",
"used_gb": "number"
},
"disk": {
"total_gb": "number",
"used_gb": "number"
},
"gpus": [
{
"name": "string",
"vram_gb": "number",
"used_gb": "number",
"sm_util_pct": "number"
}
],
"network": {
"rx_mbps": "number",
"tx_mbps": "number"
}
},
"ai": {
"swapper": {
"status": "up|down|degraded",
"endpoint": "string",
"latency_ms": "number",
"storage": {
"total_gb": "number",
"used_gb": "number",
"free_gb": "number"
},
"models": [
{
"name": "string",
"size_gb": "number",
"device": "gpu|disk",
"state": "loaded|unloaded",
"last_used": "ISO8601"
}
]
},
"router": {
"status": "up|down|degraded",
"endpoint": "string",
"version": "string",
"backends": [
{
"name": "string",
"status": "up|down|degraded",
"latency_ms": "number",
"error": "string (optional)"
}
],
"metrics": {
"requests_1m": "number",
"requests_1h": "number",
"error_rate_1h": "number",
"avg_latency_ms_1h": "number"
}
},
"services": {
"<service_name>": {
"status": "up|down|degraded",
"endpoint": "string",
"latency_ms": "number",
"error": "string (optional)",
"models": ["string (optional)"]
}
}
},
"agents": {
"total": "number",
"running": "number",
"by_kind": {
"<kind>": "number"
},
"top": [
{
"agent_id": "string",
"display_name": "string",
"kind": "string",
"status": "online|offline|busy",
"node_id": "string",
"tasks_24h": "number",
"errors_24h": "number"
}
]
},
"matrix": {
"enabled": "boolean",
"homeserver": "string",
"presence_bridge": {
"status": "up|down",
"latency_ms": "number"
}
},
"monitoring": {
"prometheus": {
"url": "string",
"status": "up|down|unknown"
},
"grafana": {
"url": "string",
"status": "up|down|unknown"
},
"logging": {
"loki": {
"status": "up|down|unknown"
}
}
}
}
```
---
## Module Probes
Dashboard API опитує модулі за допомогою HTTP probes:
| Module | Probe URL | Timeout |
|--------|-----------|---------|
| `core.health` | `GET /health` | 500ms |
| `ai.swapper` | `GET :8890/health` + `GET :8890/models` | 1000ms |
| `ai.router` | `GET :9102/health` + `GET :9102/backends/status` | 1000ms |
| `ai.stt` | `GET :8895/health` | 500ms |
| `ai.tts` | `GET :5002/health` | 500ms |
| `ai.vision` | `GET :11434/api/tags` | 500ms |
| `ai.ocr` | `GET :8896/health` | 500ms |
| `ai.memory` | `GET :8001/health` | 500ms |
| `ai.crewai` | `GET :9010/health` | 500ms |
| `matrix.synapse` | `GET :8018/_matrix/client/versions` | 500ms |
| `matrix.presence` | `GET :8085/health` | 500ms |
| `monitoring.prometheus` | `GET :9090/-/ready` | 500ms |
---
## Error Handling
- Якщо модуль недоступний → `"status": "down", "error": "timeout/connection refused"`
- Якщо модуль повертає помилку → `"status": "degraded", "error": "<message>"`
- Dashboard API **ніколи не падає** — завжди повертає JSON з актуальними статусами
---
## Implementation Notes
1. **Паралельні запити**: Всі probes виконуються паралельно (asyncio.gather)
2. **Кешування**: Результати кешуються на 10 секунд
3. **Fallback**: Якщо probe не відповідає, використовується останній відомий статус
4. **Metrics**: Для infra метрик використовується psutil або node_exporter
---
## Changelog
- **v1.0.0** (2025-11-28): Initial version

View File

@@ -0,0 +1,68 @@
# WireGuard Setup for NODE2 (macOS)
## Конфігурація готова!
Файл конфігурації: `~/.wireguard/wg0.conf`
## Кроки для підключення:
### Варіант 1: WireGuard GUI (рекомендовано)
1. Встановіть WireGuard з App Store або [офіційного сайту](https://www.wireguard.com/install/)
2. Відкрийте WireGuard.app
3. Натисніть **"Import tunnel(s) from file..."**
4. Оберіть файл: `~/.wireguard/wg0.conf`
5. Натисніть **"Activate"**
### Варіант 2: Командний рядок
```bash
# Потрібен sudo пароль
sudo wg-quick up ~/.wireguard/wg0.conf
# Перевірка
wg show
# Тест зв'язку
ping 10.42.0.1
```
## Конфігурація NODE2
```ini
[Interface]
Address = 10.42.0.2/32
PrivateKey = <hidden>
[Peer]
PublicKey = p3mGZ7kFzEeDv2poAoTXfDFuklF3JLDVbminumZGUxk=
AllowedIPs = 10.42.0.0/24
Endpoint = 144.76.224.179:51820
PersistentKeepalive = 25
```
## IP-адреси
| Node | VPN IP | Public IP |
|------|--------|-----------|
| NODE1 (Hetzner) | 10.42.0.1 | 144.76.224.179 |
| NODE2 (MacBook) | 10.42.0.2 | dynamic |
## Тести після підключення
```bash
# З NODE2
ping 10.42.0.1
curl http://10.42.0.1:9205/api/v1/nodes
curl http://10.42.0.1:9102/health
# З NODE1
ping 10.42.0.2
curl http://10.42.0.2:8890/health
curl http://10.42.0.2:8895/health
```