diff --git a/components/system/Taskbar/AI/ai.worker.ts b/components/system/Taskbar/AI/ai.worker.ts index cbf7ac71..55d8b549 100644 --- a/components/system/Taskbar/AI/ai.worker.ts +++ b/components/system/Taskbar/AI/ai.worker.ts @@ -14,6 +14,7 @@ import { type ConvoStyles, type Prompt, } from "components/system/Taskbar/AI/types"; +import { isAvailable } from "hooks/useWindowAI"; const MARKED_LIBS = [ "/Program Files/Marked/marked.min.js", @@ -140,8 +141,7 @@ globalThis.addEventListener( data.hasWindowAI && data.summarizeText && "summarizer" in globalThis.ai && - (await globalThis.ai.summarizer.capabilities())?.available === - "readily" + (await isAvailable(globalThis.ai.summarizer)) ) { summarizer = await globalThis.ai.summarizer.create(); } diff --git a/hooks/useWindowAI.ts b/hooks/useWindowAI.ts index fd722d36..7fc739d9 100644 --- a/hooks/useWindowAI.ts +++ b/hooks/useWindowAI.ts @@ -1,5 +1,26 @@ import { useCallback, useEffect, useState } from "react"; +type AIAvailability = { + availability?: () => Promise<"available" | "unavailable">; + capabilities?: () => Promise<{ available: AICapabilityAvailability }>; +}; + +export const isAvailable = async (ai: AIAvailability): Promise => { + try { + if (typeof ai.availability === "function") { + return (await ai.availability()) === "available"; + } + + if (typeof ai.capabilities === "function") { + return (await ai.capabilities()).available === "readily"; + } + } catch { + return false; + } + + return false; +}; + let HAS_WINDOW_AI = false; const supportsAI = async (): Promise => { @@ -7,16 +28,13 @@ const supportsAI = async (): Promise => { typeof window === "undefined" || !("ai" in window) || !("languageModel" in window.ai) || - typeof window.ai.languageModel !== "object" || - !("capabilities" in window.ai.languageModel) || - typeof window.ai.languageModel.capabilities !== "function" + typeof window.ai.languageModel !== "object" ) { return false; } try { - HAS_WINDOW_AI = - (await window.ai.languageModel.capabilities()).available === "readily"; + HAS_WINDOW_AI = await isAvailable(globalThis.ai.languageModel); return HAS_WINDOW_AI; } catch {