690619:0846 239 #02
CI / CD Pipeline / build (push) Failing after 4m49s
CI / CD Pipeline / deploy (push) Has been skipped

This commit is contained in:
2026-06-19 08:46:51 +07:00
parent 78e61fd300
commit 64831aba7f
4 changed files with 15 additions and 8 deletions
@@ -83,10 +83,12 @@ export class VramMonitorService {
this.logger.warn( this.logger.warn(
`Failed to query Ollama /api/ps: ${err instanceof Error ? err.message : String(err)}` `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 { return {
totalMb: this.totalVramMb, totalMb: this.totalVramMb,
usedMb: this.totalVramMb, // บังคับให้ used = totalื่อให้ available = 0 usedMb: 0, // สมมติว่าไม่มี model loadื่อ query ล้มเหลว
availableMb: 0, availableMb: this.totalVramMb,
querySuccess: false, querySuccess: false,
mainModelVramMb: 0, mainModelVramMb: 0,
}; };
@@ -150,11 +150,13 @@ describe('VramMonitorService', () => {
// 8192MB total - 1024MB used = 7168MB free > 4000MB // 8192MB total - 1024MB used = 7168MB free > 4000MB
expect(status.hasCapacity).toBe(true); 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')); mockedAxios.get.mockRejectedValue(new Error('Network error'));
const status = await service.getVramStatus(); const status = await service.getVramStatus();
expect(status.hasCapacity).toBe(false); // เปลี่ยนจาก pessimistic เป็น optimistic: สมมติว่าไม่มี model load เมื่อ query ล้มเหลว
expect(status.freeVramMb).toBe(0); expect(status.hasCapacity).toBe(true);
expect(status.freeVramMb).toBe(8192); // total VRAM ทั้งหมด (8192MB default)
expect(status.usedVramMb).toBe(0);
expect(status.loadedModels).toEqual([]); expect(status.loadedModels).toEqual([]);
}); });
}); });
@@ -8,6 +8,7 @@ import { Loader2 } from 'lucide-react';
export default function AuditLogsPage() { export default function AuditLogsPage() {
const { data: logs, isLoading } = useAuditLogs(); const { data: logs, isLoading } = useAuditLogs();
const logList = Array.isArray(logs) ? logs : [];
return ( return (
<div className="space-y-6"> <div className="space-y-6">
@@ -22,10 +23,10 @@ export default function AuditLogsPage() {
</div> </div>
) : ( ) : (
<div className="space-y-2"> <div className="space-y-2">
{!logs || logs.length === 0 ? ( {logList.length === 0 ? (
<div className="text-center text-muted-foreground py-10">No logs found</div> <div className="text-center text-muted-foreground py-10">No logs found</div>
) : ( ) : (
logs.map((log: import('@/lib/services/audit-log.service').AuditLog) => ( logList.map((log: import('@/lib/services/audit-log.service').AuditLog) => (
<Card key={log.publicId} className="p-4"> <Card key={log.publicId} className="p-4">
<div className="flex items-start justify-between"> <div className="flex items-start justify-between">
<div className="flex-1"> <div className="flex-1">
@@ -40,4 +40,6 @@ def get_vram_headroom() -> VramHeadroom:
return VramHeadroom(total_vram_mb, used_mb, available_mb, True) return VramHeadroom(total_vram_mb, used_mb, available_mb, True)
except Exception as e: except Exception as e:
logger.warning(f"Failed to query Ollama VRAM: {str(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)