@browser-ai/web-llm 2.0.4 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { LanguageModelV3, LanguageModelV3CallOptions, LanguageModelV3GenerateResult, LanguageModelV3StreamResult } from '@ai-sdk/provider';
1
+ import { LanguageModelV3, LanguageModelV3CallOptions, LanguageModelV3GenerateResult, LanguageModelV3StreamResult, EmbeddingModelV3, EmbeddingModelV3CallOptions, EmbeddingModelV3Result, ProviderV3 } from '@ai-sdk/provider';
2
2
  import { AppConfig, InitProgressReport, MLCEngineConfig, MLCEngineInterface } from '@mlc-ai/web-llm';
3
3
  export { InitProgressReport as WebLLMProgress, WebWorkerMLCEngineHandler } from '@mlc-ai/web-llm';
4
4
  import { UIMessage } from 'ai';
@@ -64,11 +64,22 @@ type Availability =
64
64
  | "downloading"
65
65
  | "available";
66
66
 
67
+ /**
68
+ * Callback type for receiving model download/initialization progress updates.
69
+ * @param progress - A value between 0 and 1 indicating completion.
70
+ */
71
+ type DownloadProgressCallback = (progress: number) => void;
72
+
67
73
  declare global {
68
74
  interface Navigator {
69
75
  gpu?: GPU;
70
76
  }
71
77
  }
78
+ /**
79
+ * Check if the browser supports WebLLM (WebGPU)
80
+ */
81
+ declare function doesBrowserSupportWebLLM(): boolean;
82
+
72
83
  type WebLLMModelId = string;
73
84
  interface WebLLMSettings {
74
85
  /**
@@ -91,11 +102,6 @@ interface WebLLMSettings {
91
102
  */
92
103
  worker?: Worker;
93
104
  }
94
- /**
95
- * Check if the browser supports WebGPU (required for WebLLM).
96
- * @returns boolean - true if WebGPU API is available
97
- */
98
- declare function doesBrowserSupportWebLLM(): boolean;
99
105
  declare class WebLLMLanguageModel implements LanguageModelV3 {
100
106
  readonly specificationVersion = "v3";
101
107
  readonly modelId: WebLLMModelId;
@@ -134,18 +140,18 @@ declare class WebLLMLanguageModel implements LanguageModelV3 {
134
140
  *
135
141
  * @example
136
142
  * ```typescript
137
- * const engine = await model.createSessionWithProgress(
143
+ * const model = await model.createSessionWithProgress(
138
144
  * (progress) => {
139
- * console.log(`Download progress: ${Math.round(progress.loaded * 100)}%`);
145
+ * console.log(`Download progress: ${Math.round(progress * 100)}%`);
140
146
  * }
141
147
  * );
142
148
  * ```
143
149
  *
144
- * @param onInitProgress Optional callback receiving progress reports during model download
145
- * @returns Promise resolving to a configured WebLLM engine
150
+ * @param onDownloadProgress Optional callback receiving progress values from 0 to 1
151
+ * @returns Promise resolving to the model instance
146
152
  * @throws {LoadSettingError} When WebLLM is not available or model is unavailable
147
153
  */
148
- createSessionWithProgress(onInitProgress?: (progress: InitProgressReport) => void): Promise<MLCEngineInterface>;
154
+ createSessionWithProgress(onDownloadProgress?: DownloadProgressCallback): Promise<WebLLMLanguageModel>;
149
155
  /**
150
156
  * Generates a streaming text response using WebLLM
151
157
  * @param options
@@ -156,11 +162,115 @@ declare class WebLLMLanguageModel implements LanguageModelV3 {
156
162
  doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult>;
157
163
  }
158
164
 
165
+ type WebLLMEmbeddingModelId = string;
166
+ interface WebLLMEmbeddingSettings {
167
+ /**
168
+ * Custom app configuration for WebLLM
169
+ */
170
+ appConfig?: AppConfig;
171
+ /**
172
+ * Progress callback for model initialization
173
+ */
174
+ initProgressCallback?: (progress: InitProgressReport) => void;
175
+ /**
176
+ * Engine configuration options
177
+ */
178
+ engineConfig?: MLCEngineConfig;
179
+ /**
180
+ * A web worker instance to run the model in.
181
+ * When provided, the model will run in a separate thread.
182
+ *
183
+ * @default undefined
184
+ */
185
+ worker?: Worker;
186
+ /**
187
+ * Maximum number of texts to embed in a single call.
188
+ * @default 100
189
+ */
190
+ maxEmbeddingsPerCall?: number;
191
+ }
192
+ declare class WebLLMEmbeddingModel implements EmbeddingModelV3 {
193
+ readonly specificationVersion = "v3";
194
+ readonly provider = "web-llm";
195
+ readonly modelId: WebLLMEmbeddingModelId;
196
+ readonly maxEmbeddingsPerCall: number;
197
+ readonly supportsParallelCalls = false;
198
+ private readonly config;
199
+ private engine?;
200
+ private isInitialized;
201
+ private initializationPromise?;
202
+ constructor(modelId: WebLLMEmbeddingModelId, options?: WebLLMEmbeddingSettings);
203
+ /**
204
+ * Check if the model is initialized and ready to use
205
+ */
206
+ get isModelInitialized(): boolean;
207
+ private getEngine;
208
+ private _initializeEngine;
209
+ /**
210
+ * Check the availability of the WebLLM embedding model
211
+ * @returns Promise resolving to "unavailable", "available", or "downloadable"
212
+ */
213
+ availability(): Promise<Availability>;
214
+ /**
215
+ * Creates an engine session with download progress monitoring.
216
+ *
217
+ * @example
218
+ * ```typescript
219
+ * const engine = await model.createSessionWithProgress(
220
+ * (progress) => {
221
+ * console.log(`Download progress: ${Math.round(progress.progress * 100)}%`);
222
+ * }
223
+ * );
224
+ * ```
225
+ *
226
+ * @param onInitProgress Optional callback receiving progress reports during model download
227
+ * @returns Promise resolving to a configured WebLLM engine
228
+ * @throws {LoadSettingError} When WebLLM isn't available or model is unavailable
229
+ */
230
+ createSessionWithProgress(onInitProgress?: (progress: InitProgressReport) => void): Promise<MLCEngineInterface>;
231
+ /**
232
+ * Embed texts using the WebLLM embedding model
233
+ */
234
+ doEmbed(options: EmbeddingModelV3CallOptions): Promise<EmbeddingModelV3Result>;
235
+ }
236
+
237
+ interface WebLLMProvider extends ProviderV3 {
238
+ (modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;
239
+ /**
240
+ * Creates a model for text generation.
241
+ */
242
+ languageModel(modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;
243
+ /**
244
+ * Creates a model for text generation.
245
+ */
246
+ chat(modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;
247
+ /**
248
+ * Creates a model for text embeddings.
249
+ */
250
+ embedding(modelId: WebLLMEmbeddingModelId, settings?: WebLLMEmbeddingSettings): EmbeddingModelV3;
251
+ /**
252
+ * Creates a model for text embeddings.
253
+ */
254
+ embeddingModel: (modelId: WebLLMEmbeddingModelId, settings?: WebLLMEmbeddingSettings) => EmbeddingModelV3;
255
+ }
159
256
  /**
160
- * Create a new WebLLMLanguageModel.
161
- * @param modelId The model ID to use (e.g., 'Llama-3.1-8B-Instruct-q4f32_1-MLC')
162
- * @param settings Options for the model
257
+ * Create a WebLLM provider instance.
258
+ */
259
+ declare function createWebLLM(): WebLLMProvider;
260
+ /**
261
+ * Default WebLLM provider instance
262
+ *
263
+ * @example
264
+ * ```typescript
265
+ * import { webLLM } from "@browser-ai/web-llm";
266
+ *
267
+ * // Language model
268
+ * const chat = webLLM("Llama-3.2-3B-Instruct-q4f16_1-MLC");
269
+ *
270
+ * // Embedding model
271
+ * const embed = webLLM.embeddingModel("snowflake-arctic-embed-m-q0f32-MLC-b32");
272
+ * ```
163
273
  */
164
- declare function webLLM(modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;
274
+ declare const webLLM: WebLLMProvider;
165
275
 
166
- export { WebLLMLanguageModel, type WebLLMModelId, type WebLLMSettings, type WebLLMUIMessage, doesBrowserSupportWebLLM, webLLM };
276
+ export { WebLLMEmbeddingModel, type WebLLMEmbeddingModelId, type WebLLMEmbeddingSettings, WebLLMLanguageModel, type WebLLMModelId, type WebLLMProvider, type WebLLMSettings, type WebLLMUIMessage, createWebLLM, doesBrowserSupportWebLLM, webLLM };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { LanguageModelV3, LanguageModelV3CallOptions, LanguageModelV3GenerateResult, LanguageModelV3StreamResult } from '@ai-sdk/provider';
1
+ import { LanguageModelV3, LanguageModelV3CallOptions, LanguageModelV3GenerateResult, LanguageModelV3StreamResult, EmbeddingModelV3, EmbeddingModelV3CallOptions, EmbeddingModelV3Result, ProviderV3 } from '@ai-sdk/provider';
2
2
  import { AppConfig, InitProgressReport, MLCEngineConfig, MLCEngineInterface } from '@mlc-ai/web-llm';
3
3
  export { InitProgressReport as WebLLMProgress, WebWorkerMLCEngineHandler } from '@mlc-ai/web-llm';
4
4
  import { UIMessage } from 'ai';
@@ -64,11 +64,22 @@ type Availability =
64
64
  | "downloading"
65
65
  | "available";
66
66
 
67
+ /**
68
+ * Callback type for receiving model download/initialization progress updates.
69
+ * @param progress - A value between 0 and 1 indicating completion.
70
+ */
71
+ type DownloadProgressCallback = (progress: number) => void;
72
+
67
73
  declare global {
68
74
  interface Navigator {
69
75
  gpu?: GPU;
70
76
  }
71
77
  }
78
+ /**
79
+ * Check if the browser supports WebLLM (WebGPU)
80
+ */
81
+ declare function doesBrowserSupportWebLLM(): boolean;
82
+
72
83
  type WebLLMModelId = string;
73
84
  interface WebLLMSettings {
74
85
  /**
@@ -91,11 +102,6 @@ interface WebLLMSettings {
91
102
  */
92
103
  worker?: Worker;
93
104
  }
94
- /**
95
- * Check if the browser supports WebGPU (required for WebLLM).
96
- * @returns boolean - true if WebGPU API is available
97
- */
98
- declare function doesBrowserSupportWebLLM(): boolean;
99
105
  declare class WebLLMLanguageModel implements LanguageModelV3 {
100
106
  readonly specificationVersion = "v3";
101
107
  readonly modelId: WebLLMModelId;
@@ -134,18 +140,18 @@ declare class WebLLMLanguageModel implements LanguageModelV3 {
134
140
  *
135
141
  * @example
136
142
  * ```typescript
137
- * const engine = await model.createSessionWithProgress(
143
+ * const model = await model.createSessionWithProgress(
138
144
  * (progress) => {
139
- * console.log(`Download progress: ${Math.round(progress.loaded * 100)}%`);
145
+ * console.log(`Download progress: ${Math.round(progress * 100)}%`);
140
146
  * }
141
147
  * );
142
148
  * ```
143
149
  *
144
- * @param onInitProgress Optional callback receiving progress reports during model download
145
- * @returns Promise resolving to a configured WebLLM engine
150
+ * @param onDownloadProgress Optional callback receiving progress values from 0 to 1
151
+ * @returns Promise resolving to the model instance
146
152
  * @throws {LoadSettingError} When WebLLM is not available or model is unavailable
147
153
  */
148
- createSessionWithProgress(onInitProgress?: (progress: InitProgressReport) => void): Promise<MLCEngineInterface>;
154
+ createSessionWithProgress(onDownloadProgress?: DownloadProgressCallback): Promise<WebLLMLanguageModel>;
149
155
  /**
150
156
  * Generates a streaming text response using WebLLM
151
157
  * @param options
@@ -156,11 +162,115 @@ declare class WebLLMLanguageModel implements LanguageModelV3 {
156
162
  doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult>;
157
163
  }
158
164
 
165
+ type WebLLMEmbeddingModelId = string;
166
+ interface WebLLMEmbeddingSettings {
167
+ /**
168
+ * Custom app configuration for WebLLM
169
+ */
170
+ appConfig?: AppConfig;
171
+ /**
172
+ * Progress callback for model initialization
173
+ */
174
+ initProgressCallback?: (progress: InitProgressReport) => void;
175
+ /**
176
+ * Engine configuration options
177
+ */
178
+ engineConfig?: MLCEngineConfig;
179
+ /**
180
+ * A web worker instance to run the model in.
181
+ * When provided, the model will run in a separate thread.
182
+ *
183
+ * @default undefined
184
+ */
185
+ worker?: Worker;
186
+ /**
187
+ * Maximum number of texts to embed in a single call.
188
+ * @default 100
189
+ */
190
+ maxEmbeddingsPerCall?: number;
191
+ }
192
+ declare class WebLLMEmbeddingModel implements EmbeddingModelV3 {
193
+ readonly specificationVersion = "v3";
194
+ readonly provider = "web-llm";
195
+ readonly modelId: WebLLMEmbeddingModelId;
196
+ readonly maxEmbeddingsPerCall: number;
197
+ readonly supportsParallelCalls = false;
198
+ private readonly config;
199
+ private engine?;
200
+ private isInitialized;
201
+ private initializationPromise?;
202
+ constructor(modelId: WebLLMEmbeddingModelId, options?: WebLLMEmbeddingSettings);
203
+ /**
204
+ * Check if the model is initialized and ready to use
205
+ */
206
+ get isModelInitialized(): boolean;
207
+ private getEngine;
208
+ private _initializeEngine;
209
+ /**
210
+ * Check the availability of the WebLLM embedding model
211
+ * @returns Promise resolving to "unavailable", "available", or "downloadable"
212
+ */
213
+ availability(): Promise<Availability>;
214
+ /**
215
+ * Creates an engine session with download progress monitoring.
216
+ *
217
+ * @example
218
+ * ```typescript
219
+ * const engine = await model.createSessionWithProgress(
220
+ * (progress) => {
221
+ * console.log(`Download progress: ${Math.round(progress.progress * 100)}%`);
222
+ * }
223
+ * );
224
+ * ```
225
+ *
226
+ * @param onInitProgress Optional callback receiving progress reports during model download
227
+ * @returns Promise resolving to a configured WebLLM engine
228
+ * @throws {LoadSettingError} When WebLLM isn't available or model is unavailable
229
+ */
230
+ createSessionWithProgress(onInitProgress?: (progress: InitProgressReport) => void): Promise<MLCEngineInterface>;
231
+ /**
232
+ * Embed texts using the WebLLM embedding model
233
+ */
234
+ doEmbed(options: EmbeddingModelV3CallOptions): Promise<EmbeddingModelV3Result>;
235
+ }
236
+
237
+ interface WebLLMProvider extends ProviderV3 {
238
+ (modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;
239
+ /**
240
+ * Creates a model for text generation.
241
+ */
242
+ languageModel(modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;
243
+ /**
244
+ * Creates a model for text generation.
245
+ */
246
+ chat(modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;
247
+ /**
248
+ * Creates a model for text embeddings.
249
+ */
250
+ embedding(modelId: WebLLMEmbeddingModelId, settings?: WebLLMEmbeddingSettings): EmbeddingModelV3;
251
+ /**
252
+ * Creates a model for text embeddings.
253
+ */
254
+ embeddingModel: (modelId: WebLLMEmbeddingModelId, settings?: WebLLMEmbeddingSettings) => EmbeddingModelV3;
255
+ }
159
256
  /**
160
- * Create a new WebLLMLanguageModel.
161
- * @param modelId The model ID to use (e.g., 'Llama-3.1-8B-Instruct-q4f32_1-MLC')
162
- * @param settings Options for the model
257
+ * Create a WebLLM provider instance.
258
+ */
259
+ declare function createWebLLM(): WebLLMProvider;
260
+ /**
261
+ * Default WebLLM provider instance
262
+ *
263
+ * @example
264
+ * ```typescript
265
+ * import { webLLM } from "@browser-ai/web-llm";
266
+ *
267
+ * // Language model
268
+ * const chat = webLLM("Llama-3.2-3B-Instruct-q4f16_1-MLC");
269
+ *
270
+ * // Embedding model
271
+ * const embed = webLLM.embeddingModel("snowflake-arctic-embed-m-q0f32-MLC-b32");
272
+ * ```
163
273
  */
164
- declare function webLLM(modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;
274
+ declare const webLLM: WebLLMProvider;
165
275
 
166
- export { WebLLMLanguageModel, type WebLLMModelId, type WebLLMSettings, type WebLLMUIMessage, doesBrowserSupportWebLLM, webLLM };
276
+ export { WebLLMEmbeddingModel, type WebLLMEmbeddingModelId, type WebLLMEmbeddingSettings, WebLLMLanguageModel, type WebLLMModelId, type WebLLMProvider, type WebLLMSettings, type WebLLMUIMessage, createWebLLM, doesBrowserSupportWebLLM, webLLM };
package/dist/index.js CHANGED
@@ -20,8 +20,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ WebLLMEmbeddingModel: () => WebLLMEmbeddingModel,
23
24
  WebLLMLanguageModel: () => WebLLMLanguageModel,
24
- WebWorkerMLCEngineHandler: () => import_web_llm2.WebWorkerMLCEngineHandler,
25
+ WebWorkerMLCEngineHandler: () => import_web_llm3.WebWorkerMLCEngineHandler,
26
+ createWebLLM: () => createWebLLM,
25
27
  doesBrowserSupportWebLLM: () => doesBrowserSupportWebLLM,
26
28
  webLLM: () => webLLM
27
29
  });
@@ -983,7 +985,7 @@ ${existingContent}` : "")
983
985
  ];
984
986
  }
985
987
 
986
- // src/web-llm-language-model.ts
988
+ // src/utils/browser.ts
987
989
  function isMobile() {
988
990
  if (typeof navigator === "undefined") return false;
989
991
  return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
@@ -1000,6 +1002,8 @@ function checkWebGPU() {
1000
1002
  function doesBrowserSupportWebLLM() {
1001
1003
  return checkWebGPU();
1002
1004
  }
1005
+
1006
+ // src/web-llm-language-model.ts
1003
1007
  function extractToolName(content) {
1004
1008
  const jsonMatch = content.match(/\{\s*"name"\s*:\s*"([^"]+)"/);
1005
1009
  if (jsonMatch) {
@@ -1372,19 +1376,23 @@ var WebLLMLanguageModel = class {
1372
1376
  *
1373
1377
  * @example
1374
1378
  * ```typescript
1375
- * const engine = await model.createSessionWithProgress(
1379
+ * const model = await model.createSessionWithProgress(
1376
1380
  * (progress) => {
1377
- * console.log(`Download progress: ${Math.round(progress.loaded * 100)}%`);
1381
+ * console.log(`Download progress: ${Math.round(progress * 100)}%`);
1378
1382
  * }
1379
1383
  * );
1380
1384
  * ```
1381
1385
  *
1382
- * @param onInitProgress Optional callback receiving progress reports during model download
1383
- * @returns Promise resolving to a configured WebLLM engine
1386
+ * @param onDownloadProgress Optional callback receiving progress values from 0 to 1
1387
+ * @returns Promise resolving to the model instance
1384
1388
  * @throws {LoadSettingError} When WebLLM is not available or model is unavailable
1385
1389
  */
1386
- async createSessionWithProgress(onInitProgress) {
1387
- return this.getEngine(void 0, onInitProgress);
1390
+ async createSessionWithProgress(onDownloadProgress) {
1391
+ const adaptedCallback = onDownloadProgress ? (report) => {
1392
+ onDownloadProgress(report.progress);
1393
+ } : void 0;
1394
+ await this.getEngine(void 0, adaptedCallback);
1395
+ return this;
1388
1396
  }
1389
1397
  /**
1390
1398
  * Generates a streaming text response using WebLLM
@@ -1710,17 +1718,211 @@ var WebLLMLanguageModel = class {
1710
1718
  }
1711
1719
  };
1712
1720
 
1713
- // src/index.ts
1721
+ // src/web-llm-embedding-model.ts
1714
1722
  var import_web_llm2 = require("@mlc-ai/web-llm");
1723
+ var WebLLMEmbeddingModel = class {
1724
+ constructor(modelId, options = {}) {
1725
+ this.specificationVersion = "v3";
1726
+ this.provider = "web-llm";
1727
+ this.supportsParallelCalls = false;
1728
+ this.isInitialized = false;
1729
+ this.modelId = modelId;
1730
+ this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall ?? 100;
1731
+ this.config = {
1732
+ provider: this.provider,
1733
+ modelId,
1734
+ options
1735
+ };
1736
+ }
1737
+ /**
1738
+ * Check if the model is initialized and ready to use
1739
+ */
1740
+ get isModelInitialized() {
1741
+ return this.isInitialized;
1742
+ }
1743
+ async getEngine(options, onInitProgress) {
1744
+ const availability = await this.availability();
1745
+ if (availability === "unavailable") {
1746
+ throw new LoadSettingError({
1747
+ message: "WebLLM is not available. This library requires a browser with WebGPU support."
1748
+ });
1749
+ }
1750
+ if (this.engine && this.isInitialized) return this.engine;
1751
+ if (this.initializationPromise) {
1752
+ await this.initializationPromise;
1753
+ if (this.engine) return this.engine;
1754
+ }
1755
+ this.initializationPromise = this._initializeEngine(
1756
+ options,
1757
+ onInitProgress
1758
+ );
1759
+ await this.initializationPromise;
1760
+ if (!this.engine) {
1761
+ throw new LoadSettingError({
1762
+ message: "Engine initialization failed"
1763
+ });
1764
+ }
1765
+ return this.engine;
1766
+ }
1767
+ async _initializeEngine(options, onInitProgress) {
1768
+ try {
1769
+ const engineConfig = {
1770
+ ...this.config.options.engineConfig,
1771
+ ...options,
1772
+ initProgressCallback: onInitProgress || this.config.options.initProgressCallback
1773
+ };
1774
+ if (this.config.options.worker) {
1775
+ this.engine = await (0, import_web_llm2.CreateWebWorkerMLCEngine)(
1776
+ this.config.options.worker,
1777
+ this.modelId,
1778
+ engineConfig
1779
+ );
1780
+ } else {
1781
+ this.engine = new import_web_llm2.MLCEngine(engineConfig);
1782
+ await this.engine.reload(this.modelId);
1783
+ }
1784
+ this.isInitialized = true;
1785
+ } catch (error) {
1786
+ this.engine = void 0;
1787
+ this.isInitialized = false;
1788
+ this.initializationPromise = void 0;
1789
+ throw new LoadSettingError({
1790
+ message: `Failed to initialize WebLLM embedding engine: ${error instanceof Error ? error.message : "Unknown error"}`
1791
+ });
1792
+ }
1793
+ }
1794
+ /**
1795
+ * Check the availability of the WebLLM embedding model
1796
+ * @returns Promise resolving to "unavailable", "available", or "downloadable"
1797
+ */
1798
+ async availability() {
1799
+ if (this.isInitialized) {
1800
+ return "available";
1801
+ }
1802
+ if (this.config.options.worker && isMobile()) {
1803
+ return "downloadable";
1804
+ }
1805
+ const supported = checkWebGPU();
1806
+ return supported ? "downloadable" : "unavailable";
1807
+ }
1808
+ /**
1809
+ * Creates an engine session with download progress monitoring.
1810
+ *
1811
+ * @example
1812
+ * ```typescript
1813
+ * const engine = await model.createSessionWithProgress(
1814
+ * (progress) => {
1815
+ * console.log(`Download progress: ${Math.round(progress.progress * 100)}%`);
1816
+ * }
1817
+ * );
1818
+ * ```
1819
+ *
1820
+ * @param onInitProgress Optional callback receiving progress reports during model download
1821
+ * @returns Promise resolving to a configured WebLLM engine
1822
+ * @throws {LoadSettingError} When WebLLM isn't available or model is unavailable
1823
+ */
1824
+ async createSessionWithProgress(onInitProgress) {
1825
+ return this.getEngine(void 0, onInitProgress);
1826
+ }
1827
+ /**
1828
+ * Embed texts using the WebLLM embedding model
1829
+ */
1830
+ async doEmbed(options) {
1831
+ const { values, abortSignal } = options;
1832
+ if (values.length > this.maxEmbeddingsPerCall) {
1833
+ throw new TooManyEmbeddingValuesForCallError({
1834
+ provider: this.provider,
1835
+ modelId: this.modelId,
1836
+ maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,
1837
+ values
1838
+ });
1839
+ }
1840
+ if (abortSignal?.aborted) {
1841
+ throw new Error("Operation was aborted");
1842
+ }
1843
+ const engine = await this.getEngine();
1844
+ const abortHandler = () => {
1845
+ engine.interruptGenerate();
1846
+ };
1847
+ if (abortSignal) {
1848
+ abortSignal.addEventListener("abort", abortHandler);
1849
+ }
1850
+ try {
1851
+ const response = await engine.embeddings.create({
1852
+ input: values,
1853
+ model: this.modelId,
1854
+ ...abortSignal && !this.config.options.worker && { signal: abortSignal }
1855
+ });
1856
+ const sortedEmbeddings = response.data.sort((a, b) => a.index - b.index).map((e) => e.embedding);
1857
+ return {
1858
+ embeddings: sortedEmbeddings,
1859
+ usage: {
1860
+ tokens: response.usage.total_tokens
1861
+ },
1862
+ providerMetadata: {
1863
+ webllm: {
1864
+ model: response.model,
1865
+ promptTokens: response.usage.prompt_tokens,
1866
+ totalTokens: response.usage.total_tokens,
1867
+ prefillTokensPerSecond: response.usage.extra?.prefill_tokens_per_s
1868
+ }
1869
+ },
1870
+ warnings: []
1871
+ };
1872
+ } catch (error) {
1873
+ throw new Error(
1874
+ `WebLLM embedding failed: ${error instanceof Error ? error.message : "Unknown error"}`
1875
+ );
1876
+ } finally {
1877
+ if (abortSignal) {
1878
+ abortSignal.removeEventListener("abort", abortHandler);
1879
+ }
1880
+ }
1881
+ }
1882
+ };
1883
+
1884
+ // src/index.ts
1885
+ var import_web_llm3 = require("@mlc-ai/web-llm");
1715
1886
 
1716
1887
  // src/web-llm-provider.ts
1717
- function webLLM(modelId, settings) {
1718
- return new WebLLMLanguageModel(modelId, settings);
1888
+ function createWebLLM() {
1889
+ const createLanguageModel = (modelId, settings) => {
1890
+ return new WebLLMLanguageModel(modelId, settings);
1891
+ };
1892
+ const createEmbeddingModel = (modelId, settings) => {
1893
+ return new WebLLMEmbeddingModel(modelId, settings);
1894
+ };
1895
+ const provider = function(modelId, settings) {
1896
+ if (new.target) {
1897
+ throw new Error(
1898
+ "The WebLLM model function cannot be called with the new keyword."
1899
+ );
1900
+ }
1901
+ return createLanguageModel(modelId, settings);
1902
+ };
1903
+ provider.specificationVersion = "v3";
1904
+ provider.languageModel = createLanguageModel;
1905
+ provider.chat = createLanguageModel;
1906
+ provider.embedding = createEmbeddingModel;
1907
+ provider.embeddingModel = createEmbeddingModel;
1908
+ provider.imageModel = (modelId) => {
1909
+ throw new NoSuchModelError({ modelId, modelType: "imageModel" });
1910
+ };
1911
+ provider.speechModel = (modelId) => {
1912
+ throw new NoSuchModelError({ modelId, modelType: "speechModel" });
1913
+ };
1914
+ provider.transcriptionModel = (modelId) => {
1915
+ throw new NoSuchModelError({ modelId, modelType: "transcriptionModel" });
1916
+ };
1917
+ return provider;
1719
1918
  }
1919
+ var webLLM = createWebLLM();
1720
1920
  // Annotate the CommonJS export names for ESM import in node:
1721
1921
  0 && (module.exports = {
1922
+ WebLLMEmbeddingModel,
1722
1923
  WebLLMLanguageModel,
1723
1924
  WebWorkerMLCEngineHandler,
1925
+ createWebLLM,
1724
1926
  doesBrowserSupportWebLLM,
1725
1927
  webLLM
1726
1928
  });