Files
microdao-daarion/CURSOR-TASK-HELION.md
Apple 4601c6fca8 feat: add Vision Encoder service + Vision RAG implementation
- Vision Encoder Service (OpenCLIP ViT-L/14, GPU-accelerated)
  - FastAPI app with text/image embedding endpoints (768-dim)
  - Docker support with NVIDIA GPU runtime
  - Port 8001, health checks, model info API

- Qdrant Vector Database integration
  - Port 6333/6334 (HTTP/gRPC)
  - Image embeddings storage (768-dim, Cosine distance)
  - Auto collection creation

- Vision RAG implementation
  - VisionEncoderClient (Python client for API)
  - Image Search module (text-to-image, image-to-image)
  - Vision RAG routing in DAGI Router (mode: image_search)
  - VisionEncoderProvider integration

- Documentation (5000+ lines)
  - SYSTEM-INVENTORY.md - Complete system inventory
  - VISION-ENCODER-STATUS.md - Service status
  - VISION-RAG-IMPLEMENTATION.md - Implementation details
  - vision_encoder_deployment_task.md - Deployment checklist
  - services/vision-encoder/README.md - Deployment guide
  - Updated WARP.md, INFRASTRUCTURE.md, Jupyter Notebook

- Testing
  - test-vision-encoder.sh - Smoke tests (6 tests)
  - Unit tests for client, image search, routing

- Services: 17 total (added Vision Encoder + Qdrant)
- AI Models: 3 (qwen3:8b, OpenCLIP ViT-L/14, BAAI/bge-m3)
- GPU Services: 2 (Vision Encoder, Ollama)
- VRAM Usage: ~10 GB (concurrent)

Status: Production Ready 
2025-11-17 05:24:36 -08:00

680 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Завдання для Cursor AI: Запуск агента Helion на сервері
**Репозиторій**: `microdao-daarion` (поточний)
**Сервер**: 144.76.224.179
**Мета**: Запустити Telegram бота Helion для платформи Energy Union
---
## 📋 Контекст
Агент Helion повністю розроблений на рівні коду, але не запущений на сервері. Потрібно:
1. Додати Memory Service в docker-compose.yml
2. Налаштувати всі залежності
3. Створити інструкції для запуску на сервері
**Існуючі компоненти**:
-`gateway-bot/helion_prompt.txt` - system prompt (200+ рядків)
-`gateway-bot/http_api.py` - endpoint `/helion/telegram/webhook`
-`gateway-bot/memory_client.py` - клієнт для Memory Service
-`services/memory-service/` - код Memory Service
-`.env` - Telegram токен вже є
-`scripts/setup-nginx-gateway.sh` - скрипт для HTTPS
-`scripts/register-agent-webhook.sh` - скрипт для webhook
---
## 🎯 Завдання 1: Додати Memory Service в docker-compose.yml
**Файл**: `docker-compose.yml`
### Що зробити:
1. **Додати сервіс memory-service** після `rag-service`:
```yaml
# Memory Service
memory-service:
build:
context: ./services/memory-service
dockerfile: Dockerfile
container_name: dagi-memory-service
ports:
- "8000:8000"
environment:
- DATABASE_URL=${MEMORY_DATABASE_URL:-postgresql://postgres:postgres@postgres:5432/daarion_memory}
- LOG_LEVEL=${LOG_LEVEL:-INFO}
volumes:
- ./logs:/app/logs
- memory-data:/app/data
depends_on:
- postgres
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
```
2. **Додати PostgreSQL** для Memory Service (якщо ще немає):
```yaml
# PostgreSQL Database
postgres:
image: postgres:15-alpine
container_name: dagi-postgres
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=daarion_memory
volumes:
- postgres-data:/var/lib/postgresql/data
- ./services/memory-service/init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
```
3. **Оновити volumes секцію**:
```yaml
volumes:
rag-model-cache:
driver: local
memory-data:
driver: local
postgres-data:
driver: local
```
4. **Додати STT Service** (для голосових повідомлень - опціонально):
```yaml
# STT Service (Speech-to-Text)
stt-service:
build:
context: ./services/stt-service
dockerfile: Dockerfile
container_name: dagi-stt-service
ports:
- "9000:9000"
environment:
- MODEL_NAME=${STT_MODEL_NAME:-openai/whisper-base}
- DEVICE=${STT_DEVICE:-cpu}
volumes:
- ./logs:/app/logs
- stt-model-cache:/root/.cache/huggingface
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/health"]
interval: 30s
timeout: 10s
retries: 3
```
5. **Оновити gateway environment**:
```yaml
gateway:
# ... існуючий код ...
environment:
- ROUTER_URL=http://router:9102
- TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN:-}
- DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN:-}
- DAARWIZZ_NAME=${DAARWIZZ_NAME:-DAARWIZZ}
- DAARWIZZ_PROMPT_PATH=/app/gateway-bot/daarwizz_prompt.txt
- HELION_TELEGRAM_BOT_TOKEN=${HELION_TELEGRAM_BOT_TOKEN:-}
- HELION_NAME=${HELION_NAME:-Helion}
- HELION_PROMPT_PATH=/app/gateway-bot/helion_prompt.txt
- MEMORY_SERVICE_URL=http://memory-service:8000
- STT_SERVICE_URL=http://stt-service:9000 # Додати це
```
---
## 🎯 Завдання 2: Оновити .env файл
**Файл**: `.env`
### Що додати:
```bash
# -----------------------------------------------------------------------------
# Memory Service Configuration
# -----------------------------------------------------------------------------
MEMORY_DATABASE_URL=postgresql://postgres:postgres@postgres:5432/daarion_memory
MEMORY_SERVICE_URL=http://memory-service:8000
# -----------------------------------------------------------------------------
# STT Service Configuration (optional)
# -----------------------------------------------------------------------------
STT_SERVICE_URL=http://stt-service:9000
STT_MODEL_NAME=openai/whisper-base
STT_DEVICE=cpu
# -----------------------------------------------------------------------------
# PostgreSQL Configuration
# -----------------------------------------------------------------------------
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=daarion_memory
```
---
## 🎯 Завдання 3: Перевірити Memory Service має init.sql
**Файл**: `services/memory-service/init.sql`
### Створити файл якщо відсутній:
```sql
-- Memory Service Database Schema
-- Created: 2025-01-16
-- User facts table
CREATE TABLE IF NOT EXISTS user_facts (
id SERIAL PRIMARY KEY,
user_id VARCHAR(255) NOT NULL,
team_id VARCHAR(255),
fact_key VARCHAR(255) NOT NULL,
fact_value TEXT,
fact_value_json JSONB,
token_gated BOOLEAN DEFAULT FALSE,
token_requirements JSONB,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(user_id, team_id, fact_key)
);
-- Dialog summaries table
CREATE TABLE IF NOT EXISTS dialog_summaries (
id SERIAL PRIMARY KEY,
team_id VARCHAR(255) NOT NULL,
channel_id VARCHAR(255),
agent_id VARCHAR(255),
user_id VARCHAR(255),
period_start TIMESTAMP NOT NULL,
period_end TIMESTAMP NOT NULL,
summary_text TEXT,
summary_json JSONB,
message_count INTEGER DEFAULT 0,
participant_count INTEGER DEFAULT 0,
topics TEXT[],
meta JSONB DEFAULT '{}',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Agent memory events table
CREATE TABLE IF NOT EXISTS agent_memory_events (
id SERIAL PRIMARY KEY,
agent_id VARCHAR(255) NOT NULL,
team_id VARCHAR(255) NOT NULL,
channel_id VARCHAR(255),
user_id VARCHAR(255),
scope VARCHAR(50) DEFAULT 'short_term',
kind VARCHAR(50) NOT NULL,
body_text TEXT,
body_json JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Indexes for performance
CREATE INDEX IF NOT EXISTS idx_user_facts_user_team ON user_facts(user_id, team_id);
CREATE INDEX IF NOT EXISTS idx_dialog_summaries_team_channel ON dialog_summaries(team_id, channel_id);
CREATE INDEX IF NOT EXISTS idx_agent_memory_events_agent_team ON agent_memory_events(agent_id, team_id);
CREATE INDEX IF NOT EXISTS idx_agent_memory_events_created ON agent_memory_events(created_at DESC);
-- Update trigger for user_facts
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ language 'plpgsql';
CREATE TRIGGER update_user_facts_updated_at BEFORE UPDATE ON user_facts
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
```
---
## 🎯 Завдання 4: Перевірити Memory Service має health endpoint
**Файл**: `services/memory-service/app/main.py`
### Перевірити наявність:
```python
@app.get("/health")
async def health():
"""Health check endpoint"""
return {
"status": "healthy",
"service": "memory-service",
"timestamp": datetime.utcnow().isoformat()
}
```
Якщо відсутній - додати.
---
## 🎯 Завдання 5: Створити інструкцію для запуску на сервері
**Файл**: `DEPLOY-HELION-SERVER.md`
### Створити файл з інструкціями:
```markdown
# Інструкція: Запуск Helion на сервері 144.76.224.179
## Крок 1: Підготовка сервера
```bash
# SSH на сервер
ssh root@144.76.224.179
# Оновити систему
apt-get update && apt-get upgrade -y
# Встановити Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# Встановити Docker Compose
apt-get install -y docker-compose
# Встановити додаткові утиліти
apt-get install -y git curl jq certbot
```
## Крок 2: Клонувати репозиторій
```bash
# Клонувати код
cd /opt
git clone https://github.com/IvanTytar/microdao-daarion.git
cd microdao-daarion
# Створити директорії для логів та даних
mkdir -p logs data/rbac
chmod -R 755 logs data
```
## Крок 3: Налаштувати .env
```bash
# Скопіювати приклад
cp .env.example .env
# Відредагувати .env
nano .env
```
**Важливі змінні для Helion**:
```bash
HELION_TELEGRAM_BOT_TOKEN=8112062582:AAGI7tPFo4gvZ6bfbkFu9miq5GdAH2_LvcM
HELION_NAME=Helion
HELION_PROMPT_PATH=./gateway-bot/helion_prompt.txt
MEMORY_SERVICE_URL=http://memory-service:8000
MEMORY_DATABASE_URL=postgresql://postgres:postgres@postgres:5432/daarion_memory
OLLAMA_BASE_URL=http://host.docker.internal:11434
OLLAMA_MODEL=qwen3:8b
```
## Крок 4: Налаштувати DNS
**Потрібно зробити ДО запуску скриптів!**
1. Зайти в панель управління DNS (Cloudflare / Hetzner DNS)
2. Створити A запис:
- **Name**: `gateway.daarion.city`
- **Type**: `A`
- **Value**: `144.76.224.179`
- **TTL**: 300
3. Перевірити DNS:
```bash
dig gateway.daarion.city +short
# Повинно вивести: 144.76.224.179
```
## Крок 5: Запустити Ollama (якщо локально)
```bash
# Встановити Ollama
curl -fsSL https://ollama.com/install.sh | sh
# Запустити Ollama
ollama serve &
# Завантажити модель
ollama pull qwen3:8b
```
## Крок 6: Запустити DAGI Stack
```bash
# Збілдити та запустити сервіси
docker-compose up -d
# Перевірити статус
docker-compose ps
# Переглянути логи
docker-compose logs -f gateway
# Очікувані сервіси:
# - dagi-router (9102)
# - dagi-gateway (9300)
# - dagi-memory-service (8000)
# - dagi-postgres (5432)
# - dagi-devtools (8008)
# - dagi-crewai (9010)
# - dagi-rbac (9200)
# - dagi-rag-service (9500)
```
## Крок 7: Перевірити health endpoints
```bash
# Gateway
curl http://localhost:9300/health
# Повинно вивести:
# {
# "status": "healthy",
# "agents": {
# "daarwizz": {"name": "DAARWIZZ", "prompt_loaded": true},
# "helion": {"name": "Helion", "prompt_loaded": true}
# }
# }
# Memory Service
curl http://localhost:8000/health
# Router
curl http://localhost:9102/health
```
## Крок 8: Налаштувати HTTPS Gateway
```bash
# Запустити скрипт (автоматично створює Let's Encrypt сертифікати)
sudo ./scripts/setup-nginx-gateway.sh gateway.daarion.city admin@daarion.city
# Перевірити HTTPS
curl https://gateway.daarion.city/health
```
**Скрипт автоматично**:
- Встановить certbot
- Отримає SSL сертифікат
- Налаштує nginx reverse proxy
- Створить auto-renewal для сертифікатів
- Запустить nginx в Docker контейнері
## Крок 9: Зареєструвати Telegram Webhook
```bash
# Зареєструвати webhook для Helion
./scripts/register-agent-webhook.sh \
helion \
8112062582:AAGI7tPFo4gvZ6bfbkFu9miq5GdAH2_LvcM \
gateway.daarion.city
# Перевірити webhook
curl "https://api.telegram.org/bot8112062582:AAGI7tPFo4gvZ6bfbkFu9miq5GdAH2_LvcM/getWebhookInfo"
```
## Крок 10: Тестування
1. Відкрити бота в Telegram
2. Надіслати повідомлення: **"Привіт! Що таке EcoMiner?"**
3. Очікувати відповідь від Helion
### Debugging
```bash
# Переглянути логи Gateway
docker-compose logs -f gateway
# Переглянути логи Memory Service
docker-compose logs -f memory-service
# Переглянути логи Router
docker-compose logs -f router
# Перевірити webhook статус
curl "https://api.telegram.org/bot8112062582:AAGI7tPFo4gvZ6bfbkFu9miq5GdAH2_LvcM/getWebhookInfo" | jq
# Увійти в контейнер Gateway
docker exec -it dagi-gateway bash
# Перевірити промпт файл
cat /app/gateway-bot/helion_prompt.txt
```
## Troubleshooting
### Проблема: Memory Service не доступний
```bash
# Перевірити чи запущено
docker ps | grep memory-service
# Перезапустити
docker-compose restart memory-service
# Переглянути логи
docker-compose logs --tail=100 memory-service
```
### Проблема: Бот не відповідає
```bash
# 1. Перевірити webhook
curl "https://api.telegram.org/bot8112062582:AAGI7tPFo4gvZ6bfbkFu9miq5GdAH2_LvcM/getWebhookInfo"
# 2. Перевірити Gateway доступний
curl https://gateway.daarion.city/health
# 3. Перевірити nginx
docker logs nginx-gateway
# 4. Переглянути логи Gateway
docker-compose logs -f gateway
```
### Проблема: SSL сертифікат не отримується
```bash
# Перевірити DNS
dig gateway.daarion.city +short
# Спробувати отримати сертифікат вручну
sudo certbot certonly --standalone -d gateway.daarion.city --email admin@daarion.city
# Перезапустити nginx
docker restart nginx-gateway
```
## Моніторинг
```bash
# Статус всіх сервісів
docker-compose ps
# Використання ресурсів
docker stats
# Disk usage
df -h
# Логи всіх сервісів
docker-compose logs --tail=50
# Restart всього стеку
docker-compose restart
```
## Backup
```bash
# Backup бази даних
docker exec dagi-postgres pg_dump -U postgres daarion_memory > backup_$(date +%Y%m%d).sql
# Backup логів
tar -czf logs_backup_$(date +%Y%m%d).tar.gz logs/
# Backup .env
cp .env .env.backup
```
## Оновлення коду
```bash
cd /opt/microdao-daarion
git pull origin main
docker-compose build
docker-compose up -d
docker-compose logs -f gateway
```
```
---
## 🎯 Завдання 6: Створити fallback для Memory Service (опціонально)
**Файл**: `gateway-bot/memory_client.py`
### Додати fallback режим:
Якщо Memory Service недоступний, gateway має працювати в stateless режимі.
Перевірити що методи `get_context()` та `save_chat_turn()` вже мають try-catch і повертають порожні дані при помилці:
```python
async def get_context(...) -> Dict[str, Any]:
try:
# ... existing code ...
except Exception as e:
logger.warning(f"Memory context fetch failed: {e}")
return {
"facts": [],
"recent_events": [],
"dialog_summaries": []
}
```
Це вже реалізовано - перевірити що працює.
---
## 📝 Checklist для виконання
- [ ] **Завдання 1**: Додати memory-service в docker-compose.yml
- [ ] **Завдання 1**: Додати postgres в docker-compose.yml
- [ ] **Завдання 1**: Додати stt-service в docker-compose.yml (опціонально)
- [ ] **Завдання 1**: Оновити volumes секцію
- [ ] **Завдання 2**: Оновити .env з новими змінними
- [ ] **Завдання 3**: Створити init.sql для PostgreSQL
- [ ] **Завдання 4**: Перевірити health endpoint в Memory Service
- [ ] **Завдання 5**: Створити DEPLOY-HELION-SERVER.md
- [ ] **Завдання 6**: Перевірити fallback режим в memory_client.py
---
## 🧪 Тестування після змін
### Локальне тестування (на Mac)
```bash
# Запустити стек локально
cd /Users/apple/github-projects/microdao-daarion
docker-compose up -d
# Перевірити health endpoints
curl http://localhost:9300/health
curl http://localhost:8000/health
# Переглянути логи
docker-compose logs -f gateway memory-service
```
### Перевірка файлів
```bash
# Перевірити що всі файли на місці
ls -la gateway-bot/helion_prompt.txt
ls -la services/memory-service/Dockerfile
ls -la services/memory-service/init.sql
ls -la scripts/setup-nginx-gateway.sh
ls -la scripts/register-agent-webhook.sh
```
---
## 📚 Додаткова інформація
### Архітектура Helion
```
User (Telegram)
Telegram Bot API (webhook)
nginx-gateway (HTTPS)
Gateway Service (/helion/telegram/webhook)
Memory Service (fetch context)
DAGI Router (process with Helion prompt)
LLM (Ollama qwen3:8b)
Memory Service (save history)
Telegram Bot API (send response)
```
### Документація
- **Helion Quick Start**: `docs/HELION-QUICKSTART.md`
- **Agents Map**: `docs/agents.md`
- **System Prompt**: `gateway-bot/helion_prompt.txt`
- **Memory Service README**: `services/memory-service/README.md`
---
## ⚠️ Важливі нотатки
1. **Токени в .env**: Ніколи не комітити .env файл в git
2. **DNS налаштування**: Має бути зроблено ДО запуску setup-nginx-gateway.sh
3. **Ollama**: Має бути запущено локально або віддалено
4. **Memory fallback**: Якщо Memory Service не доступний, бот працюватиме без історії
5. **SSL сертифікати**: Автоматично оновлюються кожної неділі через cron
---
**Після виконання всіх завдань, агент Helion має запрацювати!** 🚀