@mastra/fastembed 0.10.7-alpha.0 → 1.0.0-beta.0

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/CHANGELOG.md CHANGED
@@ -1,16 +1,14 @@
1
1
  # @mastra/fastembed
2
2
 
3
- ## 0.10.7-alpha.0
3
+ ## 1.0.0-beta.0
4
4
 
5
- ### Patch Changes
6
-
7
- - update peerdeps ([`5ca1cca`](https://github.com/mastra-ai/mastra/commit/5ca1ccac61ffa7141e6d9fa8f22d3ad4d03bf5dc))
5
+ ### Major Changes
8
6
 
9
- ## 0.10.6
7
+ - Bump minimum required Node.js version to 22.13.0 ([#9706](https://github.com/mastra-ai/mastra/pull/9706))
10
8
 
11
- ### Patch Changes
9
+ - Upgraded to AI SDK v5 (specification version v2) for compatibility with @mastra/core. Default exports now use v2 specification. Legacy v1 exports available for backwards compatibility via `fastembed.smallLegacy` and `fastembed.baseLegacy`. ([#9349](https://github.com/mastra-ai/mastra/pull/9349))
12
10
 
13
- - Fix peerdependencies ([`eb7c1c8`](https://github.com/mastra-ai/mastra/commit/eb7c1c8c592d8fb16dfd250e337d9cdc73c8d5de))
11
+ - Mark as stable ([`83d5942`](https://github.com/mastra-ai/mastra/commit/83d5942669ce7bba4a6ca4fd4da697a10eb5ebdc))
14
12
 
15
13
  ## 0.10.5
16
14
 
package/README.md CHANGED
@@ -10,19 +10,58 @@ This package provides a FastEmbed embedding model integration for use with Mastr
10
10
  pnpm add @mastra/fastembed
11
11
  ```
12
12
 
13
+ ## AI SDK v2 Compatibility
14
+
15
+ This package supports AI SDK v5 (specification version v2). The default exports use v2, which is compatible with `@mastra/core` and AI SDK v5.
16
+
17
+ **Breaking Change:** Previous versions used AI SDK specification v1. If you need v1 compatibility for legacy code, use the `Legacy` exports.
18
+
13
19
  ## Usage
14
20
 
21
+ ### Default (AI SDK v2)
22
+
15
23
  ```typescript
16
24
  import { Memory } from '@mastra/memory';
17
25
  import { fastembed } from '@mastra/fastembed';
18
26
 
19
27
  const memory = new Memory({
20
28
  // ... other memory options
21
- embedder: fastembed,
29
+ embedder: fastembed, // Uses v2 specification
22
30
  });
23
31
 
24
32
  // Now you can use this memory instance with an Agent
25
33
  // const agent = new Agent({ memory, ... });
26
34
  ```
27
35
 
36
+ ### Available Models
37
+
38
+ ```typescript
39
+ import { fastembed } from '@mastra/fastembed';
40
+
41
+ // Default export (bge-small-en-v1.5 with v2 spec)
42
+ const embedder = fastembed;
43
+
44
+ // Named exports for v2 models
45
+ const small = fastembed.small; // bge-small-en-v1.5
46
+ const base = fastembed.base; // bge-base-en-v1.5
47
+
48
+ // Legacy v1 models (for backwards compatibility)
49
+ const smallLegacy = fastembed.smallLegacy; // bge-small-en-v1.5 (v1 spec)
50
+ const baseLegacy = fastembed.baseLegacy; // bge-base-en-v1.5 (v1 spec)
51
+ ```
52
+
53
+ ### Direct Usage with AI SDK v5
54
+
55
+ ```typescript
56
+ import { embed } from 'ai';
57
+ import { fastembed } from '@mastra/fastembed';
58
+
59
+ const result = await embed({
60
+ model: fastembed,
61
+ value: 'Text to embed',
62
+ });
63
+
64
+ console.log(result.embedding); // number[]
65
+ ```
66
+
28
67
  This package wraps the `fastembed-js` library to provide an embedding model compatible with the AI SDK and Mastra.
package/dist/index.cjs CHANGED
@@ -4,6 +4,7 @@ var fsp = require('fs/promises');
4
4
  var os = require('os');
5
5
  var path = require('path');
6
6
  var ai = require('ai');
7
+ var aiV4 = require('ai-v4');
7
8
  var fastembed$1 = require('fastembed');
8
9
 
9
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -33,7 +34,7 @@ async function generateEmbeddings(values, modelType) {
33
34
  embeddings: allResults
34
35
  };
35
36
  }
36
- var fastEmbedProvider = ai.experimental_customProvider({
37
+ var fastEmbedLegacyProvider = aiV4.experimental_customProvider({
37
38
  textEmbeddingModels: {
38
39
  "bge-small-en-v1.5": {
39
40
  specificationVersion: "v1",
@@ -57,9 +58,35 @@ var fastEmbedProvider = ai.experimental_customProvider({
57
58
  }
58
59
  }
59
60
  });
61
+ var fastEmbedProvider = ai.customProvider({
62
+ textEmbeddingModels: {
63
+ "bge-small-en-v1.5": {
64
+ specificationVersion: "v2",
65
+ provider: "fastembed",
66
+ modelId: "bge-small-en-v1.5",
67
+ maxEmbeddingsPerCall: 256,
68
+ supportsParallelCalls: true,
69
+ async doEmbed({ values }) {
70
+ return generateEmbeddings(values, "BGESmallENV15");
71
+ }
72
+ },
73
+ "bge-base-en-v1.5": {
74
+ specificationVersion: "v2",
75
+ provider: "fastembed",
76
+ modelId: "bge-base-en-v1.5",
77
+ maxEmbeddingsPerCall: 256,
78
+ supportsParallelCalls: true,
79
+ async doEmbed({ values }) {
80
+ return generateEmbeddings(values, "BGEBaseENV15");
81
+ }
82
+ }
83
+ }
84
+ });
60
85
  var fastembed = Object.assign(fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`), {
61
86
  small: fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`),
62
- base: fastEmbedProvider.textEmbeddingModel(`bge-base-en-v1.5`)
87
+ base: fastEmbedProvider.textEmbeddingModel(`bge-base-en-v1.5`),
88
+ smallLegacy: fastEmbedLegacyProvider.textEmbeddingModel(`bge-small-en-v1.5`),
89
+ baseLegacy: fastEmbedLegacyProvider.textEmbeddingModel(`bge-base-en-v1.5`)
63
90
  });
64
91
 
65
92
  exports.fastembed = fastembed;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["path","os","fsp","FlagEmbedding","EmbeddingModel","experimental_customProvider"],"mappings":";;;;;;;;;;;;;;;AAMA,eAAe,iBAAA,GAAoB;AACjC,EAAA,MAAM,SAAA,GAAYA,sBAAK,IAAA,CAAKC,mBAAA,CAAG,SAAQ,EAAG,QAAA,EAAU,UAAU,kBAAkB,CAAA;AAChF,EAAA,MAAMC,qBAAI,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,EAAA,OAAO,SAAA;AACT;AAGA,eAAe,kBAAA,CAAmB,QAAkB,SAAA,EAA6C;AAC/F,EAAA,MAAM,KAAA,GAAQ,MAAMC,yBAAA,CAAc,IAAA,CAAK;AAAA,IACrC,KAAA,EAAOC,2BAAe,SAAS,CAAA;AAAA,IAC/B,QAAA,EAAU,MAAM,iBAAA;AAAkB,GACnC,CAAA;AAGD,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAErC,EAAA,MAAM,aAAa,EAAC;AACpB,EAAA,WAAA,MAAiB,UAAU,UAAA,EAAY;AAGrC,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,MAAA,CAAO,GAAA,CAAI,eAAa,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAC,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,WAAW,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAEtE,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,GACd;AACF;AAEA,IAAM,oBAAoBC,8BAAA,CAA4B;AAAA,EACpD,mBAAA,EAAqB;AAAA,IACnB,mBAAA,EAAqB;AAAA,MACnB,oBAAA,EAAsB,IAAA;AAAA,MACtB,QAAA,EAAU,WAAA;AAAA,MACV,OAAA,EAAS,mBAAA;AAAA,MACT,oBAAA,EAAsB,GAAA;AAAA,MACtB,qBAAA,EAAuB,IAAA;AAAA,MACvB,MAAM,OAAA,CAAQ,EAAE,MAAA,EAAO,EAAG;AACxB,QAAA,OAAO,kBAAA,CAAmB,QAAQ,eAAe,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,IACA,kBAAA,EAAoB;AAAA,MAClB,oBAAA,EAAsB,IAAA;AAAA,MACtB,QAAA,EAAU,WAAA;AAAA,MACV,OAAA,EAAS,kBAAA;AAAA,MACT,oBAAA,EAAsB,GAAA;AAAA,MACtB,qBAAA,EAAuB,IAAA;AAAA,MACvB,MAAM,OAAA,CAAQ,EAAE,MAAA,EAAO,EAAG;AACxB,QAAA,OAAO,kBAAA,CAAmB,QAAQ,cAAc,CAAA;AAAA,MAClD;AAAA;AACF;AAEJ,CAAC,CAAA;AAEM,IAAM,YAAY,MAAA,CAAO,MAAA,CAAO,iBAAA,CAAkB,kBAAA,CAAmB,mBAAmB,CAAA,EAAG;AAAA,EAChG,KAAA,EAAO,iBAAA,CAAkB,kBAAA,CAAmB,CAAA,iBAAA,CAAmB,CAAA;AAAA,EAC/D,IAAA,EAAM,iBAAA,CAAkB,kBAAA,CAAmB,CAAA,gBAAA,CAAkB;AAC/D,CAAC","file":"index.cjs","sourcesContent":["import fsp from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { experimental_customProvider } from 'ai';\nimport { FlagEmbedding, EmbeddingModel } from 'fastembed';\n\nasync function getModelCachePath() {\n const cachePath = path.join(os.homedir(), '.cache', 'mastra', 'fastembed-models');\n await fsp.mkdir(cachePath, { recursive: true });\n return cachePath;\n}\n\n// Shared function to generate embeddings using fastembed\nasync function generateEmbeddings(values: string[], modelType: 'BGESmallENV15' | 'BGEBaseENV15') {\n const model = await FlagEmbedding.init({\n model: EmbeddingModel[modelType],\n cacheDir: await getModelCachePath(),\n });\n\n // model.embed() returns an AsyncGenerator that processes texts in batches (default size 256)\n const embeddings = model.embed(values);\n\n const allResults = [];\n for await (const result of embeddings) {\n // result is an array of embeddings, one for each text in the batch\n // We convert each Float32Array embedding to a regular number array\n allResults.push(...result.map(embedding => Array.from(embedding)));\n }\n\n if (allResults.length === 0) throw new Error('No embeddings generated');\n\n return {\n embeddings: allResults,\n };\n}\n\nconst fastEmbedProvider = experimental_customProvider({\n textEmbeddingModels: {\n 'bge-small-en-v1.5': {\n specificationVersion: 'v1',\n provider: 'fastembed',\n modelId: 'bge-small-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGESmallENV15');\n },\n },\n 'bge-base-en-v1.5': {\n specificationVersion: 'v1',\n provider: 'fastembed',\n modelId: 'bge-base-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGEBaseENV15');\n },\n },\n },\n});\n\nexport const fastembed = Object.assign(fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`), {\n small: fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`),\n base: fastEmbedProvider.textEmbeddingModel(`bge-base-en-v1.5`),\n});\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["path","os","fsp","FlagEmbedding","EmbeddingModel","experimental_customProvider","customProvider"],"mappings":"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","file":"index.cjs","sourcesContent":["import fsp from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { customProvider } from 'ai';\nimport { experimental_customProvider } from 'ai-v4';\nimport { FlagEmbedding, EmbeddingModel } from 'fastembed';\n\nasync function getModelCachePath() {\n const cachePath = path.join(os.homedir(), '.cache', 'mastra', 'fastembed-models');\n await fsp.mkdir(cachePath, { recursive: true });\n return cachePath;\n}\n\n// Shared function to generate embeddings using fastembed\nasync function generateEmbeddings(values: string[], modelType: 'BGESmallENV15' | 'BGEBaseENV15') {\n const model = await FlagEmbedding.init({\n model: EmbeddingModel[modelType],\n cacheDir: await getModelCachePath(),\n });\n\n // model.embed() returns an AsyncGenerator that processes texts in batches (default size 256)\n const embeddings = model.embed(values);\n\n const allResults = [];\n for await (const result of embeddings) {\n // result is an array of embeddings, one for each text in the batch\n // We convert each Float32Array embedding to a regular number array\n allResults.push(...result.map(embedding => Array.from(embedding)));\n }\n\n if (allResults.length === 0) throw new Error('No embeddings generated');\n\n return {\n embeddings: allResults,\n };\n}\n\n// Legacy v1 provider for backwards compatibility\nconst fastEmbedLegacyProvider = experimental_customProvider({\n textEmbeddingModels: {\n 'bge-small-en-v1.5': {\n specificationVersion: 'v1',\n provider: 'fastembed',\n modelId: 'bge-small-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGESmallENV15');\n },\n },\n 'bge-base-en-v1.5': {\n specificationVersion: 'v1',\n provider: 'fastembed',\n modelId: 'bge-base-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGEBaseENV15');\n },\n },\n },\n});\n\n// V2 provider for AI SDK v5 compatibility\nconst fastEmbedProvider = customProvider({\n textEmbeddingModels: {\n 'bge-small-en-v1.5': {\n specificationVersion: 'v2',\n provider: 'fastembed',\n modelId: 'bge-small-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGESmallENV15');\n },\n },\n 'bge-base-en-v1.5': {\n specificationVersion: 'v2',\n provider: 'fastembed',\n modelId: 'bge-base-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGEBaseENV15');\n },\n },\n },\n});\n\nexport const fastembed = Object.assign(fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`), {\n small: fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`),\n base: fastEmbedProvider.textEmbeddingModel(`bge-base-en-v1.5`),\n smallLegacy: fastEmbedLegacyProvider.textEmbeddingModel(`bge-small-en-v1.5`),\n baseLegacy: fastEmbedLegacyProvider.textEmbeddingModel(`bge-base-en-v1.5`),\n});\n"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- export declare const fastembed: import("ai").EmbeddingModel<string> & {
2
- small: import("ai").EmbeddingModel<string>;
3
- base: import("ai").EmbeddingModel<string>;
1
+ export declare const fastembed: import("@ai-sdk/provider").EmbeddingModelV2<string> & {
2
+ small: import("@ai-sdk/provider").EmbeddingModelV2<string>;
3
+ base: import("@ai-sdk/provider").EmbeddingModelV2<string>;
4
+ smallLegacy: import("ai-v4").EmbeddingModel<string>;
5
+ baseLegacy: import("ai-v4").EmbeddingModel<string>;
4
6
  };
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6DA,eAAO,MAAM,SAAS;;;CAGpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAyFA,eAAO,MAAM,SAAS;;;;;CAKpB,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import fsp from 'fs/promises';
2
2
  import os from 'os';
3
3
  import path from 'path';
4
- import { experimental_customProvider } from 'ai';
4
+ import { customProvider } from 'ai';
5
+ import { experimental_customProvider } from 'ai-v4';
5
6
  import { FlagEmbedding, EmbeddingModel } from 'fastembed';
6
7
 
7
8
  // src/index.ts
@@ -25,7 +26,7 @@ async function generateEmbeddings(values, modelType) {
25
26
  embeddings: allResults
26
27
  };
27
28
  }
28
- var fastEmbedProvider = experimental_customProvider({
29
+ var fastEmbedLegacyProvider = experimental_customProvider({
29
30
  textEmbeddingModels: {
30
31
  "bge-small-en-v1.5": {
31
32
  specificationVersion: "v1",
@@ -49,9 +50,35 @@ var fastEmbedProvider = experimental_customProvider({
49
50
  }
50
51
  }
51
52
  });
53
+ var fastEmbedProvider = customProvider({
54
+ textEmbeddingModels: {
55
+ "bge-small-en-v1.5": {
56
+ specificationVersion: "v2",
57
+ provider: "fastembed",
58
+ modelId: "bge-small-en-v1.5",
59
+ maxEmbeddingsPerCall: 256,
60
+ supportsParallelCalls: true,
61
+ async doEmbed({ values }) {
62
+ return generateEmbeddings(values, "BGESmallENV15");
63
+ }
64
+ },
65
+ "bge-base-en-v1.5": {
66
+ specificationVersion: "v2",
67
+ provider: "fastembed",
68
+ modelId: "bge-base-en-v1.5",
69
+ maxEmbeddingsPerCall: 256,
70
+ supportsParallelCalls: true,
71
+ async doEmbed({ values }) {
72
+ return generateEmbeddings(values, "BGEBaseENV15");
73
+ }
74
+ }
75
+ }
76
+ });
52
77
  var fastembed = Object.assign(fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`), {
53
78
  small: fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`),
54
- base: fastEmbedProvider.textEmbeddingModel(`bge-base-en-v1.5`)
79
+ base: fastEmbedProvider.textEmbeddingModel(`bge-base-en-v1.5`),
80
+ smallLegacy: fastEmbedLegacyProvider.textEmbeddingModel(`bge-small-en-v1.5`),
81
+ baseLegacy: fastEmbedLegacyProvider.textEmbeddingModel(`bge-base-en-v1.5`)
55
82
  });
56
83
 
57
84
  export { fastembed };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;AAMA,eAAe,iBAAA,GAAoB;AACjC,EAAA,MAAM,SAAA,GAAY,KAAK,IAAA,CAAK,EAAA,CAAG,SAAQ,EAAG,QAAA,EAAU,UAAU,kBAAkB,CAAA;AAChF,EAAA,MAAM,IAAI,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,EAAA,OAAO,SAAA;AACT;AAGA,eAAe,kBAAA,CAAmB,QAAkB,SAAA,EAA6C;AAC/F,EAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,IAAA,CAAK;AAAA,IACrC,KAAA,EAAO,eAAe,SAAS,CAAA;AAAA,IAC/B,QAAA,EAAU,MAAM,iBAAA;AAAkB,GACnC,CAAA;AAGD,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAErC,EAAA,MAAM,aAAa,EAAC;AACpB,EAAA,WAAA,MAAiB,UAAU,UAAA,EAAY;AAGrC,IAAA,UAAA,CAAW,IAAA,CAAK,GAAG,MAAA,CAAO,GAAA,CAAI,eAAa,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAC,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,WAAW,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAEtE,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,GACd;AACF;AAEA,IAAM,oBAAoB,2BAAA,CAA4B;AAAA,EACpD,mBAAA,EAAqB;AAAA,IACnB,mBAAA,EAAqB;AAAA,MACnB,oBAAA,EAAsB,IAAA;AAAA,MACtB,QAAA,EAAU,WAAA;AAAA,MACV,OAAA,EAAS,mBAAA;AAAA,MACT,oBAAA,EAAsB,GAAA;AAAA,MACtB,qBAAA,EAAuB,IAAA;AAAA,MACvB,MAAM,OAAA,CAAQ,EAAE,MAAA,EAAO,EAAG;AACxB,QAAA,OAAO,kBAAA,CAAmB,QAAQ,eAAe,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,IACA,kBAAA,EAAoB;AAAA,MAClB,oBAAA,EAAsB,IAAA;AAAA,MACtB,QAAA,EAAU,WAAA;AAAA,MACV,OAAA,EAAS,kBAAA;AAAA,MACT,oBAAA,EAAsB,GAAA;AAAA,MACtB,qBAAA,EAAuB,IAAA;AAAA,MACvB,MAAM,OAAA,CAAQ,EAAE,MAAA,EAAO,EAAG;AACxB,QAAA,OAAO,kBAAA,CAAmB,QAAQ,cAAc,CAAA;AAAA,MAClD;AAAA;AACF;AAEJ,CAAC,CAAA;AAEM,IAAM,YAAY,MAAA,CAAO,MAAA,CAAO,iBAAA,CAAkB,kBAAA,CAAmB,mBAAmB,CAAA,EAAG;AAAA,EAChG,KAAA,EAAO,iBAAA,CAAkB,kBAAA,CAAmB,CAAA,iBAAA,CAAmB,CAAA;AAAA,EAC/D,IAAA,EAAM,iBAAA,CAAkB,kBAAA,CAAmB,CAAA,gBAAA,CAAkB;AAC/D,CAAC","file":"index.js","sourcesContent":["import fsp from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { experimental_customProvider } from 'ai';\nimport { FlagEmbedding, EmbeddingModel } from 'fastembed';\n\nasync function getModelCachePath() {\n const cachePath = path.join(os.homedir(), '.cache', 'mastra', 'fastembed-models');\n await fsp.mkdir(cachePath, { recursive: true });\n return cachePath;\n}\n\n// Shared function to generate embeddings using fastembed\nasync function generateEmbeddings(values: string[], modelType: 'BGESmallENV15' | 'BGEBaseENV15') {\n const model = await FlagEmbedding.init({\n model: EmbeddingModel[modelType],\n cacheDir: await getModelCachePath(),\n });\n\n // model.embed() returns an AsyncGenerator that processes texts in batches (default size 256)\n const embeddings = model.embed(values);\n\n const allResults = [];\n for await (const result of embeddings) {\n // result is an array of embeddings, one for each text in the batch\n // We convert each Float32Array embedding to a regular number array\n allResults.push(...result.map(embedding => Array.from(embedding)));\n }\n\n if (allResults.length === 0) throw new Error('No embeddings generated');\n\n return {\n embeddings: allResults,\n };\n}\n\nconst fastEmbedProvider = experimental_customProvider({\n textEmbeddingModels: {\n 'bge-small-en-v1.5': {\n specificationVersion: 'v1',\n provider: 'fastembed',\n modelId: 'bge-small-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGESmallENV15');\n },\n },\n 'bge-base-en-v1.5': {\n specificationVersion: 'v1',\n provider: 'fastembed',\n modelId: 'bge-base-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGEBaseENV15');\n },\n },\n },\n});\n\nexport const fastembed = Object.assign(fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`), {\n small: fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`),\n base: fastEmbedProvider.textEmbeddingModel(`bge-base-en-v1.5`),\n});\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import fsp from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { customProvider } from 'ai';\nimport { experimental_customProvider } from 'ai-v4';\nimport { FlagEmbedding, EmbeddingModel } from 'fastembed';\n\nasync function getModelCachePath() {\n const cachePath = path.join(os.homedir(), '.cache', 'mastra', 'fastembed-models');\n await fsp.mkdir(cachePath, { recursive: true });\n return cachePath;\n}\n\n// Shared function to generate embeddings using fastembed\nasync function generateEmbeddings(values: string[], modelType: 'BGESmallENV15' | 'BGEBaseENV15') {\n const model = await FlagEmbedding.init({\n model: EmbeddingModel[modelType],\n cacheDir: await getModelCachePath(),\n });\n\n // model.embed() returns an AsyncGenerator that processes texts in batches (default size 256)\n const embeddings = model.embed(values);\n\n const allResults = [];\n for await (const result of embeddings) {\n // result is an array of embeddings, one for each text in the batch\n // We convert each Float32Array embedding to a regular number array\n allResults.push(...result.map(embedding => Array.from(embedding)));\n }\n\n if (allResults.length === 0) throw new Error('No embeddings generated');\n\n return {\n embeddings: allResults,\n };\n}\n\n// Legacy v1 provider for backwards compatibility\nconst fastEmbedLegacyProvider = experimental_customProvider({\n textEmbeddingModels: {\n 'bge-small-en-v1.5': {\n specificationVersion: 'v1',\n provider: 'fastembed',\n modelId: 'bge-small-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGESmallENV15');\n },\n },\n 'bge-base-en-v1.5': {\n specificationVersion: 'v1',\n provider: 'fastembed',\n modelId: 'bge-base-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGEBaseENV15');\n },\n },\n },\n});\n\n// V2 provider for AI SDK v5 compatibility\nconst fastEmbedProvider = customProvider({\n textEmbeddingModels: {\n 'bge-small-en-v1.5': {\n specificationVersion: 'v2',\n provider: 'fastembed',\n modelId: 'bge-small-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGESmallENV15');\n },\n },\n 'bge-base-en-v1.5': {\n specificationVersion: 'v2',\n provider: 'fastembed',\n modelId: 'bge-base-en-v1.5',\n maxEmbeddingsPerCall: 256,\n supportsParallelCalls: true,\n async doEmbed({ values }) {\n return generateEmbeddings(values, 'BGEBaseENV15');\n },\n },\n },\n});\n\nexport const fastembed = Object.assign(fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`), {\n small: fastEmbedProvider.textEmbeddingModel(`bge-small-en-v1.5`),\n base: fastEmbedProvider.textEmbeddingModel(`bge-base-en-v1.5`),\n smallLegacy: fastEmbedLegacyProvider.textEmbeddingModel(`bge-small-en-v1.5`),\n baseLegacy: fastEmbedLegacyProvider.textEmbeddingModel(`bge-base-en-v1.5`),\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/fastembed",
3
- "version": "0.10.7-alpha.0",
3
+ "version": "1.0.0-beta.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -32,7 +32,9 @@
32
32
  "url": "https://github.com/mastra-ai/mastra/issues"
33
33
  },
34
34
  "dependencies": {
35
- "ai": "^4.3.19",
35
+ "ai": "^5.0.76",
36
+ "ai-v4": "npm:ai@4.3.19",
37
+ "@ai-sdk/provider": "^2.0.0",
36
38
  "fastembed": "^1.14.4"
37
39
  },
38
40
  "devDependencies": {
@@ -40,15 +42,11 @@
40
42
  "tsup": "^8.5.0",
41
43
  "typescript": "^5.8.3",
42
44
  "vitest": "^3.2.4",
43
- "@internal/lint": "0.0.57",
44
- "@internal/types-builder": "0.0.32"
45
+ "@internal/types-builder": "0.0.28",
46
+ "@internal/lint": "0.0.53"
45
47
  },
46
- "publishConfig": {
47
- "access": "public",
48
- "publish-branch": [
49
- "main",
50
- "0.x"
51
- ]
48
+ "engines": {
49
+ "node": ">=22.13.0"
52
50
  },
53
51
  "scripts": {
54
52
  "build": "tsup --silent --config tsup.config.ts",