Files
awoooi/docs/architecture/ARCHITECTURE.md
OG T b77e151387 feat(ai): ADR-036 NVIDIA Nemotron Tool Calling 整合
Phase 20 - 提升 Tool Calling 精準度 50% → 83.3%

新增:
- src/models/nvidia.py: Pydantic Schema
- src/services/nvidia_provider.py: NvidiaProvider 類別
- tests/test_nvidia_provider.py: 15 項單元測試 (全部通過)

修改:
- ai_router.py: AIProvider.NVIDIA + route_tool_calling()
- ai_rate_limiter.py: NVIDIA 限制 (5 RPM, 100/day)
- models.json: NVIDIA 配置
- cd.yaml: Secrets 注入 NVIDIA_API_KEY

路由策略:
- Tool Calling: Nemotron → Gemini → Claude
- 一般對話: Ollama → Gemini → Claude (不變)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-29 00:00:08 +08:00

234 lines
9.2 KiB
Markdown
Raw 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.
# 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 |