fix(175): NLI auf React Native funktionsfähig (ORT-Symbol-Hook + Hermes-Polyfills) #250

Merged
admin-mrrm merged 1 commit from fix/175-nli-onnxruntime-symbol into main 2026-05-14 11:31:18 +02:00
Owner

Summary

  • Registriert onnxruntime-react-native unter globalThis[Symbol.for('onnxruntime')], bevor @huggingface/transformers geladen wird → ONNX.Tensor ist auf RN nicht mehr undefined und die internen instanceof-Checks der Library werfen nicht mehr.
  • Polyfillt Browser-Globals (Blob, File, FormData, ReadableStream, HTMLCanvasElement, HTMLVideoElement, OffscreenCanvas, ServiceWorkerGlobalScope, Float16Array) als leere Klassen, damit ungeguardete instanceof X in transformers.web.js zu false evaluieren statt zu werfen.
  • Reasserted env.allowLocalModels/useFSCache/useBrowserCache zusätzlich in initialize() für HMR-Robustheit; neuer TDD-Test deckt das ab.

Background

Auf Mobile blieb die NLI-Klassifikation hartnäckig im Llama-Fallback hängen mit TypeError: right operand of 'instanceof' is not an object. Ursache (Z. 7655 in transformers.web.js):

var ORT_SYMBOL = Symbol.for('onnxruntime');
if (ORT_SYMBOL in globalThis) {
  ONNX = globalThis[ORT_SYMBOL];
} else if (apis.IS_NODE_ENV) { ... }
else { ONNX = ONNX_WEB; }

RN ist weder Node noch Browser → ONNX_WEB ohne nutzbare Tensor-Klasse → isONNXTensor(x) { return x instanceof ONNX.Tensor } warf bei jedem Tokenize-Call. Der Symbol-Hook ist der vorgesehene Extension-Punkt, um eine andere Runtime einzuhängen.

Test plan

  • pnpm --filter @mrrmlab/mobile typecheck
  • pnpm --filter @mrrmlab/mobile test -- nli-classifier model-manager — 12/12
  • Manuell auf Gerät: Mail öffnen → Logs zeigen [MailModel] NLI uncertain (top 0.297) → Llama fallback ohne instanceof-Error; bei klaren Mails NLI-Hit erwartet.

Issue

Gehört zu #175.

## Summary - Registriert `onnxruntime-react-native` unter `globalThis[Symbol.for('onnxruntime')]`, bevor `@huggingface/transformers` geladen wird → ONNX.Tensor ist auf RN nicht mehr `undefined` und die internen `instanceof`-Checks der Library werfen nicht mehr. - Polyfillt Browser-Globals (Blob, File, FormData, ReadableStream, HTMLCanvasElement, HTMLVideoElement, OffscreenCanvas, ServiceWorkerGlobalScope, Float16Array) als leere Klassen, damit ungeguardete `instanceof X` in transformers.web.js zu `false` evaluieren statt zu werfen. - Reasserted `env.allowLocalModels/useFSCache/useBrowserCache` zusätzlich in `initialize()` für HMR-Robustheit; neuer TDD-Test deckt das ab. ## Background Auf Mobile blieb die NLI-Klassifikation hartnäckig im Llama-Fallback hängen mit `TypeError: right operand of 'instanceof' is not an object`. Ursache (Z. 7655 in `transformers.web.js`): ```js var ORT_SYMBOL = Symbol.for('onnxruntime'); if (ORT_SYMBOL in globalThis) { ONNX = globalThis[ORT_SYMBOL]; } else if (apis.IS_NODE_ENV) { ... } else { ONNX = ONNX_WEB; } ``` RN ist weder Node noch Browser → ONNX_WEB ohne nutzbare `Tensor`-Klasse → `isONNXTensor(x) { return x instanceof ONNX.Tensor }` warf bei jedem Tokenize-Call. Der Symbol-Hook ist der vorgesehene Extension-Punkt, um eine andere Runtime einzuhängen. ## Test plan - [x] `pnpm --filter @mrrmlab/mobile typecheck` - [x] `pnpm --filter @mrrmlab/mobile test -- nli-classifier model-manager` — 12/12 - [x] Manuell auf Gerät: Mail öffnen → Logs zeigen `[MailModel] NLI uncertain (top 0.297) → Llama fallback` ohne instanceof-Error; bei klaren Mails NLI-Hit erwartet. ## Issue Gehört zu #175.
fix(175): NLI-Classifier auf RN funktionsfähig — ORT-Hook + Browser-Globals-Polyfill
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
9b336e2938
transformers.js v4 erkennt zur Laufzeit über `globalThis[Symbol.for("onnxruntime")]`
welche ONNX-Runtime es nutzen soll. Auf React Native war das Symbol nicht gesetzt
und kein Node-Env vorhanden → Fallback auf `onnxruntime-web`, das in RN kein
gültiges `Tensor`-Objekt liefert. Jedes `x instanceof ONNX.Tensor` warf damit
"right operand of 'instanceof' is not an object", was den NLI-Pfad komplett blockiert
und immer in den Llama-Fallback degradiert hat.

Zusätzlich enthält transformers.web.js ungeguardete `instanceof Blob/File/…`-Checks,
die in Hermes (keine Browser-Globals) ebenfalls werfen.

Fix:
- Neues Side-Effect-Modul `nli-classifier-polyfill.ts`, das vor transformers
  geladen wird: registriert `onnxruntime-react-native` unter dem ORT-Symbol und
  installiert Empty-Class-Polyfills für die fehlenden Browser-Globals.
- `env.allowLocalModels/useFSCache/useBrowserCache` zusätzlich in `initialize()`
  reasserten, falls HMR das Modul re-evaluiert ohne Top-Level-Statements neu
  auszuführen (TDD-Test prüft das Verhalten).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
admin-mrrm force-pushed fix/175-nli-onnxruntime-symbol from 9b336e2938
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
to 5bd0fa48a8
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2026-05-14 11:17:42 +02:00
Compare
admin-mrrm deleted branch fix/175-nli-onnxruntime-symbol 2026-05-14 11:31:18 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp!250
No description provided.