import { pipeline, env } from "https://cdn.jsdelivr.net/npm/@xenova/transformers@2.17.2"; import { analyzeLongText } from "./ner_long_text.js?v=20260514-offsets1"; let pipe = null; let modelName = null; self.addEventListener("message", async (event) => { const message = event.data ?? {}; const requestId = message.requestId ?? null; try { if (message.type === "init") { await loadModel(message.modelName, requestId, message.revision ?? null); return; } if (message.type === "analyze") { await runAnalysis(message, requestId); return; } if (message.type === "dispose") { pipe = null; modelName = null; self.postMessage({ type: "disposed", requestId }); } } catch (error) { self.postMessage({ type: "error", requestId, message: error instanceof Error ? error.message : String(error), }); } }); async function loadModel(nextModelName, requestId, revision = null) { const modelKey = `${nextModelName}@${revision ?? "main"}`; if (pipe && modelName === modelKey) { self.postMessage({ type: "ready", requestId }); return; } env.allowLocalModels = false; env.useBrowserCache = true; modelName = modelKey; self.postMessage({ type: "status", requestId, message: "Chargement du modèle..." }); const options = { progress_callback: (progress) => { if (progress.status !== "progress" || !progress.total) { return; } const pct = Math.round((progress.loaded / progress.total) * 100); self.postMessage({ type: "model-progress", requestId, progress: pct, message: `Téléchargement... ${pct}%`, }); }, }; if (revision) { options.revision = revision; } pipe = await pipeline("token-classification", nextModelName, options); self.postMessage({ type: "ready", requestId }); } async function runAnalysis(message, requestId) { if (!pipe) { await loadModel(message.modelName, requestId, message.revision ?? null); } const analysis = await analyzeLongText(pipe, message.text, { chunkOptions: message.chunkOptions ?? {}, minScore: message.minScore ?? 0, onProgress: ({ done, total }) => { self.postMessage({ type: "analysis-progress", requestId, done, total, progress: total ? Math.round((done / total) * 100) : 0, message: `Analyse chunk ${done}/${total}`, }); }, }); self.postMessage({ type: "result", requestId, analysis, }); }