Files
microdao-daarion/docs/ADR_DAARWIZZ_ORCHESTRATION.md
Apple ef3473db21 snapshot: NODE1 production state 2026-02-09
Complete snapshot of /opt/microdao-daarion/ from NODE1 (144.76.224.179).
This represents the actual running production code that has diverged
significantly from the previous main branch.

Key changes from old main:
- Gateway (http_api.py): expanded from ~40KB to 164KB with full agent support
- Router: new /v1/agents/{id}/infer endpoint with vision + DeepSeek routing
- Behavior Policy: SOWA v2.2 (3-level: FULL/ACK/SILENT)
- Agent Registry: config/agent_registry.yml as single source of truth
- 13 agents configured (was 3)
- Memory service integration
- CrewAI teams and roles

Excluded from snapshot: venv/, .env, data/, backups, .tgz archives

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-09 08:46:46 -08:00

191 lines
7.7 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.
# ADR: DAARWIZZ Orchestration Mode (Гібридна архітектура)
**Дата:** 2026-01-19
**Статус:** Прийнято
**Версія:** 1.0
---
## Контекст
DAARION.city має 5 спеціалізованих агентів:
- **Helion** — енергетика, DePIN
- **Nutra** — харчування, дієти
- **Druid** — біомедичні добавки, лабораторії
- **GreenFood** — крафтові виробники, кооперативи
- **DAARWIZZ** — системний координатор
**Проблема:** Користувачі не знають, до якого агента звернутися. Потрібна єдина точка входу з автоматичною маршрутизацією.
---
## Рішення: Гібридна архітектура (3 етапи)
### Етап A (зараз): Ізольовані боти + "м'який" DAARWIZZ
**Поведінка:**
- Прямі боти (@energyunionBot, @NutraChat_bot, @DRUID73bot) працюють ізольовано
- @DAARWIZZBot працює як **довідник + маршрутизатор**:
- Класифікує intent користувача
- Рекомендує правильного агента
- Може зробити "soft handoff" (передати запит, але відповідь йде через DAARWIZZ)
- **НЕ робить автоматичний handoff без згоди користувача**
**Приклад:**
```
Користувач: "що їсти на сніданок?"
DAARWIZZ: "Це питання харчування. Рекомендую @NutraChat_bot.
Можу передати запит туди зараз — дозволиш?"
```
### Етап B (пізніше): DAARWIZZ-first для 30-50% трафіку
**Поведінка:**
- @DAARWIZZBot стає **рекомендованим entry point** для нових користувачів
- Автоматичний handoff для "safe" класів запитів (single-domain)
- Прямі боти залишаються як "pro mode" для профі-користувачів
### Етап C (майбутнє): Повна оркестрація multi-agent сценаріїв
**Поведінка:**
- DAARWIZZ планує multi-step сценарії (handoff між доменами)
- Збір фактів від кількох агентів
- Контекстні контракти: що можна передавати між агентами
---
## Handoff Contract (стандартизований пакет)
### Структура:
```python
{
"intent": "nutrition_advice", # Що хоче користувач
"domain": "nutrition", # Домен (energy/food/supplements)
"user_goal": "що їсти на сніданок", # Оригінальне питання
"target_agent": "nutra", # Куди делегувати
"constraints": {
"max_response_time": 30, # Секунд
"format": "short", # short/medium/detailed
"language": "uk"
},
"context_summary": "Користувач питає про сніданок", # БЕЗ секретів
"sources": [], # IDs повідомлень/Co-Memory, не plaintext
"privacy_level": "public", # public/team/confidential
"requires_consent": true # Чи потрібна згода користувача
}
```
### Правила передачі:
1. **Single-domain запити** → автоматичний handoff (після Етапу A)
2. **Multi-domain запити** → DAARWIZZ робить plan + збирає відповіді
3. **Confidential/E2EE** → тільки sanitized summary або явна згода
---
## Розділення пам'яті
### Персональна пам'ять агентів (Nutra/Helion/Druid):
- **Qdrant:** `{agent_id}_messages`, `{agent_id}_docs`
- **Neo4j:** `:{AgentId}_*` labels
- **НЕ передається** автоматично в DAARWIZZ
### Orchestration пам'ять DAARWIZZ:
- **Qdrant:** `daarwizz_orchestration` (логи планів, стани задач)
- **Neo4j:** `:Orchestration` nodes (handoff історія)
- **НЕ містить** приватний контент користувачів
---
## Політика приватності
### За замовчуванням:
- **Public запити** → можна делегувати з context_summary
- **Team запити** → тільки в межах команди
- **Confidential запити** → тільки sanitized summary або явна згода
### Ескалація:
- Якщо запит потребує handoff, але privacy_level = confidential:
- DAARWIZZ питає: "Дозволиш передати це питання в Nutra? (буде передано тільки узагальнений контекст)"
- Користувач підтверджує → handoff
- Користувач відхиляє → DAARWIZZ відповідає сам (якщо може)
---
## Технічна реалізація
### 1. Intent Router в DAARWIZZ
```python
def route_intent(message: str) -> Dict:
"""
Визначає intent та рекомендованого агента.
Повертає handoff contract (якщо потрібно).
"""
# Класифікація через LLM або keyword matching
# Повертає: intent, domain, target_agent, confidence
```
### 2. Handoff Handler
```python
async def handle_handoff(contract: HandoffContract) -> Dict:
"""
Виконує handoff до target_agent.
Повертає відповідь для користувача.
"""
# Викликає Router з target_agent
# Повертає результат через DAARWIZZ
```
### 3. NATS Subjects для handoff
```
agent.daarwizz.handoff.request # Запит на handoff
agent.daarwizz.handoff.response # Відповідь від агента
agent.{agent_id}.invoke # Прямий виклик агента
```
---
## Покрокове впровадження
### ✅ Етап A (зараз): "М'який" DAARWIZZ
- [x] DAARWIZZ класифікує intent
- [x] DAARWIZZ рекомендує агента
- [ ] DAARWIZZ пропонує "soft handoff" (з згодою)
- [ ] Логування handoff рішень
### ⏳ Етап B (пізніше): DAARWIZZ-first
- [ ] Автоматичний handoff для single-domain
- [ ] Метрики: % трафіку через DAARWIZZ
- [ ] A/B тестування: DAARWIZZ vs прямі боти
### 📋 Етап C (майбутнє): Multi-agent оркестрація
- [ ] Планування multi-step сценаріїв
- [ ] Збір фактів від кількох агентів
- [ ] Контекстні контракти
---
## Критерії успіху
1. **Користувачі знають, куди звернутися** (через DAARWIZZ)
2. **Прямі боти залишаються швидкими** для профі-користувачів
3. **Приватність збережена** (confidential не передається без згоди)
4. **Масштабування без міграції UX** (можна додавати нових агентів)
---
## Альтернативи (відхилені)
1. **Тільки прямі боти** — користувачі не знають, куди звернутися
2. **Тільки DAARWIZZ** — втрата швидкості для профі-користувачів
3. **Повна оркестрація одразу** — занадто складно для MVP
---
**Версія:** 1.0
**Останнє оновлення:** 2026-01-19