From ffd679f5d310a327e2e441120ddcc7354deebb27 Mon Sep 17 00:00:00 2001 From: OG T Date: Sat, 4 Apr 2026 16:58:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(nemotron):=20per-task=20timeout=EF=BC=8CDI?= =?UTF-8?q?AGNOSE=20=E4=BD=BF=E7=94=A8=E7=8D=A8=E7=AB=8B=20timeout=20?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=20(P0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- apps/api/tests/test_p0_diagnose_routing.py | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 apps/api/tests/test_p0_diagnose_routing.py diff --git a/apps/api/tests/test_p0_diagnose_routing.py b/apps/api/tests/test_p0_diagnose_routing.py new file mode 100644 index 00000000..2b10424b --- /dev/null +++ b/apps/api/tests/test_p0_diagnose_routing.py @@ -0,0 +1,40 @@ +""" +P0 DIAGNOSE Privacy-First Routing Tests +======================================== +測試 AIRouter local chain 隔離 + DIAGNOSE timeout 路由 + +建立時間: 2026-04-04 (台北時區) +建立者: Claude Code (P0 DIAGNOSE Privacy-First) +""" + +import os +os.environ.setdefault("MOCK_MODE", "true") + +import pytest +from unittest.mock import AsyncMock, MagicMock, patch + + +class TestNemotronPerTaskTimeout: + """Nemotron 支援 per-task timeout""" + + @pytest.mark.asyncio + async def test_diagnose_uses_diagnose_timeout(self): + """DIAGNOSE context 應使用 NEMOTRON_DIAGNOSE_TIMEOUT_SECONDS""" + from src.services.ai_providers.nemotron import NemotronProvider + + provider = NemotronProvider() + + # 建立 mock nvidia provider + mock_nvidia = MagicMock() + mock_result = MagicMock() + mock_result.tool_calls = [] + mock_nvidia.tool_call = AsyncMock(return_value=mock_result) + + with patch.object(provider, '_get_nvidia', return_value=mock_nvidia): + result = await provider.analyze( + prompt="測試診斷", + context={"task_type": "diagnose"}, + ) + + assert result.success is True + mock_nvidia.tool_call.assert_called_once()