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