# AWOOOI 架構文檔

> 統帥鐵律：嚴禁臨時方案，所有架構決策必須符合長期維護性

## 核心架構原則

### Four Iron Laws (四大鐵律)

1. **Async-First** - 所有 Handler 必須是 `async def`
2. **CORS Whitelist** - 嚴格來源控制，禁止 wildcard (*)
3. **Pydantic Config** - 類型安全的設定驗證
4. **structlog** - 結構化 JSON 日誌

## HTTP Client 架構 (2026-03-21 架構回歸)

### 問題背景

原始實作使用 `subprocess.run(["curl", ...])` 作為 httpx 404 問題的臨時解法。
統帥明令禁止此類臨時方案，要求回歸原生 httpx AsyncClient。

### 永久解決方案

```
src/core/http_client.py - Lifespan 管理的連線池
├── get_clickhouse_client() - ClickHouse 專用 Client
├── get_general_client()    - Ollama/Gemini/Claude 通用 Client
├── init_all_http_clients() - 啟動時初始化
└── close_all_http_clients() - 關閉時清理
```

### 關鍵配置

```python
httpx.AsyncClient(
    base_url=settings.CLICKHOUSE_URL,
    timeout=httpx.Timeout(30.0, connect=10.0),
    trust_env=False,  # 🔧 禁止 HTTP_PROXY 干擾
    limits=httpx.Limits(max_connections=100, max_keepalive_connections=20),
)
```

### Lifespan 整合

```python
# src/main.py
@asynccontextmanager
async def lifespan(_app: FastAPI):
    # Startup
    await init_all_http_clients()  # ✅ 連線池建立
    yield
    # Shutdown
    await close_all_http_clients()  # ✅ 連線池回收
```

### 驗證結果

```
Status: 200
Elapsed: 28.71ms (< 50ms 目標)
Method: httpx_native
```

## 五主機架構 (2026-03-28 K-HA 更新)

| 主機 | IP | 角色 | 服務 |
|-----|-----|------|------|
| DevOps | 192.168.0.110 | CI/CD + 監控 | Harbor:5000, GH Runner, Sentry:9000, Langfuse:3100 |
| Security | 192.168.0.112 | 安全掃描 | Kali Scanner:8080 |
| K3s Server #1 | 192.168.0.120 | **Control-Plane MASTER** | keepalived (priority=101) |
| K3s Server #2 | 192.168.0.121 | **Control-Plane BACKUP** | keepalived (priority=100) |
| **VIP** | **192.168.0.125** | **HA Endpoint** | **K3s API:6443 + NodePort (32334/32335)** |
| AI+Web | 192.168.0.188 | AI/DB/Web | Ollama:11434, OpenClaw:8089, **PostgreSQL:5432 (K3s Datastore)**, Redis:6380, SignOz:3301 |

## K3s 高可用架構 (ADR-033)

```
              VIP 192.168.0.125 (keepalived)
                       ↓
        ┌──────────────┼──────────────┐
        ▼              ▼              ▼
     mon(120)      mon1(121)    PostgreSQL(188)
   K3s MASTER    K3s BACKUP     K3s Datastore
   priority=101  priority=100   (Kine protocol)
```

### 關鍵變更 (2026-03-28)

- ✅ 雙 Control-Plane (120+121)
- ✅ 外接 PostgreSQL Datastore (188:5432)
- ✅ VIP 192.168.0.125 (keepalived VRRP)
- ✅ CI/CD kubeconfig 指向 VIP
- ✅ 故障轉移 < 3 秒

## SignOz 整合架構

```
┌─────────────────────────────────────────────┐
│                 AWOOOI API                   │
│                 (port 8000)                  │
├─────────────────────────────────────────────┤
│  signoz_client.py                           │
│  └── get_clickhouse_client()                │
│      └── httpx.AsyncClient (Lifespan)       │
└─────────────────┬───────────────────────────┘
                  │ HTTP POST (< 50ms)
                  ▼
┌─────────────────────────────────────────────┐
│           ClickHouse HTTP API               │
│           192.168.0.188:8123                │
├─────────────────────────────────────────────┤
│  signoz_metrics.distributed_samples_v4      │
│  - signoz_calls_total (RPS)                 │
│  - signoz_latency_count (P99)               │
└─────────────────────────────────────────────┘
```

## AI Fallback 策略 (ADR-006 v1.3 + ADR-036)

### 一般對話任務
```
Ollama (local) → Gemini (cloud) → Claude (cloud) → mock_fallback
     ↓              ↓                 ↓                ↓
   免費           $0.001/1K        $0.003/1K        開發用
   188:11434     API Key          API Key          無 LLM
```

### Tool Calling 任務 (ADR-036 - 待批准)
```
Nemotron (cloud) → Gemini (cloud) → Claude (cloud) → 拒絕執行
     ↓                  ↓                 ↓
   免費 tier         $0.001/1K        $0.003/1K
   精準度 83%        API Key          API Key
   延遲 11-45s
```

### Provider 對照表

| Provider | 用途 | 延遲 | 精準度 | 成本 |
|----------|------|------|--------|------|
| **Ollama** | 即時對話、簡單查詢 | < 5s | 中 | $0 |
| **Nemotron** | Tool Calling、K8s 操作 | 11-45s | 高 (83%) | 免費 tier |
| **Gemini** | 通用備援 | 2-5s | 中高 | 低 |
| **Claude** | 複雜推理、CRITICAL | 2-5s | 最高 | 高 |

## Phase 7: 視覺主權組件

### 已完成組件

| 組件 | 路徑 | 功能 |
|-----|------|------|
| GlobalPulseChart | `components/charts/global-pulse-chart.tsx` | 4 指標卡片 + Sparkline |
| AIProcessStepper | `components/charts/ai-process-stepper.tsx` | 5 步 AI 決策流程 |
| TimeSeriesChart | `components/charts/time-series-chart.tsx` | 通用趨勢圖 |

### Nothing.tech 設計語言

```css
/* 主色調 */
--nothing-white: #FFFFFF;
--nothing-gray-50: #FAFAFA;
--nothing-gray-900: #171717;
--nothing-red: #EF4444;

/* 玻璃效果 */
.glass-card {
  background: rgba(255, 255, 255, 0.7);
  backdrop-filter: blur(16px);
  border: 1px solid rgba(0, 0, 0, 0.05);
}
```

## Phase 6: 架構硬化 ✅ (2026-03-23)

> **來源**: `docs/ARCHITECTURE_CODE_REVIEW.md` 技術債審查

| 項目 | 現狀 | 目標 | 優先級 |
|------|------|------|--------|
| Multi-Sig 持久化 | ~~In-Memory dict~~ | ✅ Redis Hash + Redlock | 🔴 P0 |
| GraphRAG 遷移 | ~~In-Memory dict~~ | ✅ Neo4j / Redis Graph | 🔴 P0 |
| SSE 容錯驗證 | ~~ADR-004 已規劃~~ | ✅ 驗證實作 | 🟢 P2 |
| 水平擴展 | ~~單實例~~ | ✅ Redis Pub/Sub + Sticky Session | 🟡 P1 |

## Phase 8-10: 生產修復與監控 ✅

- Phase 8: OTEL/SignOz v3/Telegram UX/Worker 分離
- Phase 9: OpenClaw Agent Teams (多專家共識)
- Phase 10: Sentry Self-Hosted 整合 (192.168.0.110:9000)

## Phase 11: 對話式 AI UI/UX ✅

| 組件 | 路徑 | 功能 |
|-----|------|------|
| ConversationalView | `components/conversational-view.tsx` | ChatGPT 風格雙欄 |
| BatchModeSelector | `components/batch-mode-selector.tsx` | 批次處理 + 風險過濾 |
| useKeyboardShortcuts | `hooks/useKeyboardShortcuts.ts` | Y/N 長按 + 方向鍵 |

## Phase 12: Ollama 深度整合 ✅

- 12.1 Tool Calling 優化 (準確率 100%)
- 12.2 本地模型優化 (Qwen2.5:7b + ModelRouter)

## Phase 13: Enterprise AIOps (規劃中)

```
┌─────────────────────────────────────────────────────────────┐
│                   Phase 13 Enterprise AIOps                 │
├─────────────────────────────────────────────────────────────┤
│  13.1 CI/CD 整合                                            │
│  ├── GitHub Webhook → OpenClaw                              │
│  ├── CI 失敗 → AI 診斷                                       │
│  └── AI 自動修復 (風險分級)                                   │
│                                                              │
│  13.2 Tool 實作 (P0 - Mock → 真實)                           │
│  ├── SignOz MCP (Trace/Logs/Metrics)                        │
│  ├── Kubernetes MCP (kubectl exec)                          │
│  ├── PostgreSQL MCP (歷史查詢)                               │
│  └── 維運手冊 RAG (Markdown 向量化)                          │
│                                                              │
│  13.3 智能路由                                               │
│  ├── Intent Classifier (意圖判別)                            │
│  ├── Complexity Scorer (難度評分)                            │
│  └── AI Router (動態模型選擇)                                │
└─────────────────────────────────────────────────────────────┘
```

## 變更紀錄

| 日期 | 版本 | 變更 |
|-----|------|------|
| 2026-03-25 | 1.3 | 新增 Phase 8-13 完整進度，ClawBot → OpenClaw |
| 2026-03-22 | 1.1 | 新增 Phase 6 架構硬化 Roadmap (Code Review 來源) |
| 2026-03-21 | 1.0 | 架構回歸：移除 subprocess+curl，實作 httpx Lifespan |
| 2026-03-21 | 1.0 | Phase 7 視覺組件：GlobalPulseChart, AIProcessStepper |
