From 17c41c1d60b0b5d50adfaaa040c5482363addaff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20S=C5=82uszniak?= Date: Wed, 7 Oct 2026 11:33:24 +0200 Subject: [PATCH 1/5] feat: deprecate unquantized XNNPACK variants with a faster quantized twin Deprecated variants warn once on download (dev only) and carry @deprecated JSDoc; they are removed in v0.12.0. Covers all 15 bf16/fp16 LLMs and the fp32 builds whose int8/8da4w twin was measured to hold accuracy. --- .../app/audio-file-transcription/index.tsx | 4 +- .../app/microphone-transcription/index.tsx | 4 +- .../__tests__/api/modelVariants.test.ts | 71 +++++++++ .../__tests__/fetcher/download.test.ts | 17 ++ .../src/deprecation.ts | 45 ++++++ .../src/fetcher/fetcher.ts | 2 + .../react-native-executorch/src/models.ts | 145 ++++++++++++++---- 7 files changed, 254 insertions(+), 34 deletions(-) create mode 100644 packages/react-native-executorch/src/deprecation.ts diff --git a/apps/speech/app/audio-file-transcription/index.tsx b/apps/speech/app/audio-file-transcription/index.tsx index 1bba02bab5..679714cb3f 100644 --- a/apps/speech/app/audio-file-transcription/index.tsx +++ b/apps/speech/app/audio-file-transcription/index.tsx @@ -33,7 +33,7 @@ const MODELS = [ }, { name: 'Base English (CPU)', - config: models.speechToText.WHISPER.EN.BASE.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.BASE.XNNPACK_INT8, }, { name: 'Base English (CoreML)', @@ -47,7 +47,7 @@ const MODELS = [ }, { name: 'Small English (CPU)', - config: models.speechToText.WHISPER.EN.SMALL.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.SMALL.XNNPACK_INT8, }, { name: 'Small English (CoreML)', diff --git a/apps/speech/app/microphone-transcription/index.tsx b/apps/speech/app/microphone-transcription/index.tsx index b30ec6b0b9..c4114ca4e2 100644 --- a/apps/speech/app/microphone-transcription/index.tsx +++ b/apps/speech/app/microphone-transcription/index.tsx @@ -26,7 +26,7 @@ const MODELS = [ }, { name: 'Base English (CPU)', - config: models.speechToText.WHISPER.EN.BASE.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.BASE.XNNPACK_INT8, }, { name: 'Base English (CoreML)', @@ -40,7 +40,7 @@ const MODELS = [ }, { name: 'Small English (CPU)', - config: models.speechToText.WHISPER.EN.SMALL.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.SMALL.XNNPACK_INT8, }, { name: 'Small English (CoreML)', diff --git a/packages/react-native-executorch/__tests__/api/modelVariants.test.ts b/packages/react-native-executorch/__tests__/api/modelVariants.test.ts index ef303485c6..cd3951adde 100644 --- a/packages/react-native-executorch/__tests__/api/modelVariants.test.ts +++ b/packages/react-native-executorch/__tests__/api/modelVariants.test.ts @@ -326,6 +326,77 @@ describe('variant selection rules', () => { }); }); +describe('deprecated variants', () => { + /** The devices a `DEFAULT` can resolve differently on. */ + const devices = [ + { os: 'ios' as const }, + { os: 'android' as const }, + { os: 'ios' as const, isEmulator: true }, + { os: 'ios' as const, backends: ['XnnpackBackend'] }, + { os: 'android' as const, backends: ['XnnpackBackend'] }, + ]; + + /** + * Every group of the registry as resolved on `device`, with the notices of + * the variants it deprecates. Read from the deprecation module the reloaded + * registry registered them in. + */ + function deprecationsFor(device: Parameters[0]) { + const registry = registryFor(device); + const { deprecationOf } = require('../../src/deprecation') as { + deprecationOf: (modelPath: string) => string | undefined; + }; + return variantGroups(registry).map(({ label, group }) => ({ + label, + group, + notices: new Map( + namedVariants(group).flatMap(([key, config]) => { + const notice = deprecationOf(modelPathsOf(config)); + return notice === undefined ? [] : [[key, notice] as const]; + }) + ), + })); + } + + it('finds deprecated variants to check', () => { + const count = deprecationsFor({ os: 'android' }).reduce( + (n, { notices }) => n + notices.size, + 0 + ); + expect(count).toBeGreaterThan(0); + }); + + it('never defaults to a deprecated variant, on any device', () => { + const offenders = devices.flatMap((device) => + deprecationsFor(device) + .filter(({ group, notices }) => notices.has(defaultKeyOf(group) ?? '')) + .map(({ label, group }) => `${JSON.stringify(device)} ${label}: ${defaultKeyOf(group)}`) + ); + + expect(offenders).toEqual([]); + }); + + it('points every deprecated variant at a supported sibling', () => { + const offenders = deprecationsFor({ os: 'android' }).flatMap(({ label, group, notices }) => + [...notices].flatMap(([key, notice]) => { + const prefix = `models.${label}.`; + const named = notice.match(/^(\S+) is deprecated.* Use (\S+), which/); + const replacement = named?.[2]?.startsWith(prefix) + ? named[2].slice(prefix.length) + : undefined; + const ok = + named?.[1] === `${prefix}${key}` && + replacement !== undefined && + isConfig(group[replacement]) && + !notices.has(replacement); + return ok ? [] : [`${label}.${key}: ${notice}`]; + }) + ); + + expect(offenders).toEqual([]); + }); +}); + describe('feature map', () => { // `models...DEFAULT` only reaches the accelerated export when // the app downloaded that backend, and `features` is the documented way to diff --git a/packages/react-native-executorch/__tests__/fetcher/download.test.ts b/packages/react-native-executorch/__tests__/fetcher/download.test.ts index 003ac5180a..d3fa796924 100644 --- a/packages/react-native-executorch/__tests__/fetcher/download.test.ts +++ b/packages/react-native-executorch/__tests__/fetcher/download.test.ts @@ -1,4 +1,5 @@ import { isRnExecuTorchError } from '../../src/core/error'; +import { registerDeprecation } from '../../src/deprecation'; import { download } from '../../src/fetcher/fetcher'; import { setTelemetryEnabled } from '../../src/fetcher/telemetry'; import { until } from '../support/async'; @@ -108,6 +109,22 @@ describe('download — resolution', () => { }); }); +describe('download — deprecated models', () => { + it('warns once per deprecated model, however often it is downloaded', async () => { + const warn = jest.spyOn(console, 'warn').mockImplementation(() => {}); + const deprecatedUrl = 'https://huggingface.co/software-mansion/model/resolve/v1/old.pte'; + registerDeprecation(deprecatedUrl, 'old.pte is deprecated.'); + fakeNet.serve(deprecatedUrl); + fakeNet.serve(URL_B); + + await download({ modelPath: deprecatedUrl, tokenizerPath: URL_B }); + await download({ modelPath: deprecatedUrl }); + + expect(warn.mock.calls).toEqual([['[React Native ExecuTorch] old.pte is deprecated.']]); + warn.mockRestore(); + }); +}); + describe('download — caching', () => { it('serves a second call from the cache without a request', async () => { fakeNet.serve(URL_A); diff --git a/packages/react-native-executorch/src/deprecation.ts b/packages/react-native-executorch/src/deprecation.ts new file mode 100644 index 0000000000..c05a819e2c --- /dev/null +++ b/packages/react-native-executorch/src/deprecation.ts @@ -0,0 +1,45 @@ +/** + * Registry variants on their way out. A variant is deprecated once a twin on the + * same backend runs faster from a smaller download without losing accuracy. It + * keeps working for one minor release, warning whenever it is downloaded, and is + * then removed. + */ + +// Keyed by model URL rather than by config object, so a config the app copied +// or extended (`{ ...models.x.Y.XNNPACK_FP32, modelOpts }`) still warns. +const notices = new Map(); +const warned = new Set(); + +/** + * Records that the model at `modelPath` is deprecated. + * @param modelPath The variant's remote `.pte` URL. + * @param notice What to tell the developer, including what to use instead. + */ +export function registerDeprecation(modelPath: string, notice: string): void { + notices.set(modelPath, notice); +} + +/** + * The deprecation notice for a model URL, if it has one. + * @param modelPath A remote `.pte` URL. + * @returns The notice, or `undefined` for a supported model. + */ +export function deprecationOf(modelPath: string): string | undefined { + return notices.get(modelPath); +} + +/** + * Warns, once per URL and in development only, about every deprecated model + * among `urls`. + * @param urls The remote sources about to be downloaded. + */ +export function warnIfDeprecated(urls: Iterable): void { + if (!__DEV__) return; + for (const url of urls) { + const notice = notices.get(url); + if (notice === undefined || warned.has(url)) continue; + warned.add(url); + // eslint-disable-next-line no-console + console.warn(`[React Native ExecuTorch] ${notice}`); + } +} diff --git a/packages/react-native-executorch/src/fetcher/fetcher.ts b/packages/react-native-executorch/src/fetcher/fetcher.ts index dc0985c0a6..26e1555ac2 100644 --- a/packages/react-native-executorch/src/fetcher/fetcher.ts +++ b/packages/react-native-executorch/src/fetcher/fetcher.ts @@ -8,6 +8,7 @@ import { type BackgroundDownloadTask, } from './backgroundDownloader'; import { RnExecuTorchError } from '../core/error'; +import { warnIfDeprecated } from '../deprecation'; const IS_ANDROID = Platform.OS === 'android'; @@ -778,6 +779,7 @@ function substituteRemoteSources(node: T, resolved: ReadonlyMap(source: T, options: DownloadOptions = {}): Promise { const urls = [...collectRemoteSources(source)]; + warnIfDeprecated(urls); // Nothing to fetch — every source is already a local path. if (urls.length === 0) { diff --git a/packages/react-native-executorch/src/models.ts b/packages/react-native-executorch/src/models.ts index de37ec051d..ea68a608df 100644 --- a/packages/react-native-executorch/src/models.ts +++ b/packages/react-native-executorch/src/models.ts @@ -16,6 +16,7 @@ import { Platform } from 'react-native'; import { rnexecutorchJsi } from './native/bridge'; import { getRegisteredBackends } from './utils'; +import { registerDeprecation } from './deprecation'; import type { ClassifierModel } from './extensions/cv/tasks/classification'; import type { ObjectDetectorModel } from './extensions/cv/tasks/objectDetection'; import type { StyleTransferModel } from './extensions/cv/tasks/styleTransfer'; @@ -173,6 +174,25 @@ function family>( return { ...map, DEFAULT: map[first]!.DEFAULT as V[keyof V]['DEFAULT'] }; } +// Deprecated variants, mapped to the key of the sibling that replaces them. +// The registry is walked once it is built, so that each warning can name both +// by their full path. +const REPLACEMENTS = new Map(); + +/** + * Marks a variant deprecated in favour of a sibling in the same group. It still + * loads, and warns on download, until it is removed in the next minor release. + * Never declare it ahead of its replacement, or it can become the `DEFAULT`. + * @typeParam T The variant's config. + * @param config The deprecated variant. + * @param replacement The key of the sibling variant to use instead. + * @returns `config`, unchanged. + */ +function deprecated(config: T, replacement: string): T { + REPLACEMENTS.set(config, replacement); + return config; +} + const BASE_URL = 'https://huggingface.co/software-mansion/react-native-executorch'; // Models resolve through VERSION_TAG, the latest published stable tag, unless // they have been re-exported for the next release, in which case their URL moves @@ -2318,6 +2338,8 @@ export const models = { * architecture providing high accuracy for general-purpose image * classification. */ + // fp32 stays: int8 costs 3.7 points of top-1 (75.8% -> 72.1% on 1000 + // ImageNetV2 images) for its 1.38x speedup. EFFICIENTNET_V2_S: variants({ XNNPACK_INT8: EFFICIENTNET_V2_S_XNNPACK_INT8, XNNPACK_FP32: EFFICIENTNET_V2_S_XNNPACK_FP32, @@ -2336,7 +2358,8 @@ export const models = { */ CANDY: variants({ XNNPACK_INT8: STYLE_TRANSFER_CANDY_XNNPACK_INT8, - XNNPACK_FP32: STYLE_TRANSFER_CANDY_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(STYLE_TRANSFER_CANDY_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_CANDY_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_CANDY_VULKAN_FP16, }), @@ -2346,7 +2369,8 @@ export const models = { */ MOSAIC: variants({ XNNPACK_INT8: STYLE_TRANSFER_MOSAIC_XNNPACK_INT8, - XNNPACK_FP32: STYLE_TRANSFER_MOSAIC_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(STYLE_TRANSFER_MOSAIC_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_MOSAIC_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_MOSAIC_VULKAN_FP16, }), @@ -2356,7 +2380,8 @@ export const models = { */ RAIN_PRINCESS: variants({ XNNPACK_INT8: STYLE_TRANSFER_RAIN_PRINCESS_XNNPACK_INT8, - XNNPACK_FP32: STYLE_TRANSFER_RAIN_PRINCESS_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(STYLE_TRANSFER_RAIN_PRINCESS_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_RAIN_PRINCESS_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_RAIN_PRINCESS_VULKAN_FP16, }), @@ -2366,7 +2391,8 @@ export const models = { */ UDNIE: variants({ XNNPACK_INT8: STYLE_TRANSFER_UDNIE_XNNPACK_INT8, - XNNPACK_FP32: STYLE_TRANSFER_UDNIE_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(STYLE_TRANSFER_UDNIE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_UDNIE_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_UDNIE_VULKAN_FP16, }), @@ -2401,7 +2427,8 @@ export const models = { */ LRASPP_MOBILENET_V3_LARGE: variants({ XNNPACK_INT8: LRASPP_MOBILENET_V3_LARGE_XNNPACK_INT8, - XNNPACK_FP32: LRASPP_MOBILENET_V3_LARGE_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(LRASPP_MOBILENET_V3_LARGE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: LRASPP_MOBILENET_V3_LARGE_COREML_FP16, }), /** @@ -2411,7 +2438,8 @@ export const models = { */ DEEPLAB_V3_RESNET50: variants({ XNNPACK_INT8: DEEPLAB_V3_RESNET50_XNNPACK_INT8, - XNNPACK_FP32: DEEPLAB_V3_RESNET50_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(DEEPLAB_V3_RESNET50_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: DEEPLAB_V3_RESNET50_COREML_FP16, }), /** @@ -2421,7 +2449,8 @@ export const models = { */ DEEPLAB_V3_RESNET101: variants({ XNNPACK_INT8: DEEPLAB_V3_RESNET101_XNNPACK_INT8, - XNNPACK_FP32: DEEPLAB_V3_RESNET101_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(DEEPLAB_V3_RESNET101_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: DEEPLAB_V3_RESNET101_COREML_FP16, }), /** @@ -2429,6 +2458,8 @@ export const models = { * classes, see {@link PASCAL_VOC_LABELS}). Combines DeepLabV3 feature * extraction quality with a lightweight mobile backbone. */ + // fp32 stays: int8 costs 1.70 mIoU points (69.13 -> 67.43 on 300 VOC2012 + // val images), where the ResNet backbones lose under 0.4. DEEPLAB_V3_MOBILENET_V3_LARGE: variants({ XNNPACK_INT8: DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_INT8, XNNPACK_FP32: DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_FP32, @@ -2440,7 +2471,8 @@ export const models = { */ FCN_RESNET50: variants({ XNNPACK_INT8: FCN_RESNET50_XNNPACK_INT8, - XNNPACK_FP32: FCN_RESNET50_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(FCN_RESNET50_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FCN_RESNET50_COREML_FP16, }), /** @@ -2449,7 +2481,8 @@ export const models = { */ FCN_RESNET101: variants({ XNNPACK_INT8: FCN_RESNET101_XNNPACK_INT8, - XNNPACK_FP32: FCN_RESNET101_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(FCN_RESNET101_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FCN_RESNET101_COREML_FP16, }), }, @@ -2928,7 +2961,9 @@ export const models = { // WER and small.en 3.42% -> 3.38%: too little to outweigh halving the // download (247 MB against 399, 448 against 1129). `TINY` keeps fp32 // first because there int8 costs 6.08% -> 7.77%, a quarter of the - // accuracy the smallest model has left. + // accuracy the smallest model has left. The fp32 builds of the other two + // are deprecated: int8 is also 1.55x (base.en) and 1.68x (small.en) + // faster on an S26 Ultra. EN: { /** * English-only Whisper Tiny model. Fast and compact for English STT. @@ -2953,7 +2988,8 @@ export const models = { BASE: variants( { XNNPACK_INT8: WHISPER_BASE_EN_XNNPACK_INT8, - XNNPACK_FP32: WHISPER_BASE_EN_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(WHISPER_BASE_EN_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_BASE_EN_COREML_FP16, MLX_BF16: WHISPER_BASE_EN_MLX_BF16, MLX_INT8: WHISPER_BASE_EN_MLX_INT8, @@ -2970,7 +3006,8 @@ export const models = { SMALL: variants( { XNNPACK_INT8: WHISPER_SMALL_EN_XNNPACK_INT8, - XNNPACK_FP32: WHISPER_SMALL_EN_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(WHISPER_SMALL_EN_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_SMALL_EN_COREML_FP16, MLX_INT8: WHISPER_SMALL_EN_MLX_INT8, VULKAN_FP16: WHISPER_SMALL_EN_VULKAN_FP16, @@ -2995,6 +3032,10 @@ export const models = { * Generative Large Language Models (LLMs) for instruction following, chat, * text generation, and reasoning. */ + // Every bf16 and fp16 XNNPACK export is deprecated in favour of its 8da4w or + // SpinQuant sibling, which is 2-3.5x smaller. bf16 also misses XNNPACK's fast + // kernels: Qwen2.5 0.5B decodes at 0.5 tok/s against 27.1 for 8da4w on an S26 + // Ultra. fp16 decodes LFM2.5 350M 2.2x slower than 8da4w. llm: { /** * Liquid AI LFM 2.5 1.2B general-purpose hybrid language model. Built on @@ -3005,7 +3046,8 @@ export const models = { */ LFM2_5_1_2B: variants({ XNNPACK_8DA4W: LFM2_5_1_2B_XNNPACK_8DA4W, - XNNPACK_FP16: LFM2_5_1_2B_XNNPACK_FP16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_FP16: deprecated(LFM2_5_1_2B_XNNPACK_FP16, 'XNNPACK_8DA4W'), MLX_INT4: LFM2_5_1_2B_MLX_INT4, }), /** @@ -3016,7 +3058,8 @@ export const models = { */ LFM2_5_350M: variants({ XNNPACK_8DA4W: LFM2_5_350M_XNNPACK_8DA4W, - XNNPACK_FP16: LFM2_5_350M_XNNPACK_FP16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_FP16: deprecated(LFM2_5_350M_XNNPACK_FP16, 'XNNPACK_8DA4W'), MLX_INT4: LFM2_5_350M_MLX_INT4, }), /** @@ -3050,7 +3093,8 @@ export const models = { */ BIELIK_V3_1_5B: variants({ XNNPACK_8DA4W: BIELIK_V3_1_5B_XNNPACK_8DA4W, - XNNPACK_FP16: BIELIK_V3_1_5B_XNNPACK_FP16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_FP16: deprecated(BIELIK_V3_1_5B_XNNPACK_FP16, 'XNNPACK_8DA4W'), }), /** * Meta Llama 3.2 1B lightweight instruction-tuned multilingual model. @@ -3061,7 +3105,8 @@ export const models = { */ LLAMA3_2_1B: variants({ XNNPACK_SPINQUANT: LLAMA3_2_1B_SPINQUANT, - XNNPACK_BF16: LLAMA3_2_1B_BF16, + /** @deprecated Use `XNNPACK_SPINQUANT`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(LLAMA3_2_1B_BF16, 'XNNPACK_SPINQUANT'), MLX_INT4: LLAMA3_2_1B_MLX_INT4, }), /** @@ -3072,7 +3117,8 @@ export const models = { */ LLAMA3_2_3B: variants({ XNNPACK_SPINQUANT: LLAMA3_2_3B_SPINQUANT, - XNNPACK_BF16: LLAMA3_2_3B_BF16, + /** @deprecated Use `XNNPACK_SPINQUANT`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(LLAMA3_2_3B_BF16, 'XNNPACK_SPINQUANT'), MLX_INT4: LLAMA3_2_3B_MLX_INT4, }), /** @@ -3112,7 +3158,8 @@ export const models = { */ HAMMER2_1_0_5B: variants({ XNNPACK_8DA4W: HAMMER2_1_0_5B_XNNPACK_8DA4W, - XNNPACK_BF16: HAMMER2_1_0_5B_XNNPACK_BF16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(HAMMER2_1_0_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: HAMMER2_1_0_5B_MLX_INT4, }), /** @@ -3122,7 +3169,8 @@ export const models = { */ HAMMER2_1_1_5B: variants({ XNNPACK_8DA4W: HAMMER2_1_1_5B_XNNPACK_8DA4W, - XNNPACK_BF16: HAMMER2_1_1_5B_XNNPACK_BF16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(HAMMER2_1_1_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: HAMMER2_1_1_5B_MLX_INT4, }), /** @@ -3133,7 +3181,8 @@ export const models = { */ HAMMER2_1_3B: variants({ XNNPACK_8DA4W: HAMMER2_1_3B_XNNPACK_8DA4W, - XNNPACK_BF16: HAMMER2_1_3B_XNNPACK_BF16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(HAMMER2_1_3B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: HAMMER2_1_3B_MLX_INT4, }), /** @@ -3144,7 +3193,8 @@ export const models = { */ PHI4_MINI: variants({ XNNPACK_8DA4W: PHI4_MINI_XNNPACK_8DA4W, - XNNPACK_BF16: PHI4_MINI_XNNPACK_BF16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(PHI4_MINI_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: PHI4_MINI_MLX_INT4, }), /** @@ -3155,7 +3205,8 @@ export const models = { */ QWEN2_5_0_5B: variants({ XNNPACK_8DA4W: QWEN2_5_0_5B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN2_5_0_5B_XNNPACK_BF16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(QWEN2_5_0_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN2_5_0_5B_MLX_INT4, }), /** @@ -3166,7 +3217,8 @@ export const models = { */ QWEN2_5_1_5B: variants({ XNNPACK_8DA4W: QWEN2_5_1_5B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN2_5_1_5B_XNNPACK_BF16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(QWEN2_5_1_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN2_5_1_5B_MLX_INT4, }), /** @@ -3176,7 +3228,8 @@ export const models = { */ QWEN2_5_3B: variants({ XNNPACK_8DA4W: QWEN2_5_3B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN2_5_3B_XNNPACK_BF16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(QWEN2_5_3B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN2_5_3B_MLX_INT4, }), /** @@ -3187,7 +3240,8 @@ export const models = { */ QWEN3_0_6B: variants({ XNNPACK_8DA4W: QWEN3_0_6B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN3_0_6B_XNNPACK_BF16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(QWEN3_0_6B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN3_0_6B_MLX_INT4, }), /** @@ -3197,7 +3251,8 @@ export const models = { */ QWEN3_1_7B: variants({ XNNPACK_8DA4W: QWEN3_1_7B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN3_1_7B_XNNPACK_BF16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(QWEN3_1_7B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN3_1_7B_MLX_INT4, }), /** @@ -3208,7 +3263,8 @@ export const models = { */ QWEN3_4B: variants({ XNNPACK_8DA4W: QWEN3_4B_XNNPACK_8DA4W, - XNNPACK_BF16: QWEN3_4B_XNNPACK_BF16, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_BF16: deprecated(QWEN3_4B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN3_4B_MLX_INT4, }), /** @@ -3278,7 +3334,8 @@ export const models = { */ PARAPHRASE_MULTILINGUAL_MINILM_L12_V2: variants({ XNNPACK_8DA4W: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_EMBEDDINGS, - XNNPACK_FP32: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_XNNPACK_FP32, 'XNNPACK_8DA4W'), COREML_INT8: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_COREML_INT8, COREML_FP16: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_COREML_FP16, VULKAN_FP16: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_VULKAN_FP16, @@ -3290,7 +3347,11 @@ export const models = { DISTILUSE_BASE_MULTILINGUAL_CASED_V2: variants( { XNNPACK_8DA4W: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_EMBEDDINGS, - XNNPACK_FP32: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated( + DISTILUSE_BASE_MULTILINGUAL_CASED_V2_XNNPACK_FP32, + 'XNNPACK_8DA4W' + ), COREML_INT8: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_COREML_INT8, COREML_FP16: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_COREML_FP16, MLX_INT8: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_MLX_INT8, @@ -3491,10 +3552,34 @@ export const models = { */ PPOCRV6_SMALL: variants({ XNNPACK: PPOCRV6_SMALL_XNNPACK_INT8, - XNNPACK_FP32: PPOCRV6_SMALL_XNNPACK_FP32, + /** @deprecated Use `XNNPACK`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(PPOCRV6_SMALL_XNNPACK_FP32, 'XNNPACK'), COREML: PPOCRV6_SMALL_COREML_INT8, VULKAN: PPOCRV6_SMALL_VULKAN_FP16, }), }, }, }; + +/** + * Registers the download warning of every variant marked {@link deprecated}. + * @param node A registry branch. + * @param path The branch's dotted path, starting at `models`. + */ +function registerDeprecations(node: object, path: string): void { + for (const [key, value] of Object.entries(node)) { + if (key === 'DEFAULT' || typeof value !== 'object' || value === null) continue; + const replacement = REPLACEMENTS.get(value); + if (replacement !== undefined) { + registerDeprecation( + (value as { modelPath: string }).modelPath, + `${path}.${key} is deprecated and will be removed in v0.12.0. ` + + `Use ${path}.${replacement}, which is faster and smaller.` + ); + } else if (!('modelPath' in value) && !('modelPaths' in value)) { + registerDeprecations(value, `${path}.${key}`); + } + } +} + +registerDeprecations(models, 'models'); From e4d8ddf3fbf0f5810a78bb717175a4ab74d645e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20S=C5=82uszniak?= Date: Wed, 7 Oct 2026 15:42:46 +0200 Subject: [PATCH 2/5] feat: deprecate efficientnet-v2-s and deeplab mbv3 fp32 now int8 holds Points the efficientnet, deeplab mbv3 int8 and paraphrase/distiluse 8da4w exports at their v0.11.0 re-exports (int8 recipe fixes and int8 embedding tables). --- .../app/classification/index.tsx | 4 --- .../01-fundamentals/02-downloading-models.md | 4 +-- .../src/fetcher/fetcher.ts | 2 +- .../react-native-executorch/src/models.ts | 26 ++++++++++--------- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/apps/computer-vision/app/classification/index.tsx b/apps/computer-vision/app/classification/index.tsx index 1dcd140a5a..e8e9b90eea 100644 --- a/apps/computer-vision/app/classification/index.tsx +++ b/apps/computer-vision/app/classification/index.tsx @@ -17,10 +17,6 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'EfficientNetV2-S (XNNPACK INT8)', value: models.classification.EFFICIENTNET_V2_S.XNNPACK_INT8, }, - { - label: 'EfficientNetV2-S (XNNPACK FP32)', - value: models.classification.EFFICIENTNET_V2_S.XNNPACK_FP32, - }, { label: 'EfficientNetV2-S (CoreML FP16)', value: models.classification.EFFICIENTNET_V2_S.COREML_FP16, diff --git a/docs/docs/01-fundamentals/02-downloading-models.md b/docs/docs/01-fundamentals/02-downloading-models.md index 87e4c8b51a..220ba56462 100644 --- a/docs/docs/01-fundamentals/02-downloading-models.md +++ b/docs/docs/01-fundamentals/02-downloading-models.md @@ -53,7 +53,7 @@ import { useResourceDownload, models } from 'react-native-executorch'; function Example() { const { resource, downloadProgress, downloadError } = useResourceDownload( - models.classification.EFFICIENTNET_V2_S.XNNPACK_FP32 + models.classification.EFFICIENTNET_V2_S.XNNPACK_INT8 ); // resource is undefined until the download resolves, then mirrors the config @@ -83,7 +83,7 @@ paths — ready to pass straight to a `create` factory: ```typescript import { download, models } from 'react-native-executorch'; -const model = await download(models.classification.EFFICIENTNET_V2_S.XNNPACK_FP32, { +const model = await download(models.classification.EFFICIENTNET_V2_S.XNNPACK_INT8, { onProgress: (p) => console.log(`${Math.round(p * 100)}%`), }); diff --git a/packages/react-native-executorch/src/fetcher/fetcher.ts b/packages/react-native-executorch/src/fetcher/fetcher.ts index 26e1555ac2..1a2d29dbf9 100644 --- a/packages/react-native-executorch/src/fetcher/fetcher.ts +++ b/packages/react-native-executorch/src/fetcher/fetcher.ts @@ -755,7 +755,7 @@ function substituteRemoteSources(node: T, resolved: ReadonlyMap` factory: * * ```ts - * const model = await download(models.classification.EFFICIENTNET_V2_S.XNNPACK_FP32); + * const model = await download(models.classification.EFFICIENTNET_V2_S.XNNPACK_INT8); * const { classify, dispose } = await createClassifier(model); * ``` * diff --git a/packages/react-native-executorch/src/models.ts b/packages/react-native-executorch/src/models.ts index ea68a608df..a2d870eb56 100644 --- a/packages/react-native-executorch/src/models.ts +++ b/packages/react-native-executorch/src/models.ts @@ -211,7 +211,7 @@ const EFFICIENTNET_V2_S_OPTS = { labels: IMAGENET1K_LABELS, }; const EFFICIENTNET_V2_S_XNNPACK_INT8: ClassifierModel = { - modelPath: `${BASE_URL}-efficientnet-v2-s/${VERSION_TAG}/xnnpack/efficientnet_v2_s_xnnpack_int8.pte`, + modelPath: `${BASE_URL}-efficientnet-v2-s/${NEXT_VERSION_TAG}/xnnpack/efficientnet_v2_s_xnnpack_int8.pte`, modelOpts: EFFICIENTNET_V2_S_OPTS, }; const EFFICIENTNET_V2_S_XNNPACK_FP32: ClassifierModel = { @@ -381,7 +381,7 @@ const DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_FP32: SemanticSegmenterModel = { - modelPath: `${BASE_URL}-deeplab-v3/${VERSION_TAG}/xnnpack/deeplab_v3_mobilenet_v3_large_xnnpack_int8.pte`, + modelPath: `${BASE_URL}-deeplab-v3/${NEXT_VERSION_TAG}/xnnpack/deeplab_v3_mobilenet_v3_large_xnnpack_int8.pte`, modelOpts: DEEPLAB_V3_OPTS, }; const DEEPLAB_V3_MOBILENET_V3_LARGE_COREML_FP16: SemanticSegmenterModel = { @@ -1252,8 +1252,8 @@ const MULTI_QA_MPNET_BASE_DOT_V1_VULKAN_FP16: TextEmbedderModel = { tokenizerPath: `${BASE_URL}-multi-qa-mpnet-base-dot-v1/${VERSION_TAG}/tokenizer.json`, }; const PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_EMBEDDINGS: TextEmbedderModel = { - modelPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${VERSION_TAG}/xnnpack/paraphrase_multilingual_minilm_l12_v2_xnnpack_8da4w.pte`, - tokenizerPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${VERSION_TAG}/tokenizer.json`, + modelPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${NEXT_VERSION_TAG}/xnnpack/paraphrase_multilingual_minilm_l12_v2_xnnpack_8da4w.pte`, + tokenizerPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${NEXT_VERSION_TAG}/tokenizer.json`, }; const PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_XNNPACK_FP32: TextEmbedderModel = { modelPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${VERSION_TAG}/xnnpack/paraphrase_multilingual_minilm_l12_v2_xnnpack_fp32.pte`, @@ -1272,8 +1272,8 @@ const PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_VULKAN_FP16: TextEmbedderModel = { tokenizerPath: `${BASE_URL}-paraphrase-multilingual-MiniLM-L12-v2/${VERSION_TAG}/tokenizer.json`, }; const DISTILUSE_BASE_MULTILINGUAL_CASED_V2_EMBEDDINGS: TextEmbedderModel = { - modelPath: `${BASE_URL}-distiluse-base-multilingual-cased-v2/${VERSION_TAG}/xnnpack/distiluse_base_multilingual_cased_v2_xnnpack_8da4w.pte`, - tokenizerPath: `${BASE_URL}-distiluse-base-multilingual-cased-v2/${VERSION_TAG}/tokenizer.json`, + modelPath: `${BASE_URL}-distiluse-base-multilingual-cased-v2/${NEXT_VERSION_TAG}/xnnpack/distiluse_base_multilingual_cased_v2_xnnpack_8da4w.pte`, + tokenizerPath: `${BASE_URL}-distiluse-base-multilingual-cased-v2/${NEXT_VERSION_TAG}/tokenizer.json`, }; const DISTILUSE_BASE_MULTILINGUAL_CASED_V2_XNNPACK_FP32: TextEmbedderModel = { modelPath: `${BASE_URL}-distiluse-base-multilingual-cased-v2/${VERSION_TAG}/xnnpack/distiluse_base_multilingual_cased_v2_xnnpack_fp32.pte`, @@ -2338,11 +2338,12 @@ export const models = { * architecture providing high accuracy for general-purpose image * classification. */ - // fp32 stays: int8 costs 3.7 points of top-1 (75.8% -> 72.1% on 1000 - // ImageNetV2 images) for its 1.38x speedup. + // int8 keeps its squeeze-excitation blocks fp32: 75.0% top-1 on 1000 + // ImageNetV2 images against fp32's 75.8%, still 2.2x faster than fp32. EFFICIENTNET_V2_S: variants({ XNNPACK_INT8: EFFICIENTNET_V2_S_XNNPACK_INT8, - XNNPACK_FP32: EFFICIENTNET_V2_S_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(EFFICIENTNET_V2_S_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: EFFICIENTNET_V2_S_COREML_FP16, }), }, @@ -2458,11 +2459,12 @@ export const models = { * classes, see {@link PASCAL_VOC_LABELS}). Combines DeepLabV3 feature * extraction quality with a lightweight mobile backbone. */ - // fp32 stays: int8 costs 1.70 mIoU points (69.13 -> 67.43 on 300 VOC2012 - // val images), where the ResNet backbones lose under 0.4. + // int8 keeps the stem and the classifier convolution fp32: 68.88 mIoU on + // 300 VOC2012 val images against fp32's 69.13. DEEPLAB_V3_MOBILENET_V3_LARGE: variants({ XNNPACK_INT8: DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_INT8, - XNNPACK_FP32: DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: DEEPLAB_V3_MOBILENET_V3_LARGE_COREML_FP16, }), /** From cd9825989bf1df29a7bff80e122ef74278a49d51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20S=C5=82uszniak?= Date: Thu, 15 Oct 2026 13:55:43 +0200 Subject: [PATCH 3/5] feat: deprecate fp32 XNNPACK variants superseded by int8 Co-Authored-By: Claude Opus 5.5 --- apps/computer-vision/app/detection/index.tsx | 28 ++- .../app/imageEmbeddings/index.tsx | 4 +- .../app/instanceSegmentation/index.tsx | 16 -- apps/computer-vision/app/keypoint/index.tsx | 8 - .../computer-vision/app/textToImage/index.tsx | 4 - .../app/audio-file-transcription/index.tsx | 8 +- .../app/microphone-transcription/index.tsx | 8 +- apps/speech/app/text-to-speech/index.tsx | 6 +- .../__tests__/api/modelVariants.test.ts | 9 +- .../react-native-executorch/src/models.ts | 188 ++++++++++++------ 10 files changed, 165 insertions(+), 114 deletions(-) diff --git a/apps/computer-vision/app/detection/index.tsx b/apps/computer-vision/app/detection/index.tsx index dd910711fe..0ecbc1012a 100644 --- a/apps/computer-vision/app/detection/index.tsx +++ b/apps/computer-vision/app/detection/index.tsx @@ -22,38 +22,34 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'RF-DETR Nano (XNNPACK INT8)', value: models.objectDetection.RFDETR_NANO.XNNPACK_INT8, }, - { - label: 'RF-DETR Nano (XNNPACK FP32)', - value: models.objectDetection.RFDETR_NANO.XNNPACK_FP32, - }, { label: 'RF-DETR Nano (CoreML FP16)', value: models.objectDetection.RFDETR_NANO.COREML_FP16, disabled: Platform.OS !== 'ios', }, { - label: 'YOLO26 Nano 384 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.NANO.SIZE_384.XNNPACK_FP32, + label: 'YOLO26 Nano 384 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.NANO.SIZE_384.XNNPACK_INT8, }, { - label: 'YOLO26 Nano 640 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.NANO.SIZE_640.XNNPACK_FP32, + label: 'YOLO26 Nano 640 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.NANO.SIZE_640.XNNPACK_INT8, }, { - label: 'YOLO26 Small 640 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.SMALL.SIZE_640.XNNPACK_FP32, + label: 'YOLO26 Small 640 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.SMALL.SIZE_640.XNNPACK_INT8, }, { - label: 'YOLO26 Medium 640 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.MEDIUM.SIZE_640.XNNPACK_FP32, + label: 'YOLO26 Medium 640 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.MEDIUM.SIZE_640.XNNPACK_INT8, }, { - label: 'YOLO26 Large 640 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.LARGE.SIZE_640.XNNPACK_FP32, + label: 'YOLO26 Large 640 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.LARGE.SIZE_640.XNNPACK_INT8, }, { - label: 'YOLO26 X-Large 640 (XNNPACK FP32)', - value: models.objectDetection.YOLO26.XLARGE.SIZE_640.XNNPACK_FP32, + label: 'YOLO26 X-Large 640 (XNNPACK INT8)', + value: models.objectDetection.YOLO26.XLARGE.SIZE_640.XNNPACK_INT8, }, ]; diff --git a/apps/computer-vision/app/imageEmbeddings/index.tsx b/apps/computer-vision/app/imageEmbeddings/index.tsx index 2d6dcf6323..d2def3fc13 100644 --- a/apps/computer-vision/app/imageEmbeddings/index.tsx +++ b/apps/computer-vision/app/imageEmbeddings/index.tsx @@ -22,8 +22,8 @@ import { Button } from '../../components/Button'; const IMAGE_MODEL_OPTIONS: ModelOption[] = [ { - label: 'CLIP ViT-B/32 (XNNPACK FP32)', - value: models.imageEmbeddings.CLIP_VIT_BASE_PATCH32.XNNPACK_FP32, + label: 'CLIP ViT-B/32 (XNNPACK INT8)', + value: models.imageEmbeddings.CLIP_VIT_BASE_PATCH32.XNNPACK_INT8, }, { label: 'CLIP ViT-B/32 (CoreML FP16)', diff --git a/apps/computer-vision/app/instanceSegmentation/index.tsx b/apps/computer-vision/app/instanceSegmentation/index.tsx index f6bfe82dfe..3720f47836 100644 --- a/apps/computer-vision/app/instanceSegmentation/index.tsx +++ b/apps/computer-vision/app/instanceSegmentation/index.tsx @@ -28,18 +28,10 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'YOLO26 Nano (XNNPACK INT8)', value: models.instanceSegmentation.YOLO26.NANO.SIZE_384.XNNPACK_INT8, }, - { - label: 'YOLO26 Nano (XNNPACK FP32)', - value: models.instanceSegmentation.YOLO26.NANO.SIZE_384.XNNPACK_FP32, - }, { label: 'RFDETR (XNNPACK INT8)', value: models.instanceSegmentation.RFDETR_NANO.XNNPACK_INT8, }, - { - label: 'RFDETR (XNNPACK FP32)', - value: models.instanceSegmentation.RFDETR_NANO.XNNPACK_FP32, - }, { label: 'RFDETR (CoreML FP16)', value: models.instanceSegmentation.RFDETR_NANO.COREML_FP16, @@ -49,18 +41,10 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'FastSAM Small (XNNPACK INT8)', value: models.instanceSegmentation.FASTSAM.S.XNNPACK_INT8, }, - { - label: 'FastSAM Small (XNNPACK FP32)', - value: models.instanceSegmentation.FASTSAM.S.XNNPACK_FP32, - }, { label: 'FastSAM X-Large (XNNPACK INT8)', value: models.instanceSegmentation.FASTSAM.X.XNNPACK_INT8, }, - { - label: 'FastSAM X-Large (XNNPACK FP32)', - value: models.instanceSegmentation.FASTSAM.X.XNNPACK_FP32, - }, { label: 'FastSAM Small (CoreML FP16)', value: models.instanceSegmentation.FASTSAM.S.COREML_FP16, diff --git a/apps/computer-vision/app/keypoint/index.tsx b/apps/computer-vision/app/keypoint/index.tsx index aa58c108e8..2a7729c789 100644 --- a/apps/computer-vision/app/keypoint/index.tsx +++ b/apps/computer-vision/app/keypoint/index.tsx @@ -32,18 +32,10 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'YOLO26 Pose (XNNPACK INT8)', value: models.keypointDetection.YOLO26_POSE.SIZE_384.XNNPACK_INT8, }, - { - label: 'YOLO26 Pose (XNNPACK FP32)', - value: models.keypointDetection.YOLO26_POSE.SIZE_384.XNNPACK_FP32, - }, { label: 'RF-DETR Keypoint (XNNPACK INT8)', value: models.keypointDetection.RFDETR_KEYPOINT.XNNPACK_INT8, }, - { - label: 'RF-DETR Keypoint (XNNPACK FP32)', - value: models.keypointDetection.RFDETR_KEYPOINT.XNNPACK_FP32, - }, { label: 'RF-DETR Keypoint (CoreML FP16)', value: models.keypointDetection.RFDETR_KEYPOINT.COREML_FP16, diff --git a/apps/computer-vision/app/textToImage/index.tsx b/apps/computer-vision/app/textToImage/index.tsx index f7ab5a9b35..da7d6d5207 100644 --- a/apps/computer-vision/app/textToImage/index.tsx +++ b/apps/computer-vision/app/textToImage/index.tsx @@ -26,10 +26,6 @@ const MODEL_OPTIONS: ModelOption[] = [ label: 'SDXS-512-DreamShaper (XNNPACK INT8)', value: models.textToImage.SDXS_512_DREAMSHAPER.XNNPACK_INT8, }, - { - label: 'SDXS-512-DreamShaper (XNNPACK FP32)', - value: models.textToImage.SDXS_512_DREAMSHAPER.XNNPACK_FP32, - }, { label: 'SDXS-512-DreamShaper (CoreML FP16)', value: models.textToImage.SDXS_512_DREAMSHAPER.COREML_FP16, diff --git a/apps/speech/app/audio-file-transcription/index.tsx b/apps/speech/app/audio-file-transcription/index.tsx index 679714cb3f..8d90041568 100644 --- a/apps/speech/app/audio-file-transcription/index.tsx +++ b/apps/speech/app/audio-file-transcription/index.tsx @@ -19,7 +19,7 @@ import { theme } from '../../theme'; const MODELS = [ { name: 'Tiny English (CPU)', - config: models.speechToText.WHISPER.EN.TINY.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.TINY.XNNPACK_INT8, }, { name: 'Tiny English (CoreML)', @@ -61,7 +61,7 @@ const MODELS = [ }, { name: 'Tiny Multilingual (CPU)', - config: models.speechToText.WHISPER.TINY.XNNPACK_FP32, + config: models.speechToText.WHISPER.TINY.XNNPACK_INT8, }, { name: 'Tiny Multilingual (CoreML)', @@ -100,7 +100,7 @@ const MODELS = [ }, { name: 'Base Multilingual (CPU)', - config: models.speechToText.WHISPER.BASE.XNNPACK_FP32, + config: models.speechToText.WHISPER.BASE.XNNPACK_INT8, }, { name: 'Base Multilingual (CoreML)', @@ -114,7 +114,7 @@ const MODELS = [ }, { name: 'Small Multilingual (CPU)', - config: models.speechToText.WHISPER.SMALL.XNNPACK_FP32, + config: models.speechToText.WHISPER.SMALL.XNNPACK_INT8, }, { name: 'Small Multilingual (CoreML)', diff --git a/apps/speech/app/microphone-transcription/index.tsx b/apps/speech/app/microphone-transcription/index.tsx index c4114ca4e2..92c78ae473 100644 --- a/apps/speech/app/microphone-transcription/index.tsx +++ b/apps/speech/app/microphone-transcription/index.tsx @@ -12,7 +12,7 @@ import { theme } from '../../theme'; const MODELS = [ { name: 'Tiny English (CPU)', - config: models.speechToText.WHISPER.EN.TINY.XNNPACK_FP32, + config: models.speechToText.WHISPER.EN.TINY.XNNPACK_INT8, }, { name: 'Tiny English (CoreML)', @@ -54,7 +54,7 @@ const MODELS = [ }, { name: 'Tiny Multilingual (CPU)', - config: models.speechToText.WHISPER.TINY.XNNPACK_FP32, + config: models.speechToText.WHISPER.TINY.XNNPACK_INT8, }, { name: 'Tiny Multilingual (CoreML)', @@ -93,7 +93,7 @@ const MODELS = [ }, { name: 'Base Multilingual (CPU)', - config: models.speechToText.WHISPER.BASE.XNNPACK_FP32, + config: models.speechToText.WHISPER.BASE.XNNPACK_INT8, }, { name: 'Base Multilingual (CoreML)', @@ -107,7 +107,7 @@ const MODELS = [ }, { name: 'Small Multilingual (CPU)', - config: models.speechToText.WHISPER.SMALL.XNNPACK_FP32, + config: models.speechToText.WHISPER.SMALL.XNNPACK_INT8, }, { name: 'Small Multilingual (CoreML)', diff --git a/apps/speech/app/text-to-speech/index.tsx b/apps/speech/app/text-to-speech/index.tsx index eece65771e..c24a60fcd9 100644 --- a/apps/speech/app/text-to-speech/index.tsx +++ b/apps/speech/app/text-to-speech/index.tsx @@ -51,15 +51,15 @@ const STEPS_OPTIONS = [ ]; const MODEL_OPTIONS = [ - { label: 'XNNPACK (CPU)', value: 'XNNPACK_FP32' as const }, + { label: 'XNNPACK (CPU)', value: 'XNNPACK_INT8' as const }, { label: 'MLX (Apple Silicon)', value: 'MLX_FP32' as const, disabled: Platform.OS !== 'ios' }, { label: 'Vulkan (GPU)', value: 'VULKAN_FP16' as const, disabled: Platform.OS !== 'android' }, ]; function TTSContent() { const [text, setText] = useState(SAMPLE_TEXT); - const [selectedModel, setSelectedModel] = useState<'XNNPACK_FP32' | 'MLX_FP32' | 'VULKAN_FP16'>( - Platform.OS === 'android' ? 'VULKAN_FP16' : 'XNNPACK_FP32' + const [selectedModel, setSelectedModel] = useState<'XNNPACK_INT8' | 'MLX_FP32' | 'VULKAN_FP16'>( + Platform.OS === 'android' ? 'VULKAN_FP16' : 'XNNPACK_INT8' ); const [selectedVoice, setSelectedVoice] = useState('F1'); const [selectedLang, setSelectedLang] = useState('en'); diff --git a/packages/react-native-executorch/__tests__/api/modelVariants.test.ts b/packages/react-native-executorch/__tests__/api/modelVariants.test.ts index cd3951adde..6c02187464 100644 --- a/packages/react-native-executorch/__tests__/api/modelVariants.test.ts +++ b/packages/react-native-executorch/__tests__/api/modelVariants.test.ts @@ -33,6 +33,11 @@ const modelPathsOf = (config: Node): string => .sort() .join('|'); +const modelUrlsOf = (config: Node): string[] => + typeof config.modelPath === 'string' + ? [config.modelPath] + : Object.values(config.modelPaths as Node).map(String); + const isUpperKey = (key: string) => /^[A-Z0-9_]+$/.test(key); /** Every group that names a `DEFAULT`, with the dotted path it sits at. */ @@ -351,7 +356,9 @@ describe('deprecated variants', () => { group, notices: new Map( namedVariants(group).flatMap(([key, config]) => { - const notice = deprecationOf(modelPathsOf(config)); + const notice = modelUrlsOf(config) + .map(deprecationOf) + .find((n) => n !== undefined); return notice === undefined ? [] : [[key, notice] as const]; }) ), diff --git a/packages/react-native-executorch/src/models.ts b/packages/react-native-executorch/src/models.ts index a2d870eb56..da7ff39f09 100644 --- a/packages/react-native-executorch/src/models.ts +++ b/packages/react-native-executorch/src/models.ts @@ -188,7 +188,9 @@ const REPLACEMENTS = new Map(); * @param replacement The key of the sibling variant to use instead. * @returns `config`, unchanged. */ -function deprecated(config: T, replacement: string): T { +function deprecated< + T extends { readonly modelPath: string } | { readonly modelPaths: Record }, +>(config: T, replacement: string): T { REPLACEMENTS.set(config, replacement); return config; } @@ -1199,6 +1201,10 @@ const ALL_MINILM_L6_V2_VULKAN_FP16: TextEmbedderModel = { modelPath: `${BASE_URL}-all-MiniLM-L6-v2/${VERSION_TAG}/vulkan/all_minilm_l6_v2_vulkan_fp16.pte`, tokenizerPath: `${BASE_URL}-all-MiniLM-L6-v2/${VERSION_TAG}/tokenizer.json`, }; +const ALL_MPNET_BASE_V2_XNNPACK_INT8: TextEmbedderModel = { + modelPath: `${BASE_URL}-all-mpnet-base-v2/${NEXT_VERSION_TAG}/xnnpack/all_mpnet_base_v2_xnnpack_int8.pte`, + tokenizerPath: `${BASE_URL}-all-mpnet-base-v2/${VERSION_TAG}/tokenizer.json`, +}; const ALL_MPNET_BASE_V2_XNNPACK_8DA4W: TextEmbedderModel = { modelPath: `${BASE_URL}-all-mpnet-base-v2/${NEXT_VERSION_TAG}/xnnpack/all_mpnet_base_v2_xnnpack_8da4w.pte`, tokenizerPath: `${BASE_URL}-all-mpnet-base-v2/${VERSION_TAG}/tokenizer.json`, @@ -1235,6 +1241,10 @@ const MULTI_QA_MINILM_L6_COS_V1_VULKAN_FP16: TextEmbedderModel = { modelPath: `${BASE_URL}-multi-qa-MiniLM-L6-cos-v1/${VERSION_TAG}/vulkan/multi_qa_minilm_l6_cos_v1_vulkan_fp16.pte`, tokenizerPath: `${BASE_URL}-multi-qa-MiniLM-L6-cos-v1/${VERSION_TAG}/tokenizer.json`, }; +const MULTI_QA_MPNET_BASE_DOT_V1_XNNPACK_INT8: TextEmbedderModel = { + modelPath: `${BASE_URL}-multi-qa-mpnet-base-dot-v1/${NEXT_VERSION_TAG}/xnnpack/multi_qa_mpnet_base_dot_v1_xnnpack_int8.pte`, + tokenizerPath: `${BASE_URL}-multi-qa-mpnet-base-dot-v1/${VERSION_TAG}/tokenizer.json`, +}; const MULTI_QA_MPNET_BASE_DOT_V1_XNNPACK_8DA4W: TextEmbedderModel = { modelPath: `${BASE_URL}-multi-qa-mpnet-base-dot-v1/${NEXT_VERSION_TAG}/xnnpack/multi_qa_mpnet_base_dot_v1_xnnpack_8da4w.pte`, tokenizerPath: `${BASE_URL}-multi-qa-mpnet-base-dot-v1/${VERSION_TAG}/tokenizer.json`, @@ -1579,7 +1589,7 @@ const WHISPER_SMALL_EN_XNNPACK_FP32: WhisperSttModel<'en'> = { vadModel: FSMN_VAD_XNNPACK_FP32, }; const WHISPER_SMALL_EN_XNNPACK_INT8: WhisperSttModel<'en'> = { - modelPath: `${BASE_URL}-whisper-small.en/${VERSION_TAG}/xnnpack/whisper_small_en_xnnpack_int8.pte`, + modelPath: `${BASE_URL}-whisper-small.en/${NEXT_VERSION_TAG}/xnnpack/whisper_small_en_xnnpack_int8.pte`, tokenizerPath: `${BASE_URL}-whisper-small.en/${VERSION_TAG}/tokenizer.json`, supportedLanguages: ['en'], vadModel: FSMN_VAD_XNNPACK_FP32, @@ -2509,7 +2519,8 @@ export const models = { */ RFDETR_NANO: variants({ XNNPACK_INT8: RFDETR_NANO_DETECTOR_XNNPACK_INT8, - XNNPACK_FP32: RFDETR_NANO_DETECTOR_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(RFDETR_NANO_DETECTOR_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: RFDETR_NANO_DETECTOR_COREML_FP16, VULKAN_FP16: RFDETR_NANO_DETECTOR_VULKAN_FP16, }), @@ -2527,19 +2538,22 @@ export const models = { NANO: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_NANO_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_384_COREML_FP16, VULKAN_FP16: YOLO26_NANO_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_NANO_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_512_COREML_FP16, VULKAN_FP16: YOLO26_NANO_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_NANO_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_640_COREML_FP16, VULKAN_FP16: YOLO26_NANO_640_VULKAN_FP16, }), @@ -2551,19 +2565,22 @@ export const models = { SMALL: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_SMALL_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_384_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_SMALL_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_512_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_SMALL_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_640_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_640_VULKAN_FP16, }), @@ -2575,19 +2592,22 @@ export const models = { MEDIUM: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_MEDIUM_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_384_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_MEDIUM_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_512_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_MEDIUM_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_640_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_640_VULKAN_FP16, }), @@ -2598,19 +2618,22 @@ export const models = { LARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_LARGE_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_384_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_LARGE_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_512_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_LARGE_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_640_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_640_VULKAN_FP16, }), @@ -2622,19 +2645,22 @@ export const models = { XLARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_XLARGE_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_384_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_XLARGE_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_512_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_XLARGE_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_640_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_640_VULKAN_FP16, }), @@ -2675,19 +2701,22 @@ export const models = { YOLO26_POSE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_POSE_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_POSE_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_POSE_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_POSE_384_COREML_FP16, VULKAN_FP16: YOLO26_POSE_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_POSE_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_POSE_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_POSE_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_POSE_512_COREML_FP16, VULKAN_FP16: YOLO26_POSE_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_POSE_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_POSE_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_POSE_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_POSE_640_COREML_FP16, VULKAN_FP16: YOLO26_POSE_640_VULKAN_FP16, }), @@ -2699,7 +2728,8 @@ export const models = { RFDETR_KEYPOINT: variants( { XNNPACK_INT8: RFDETR_KEYPOINT_XNNPACK_INT8, - XNNPACK_FP32: RFDETR_KEYPOINT_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(RFDETR_KEYPOINT_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: RFDETR_KEYPOINT_COREML_FP16, VULKAN_FP16: RFDETR_KEYPOINT_VULKAN_FP16, }, @@ -2723,7 +2753,8 @@ export const models = { */ S: variants({ XNNPACK_INT8: FASTSAM_S_XNNPACK_INT8, - XNNPACK_FP32: FASTSAM_S_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(FASTSAM_S_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FASTSAM_S_COREML_FP16, VULKAN_FP16: FASTSAM_S_VULKAN_FP16, }), @@ -2732,7 +2763,8 @@ export const models = { */ X: variants({ XNNPACK_INT8: FASTSAM_X_XNNPACK_INT8, - XNNPACK_FP32: FASTSAM_X_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(FASTSAM_X_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FASTSAM_X_COREML_FP16, VULKAN_FP16: FASTSAM_X_VULKAN_FP16, }), @@ -2744,7 +2776,8 @@ export const models = { */ RFDETR_NANO: variants({ XNNPACK_INT8: RFDETR_NANO_SEG_XNNPACK_INT8, - XNNPACK_FP32: RFDETR_NANO_SEG_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(RFDETR_NANO_SEG_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: RFDETR_NANO_SEG_COREML_FP16, VULKAN_FP16: RFDETR_NANO_SEG_VULKAN_FP16, }), @@ -2762,19 +2795,22 @@ export const models = { NANO: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_NANO_SEG_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_SEG_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_NANO_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_NANO_SEG_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_SEG_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_NANO_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_NANO_SEG_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_NANO_SEG_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_NANO_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_NANO_SEG_640_VULKAN_FP16, }), @@ -2786,19 +2822,22 @@ export const models = { SMALL: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_SMALL_SEG_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_SEG_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_SMALL_SEG_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_SEG_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_SMALL_SEG_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_SMALL_SEG_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_SMALL_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_SEG_640_VULKAN_FP16, }), @@ -2810,19 +2849,22 @@ export const models = { MEDIUM: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_MEDIUM_SEG_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_SEG_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_MEDIUM_SEG_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_SEG_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_MEDIUM_SEG_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_MEDIUM_SEG_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_MEDIUM_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_SEG_640_VULKAN_FP16, }), @@ -2834,19 +2876,22 @@ export const models = { LARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_LARGE_SEG_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_SEG_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_LARGE_SEG_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_SEG_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_LARGE_SEG_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_LARGE_SEG_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_LARGE_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_SEG_640_VULKAN_FP16, }), @@ -2858,19 +2903,22 @@ export const models = { XLARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_XLARGE_SEG_384_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_SEG_384_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_XLARGE_SEG_512_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_SEG_512_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_XLARGE_SEG_640_XNNPACK_INT8, - XNNPACK_FP32: YOLO26_XLARGE_SEG_640_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(YOLO26_XLARGE_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_SEG_640_VULKAN_FP16, }), @@ -2914,7 +2962,8 @@ export const models = { TINY: variants( { XNNPACK_INT8: WHISPER_TINY_XNNPACK_INT8, - XNNPACK_FP32: WHISPER_TINY_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(WHISPER_TINY_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_TINY_COREML_FP16, MLX_BF16: WHISPER_TINY_MLX_BF16, MLX_INT8: WHISPER_TINY_MLX_INT8, @@ -2931,7 +2980,8 @@ export const models = { BASE: variants( { XNNPACK_INT8: WHISPER_BASE_XNNPACK_INT8, - XNNPACK_FP32: WHISPER_BASE_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(WHISPER_BASE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_BASE_COREML_FP16, MLX_BF16: WHISPER_BASE_MLX_BF16, MLX_INT8: WHISPER_BASE_MLX_INT8, @@ -2948,7 +2998,8 @@ export const models = { SMALL: variants( { XNNPACK_INT8: WHISPER_SMALL_XNNPACK_INT8, - XNNPACK_FP32: WHISPER_SMALL_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(WHISPER_SMALL_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_SMALL_COREML_FP16, MLX_INT8: WHISPER_SMALL_MLX_INT8, VULKAN_FP16: WHISPER_SMALL_VULKAN_FP16, @@ -2972,8 +3023,9 @@ export const models = { */ TINY: variants( { - XNNPACK_FP32: WHISPER_TINY_EN_XNNPACK_FP32, XNNPACK_INT8: WHISPER_TINY_EN_XNNPACK_INT8, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(WHISPER_TINY_EN_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_TINY_EN_COREML_FP16, MLX_BF16: WHISPER_TINY_EN_MLX_BF16, MLX_INT8: WHISPER_TINY_EN_MLX_INT8, @@ -3294,7 +3346,8 @@ export const models = { */ ALL_MINILM_L6_V2: variants({ XNNPACK_INT8: ALL_MINILM_L6_V2_XNNPACK_INT8, - XNNPACK_FP32: ALL_MINILM_L6_V2_EMBEDDINGS, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(ALL_MINILM_L6_V2_EMBEDDINGS, 'XNNPACK_INT8'), COREML_INT8: ALL_MINILM_L6_V2_COREML_INT8, COREML_FP16: ALL_MINILM_L6_V2_COREML_FP16, VULKAN_FP16: ALL_MINILM_L6_V2_VULKAN_FP16, @@ -3304,8 +3357,10 @@ export const models = { * Provides higher quality semantic embeddings compared to MiniLM. */ ALL_MPNET_BASE_V2: variants({ + XNNPACK_INT8: ALL_MPNET_BASE_V2_XNNPACK_INT8, XNNPACK_8DA4W: ALL_MPNET_BASE_V2_XNNPACK_8DA4W, - XNNPACK_FP32: ALL_MPNET_BASE_V2_EMBEDDINGS, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(ALL_MPNET_BASE_V2_EMBEDDINGS, 'XNNPACK_INT8'), VULKAN_FP16: ALL_MPNET_BASE_V2_VULKAN_FP16, VULKAN_INT8: ALL_MPNET_BASE_V2_VULKAN_INT8, }), @@ -3315,7 +3370,8 @@ export const models = { */ MULTI_QA_MINILM_L6_COS_V1: variants({ XNNPACK_INT8: MULTI_QA_MINILM_L6_COS_V1_XNNPACK_INT8, - XNNPACK_FP32: MULTI_QA_MINILM_L6_COS_V1_EMBEDDINGS, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(MULTI_QA_MINILM_L6_COS_V1_EMBEDDINGS, 'XNNPACK_INT8'), COREML_INT8: MULTI_QA_MINILM_L6_COS_V1_COREML_INT8, COREML_FP16: MULTI_QA_MINILM_L6_COS_V1_COREML_FP16, VULKAN_FP16: MULTI_QA_MINILM_L6_COS_V1_VULKAN_FP16, @@ -3325,8 +3381,10 @@ export const models = { * question-answering matching using dot product distance. */ MULTI_QA_MPNET_BASE_DOT_V1: variants({ + XNNPACK_INT8: MULTI_QA_MPNET_BASE_DOT_V1_XNNPACK_INT8, XNNPACK_8DA4W: MULTI_QA_MPNET_BASE_DOT_V1_XNNPACK_8DA4W, - XNNPACK_FP32: MULTI_QA_MPNET_BASE_DOT_V1_EMBEDDINGS, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(MULTI_QA_MPNET_BASE_DOT_V1_EMBEDDINGS, 'XNNPACK_INT8'), VULKAN_FP16: MULTI_QA_MPNET_BASE_DOT_V1_VULKAN_FP16, VULKAN_INT8: MULTI_QA_MPNET_BASE_DOT_V1_VULKAN_INT8, }), @@ -3373,7 +3431,8 @@ export const models = { */ CLIP_VIT_BASE_PATCH32_TEXT: variants({ XNNPACK_INT8: CLIP_VIT_BASE_PATCH32_TEXT_XNNPACK_INT8, - XNNPACK_FP32: CLIP_VIT_BASE_PATCH32_TEXT_EMBEDDINGS, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(CLIP_VIT_BASE_PATCH32_TEXT_EMBEDDINGS, 'XNNPACK_INT8'), COREML_INT8: CLIP_VIT_BASE_PATCH32_TEXT_COREML_INT8, COREML_FP16: CLIP_VIT_BASE_PATCH32_TEXT_COREML_FP16, VULKAN_FP16: CLIP_VIT_BASE_PATCH32_TEXT_VULKAN_FP16, @@ -3442,7 +3501,8 @@ export const models = { CLIP_VIT_BASE_PATCH32: variants( { XNNPACK_INT8: CLIP_VIT_BASE_PATCH32_IMAGE_XNNPACK_INT8, - XNNPACK_FP32: CLIP_VIT_BASE_PATCH32_IMAGE_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(CLIP_VIT_BASE_PATCH32_IMAGE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: CLIP_VIT_BASE_PATCH32_IMAGE_COREML_FP16, MLX_INT8: CLIP_VIT_BASE_PATCH32_IMAGE_MLX_INT8, VULKAN_FP16: CLIP_VIT_BASE_PATCH32_IMAGE_VULKAN_FP16, @@ -3464,7 +3524,8 @@ export const models = { */ SDXS_512_DREAMSHAPER: variants({ XNNPACK_INT8: SDXS_512_DREAMSHAPER_XNNPACK_INT8, - XNNPACK_FP32: SDXS_512_DREAMSHAPER_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(SDXS_512_DREAMSHAPER_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: SDXS_512_DREAMSHAPER_COREML_FP16, VULKAN_FP16: SDXS_512_DREAMSHAPER_VULKAN_FP16, }), @@ -3482,7 +3543,8 @@ export const models = { */ SUPERTONIC: variants({ XNNPACK_INT8: SUPERTONIC_3_XNNPACK_INT8, - XNNPACK_FP32: SUPERTONIC_3_XNNPACK_FP32, + /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + XNNPACK_FP32: deprecated(SUPERTONIC_3_XNNPACK_FP32, 'XNNPACK_INT8'), MLX_FP32: SUPERTONIC_3_MLX_FP32, VULKAN_FP16: SUPERTONIC_3_VULKAN_FP16, }), @@ -3563,6 +3625,16 @@ export const models = { }, }; +/** + * The remote `.pte` URLs of a variant config. + * @param config A single-file (`modelPath`) or multi-file (`modelPaths`) config. + * @returns Its model URLs. + */ +function modelUrls(config: object): string[] { + if ('modelPath' in config) return [(config as { modelPath: string }).modelPath]; + return Object.values((config as { modelPaths: Record }).modelPaths); +} + /** * Registers the download warning of every variant marked {@link deprecated}. * @param node A registry branch. @@ -3573,11 +3645,15 @@ function registerDeprecations(node: object, path: string): void { if (key === 'DEFAULT' || typeof value !== 'object' || value === null) continue; const replacement = REPLACEMENTS.get(value); if (replacement !== undefined) { - registerDeprecation( - (value as { modelPath: string }).modelPath, + const notice = `${path}.${key} is deprecated and will be removed in v0.12.0. ` + - `Use ${path}.${replacement}, which is faster and smaller.` - ); + `Use ${path}.${replacement}, which is faster and smaller.`; + // A multi-file variant warns only for the files its replacement does not + // reuse (Supertonic int8 keeps the fp32 duration predictor and text encoder). + const kept = new Set(modelUrls((node as Record)[replacement]!)); + for (const url of modelUrls(value)) { + if (!kept.has(url)) registerDeprecation(url, notice); + } } else if (!('modelPath' in value) && !('modelPaths' in value)) { registerDeprecations(value, `${path}.${key}`); } From 51bbb7e65596683cd1ab13eaef82f766630b50ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20S=C5=82uszniak?= Date: Tue, 20 Oct 2026 14:29:32 +0200 Subject: [PATCH 4/5] chore: deprecated variants are removed in v1.0.0 --- .../src/deprecation.ts | 4 +- .../react-native-executorch/src/models.ts | 166 +++++++++--------- 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/packages/react-native-executorch/src/deprecation.ts b/packages/react-native-executorch/src/deprecation.ts index c05a819e2c..3fd6b4dd39 100644 --- a/packages/react-native-executorch/src/deprecation.ts +++ b/packages/react-native-executorch/src/deprecation.ts @@ -1,8 +1,8 @@ /** * Registry variants on their way out. A variant is deprecated once a twin on the * same backend runs faster from a smaller download without losing accuracy. It - * keeps working for one minor release, warning whenever it is downloaded, and is - * then removed. + * keeps working until v1.0.0, warning whenever it is downloaded, and is then + * removed. */ // Keyed by model URL rather than by config object, so a config the app copied diff --git a/packages/react-native-executorch/src/models.ts b/packages/react-native-executorch/src/models.ts index da7ff39f09..0687b7dfac 100644 --- a/packages/react-native-executorch/src/models.ts +++ b/packages/react-native-executorch/src/models.ts @@ -181,7 +181,7 @@ const REPLACEMENTS = new Map(); /** * Marks a variant deprecated in favour of a sibling in the same group. It still - * loads, and warns on download, until it is removed in the next minor release. + * loads, and warns on download, until it is removed in v1.0.0. * Never declare it ahead of its replacement, or it can become the `DEFAULT`. * @typeParam T The variant's config. * @param config The deprecated variant. @@ -2352,7 +2352,7 @@ export const models = { // ImageNetV2 images against fp32's 75.8%, still 2.2x faster than fp32. EFFICIENTNET_V2_S: variants({ XNNPACK_INT8: EFFICIENTNET_V2_S_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(EFFICIENTNET_V2_S_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: EFFICIENTNET_V2_S_COREML_FP16, }), @@ -2369,7 +2369,7 @@ export const models = { */ CANDY: variants({ XNNPACK_INT8: STYLE_TRANSFER_CANDY_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(STYLE_TRANSFER_CANDY_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_CANDY_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_CANDY_VULKAN_FP16, @@ -2380,7 +2380,7 @@ export const models = { */ MOSAIC: variants({ XNNPACK_INT8: STYLE_TRANSFER_MOSAIC_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(STYLE_TRANSFER_MOSAIC_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_MOSAIC_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_MOSAIC_VULKAN_FP16, @@ -2391,7 +2391,7 @@ export const models = { */ RAIN_PRINCESS: variants({ XNNPACK_INT8: STYLE_TRANSFER_RAIN_PRINCESS_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(STYLE_TRANSFER_RAIN_PRINCESS_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_RAIN_PRINCESS_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_RAIN_PRINCESS_VULKAN_FP16, @@ -2402,7 +2402,7 @@ export const models = { */ UDNIE: variants({ XNNPACK_INT8: STYLE_TRANSFER_UDNIE_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(STYLE_TRANSFER_UDNIE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: STYLE_TRANSFER_UDNIE_COREML_FP16, VULKAN_FP16: STYLE_TRANSFER_UDNIE_VULKAN_FP16, @@ -2438,7 +2438,7 @@ export const models = { */ LRASPP_MOBILENET_V3_LARGE: variants({ XNNPACK_INT8: LRASPP_MOBILENET_V3_LARGE_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(LRASPP_MOBILENET_V3_LARGE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: LRASPP_MOBILENET_V3_LARGE_COREML_FP16, }), @@ -2449,7 +2449,7 @@ export const models = { */ DEEPLAB_V3_RESNET50: variants({ XNNPACK_INT8: DEEPLAB_V3_RESNET50_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(DEEPLAB_V3_RESNET50_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: DEEPLAB_V3_RESNET50_COREML_FP16, }), @@ -2460,7 +2460,7 @@ export const models = { */ DEEPLAB_V3_RESNET101: variants({ XNNPACK_INT8: DEEPLAB_V3_RESNET101_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(DEEPLAB_V3_RESNET101_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: DEEPLAB_V3_RESNET101_COREML_FP16, }), @@ -2473,7 +2473,7 @@ export const models = { // 300 VOC2012 val images against fp32's 69.13. DEEPLAB_V3_MOBILENET_V3_LARGE: variants({ XNNPACK_INT8: DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(DEEPLAB_V3_MOBILENET_V3_LARGE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: DEEPLAB_V3_MOBILENET_V3_LARGE_COREML_FP16, }), @@ -2483,7 +2483,7 @@ export const models = { */ FCN_RESNET50: variants({ XNNPACK_INT8: FCN_RESNET50_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(FCN_RESNET50_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FCN_RESNET50_COREML_FP16, }), @@ -2493,7 +2493,7 @@ export const models = { */ FCN_RESNET101: variants({ XNNPACK_INT8: FCN_RESNET101_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(FCN_RESNET101_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FCN_RESNET101_COREML_FP16, }), @@ -2519,7 +2519,7 @@ export const models = { */ RFDETR_NANO: variants({ XNNPACK_INT8: RFDETR_NANO_DETECTOR_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(RFDETR_NANO_DETECTOR_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: RFDETR_NANO_DETECTOR_COREML_FP16, VULKAN_FP16: RFDETR_NANO_DETECTOR_VULKAN_FP16, @@ -2538,21 +2538,21 @@ export const models = { NANO: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_NANO_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_NANO_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_384_COREML_FP16, VULKAN_FP16: YOLO26_NANO_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_NANO_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_NANO_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_512_COREML_FP16, VULKAN_FP16: YOLO26_NANO_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_NANO_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_NANO_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_640_COREML_FP16, VULKAN_FP16: YOLO26_NANO_640_VULKAN_FP16, @@ -2565,21 +2565,21 @@ export const models = { SMALL: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_SMALL_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_SMALL_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_384_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_SMALL_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_SMALL_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_512_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_SMALL_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_SMALL_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_640_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_640_VULKAN_FP16, @@ -2592,21 +2592,21 @@ export const models = { MEDIUM: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_MEDIUM_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_MEDIUM_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_384_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_MEDIUM_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_MEDIUM_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_512_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_MEDIUM_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_MEDIUM_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_640_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_640_VULKAN_FP16, @@ -2618,21 +2618,21 @@ export const models = { LARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_LARGE_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_LARGE_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_384_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_LARGE_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_LARGE_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_512_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_LARGE_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_LARGE_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_640_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_640_VULKAN_FP16, @@ -2645,21 +2645,21 @@ export const models = { XLARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_XLARGE_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_XLARGE_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_384_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_XLARGE_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_XLARGE_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_512_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_XLARGE_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_XLARGE_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_640_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_640_VULKAN_FP16, @@ -2701,21 +2701,21 @@ export const models = { YOLO26_POSE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_POSE_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_POSE_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_POSE_384_COREML_FP16, VULKAN_FP16: YOLO26_POSE_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_POSE_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_POSE_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_POSE_512_COREML_FP16, VULKAN_FP16: YOLO26_POSE_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_POSE_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_POSE_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_POSE_640_COREML_FP16, VULKAN_FP16: YOLO26_POSE_640_VULKAN_FP16, @@ -2728,7 +2728,7 @@ export const models = { RFDETR_KEYPOINT: variants( { XNNPACK_INT8: RFDETR_KEYPOINT_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(RFDETR_KEYPOINT_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: RFDETR_KEYPOINT_COREML_FP16, VULKAN_FP16: RFDETR_KEYPOINT_VULKAN_FP16, @@ -2753,7 +2753,7 @@ export const models = { */ S: variants({ XNNPACK_INT8: FASTSAM_S_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(FASTSAM_S_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FASTSAM_S_COREML_FP16, VULKAN_FP16: FASTSAM_S_VULKAN_FP16, @@ -2763,7 +2763,7 @@ export const models = { */ X: variants({ XNNPACK_INT8: FASTSAM_X_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(FASTSAM_X_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: FASTSAM_X_COREML_FP16, VULKAN_FP16: FASTSAM_X_VULKAN_FP16, @@ -2776,7 +2776,7 @@ export const models = { */ RFDETR_NANO: variants({ XNNPACK_INT8: RFDETR_NANO_SEG_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(RFDETR_NANO_SEG_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: RFDETR_NANO_SEG_COREML_FP16, VULKAN_FP16: RFDETR_NANO_SEG_VULKAN_FP16, @@ -2795,21 +2795,21 @@ export const models = { NANO: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_NANO_SEG_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_NANO_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_NANO_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_NANO_SEG_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_NANO_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_NANO_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_NANO_SEG_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_NANO_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_NANO_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_NANO_SEG_640_VULKAN_FP16, @@ -2822,21 +2822,21 @@ export const models = { SMALL: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_SMALL_SEG_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_SMALL_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_SMALL_SEG_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_SMALL_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_SMALL_SEG_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_SMALL_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_SMALL_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_SMALL_SEG_640_VULKAN_FP16, @@ -2849,21 +2849,21 @@ export const models = { MEDIUM: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_MEDIUM_SEG_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_MEDIUM_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_MEDIUM_SEG_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_MEDIUM_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_MEDIUM_SEG_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_MEDIUM_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_MEDIUM_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_MEDIUM_SEG_640_VULKAN_FP16, @@ -2876,21 +2876,21 @@ export const models = { LARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_LARGE_SEG_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_LARGE_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_LARGE_SEG_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_LARGE_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_LARGE_SEG_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_LARGE_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_LARGE_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_LARGE_SEG_640_VULKAN_FP16, @@ -2903,21 +2903,21 @@ export const models = { XLARGE: family({ SIZE_384: variants({ XNNPACK_INT8: YOLO26_XLARGE_SEG_384_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_XLARGE_SEG_384_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_SEG_384_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_SEG_384_VULKAN_FP16, }), SIZE_512: variants({ XNNPACK_INT8: YOLO26_XLARGE_SEG_512_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_XLARGE_SEG_512_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_SEG_512_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_SEG_512_VULKAN_FP16, }), SIZE_640: variants({ XNNPACK_INT8: YOLO26_XLARGE_SEG_640_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(YOLO26_XLARGE_SEG_640_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: YOLO26_XLARGE_SEG_640_COREML_FP16, VULKAN_FP16: YOLO26_XLARGE_SEG_640_VULKAN_FP16, @@ -2962,7 +2962,7 @@ export const models = { TINY: variants( { XNNPACK_INT8: WHISPER_TINY_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(WHISPER_TINY_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_TINY_COREML_FP16, MLX_BF16: WHISPER_TINY_MLX_BF16, @@ -2980,7 +2980,7 @@ export const models = { BASE: variants( { XNNPACK_INT8: WHISPER_BASE_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(WHISPER_BASE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_BASE_COREML_FP16, MLX_BF16: WHISPER_BASE_MLX_BF16, @@ -2998,7 +2998,7 @@ export const models = { SMALL: variants( { XNNPACK_INT8: WHISPER_SMALL_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(WHISPER_SMALL_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_SMALL_COREML_FP16, MLX_INT8: WHISPER_SMALL_MLX_INT8, @@ -3024,7 +3024,7 @@ export const models = { TINY: variants( { XNNPACK_INT8: WHISPER_TINY_EN_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(WHISPER_TINY_EN_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_TINY_EN_COREML_FP16, MLX_BF16: WHISPER_TINY_EN_MLX_BF16, @@ -3042,7 +3042,7 @@ export const models = { BASE: variants( { XNNPACK_INT8: WHISPER_BASE_EN_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(WHISPER_BASE_EN_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_BASE_EN_COREML_FP16, MLX_BF16: WHISPER_BASE_EN_MLX_BF16, @@ -3060,7 +3060,7 @@ export const models = { SMALL: variants( { XNNPACK_INT8: WHISPER_SMALL_EN_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(WHISPER_SMALL_EN_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: WHISPER_SMALL_EN_COREML_FP16, MLX_INT8: WHISPER_SMALL_EN_MLX_INT8, @@ -3100,7 +3100,7 @@ export const models = { */ LFM2_5_1_2B: variants({ XNNPACK_8DA4W: LFM2_5_1_2B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_FP16: deprecated(LFM2_5_1_2B_XNNPACK_FP16, 'XNNPACK_8DA4W'), MLX_INT4: LFM2_5_1_2B_MLX_INT4, }), @@ -3112,7 +3112,7 @@ export const models = { */ LFM2_5_350M: variants({ XNNPACK_8DA4W: LFM2_5_350M_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_FP16: deprecated(LFM2_5_350M_XNNPACK_FP16, 'XNNPACK_8DA4W'), MLX_INT4: LFM2_5_350M_MLX_INT4, }), @@ -3147,7 +3147,7 @@ export const models = { */ BIELIK_V3_1_5B: variants({ XNNPACK_8DA4W: BIELIK_V3_1_5B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_FP16: deprecated(BIELIK_V3_1_5B_XNNPACK_FP16, 'XNNPACK_8DA4W'), }), /** @@ -3159,7 +3159,7 @@ export const models = { */ LLAMA3_2_1B: variants({ XNNPACK_SPINQUANT: LLAMA3_2_1B_SPINQUANT, - /** @deprecated Use `XNNPACK_SPINQUANT`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_SPINQUANT`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(LLAMA3_2_1B_BF16, 'XNNPACK_SPINQUANT'), MLX_INT4: LLAMA3_2_1B_MLX_INT4, }), @@ -3171,7 +3171,7 @@ export const models = { */ LLAMA3_2_3B: variants({ XNNPACK_SPINQUANT: LLAMA3_2_3B_SPINQUANT, - /** @deprecated Use `XNNPACK_SPINQUANT`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_SPINQUANT`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(LLAMA3_2_3B_BF16, 'XNNPACK_SPINQUANT'), MLX_INT4: LLAMA3_2_3B_MLX_INT4, }), @@ -3212,7 +3212,7 @@ export const models = { */ HAMMER2_1_0_5B: variants({ XNNPACK_8DA4W: HAMMER2_1_0_5B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(HAMMER2_1_0_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: HAMMER2_1_0_5B_MLX_INT4, }), @@ -3223,7 +3223,7 @@ export const models = { */ HAMMER2_1_1_5B: variants({ XNNPACK_8DA4W: HAMMER2_1_1_5B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(HAMMER2_1_1_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: HAMMER2_1_1_5B_MLX_INT4, }), @@ -3235,7 +3235,7 @@ export const models = { */ HAMMER2_1_3B: variants({ XNNPACK_8DA4W: HAMMER2_1_3B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(HAMMER2_1_3B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: HAMMER2_1_3B_MLX_INT4, }), @@ -3247,7 +3247,7 @@ export const models = { */ PHI4_MINI: variants({ XNNPACK_8DA4W: PHI4_MINI_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(PHI4_MINI_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: PHI4_MINI_MLX_INT4, }), @@ -3259,7 +3259,7 @@ export const models = { */ QWEN2_5_0_5B: variants({ XNNPACK_8DA4W: QWEN2_5_0_5B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(QWEN2_5_0_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN2_5_0_5B_MLX_INT4, }), @@ -3271,7 +3271,7 @@ export const models = { */ QWEN2_5_1_5B: variants({ XNNPACK_8DA4W: QWEN2_5_1_5B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(QWEN2_5_1_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN2_5_1_5B_MLX_INT4, }), @@ -3282,7 +3282,7 @@ export const models = { */ QWEN2_5_3B: variants({ XNNPACK_8DA4W: QWEN2_5_3B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(QWEN2_5_3B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN2_5_3B_MLX_INT4, }), @@ -3294,7 +3294,7 @@ export const models = { */ QWEN3_0_6B: variants({ XNNPACK_8DA4W: QWEN3_0_6B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(QWEN3_0_6B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN3_0_6B_MLX_INT4, }), @@ -3305,7 +3305,7 @@ export const models = { */ QWEN3_1_7B: variants({ XNNPACK_8DA4W: QWEN3_1_7B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(QWEN3_1_7B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN3_1_7B_MLX_INT4, }), @@ -3317,7 +3317,7 @@ export const models = { */ QWEN3_4B: variants({ XNNPACK_8DA4W: QWEN3_4B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_BF16: deprecated(QWEN3_4B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN3_4B_MLX_INT4, }), @@ -3346,7 +3346,7 @@ export const models = { */ ALL_MINILM_L6_V2: variants({ XNNPACK_INT8: ALL_MINILM_L6_V2_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(ALL_MINILM_L6_V2_EMBEDDINGS, 'XNNPACK_INT8'), COREML_INT8: ALL_MINILM_L6_V2_COREML_INT8, COREML_FP16: ALL_MINILM_L6_V2_COREML_FP16, @@ -3359,7 +3359,7 @@ export const models = { ALL_MPNET_BASE_V2: variants({ XNNPACK_INT8: ALL_MPNET_BASE_V2_XNNPACK_INT8, XNNPACK_8DA4W: ALL_MPNET_BASE_V2_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(ALL_MPNET_BASE_V2_EMBEDDINGS, 'XNNPACK_INT8'), VULKAN_FP16: ALL_MPNET_BASE_V2_VULKAN_FP16, VULKAN_INT8: ALL_MPNET_BASE_V2_VULKAN_INT8, @@ -3370,7 +3370,7 @@ export const models = { */ MULTI_QA_MINILM_L6_COS_V1: variants({ XNNPACK_INT8: MULTI_QA_MINILM_L6_COS_V1_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(MULTI_QA_MINILM_L6_COS_V1_EMBEDDINGS, 'XNNPACK_INT8'), COREML_INT8: MULTI_QA_MINILM_L6_COS_V1_COREML_INT8, COREML_FP16: MULTI_QA_MINILM_L6_COS_V1_COREML_FP16, @@ -3383,7 +3383,7 @@ export const models = { MULTI_QA_MPNET_BASE_DOT_V1: variants({ XNNPACK_INT8: MULTI_QA_MPNET_BASE_DOT_V1_XNNPACK_INT8, XNNPACK_8DA4W: MULTI_QA_MPNET_BASE_DOT_V1_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(MULTI_QA_MPNET_BASE_DOT_V1_EMBEDDINGS, 'XNNPACK_INT8'), VULKAN_FP16: MULTI_QA_MPNET_BASE_DOT_V1_VULKAN_FP16, VULKAN_INT8: MULTI_QA_MPNET_BASE_DOT_V1_VULKAN_INT8, @@ -3394,7 +3394,7 @@ export const models = { */ PARAPHRASE_MULTILINGUAL_MINILM_L12_V2: variants({ XNNPACK_8DA4W: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_EMBEDDINGS, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_XNNPACK_FP32, 'XNNPACK_8DA4W'), COREML_INT8: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_COREML_INT8, COREML_FP16: PARAPHRASE_MULTILINGUAL_MINILM_L12_V2_COREML_FP16, @@ -3407,7 +3407,7 @@ export const models = { DISTILUSE_BASE_MULTILINGUAL_CASED_V2: variants( { XNNPACK_8DA4W: DISTILUSE_BASE_MULTILINGUAL_CASED_V2_EMBEDDINGS, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated( DISTILUSE_BASE_MULTILINGUAL_CASED_V2_XNNPACK_FP32, 'XNNPACK_8DA4W' @@ -3431,7 +3431,7 @@ export const models = { */ CLIP_VIT_BASE_PATCH32_TEXT: variants({ XNNPACK_INT8: CLIP_VIT_BASE_PATCH32_TEXT_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(CLIP_VIT_BASE_PATCH32_TEXT_EMBEDDINGS, 'XNNPACK_INT8'), COREML_INT8: CLIP_VIT_BASE_PATCH32_TEXT_COREML_INT8, COREML_FP16: CLIP_VIT_BASE_PATCH32_TEXT_COREML_FP16, @@ -3501,7 +3501,7 @@ export const models = { CLIP_VIT_BASE_PATCH32: variants( { XNNPACK_INT8: CLIP_VIT_BASE_PATCH32_IMAGE_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(CLIP_VIT_BASE_PATCH32_IMAGE_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: CLIP_VIT_BASE_PATCH32_IMAGE_COREML_FP16, MLX_INT8: CLIP_VIT_BASE_PATCH32_IMAGE_MLX_INT8, @@ -3524,7 +3524,7 @@ export const models = { */ SDXS_512_DREAMSHAPER: variants({ XNNPACK_INT8: SDXS_512_DREAMSHAPER_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(SDXS_512_DREAMSHAPER_XNNPACK_FP32, 'XNNPACK_INT8'), COREML_FP16: SDXS_512_DREAMSHAPER_COREML_FP16, VULKAN_FP16: SDXS_512_DREAMSHAPER_VULKAN_FP16, @@ -3543,7 +3543,7 @@ export const models = { */ SUPERTONIC: variants({ XNNPACK_INT8: SUPERTONIC_3_XNNPACK_INT8, - /** @deprecated Use `XNNPACK_INT8`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK_INT8`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(SUPERTONIC_3_XNNPACK_FP32, 'XNNPACK_INT8'), MLX_FP32: SUPERTONIC_3_MLX_FP32, VULKAN_FP16: SUPERTONIC_3_VULKAN_FP16, @@ -3616,7 +3616,7 @@ export const models = { */ PPOCRV6_SMALL: variants({ XNNPACK: PPOCRV6_SMALL_XNNPACK_INT8, - /** @deprecated Use `XNNPACK`. Removed in v0.12.0. */ + /** @deprecated Use `XNNPACK`. Removed in v1.0.0. */ XNNPACK_FP32: deprecated(PPOCRV6_SMALL_XNNPACK_FP32, 'XNNPACK'), COREML: PPOCRV6_SMALL_COREML_INT8, VULKAN: PPOCRV6_SMALL_VULKAN_FP16, @@ -3646,7 +3646,7 @@ function registerDeprecations(node: object, path: string): void { const replacement = REPLACEMENTS.get(value); if (replacement !== undefined) { const notice = - `${path}.${key} is deprecated and will be removed in v0.12.0. ` + + `${path}.${key} is deprecated and will be removed in v1.0.0. ` + `Use ${path}.${replacement}, which is faster and smaller.`; // A multi-file variant warns only for the files its replacement does not // reuse (Supertonic int8 keeps the fp32 duration predictor and text encoder). From 3b2ab03d96d8bfba7ee4396d6798d2239c9bcceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20S=C5=82uszniak?= Date: Wed, 21 Oct 2026 07:44:40 +0200 Subject: [PATCH 5/5] feat: remove bf16/fp16 XNNPACK LLM variants Move the deprecation helpers next to deprecated(). --- .../react-native-executorch/src/models.ts | 179 ++++-------------- 1 file changed, 35 insertions(+), 144 deletions(-) diff --git a/packages/react-native-executorch/src/models.ts b/packages/react-native-executorch/src/models.ts index 0687b7dfac..4f43e54d49 100644 --- a/packages/react-native-executorch/src/models.ts +++ b/packages/react-native-executorch/src/models.ts @@ -195,6 +195,41 @@ function deprecated< return config; } +/** + * The remote `.pte` URLs of a variant config. + * @param config A single-file (`modelPath`) or multi-file (`modelPaths`) config. + * @returns Its model URLs. + */ +function modelUrls(config: object): string[] { + if ('modelPath' in config) return [(config as { modelPath: string }).modelPath]; + return Object.values((config as { modelPaths: Record }).modelPaths); +} + +/** + * Registers the download warning of every variant marked {@link deprecated}. + * @param node A registry branch. + * @param path The branch's dotted path, starting at `models`. + */ +function registerDeprecations(node: object, path: string): void { + for (const [key, value] of Object.entries(node)) { + if (key === 'DEFAULT' || typeof value !== 'object' || value === null) continue; + const replacement = REPLACEMENTS.get(value); + if (replacement !== undefined) { + const notice = + `${path}.${key} is deprecated and will be removed in v1.0.0. ` + + `Use ${path}.${replacement}, which is faster and smaller.`; + // A multi-file variant warns only for the files its replacement does not + // reuse (Supertonic int8 keeps the fp32 duration predictor and text encoder). + const kept = new Set(modelUrls((node as Record)[replacement]!)); + for (const url of modelUrls(value)) { + if (!kept.has(url)) registerDeprecation(url, notice); + } + } else if (!('modelPath' in value) && !('modelPaths' in value)) { + registerDeprecations(value, `${path}.${key}`); + } + } +} + const BASE_URL = 'https://huggingface.co/software-mansion/react-native-executorch'; // Models resolve through VERSION_TAG, the latest published stable tag, unless // they have been re-exported for the next release, in which case their URL moves @@ -1975,11 +2010,6 @@ const LFM2_5_1_2B_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${LFM2_5_BASE_URL}/1_2b/tokenizer.json`, tokenizerConfigPath: `${LFM2_5_BASE_URL}/1_2b/tokenizer_config.json`, }; -const LFM2_5_1_2B_XNNPACK_FP16: LLMModel = { - modelPath: `${LFM2_5_BASE_URL}/1_2b/xnnpack/lfm_2_5_1_2b_xnnpack_fp16.pte`, - tokenizerPath: `${LFM2_5_BASE_URL}/1_2b/tokenizer.json`, - tokenizerConfigPath: `${LFM2_5_BASE_URL}/1_2b/tokenizer_config.json`, -}; const LFM2_5_1_2B_MLX_INT4: LLMModel = { modelPath: `${LFM2_5_BASE_URL}/1_2b/mlx/lfm_2_5_1_2b_mlx_int4.pte`, tokenizerPath: `${LFM2_5_BASE_URL}/1_2b/tokenizer.json`, @@ -1990,11 +2020,6 @@ const LFM2_5_350M_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${LFM2_5_BASE_URL}/350m/tokenizer.json`, tokenizerConfigPath: `${LFM2_5_BASE_URL}/350m/tokenizer_config.json`, }; -const LFM2_5_350M_XNNPACK_FP16: LLMModel = { - modelPath: `${LFM2_5_BASE_URL}/350m/xnnpack/lfm_2_5_350m_xnnpack_fp16.pte`, - tokenizerPath: `${LFM2_5_BASE_URL}/350m/tokenizer.json`, - tokenizerConfigPath: `${LFM2_5_BASE_URL}/350m/tokenizer_config.json`, -}; const LFM2_5_350M_MLX_INT4: LLMModel = { modelPath: `${LFM2_5_BASE_URL}/350m/mlx/lfm_2_5_350m_mlx_int4.pte`, tokenizerPath: `${LFM2_5_BASE_URL}/350m/tokenizer.json`, @@ -2069,11 +2094,6 @@ const BIELIK_V3_1_5B_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${BIELIK_V3_1_5B_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${BIELIK_V3_1_5B_BASE_URL}/tokenizer_config.json`, }; -const BIELIK_V3_1_5B_XNNPACK_FP16: LLMModel = { - modelPath: `${BIELIK_V3_1_5B_BASE_URL}/xnnpack/bielik_v3_0_1_5b_xnnpack_fp16.pte`, - tokenizerPath: `${BIELIK_V3_1_5B_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${BIELIK_V3_1_5B_BASE_URL}/tokenizer_config.json`, -}; const LLAMA3_2_BASE_URL = `${BASE_URL}-llama-3.2/${VERSION_TAG}`; @@ -2082,21 +2102,11 @@ const LLAMA3_2_3B_SPINQUANT: LLMModel = { tokenizerPath: `${LLAMA3_2_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${LLAMA3_2_BASE_URL}/tokenizer_config.json`, }; -const LLAMA3_2_3B_BF16: LLMModel = { - modelPath: `${LLAMA3_2_BASE_URL}/3b/xnnpack/llama_3_2_3b_xnnpack_bf16.pte`, - tokenizerPath: `${LLAMA3_2_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${LLAMA3_2_BASE_URL}/tokenizer_config.json`, -}; const LLAMA3_2_1B_SPINQUANT: LLMModel = { modelPath: `${LLAMA3_2_BASE_URL}/1b/xnnpack/llama_3_2_1b_xnnpack_spinquant.pte`, tokenizerPath: `${LLAMA3_2_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${LLAMA3_2_BASE_URL}/tokenizer_config.json`, }; -const LLAMA3_2_1B_BF16: LLMModel = { - modelPath: `${LLAMA3_2_BASE_URL}/1b/xnnpack/llama_3_2_1b_xnnpack_bf16.pte`, - tokenizerPath: `${LLAMA3_2_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${LLAMA3_2_BASE_URL}/tokenizer_config.json`, -}; const LLAMA3_2_1B_MLX_INT4: LLMModel = { modelPath: `${LLAMA3_2_BASE_URL}/1b/mlx/llama_3_2_1b_mlx_int4.pte`, tokenizerPath: `${LLAMA3_2_BASE_URL}/tokenizer.json`, @@ -2148,31 +2158,16 @@ const HAMMER2_1_0_5B_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, }; -const HAMMER2_1_0_5B_XNNPACK_BF16: LLMModel = { - modelPath: `${HAMMER2_1_BASE_URL}/0_5b/xnnpack/hammer_2_1_0_5b_xnnpack_bf16.pte`, - tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, -}; const HAMMER2_1_1_5B_XNNPACK_8DA4W: LLMModel = { modelPath: `${HAMMER2_1_BASE_URL}/1_5b/xnnpack/hammer_2_1_1_5b_xnnpack_8da4w.pte`, tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, }; -const HAMMER2_1_1_5B_XNNPACK_BF16: LLMModel = { - modelPath: `${HAMMER2_1_BASE_URL}/1_5b/xnnpack/hammer_2_1_1_5b_xnnpack_bf16.pte`, - tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, -}; const HAMMER2_1_3B_XNNPACK_8DA4W: LLMModel = { modelPath: `${HAMMER2_1_BASE_URL}/3b/xnnpack/hammer_2_1_3b_xnnpack_8da4w.pte`, tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, }; -const HAMMER2_1_3B_XNNPACK_BF16: LLMModel = { - modelPath: `${HAMMER2_1_BASE_URL}/3b/xnnpack/hammer_2_1_3b_xnnpack_bf16.pte`, - tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${HAMMER2_1_BASE_URL}/tokenizer_config.json`, -}; const HAMMER2_1_0_5B_MLX_INT4: LLMModel = { modelPath: `${HAMMER2_1_BASE_URL}/0_5b/mlx/hammer_2_1_0_5b_mlx_int4.pte`, tokenizerPath: `${HAMMER2_1_BASE_URL}/tokenizer.json`, @@ -2196,11 +2191,6 @@ const PHI4_MINI_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${PHI4_MINI_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${PHI4_MINI_BASE_URL}/tokenizer_config.json`, }; -const PHI4_MINI_XNNPACK_BF16: LLMModel = { - modelPath: `${PHI4_MINI_BASE_URL}/xnnpack/phi_4_mini_xnnpack_bf16.pte`, - tokenizerPath: `${PHI4_MINI_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${PHI4_MINI_BASE_URL}/tokenizer_config.json`, -}; const PHI4_MINI_MLX_INT4: LLMModel = { modelPath: `${PHI4_MINI_BASE_URL}/mlx/phi_4_mini_mlx_int4.pte`, tokenizerPath: `${PHI4_MINI_BASE_URL}/tokenizer.json`, @@ -2214,31 +2204,16 @@ const QWEN2_5_0_5B_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, }; -const QWEN2_5_0_5B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN2_5_BASE_URL}/0_5b/xnnpack/qwen_2_5_0_5b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, -}; const QWEN2_5_1_5B_XNNPACK_8DA4W: LLMModel = { modelPath: `${QWEN2_5_BASE_URL}/1_5b/xnnpack/qwen_2_5_1_5b_xnnpack_8da4w.pte`, tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, }; -const QWEN2_5_1_5B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN2_5_BASE_URL}/1_5b/xnnpack/qwen_2_5_1_5b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, -}; const QWEN2_5_3B_XNNPACK_8DA4W: LLMModel = { modelPath: `${QWEN2_5_BASE_URL}/3b/xnnpack/qwen_2_5_3b_xnnpack_8da4w.pte`, tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, }; -const QWEN2_5_3B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN2_5_BASE_URL}/3b/xnnpack/qwen_2_5_3b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN2_5_BASE_URL}/tokenizer_config.json`, -}; const QWEN2_5_0_5B_MLX_INT4: LLMModel = { modelPath: `${QWEN2_5_BASE_URL}/0_5b/mlx/qwen_2_5_0_5b_mlx_int4.pte`, tokenizerPath: `${QWEN2_5_BASE_URL}/tokenizer.json`, @@ -2280,31 +2255,16 @@ const QWEN3_0_6B_XNNPACK_8DA4W: LLMModel = { tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, }; -const QWEN3_0_6B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN3_BASE_URL}/0_6b/xnnpack/qwen_3_0_6b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, -}; const QWEN3_1_7B_XNNPACK_8DA4W: LLMModel = { modelPath: `${QWEN3_BASE_URL}/1_7b/xnnpack/qwen_3_1_7b_xnnpack_8da4w.pte`, tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, }; -const QWEN3_1_7B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN3_BASE_URL}/1_7b/xnnpack/qwen_3_1_7b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, -}; const QWEN3_4B_XNNPACK_8DA4W: LLMModel = { modelPath: `${QWEN3_BASE_URL}/4b/xnnpack/qwen_3_4b_xnnpack_8da4w.pte`, tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, }; -const QWEN3_4B_XNNPACK_BF16: LLMModel = { - modelPath: `${QWEN3_BASE_URL}/4b/xnnpack/qwen_3_4b_xnnpack_bf16.pte`, - tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, - tokenizerConfigPath: `${QWEN3_BASE_URL}/tokenizer_config.json`, -}; const QWEN3_0_6B_MLX_INT4: LLMModel = { modelPath: `${QWEN3_BASE_URL}/0_6b/mlx/qwen_3_0_6b_mlx_int4.pte`, tokenizerPath: `${QWEN3_BASE_URL}/tokenizer.json`, @@ -3086,10 +3046,6 @@ export const models = { * Generative Large Language Models (LLMs) for instruction following, chat, * text generation, and reasoning. */ - // Every bf16 and fp16 XNNPACK export is deprecated in favour of its 8da4w or - // SpinQuant sibling, which is 2-3.5x smaller. bf16 also misses XNNPACK's fast - // kernels: Qwen2.5 0.5B decodes at 0.5 tok/s against 27.1 for 8da4w on an S26 - // Ultra. fp16 decodes LFM2.5 350M 2.2x slower than 8da4w. llm: { /** * Liquid AI LFM 2.5 1.2B general-purpose hybrid language model. Built on @@ -3100,8 +3056,6 @@ export const models = { */ LFM2_5_1_2B: variants({ XNNPACK_8DA4W: LFM2_5_1_2B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_FP16: deprecated(LFM2_5_1_2B_XNNPACK_FP16, 'XNNPACK_8DA4W'), MLX_INT4: LFM2_5_1_2B_MLX_INT4, }), /** @@ -3112,8 +3066,6 @@ export const models = { */ LFM2_5_350M: variants({ XNNPACK_8DA4W: LFM2_5_350M_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_FP16: deprecated(LFM2_5_350M_XNNPACK_FP16, 'XNNPACK_8DA4W'), MLX_INT4: LFM2_5_350M_MLX_INT4, }), /** @@ -3147,8 +3099,6 @@ export const models = { */ BIELIK_V3_1_5B: variants({ XNNPACK_8DA4W: BIELIK_V3_1_5B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_FP16: deprecated(BIELIK_V3_1_5B_XNNPACK_FP16, 'XNNPACK_8DA4W'), }), /** * Meta Llama 3.2 1B lightweight instruction-tuned multilingual model. @@ -3159,8 +3109,6 @@ export const models = { */ LLAMA3_2_1B: variants({ XNNPACK_SPINQUANT: LLAMA3_2_1B_SPINQUANT, - /** @deprecated Use `XNNPACK_SPINQUANT`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(LLAMA3_2_1B_BF16, 'XNNPACK_SPINQUANT'), MLX_INT4: LLAMA3_2_1B_MLX_INT4, }), /** @@ -3171,8 +3119,6 @@ export const models = { */ LLAMA3_2_3B: variants({ XNNPACK_SPINQUANT: LLAMA3_2_3B_SPINQUANT, - /** @deprecated Use `XNNPACK_SPINQUANT`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(LLAMA3_2_3B_BF16, 'XNNPACK_SPINQUANT'), MLX_INT4: LLAMA3_2_3B_MLX_INT4, }), /** @@ -3212,8 +3158,6 @@ export const models = { */ HAMMER2_1_0_5B: variants({ XNNPACK_8DA4W: HAMMER2_1_0_5B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(HAMMER2_1_0_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: HAMMER2_1_0_5B_MLX_INT4, }), /** @@ -3223,8 +3167,6 @@ export const models = { */ HAMMER2_1_1_5B: variants({ XNNPACK_8DA4W: HAMMER2_1_1_5B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(HAMMER2_1_1_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: HAMMER2_1_1_5B_MLX_INT4, }), /** @@ -3235,8 +3177,6 @@ export const models = { */ HAMMER2_1_3B: variants({ XNNPACK_8DA4W: HAMMER2_1_3B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(HAMMER2_1_3B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: HAMMER2_1_3B_MLX_INT4, }), /** @@ -3247,8 +3187,6 @@ export const models = { */ PHI4_MINI: variants({ XNNPACK_8DA4W: PHI4_MINI_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(PHI4_MINI_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: PHI4_MINI_MLX_INT4, }), /** @@ -3259,8 +3197,6 @@ export const models = { */ QWEN2_5_0_5B: variants({ XNNPACK_8DA4W: QWEN2_5_0_5B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(QWEN2_5_0_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN2_5_0_5B_MLX_INT4, }), /** @@ -3271,8 +3207,6 @@ export const models = { */ QWEN2_5_1_5B: variants({ XNNPACK_8DA4W: QWEN2_5_1_5B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(QWEN2_5_1_5B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN2_5_1_5B_MLX_INT4, }), /** @@ -3282,8 +3216,6 @@ export const models = { */ QWEN2_5_3B: variants({ XNNPACK_8DA4W: QWEN2_5_3B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(QWEN2_5_3B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN2_5_3B_MLX_INT4, }), /** @@ -3294,8 +3226,6 @@ export const models = { */ QWEN3_0_6B: variants({ XNNPACK_8DA4W: QWEN3_0_6B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(QWEN3_0_6B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN3_0_6B_MLX_INT4, }), /** @@ -3305,8 +3235,6 @@ export const models = { */ QWEN3_1_7B: variants({ XNNPACK_8DA4W: QWEN3_1_7B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(QWEN3_1_7B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN3_1_7B_MLX_INT4, }), /** @@ -3317,8 +3245,6 @@ export const models = { */ QWEN3_4B: variants({ XNNPACK_8DA4W: QWEN3_4B_XNNPACK_8DA4W, - /** @deprecated Use `XNNPACK_8DA4W`. Removed in v1.0.0. */ - XNNPACK_BF16: deprecated(QWEN3_4B_XNNPACK_BF16, 'XNNPACK_8DA4W'), MLX_INT4: QWEN3_4B_MLX_INT4, }), /** @@ -3625,39 +3551,4 @@ export const models = { }, }; -/** - * The remote `.pte` URLs of a variant config. - * @param config A single-file (`modelPath`) or multi-file (`modelPaths`) config. - * @returns Its model URLs. - */ -function modelUrls(config: object): string[] { - if ('modelPath' in config) return [(config as { modelPath: string }).modelPath]; - return Object.values((config as { modelPaths: Record }).modelPaths); -} - -/** - * Registers the download warning of every variant marked {@link deprecated}. - * @param node A registry branch. - * @param path The branch's dotted path, starting at `models`. - */ -function registerDeprecations(node: object, path: string): void { - for (const [key, value] of Object.entries(node)) { - if (key === 'DEFAULT' || typeof value !== 'object' || value === null) continue; - const replacement = REPLACEMENTS.get(value); - if (replacement !== undefined) { - const notice = - `${path}.${key} is deprecated and will be removed in v1.0.0. ` + - `Use ${path}.${replacement}, which is faster and smaller.`; - // A multi-file variant warns only for the files its replacement does not - // reuse (Supertonic int8 keeps the fp32 duration predictor and text encoder). - const kept = new Set(modelUrls((node as Record)[replacement]!)); - for (const url of modelUrls(value)) { - if (!kept.has(url)) registerDeprecation(url, notice); - } - } else if (!('modelPath' in value) && !('modelPaths' in value)) { - registerDeprecations(value, `${path}.${key}`); - } - } -} - registerDeprecations(models, 'models');