(onProgress?: (msg: string) => void)
| 332 | |
| 333 | let debertaLoadPromise: Promise<void> | null = null; |
| 334 | export function loadDeberta(onProgress?: (msg: string) => void): Promise<void> { |
| 335 | if (process.env.GSTACK_SECURITY_OFF === '1') return Promise.resolve(); |
| 336 | if (!isDebertaEnabled()) return Promise.resolve(); |
| 337 | if (debertaState === 'loaded') return Promise.resolve(); |
| 338 | if (debertaLoadPromise) return debertaLoadPromise; |
| 339 | debertaState = 'loading'; |
| 340 | debertaLoadPromise = (async () => { |
| 341 | try { |
| 342 | await ensureDebertaStaged(onProgress); |
| 343 | onProgress?.('deberta: initializing classifier'); |
| 344 | const { pipeline, env } = await import('@huggingface/transformers'); |
| 345 | env.allowLocalModels = true; |
| 346 | env.allowRemoteModels = false; |
| 347 | env.localModelPath = MODELS_DIR; |
| 348 | debertaClassifier = await pipeline( |
| 349 | 'text-classification', |
| 350 | 'deberta-v3-injection', |
| 351 | { dtype: 'fp32' }, |
| 352 | ); |
| 353 | const tok = debertaClassifier?.tokenizer as any; |
| 354 | if (tok?._tokenizerConfig) { |
| 355 | tok._tokenizerConfig.model_max_length = 512; |
| 356 | } |
| 357 | debertaState = 'loaded'; |
| 358 | } catch (err: any) { |
| 359 | debertaState = 'failed'; |
| 360 | debertaLoadError = err?.message ?? String(err); |
| 361 | console.error('[security-classifier] Failed to load DeBERTa-v3:', debertaLoadError); |
| 362 | } |
| 363 | })(); |
| 364 | return debertaLoadPromise; |
| 365 | } |
| 366 | |
| 367 | /** |
| 368 | * Scan text with the DeBERTa-v3 ensemble classifier. Returns a LayerSignal |
nothing calls this directly
no test coverage detected