diff --git a/backend/src/modules/ai/services/vram-monitor.service.ts b/backend/src/modules/ai/services/vram-monitor.service.ts index 334741ed..9be89de5 100644 --- a/backend/src/modules/ai/services/vram-monitor.service.ts +++ b/backend/src/modules/ai/services/vram-monitor.service.ts @@ -83,10 +83,12 @@ export class VramMonitorService { this.logger.warn( `Failed to query Ollama /api/ps: ${err instanceof Error ? err.message : String(err)}` ); + // เปลี่ยนจาก pessimistic (assume all VRAM used) เป็น optimistic (assume no VRAM used) + // เพื่อป้องกัน false positive OOM Guard เมื่อ query ล้มเหลวแต่ไม่มี model load จริง return { totalMb: this.totalVramMb, - usedMb: this.totalVramMb, // บังคับให้ used = total เพื่อให้ available = 0 - availableMb: 0, + usedMb: 0, // สมมติว่าไม่มี model load เมื่อ query ล้มเหลว + availableMb: this.totalVramMb, querySuccess: false, mainModelVramMb: 0, }; diff --git a/backend/src/modules/ai/tests/vram-monitor.service.spec.ts b/backend/src/modules/ai/tests/vram-monitor.service.spec.ts index ec20364e..ea848bc9 100644 --- a/backend/src/modules/ai/tests/vram-monitor.service.spec.ts +++ b/backend/src/modules/ai/tests/vram-monitor.service.spec.ts @@ -150,11 +150,13 @@ describe('VramMonitorService', () => { // 8192MB total - 1024MB used = 7168MB free > 4000MB expect(status.hasCapacity).toBe(true); }); - it('ควรคืน fallback (hasCapacity=false) เมื่อ /api/ps ล้มเหลว', async () => { + it('ควรคืน fallback optimistic (hasCapacity=true) เมื่อ /api/ps ล้มเหลว', async () => { mockedAxios.get.mockRejectedValue(new Error('Network error')); const status = await service.getVramStatus(); - expect(status.hasCapacity).toBe(false); - expect(status.freeVramMb).toBe(0); + // เปลี่ยนจาก pessimistic เป็น optimistic: สมมติว่าไม่มี model load เมื่อ query ล้มเหลว + expect(status.hasCapacity).toBe(true); + expect(status.freeVramMb).toBe(8192); // total VRAM ทั้งหมด (8192MB default) + expect(status.usedVramMb).toBe(0); expect(status.loadedModels).toEqual([]); }); }); diff --git a/frontend/app/(admin)/admin/monitoring/audit-logs/page.tsx b/frontend/app/(admin)/admin/monitoring/audit-logs/page.tsx index 84e56547..c3423c93 100644 --- a/frontend/app/(admin)/admin/monitoring/audit-logs/page.tsx +++ b/frontend/app/(admin)/admin/monitoring/audit-logs/page.tsx @@ -8,6 +8,7 @@ import { Loader2 } from 'lucide-react'; export default function AuditLogsPage() { const { data: logs, isLoading } = useAuditLogs(); + const logList = Array.isArray(logs) ? logs : []; return (
@@ -22,10 +23,10 @@ export default function AuditLogsPage() {
) : (
- {!logs || logs.length === 0 ? ( + {logList.length === 0 ? (
No logs found
) : ( - logs.map((log: import('@/lib/services/audit-log.service').AuditLog) => ( + logList.map((log: import('@/lib/services/audit-log.service').AuditLog) => (
diff --git a/specs/04-Infrastructure-OPS/04-00-docker-compose/Desk-5439/ocr-sidecar/services/vram_monitor.py b/specs/04-Infrastructure-OPS/04-00-docker-compose/Desk-5439/ocr-sidecar/services/vram_monitor.py index aa8cc97d..2825cc82 100644 --- a/specs/04-Infrastructure-OPS/04-00-docker-compose/Desk-5439/ocr-sidecar/services/vram_monitor.py +++ b/specs/04-Infrastructure-OPS/04-00-docker-compose/Desk-5439/ocr-sidecar/services/vram_monitor.py @@ -40,4 +40,6 @@ def get_vram_headroom() -> VramHeadroom: return VramHeadroom(total_vram_mb, used_mb, available_mb, True) except Exception as e: logger.warning(f"Failed to query Ollama VRAM: {str(e)}") - return VramHeadroom(total_vram_mb, total_vram_mb, 0.0, False) + # เปลี่ยนจาก pessimistic (assume all VRAM used) เป็น optimistic (assume no VRAM used) + # เพื่อป้องกัน false positive OOM Guard เมื่อ query ล้มเหลวแต่ไม่มี model load จริง + return VramHeadroom(total_vram_mb, 0.0, total_vram_mb, False)