# ADR-036: Nemotron Tool Calling 整合 > **狀態**: ✅ 已實作 > **日期**: 2026-03-29 > **決策者**: 統帥 (已批准) > **審查者**: 首席架構師 (95/100 通過 - P1+P2+P3 全部完成) > **部署日期**: 2026-03-29 08:40 (台北時間) --- ## 背景 2026-03-28 統帥指示評估 NVIDIA Nemotron 模型整合可行性。經過實測確認: | 指標 | Nemotron (NIM) | Ollama (CPU) | |------|----------------|--------------| | **Tool Calling 精準度** | 83.3% (5/6) | ~50% | | **平均延遲** | 11-23 秒 | 100+ 秒 | | **最慢延遲** | 45 秒 | 超時 | | **繁中支援** | ✅ 良好 | ✅ 良好 | | **成本** | 免費 tier | $0 | ### 核心發現 Nemotron 在 **Tool Calling** 場景表現顯著優於 CPU-only Ollama,但延遲較高,不適合即時對話。 --- ## 決策 ### 1. 定位:專才補充,非取代 ``` 任務類型 → 路由目標 ──────────────────────────────── Tool Calling → Nemotron (精準度高) 即時對話 → Ollama (低延遲) 複雜推理 → Claude (最強) 通用備援 → Gemini (平衡) ``` ### 2. 架構整合 ``` ┌─────────────────────────────────────────────────────────────────┐ │ OpenClaw Decision Flow │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ 1. Request 進入 │ │ │ │ │ ▼ │ │ 2. TaskRouter (NEW) │ │ ├── is_tool_calling? ──────────────────────┐ │ │ │ │ │ │ │ NO │ YES │ │ ▼ ▼ │ │ 3. AIRouter (現有) 4. AsyncQueue │ │ ├── Intent Classifier │ │ │ ├── Complexity Scorer ▼ │ │ └── Provider Selection 5. NvidiaProvider │ │ ├── Ollama (背景處理) │ │ ├── Gemini │ │ │ └── Claude ▼ │ │ 6. Tool Execution │ │ │ │ │ ▼ ▼ │ │ 7. Response 8. Callback/Webhook │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### 3. Provider 更新 (ADR-006 v1.3) | Provider | 用途 | 延遲 | 精準度 | 成本 | |----------|------|------|--------|------| | **Ollama** | 即時對話、簡單查詢 | < 5s | 中 | $0 | | **Nemotron** | Tool Calling、K8s 操作 | 11-45s | 高 (83%) | 免費 tier | | **Gemini** | 通用備援 | 2-5s | 中高 | 低 | | **Claude** | 複雜推理、CRITICAL | 2-5s | 最高 | 高 | ### 4. Fallback 鏈更新 ``` Tool Calling 任務: Nemotron → Gemini → Claude → 拒絕執行 一般對話任務 (不變): Ollama → Gemini → Claude → Static Response ``` ### 5. HITL 高風險保護 ```python HIGH_RISK_TOOLS = { "restart_deployment", "scale_deployment", "delete_resource", "apply_manifest", "rollback_deployment", } ``` 高風險 Tool 呼叫需經過 Telegram 人工確認。 --- ## 實作檔案 (2026-03-29 完成) ### 新增檔案 | 檔案路徑 | 說明 | 狀態 | |----------|------|------| | `src/services/nvidia_provider.py` | NvidiaProvider 類別 | ✅ | | `src/models/nvidia.py` | Pydantic Schema | ✅ | | `tests/test_nvidia_provider.py` | 單元測試 (25/25) | ✅ | | `scripts/verify_nemotron_e2e.py` | E2E 驗證腳本 | ✅ | ### 修改檔案 | 檔案路徑 | 變更內容 | 狀態 | |----------|----------|------| | `src/services/ai_router.py` | `AIProvider.NVIDIA` + `route_tool_calling()` | ✅ | | `src/services/ai_rate_limiter.py` | NVIDIA 限制 (5 RPM / 50K tokens) | ✅ | | `src/core/config.py` | `NVIDIA_API_KEY` | ✅ | | `apps/api/models.json` | NVIDIA provider 配置 | ✅ | | `.github/workflows/cd.yaml` | K8s Secrets 自動注入 | ✅ | ### 可觀測性整合 (P1 修復) | 整合 | 說明 | 狀態 | |------|------|------| | OTEL Tracing | `_tracer.start_as_current_span("nvidia_tool_call")` | ✅ | | Langfuse | `LangfuseTraceContext` + `generation()` | ✅ | | Structlog | 結構化日誌 (latency_ms, tokens) | ✅ | --- ## 環境配置 ```bash # GitHub Secrets gh secret set NVIDIA_API_KEY --body "nvapi-xxxx" # K8s Secrets kubectl create secret generic nvidia-api \ --from-literal=NVIDIA_API_KEY="nvapi-xxxx" \ -n awoooi-prod ``` --- ## 風險評估 | 風險 | 機率 | 影響 | 緩解 | |------|------|------|------| | 免費 tier 額度不足 | 中 | 低 | Fallback 到 Gemini | | API 延遲高峰 | 高 | 低 | 非同步 Queue | | Tool Calling 精準度下降 | 低 | 中 | 重試 + Schema 驗證 | --- ## 首席架構師審查 (2026-03-29 P1+P2+P3 完成) | 項目 | 評分 | 備註 | |------|------|------| | 模組化合規 | 19/20 | ✅ Protocol 定義完成 | | 分層架構 | 18/20 | 正確分層 | | 程式碼品質 | 19/20 | ✅ P3 Circuit Breaker | | 安全性 | 19/20 | HITL 保護完整 | | 可觀測性 | 19/20 | ✅ P1+P3 (Langfuse + OTEL + Prometheus) | | 測試覆蓋率 | 19/20 | ✅ P3 (34/34 測試) | | **總分** | **95/100** | **卓越 (A)** | **評級**: ✅ EXCEPTIONAL ### P1 修復 (2026-03-29 09:20) - [x] Langfuse 整合 (`LangfuseTraceContext`) - [x] OTEL Tracing (`start_as_current_span`) ### P2 修復 (2026-03-29 10:30) - [x] INvidiaProvider Protocol (`@runtime_checkable`) - [x] 邊界測試補充 (15 → 25 測試案例) - [x] model_registry NVIDIA 配置 ### P3 優化 (2026-03-29 11:15) - [x] Circuit Breaker 狀態機 (CLOSED/OPEN/HALF_OPEN) - [x] 指數退避重試 (含 jitter) - [x] Prometheus Metrics (requests/latency/circuit_breaker) - [x] 測試擴充 (25 → 34 測試案例) --- ## 驗證結果 ```bash # Tool Calling 測試 (2026-03-29 08:51) 預設模型: nvidia/nemotron-mini-4b-instruct ✅ Tool: restart_pod Args: {"pod_name": "awoooi-api", "namespace": "awoooi-prod"} 延遲: 44.7s Tokens: 158 ``` --- ## 相關文件 - [NEMOTRON-INTEGRATION-SOLUTION.md](../proposals/NEMOTRON-INTEGRATION-SOLUTION.md) - [INSPIRATION_LAB.md](../INSPIRATION_LAB.md) (Section 6.1) - [ADR-006](ADR-006-ai-fallback-strategy.md) (v1.3 已更新 Tool Calling Fallback) - [08-model-router-expert.md](../../.agents/skills/08-model-router-expert.md) --- ## 變更記錄 | 日期 | 版本 | 變更 | 作者 | |------|------|------|------| | 2026-03-29 | v1.4 | P3 優化 (Circuit Breaker + Prometheus),評分 95/100 | Claude Code | | 2026-03-29 | v1.3 | P2 修復 (Protocol + 測試 + model_registry),評分 90/100 | Claude Code | | 2026-03-29 | v1.2 | P1 修復 (Langfuse + OTEL) | Claude Code | | 2026-03-29 | v1.1 | 實作完成,部署驗證通過 | Claude Code | | 2026-03-29 | v1.0 | 初版建立 | 首席架構師 | --- *此 ADR 記錄 NVIDIA Nemotron Tool Calling 整合的架構決策。狀態: ✅ 已實作*