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>
This commit is contained in:
@@ -66,6 +66,8 @@ class AIProvider(Enum):
|
||||
OLLAMA = "ollama"
|
||||
GEMINI = "gemini"
|
||||
CLAUDE = "claude"
|
||||
# 2026-03-29 ogt: ADR-036 Nemotron Tool Calling (83.3% 精準度)
|
||||
NVIDIA = "nvidia"
|
||||
|
||||
|
||||
# Provider 對應延遲預算 (ms)
|
||||
@@ -73,6 +75,8 @@ PROVIDER_LATENCY_BUDGET: dict[AIProvider, int] = {
|
||||
AIProvider.OLLAMA: 60000, # 本地,允許較長處理時間
|
||||
AIProvider.GEMINI: 30000, # 雲端,較低延遲
|
||||
AIProvider.CLAUDE: 30000, # 雲端,較低延遲
|
||||
# 2026-03-29 ogt: ADR-036 Nemotron Tool Calling (延遲 11-45s)
|
||||
AIProvider.NVIDIA: 60000, # Tool Calling 專用,允許較長時間
|
||||
}
|
||||
|
||||
|
||||
@@ -164,21 +168,32 @@ class AIRouter:
|
||||
self._ollama_summary = self._model_registry.get_model("ollama", "summary")
|
||||
self._gemini_default = self._model_registry.get_model("gemini", "default")
|
||||
self._claude_default = self._model_registry.get_model("claude", "default")
|
||||
# 2026-03-29 ogt: ADR-036 Nemotron Tool Calling
|
||||
self._nvidia_default = self._model_registry.get_model("nvidia", "default")
|
||||
|
||||
# Provider 對應模型映射
|
||||
self._provider_models: dict[AIProvider, str] = {
|
||||
AIProvider.OLLAMA: self._ollama_default,
|
||||
AIProvider.GEMINI: self._gemini_default,
|
||||
AIProvider.CLAUDE: self._claude_default,
|
||||
AIProvider.NVIDIA: self._nvidia_default, # ADR-036
|
||||
}
|
||||
|
||||
# 完整 Fallback 鏈 (Provider, Model)
|
||||
# 2026-03-29 ogt: NVIDIA 不在一般 Fallback 鏈 (僅用於 Tool Calling)
|
||||
self._full_fallback_chain: list[tuple[AIProvider, str]] = [
|
||||
(AIProvider.OLLAMA, self._ollama_default),
|
||||
(AIProvider.GEMINI, self._gemini_default),
|
||||
(AIProvider.CLAUDE, self._claude_default),
|
||||
]
|
||||
|
||||
# Tool Calling 專用 Fallback 鏈 (ADR-036)
|
||||
self._tool_calling_fallback_chain: list[tuple[AIProvider, str]] = [
|
||||
(AIProvider.NVIDIA, self._nvidia_default),
|
||||
(AIProvider.GEMINI, self._gemini_default),
|
||||
(AIProvider.CLAUDE, self._claude_default),
|
||||
]
|
||||
|
||||
# 意圖對應 Provider 強制覆寫 (None = 依複雜度決定)
|
||||
self._intent_provider_overrides: dict[IntentType, AIProvider | None] = {
|
||||
# 四大核心意圖
|
||||
@@ -466,6 +481,39 @@ class AIRouter:
|
||||
routing_latency_ms=routing_latency,
|
||||
)
|
||||
|
||||
# =========================================================================
|
||||
# Tool Calling 路由 (ADR-036)
|
||||
# =========================================================================
|
||||
|
||||
def route_tool_calling(self) -> tuple[AIProvider, str, list[tuple[AIProvider, str]]]:
|
||||
"""
|
||||
Tool Calling 專用路由 (ADR-036)
|
||||
|
||||
Tool Calling 任務優先使用 Nemotron (83.3% 精準度),
|
||||
Fallback 到 Gemini/Claude。
|
||||
|
||||
Returns:
|
||||
(provider, model, fallback_chain)
|
||||
"""
|
||||
provider = AIProvider.NVIDIA
|
||||
model = self._nvidia_default
|
||||
fallback_chain = [
|
||||
(p, m) for p, m in self._tool_calling_fallback_chain if p != provider
|
||||
]
|
||||
|
||||
logger.info(
|
||||
"tool_calling_routing",
|
||||
provider=provider.value,
|
||||
model=model,
|
||||
fallback_count=len(fallback_chain),
|
||||
)
|
||||
|
||||
return provider, model, fallback_chain
|
||||
|
||||
def get_tool_calling_fallback_chain(self) -> list[tuple[AIProvider, str]]:
|
||||
"""取得 Tool Calling Fallback 鏈"""
|
||||
return self._tool_calling_fallback_chain.copy()
|
||||
|
||||
# =========================================================================
|
||||
# 便捷方法
|
||||
# =========================================================================
|
||||
|
||||
Reference in New Issue
Block a user