modelfusion 0.36.0 → 0.38.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.
Files changed (43) hide show
  1. package/README.md +4 -4
  2. package/model-function/ModelCallEvent.d.ts +3 -3
  3. package/model-function/embed/EmbeddingEvent.d.ts +21 -0
  4. package/model-function/embed/EmbeddingModel.d.ts +17 -0
  5. package/model-function/{embed-text/embedText.cjs → embed/embed.cjs} +22 -22
  6. package/model-function/embed/embed.d.ts +27 -0
  7. package/model-function/{embed-text/embedText.js → embed/embed.js} +19 -19
  8. package/model-function/index.cjs +3 -3
  9. package/model-function/index.d.ts +3 -3
  10. package/model-function/index.js +3 -3
  11. package/model-provider/cohere/CohereTextEmbeddingModel.cjs +5 -5
  12. package/model-provider/cohere/CohereTextEmbeddingModel.d.ts +6 -6
  13. package/model-provider/cohere/CohereTextEmbeddingModel.js +5 -5
  14. package/model-provider/huggingface/HuggingFaceTextEmbeddingModel.cjs +5 -5
  15. package/model-provider/huggingface/HuggingFaceTextEmbeddingModel.d.ts +6 -6
  16. package/model-provider/huggingface/HuggingFaceTextEmbeddingModel.js +5 -5
  17. package/model-provider/llamacpp/LlamaCppTextEmbeddingModel.cjs +4 -4
  18. package/model-provider/llamacpp/LlamaCppTextEmbeddingModel.d.ts +5 -5
  19. package/model-provider/llamacpp/LlamaCppTextEmbeddingModel.js +4 -4
  20. package/model-provider/openai/OpenAICostCalculator.cjs +1 -1
  21. package/model-provider/openai/OpenAICostCalculator.js +1 -1
  22. package/model-provider/openai/OpenAITextEmbeddingModel.cjs +4 -4
  23. package/model-provider/openai/OpenAITextEmbeddingModel.d.ts +5 -5
  24. package/model-provider/openai/OpenAITextEmbeddingModel.js +4 -4
  25. package/package.json +2 -2
  26. package/vector-index/VectorIndex.d.ts +2 -1
  27. package/vector-index/VectorIndexRetriever.cjs +5 -3
  28. package/vector-index/VectorIndexRetriever.d.ts +10 -9
  29. package/vector-index/VectorIndexRetriever.js +5 -3
  30. package/vector-index/memory/MemoryVectorIndex.cjs +2 -1
  31. package/vector-index/memory/MemoryVectorIndex.d.ts +3 -2
  32. package/vector-index/memory/MemoryVectorIndex.js +2 -1
  33. package/vector-index/pinecone/PineconeVectorIndex.d.ts +1 -1
  34. package/vector-index/upsertIntoVectorIndex.cjs +2 -2
  35. package/vector-index/upsertIntoVectorIndex.d.ts +5 -5
  36. package/vector-index/upsertIntoVectorIndex.js +2 -2
  37. package/model-function/embed-text/TextEmbeddingEvent.d.ts +0 -21
  38. package/model-function/embed-text/TextEmbeddingModel.d.ts +0 -21
  39. package/model-function/embed-text/embedText.d.ts +0 -27
  40. /package/model-function/{embed-text/TextEmbeddingEvent.cjs → embed/EmbeddingEvent.cjs} +0 -0
  41. /package/model-function/{embed-text/TextEmbeddingEvent.js → embed/EmbeddingEvent.js} +0 -0
  42. /package/model-function/{embed-text/TextEmbeddingModel.cjs → embed/EmbeddingModel.cjs} +0 -0
  43. /package/model-function/{embed-text/TextEmbeddingModel.js → embed/EmbeddingModel.js} +0 -0
package/README.md CHANGED
@@ -377,12 +377,12 @@ const image = await generateImage(
377
377
 
378
378
  Providers: [OpenAI (Dall·E)](https://modelfusion.dev/integration/model-provider/openai), [Stability AI](https://modelfusion.dev/integration/model-provider/stability), [Automatic1111](https://modelfusion.dev/integration/model-provider/automatic1111)
379
379
 
380
- ### [Embed Text](https://modelfusion.dev/guide/function/embed-text)
380
+ ### [Embed Value](https://modelfusion.dev/guide/function/embed)
381
381
 
382
- Create embeddings for text. Embeddings are vectors that represent the meaning of the text.
382
+ Create embeddings for text and other values. Embeddings are vectors that represent the essence of the values in the context of the model.
383
383
 
384
384
  ```ts
385
- const embeddings = await embedTexts(
385
+ const embeddings = await embedMany(
386
386
  new OpenAITextEmbeddingModel({ model: "text-embedding-ada-002" }),
387
387
  [
388
388
  "At first, Nox didn't know what to do with the pup.",
@@ -459,7 +459,7 @@ Integrations: [Helicone](https://modelfusion.dev/integration/observability/helic
459
459
  - [Generate and stream text](https://modelfusion.dev/guide/function/generate-text)
460
460
  - [Generate structure](https://modelfusion.dev/guide/function/generate-structure)
461
461
  - [Generate structure or text](https://modelfusion.dev/guide/function/generate-structure-or-text)
462
- - [Embed Text](https://modelfusion.dev/guide/function/embed-text)
462
+ - [Embed Value](https://modelfusion.dev/guide/function/embed)
463
463
  - [Tokenize Text](https://modelfusion.dev/guide/function/tokenize-text)
464
464
  - [Transcribe Speech](https://modelfusion.dev/guide/function/transcribe-speech)
465
465
  - [Synthesize Speech](https://modelfusion.dev/guide/function/synthesize-speech)
@@ -1,7 +1,7 @@
1
1
  import { BaseFunctionFinishedEvent, BaseFunctionStartedEvent } from "../core/FunctionEvent.js";
2
2
  import { ModelInformation } from "./ModelInformation.js";
3
3
  import { ImageDescriptionFinishedEvent, ImageDescriptionStartedEvent } from "./describe-image/ImageDescriptionEvent.js";
4
- import { TextEmbeddingFinishedEvent, TextEmbeddingStartedEvent } from "./embed-text/TextEmbeddingEvent.js";
4
+ import { EmbeddingFinishedEvent, EmbeddingStartedEvent } from "./embed/EmbeddingEvent.js";
5
5
  import { ImageGenerationFinishedEvent, ImageGenerationStartedEvent } from "./generate-image/ImageGenerationEvent.js";
6
6
  import { StructureGenerationFinishedEvent, StructureGenerationStartedEvent } from "./generate-structure/StructureGenerationEvent.js";
7
7
  import { StructureStreamingFinishedEvent, StructureStreamingStartedEvent } from "./generate-structure/StructureStreamingEvent.js";
@@ -49,5 +49,5 @@ export interface BaseModelCallFinishedEvent extends BaseFunctionFinishedEvent {
49
49
  */
50
50
  result: BaseModelCallFinishedEventResult;
51
51
  }
52
- export type ModelCallStartedEvent = ImageDescriptionStartedEvent | ImageGenerationStartedEvent | StructureGenerationStartedEvent | StructureStreamingStartedEvent | SpeechSynthesisStartedEvent | TextEmbeddingStartedEvent | TextGenerationStartedEvent | TextStreamingStartedEvent | TranscriptionStartedEvent;
53
- export type ModelCallFinishedEvent = ImageDescriptionFinishedEvent | ImageGenerationFinishedEvent | StructureGenerationFinishedEvent | StructureStreamingFinishedEvent | SpeechSynthesisFinishedEvent | TextEmbeddingFinishedEvent | TextGenerationFinishedEvent | TextStreamingFinishedEvent | TranscriptionFinishedEvent;
52
+ export type ModelCallStartedEvent = EmbeddingStartedEvent | ImageDescriptionStartedEvent | ImageGenerationStartedEvent | StructureGenerationStartedEvent | StructureStreamingStartedEvent | SpeechSynthesisStartedEvent | TextGenerationStartedEvent | TextStreamingStartedEvent | TranscriptionStartedEvent;
53
+ export type ModelCallFinishedEvent = EmbeddingFinishedEvent | ImageDescriptionFinishedEvent | ImageGenerationFinishedEvent | StructureGenerationFinishedEvent | StructureStreamingFinishedEvent | SpeechSynthesisFinishedEvent | TextGenerationFinishedEvent | TextStreamingFinishedEvent | TranscriptionFinishedEvent;
@@ -0,0 +1,21 @@
1
+ import { Vector } from "../../core/Vector.js";
2
+ import { BaseModelCallFinishedEvent, BaseModelCallStartedEvent } from "../ModelCallEvent.js";
3
+ export interface EmbeddingStartedEvent extends BaseModelCallStartedEvent {
4
+ functionType: "embedding";
5
+ input: unknown | Array<unknown>;
6
+ }
7
+ export type EmbeddingFinishedEventResult = {
8
+ status: "success";
9
+ response: unknown;
10
+ output: Vector | Array<Vector>;
11
+ } | {
12
+ status: "error";
13
+ error: unknown;
14
+ } | {
15
+ status: "abort";
16
+ };
17
+ export interface EmbeddingFinishedEvent extends BaseModelCallFinishedEvent {
18
+ functionType: "embedding";
19
+ input: unknown | Array<unknown>;
20
+ result: EmbeddingFinishedEventResult;
21
+ }
@@ -0,0 +1,17 @@
1
+ import { Vector } from "../../core/Vector.js";
2
+ import { ModelFunctionOptions } from "../ModelFunctionOptions.js";
3
+ import { Model, ModelSettings } from "../Model.js";
4
+ export interface EmbeddingModelSettings extends ModelSettings {
5
+ }
6
+ export interface EmbeddingModel<VALUE, RESPONSE, SETTINGS extends EmbeddingModelSettings> extends Model<SETTINGS> {
7
+ /**
8
+ * The size of the embedding vector.
9
+ */
10
+ readonly embeddingDimensions: number | undefined;
11
+ /**
12
+ * Limit of how many values can be sent in a single API call.
13
+ */
14
+ readonly maxValuesPerCall: number | undefined;
15
+ generateEmbeddingResponse(values: VALUE[], options?: ModelFunctionOptions<SETTINGS>): PromiseLike<RESPONSE>;
16
+ extractEmbeddings(response: RESPONSE): Vector[];
17
+ }
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.embedText = exports.embedTexts = void 0;
3
+ exports.embed = exports.embedMany = void 0;
4
4
  const executeCall_js_1 = require("../executeCall.cjs");
5
5
  /**
6
- * Generate embeddings for multiple texts.
6
+ * Generate embeddings for multiple values.
7
7
  *
8
8
  * @example
9
- * const embeddings = await embedTexts(
9
+ * const embeddings = await embedMany(
10
10
  * new OpenAITextEmbeddingModel(...),
11
11
  * [
12
12
  * "At first, Nox didn't know what to do with the pup.",
@@ -14,25 +14,25 @@ const executeCall_js_1 = require("../executeCall.cjs");
14
14
  * ]
15
15
  * );
16
16
  */
17
- function embedTexts(model, texts, options) {
17
+ function embedMany(model, values, options) {
18
18
  return (0, executeCall_js_1.executeCall)({
19
- functionType: "text-embedding",
20
- input: texts,
19
+ functionType: "embedding",
20
+ input: values,
21
21
  model,
22
22
  options,
23
23
  generateResponse: (options) => {
24
- // split the texts into groups that are small enough to be sent in one call:
25
- const maxTextsPerCall = model.maxTextsPerCall;
26
- const textGroups = [];
27
- if (maxTextsPerCall == null) {
28
- textGroups.push(texts);
24
+ // split the values into groups that are small enough to be sent in one call:
25
+ const maxValuesPerCall = model.maxValuesPerCall;
26
+ const valueGroups = [];
27
+ if (maxValuesPerCall == null) {
28
+ valueGroups.push(values);
29
29
  }
30
30
  else {
31
- for (let i = 0; i < texts.length; i += maxTextsPerCall) {
32
- textGroups.push(texts.slice(i, i + maxTextsPerCall));
31
+ for (let i = 0; i < values.length; i += maxValuesPerCall) {
32
+ valueGroups.push(values.slice(i, i + maxValuesPerCall));
33
33
  }
34
34
  }
35
- return Promise.all(textGroups.map((textGroup) => model.generateEmbeddingResponse(textGroup, options)));
35
+ return Promise.all(valueGroups.map((valueGroup) => model.generateEmbeddingResponse(valueGroup, options)));
36
36
  },
37
37
  extractOutputValue: (result) => {
38
38
  const embeddings = [];
@@ -43,26 +43,26 @@ function embedTexts(model, texts, options) {
43
43
  },
44
44
  });
45
45
  }
46
- exports.embedTexts = embedTexts;
46
+ exports.embedMany = embedMany;
47
47
  /**
48
- * Generate an embedding for a single text.
48
+ * Generate an embedding for a single value.
49
49
  *
50
50
  * @example
51
- * const embedding = await embedText(
51
+ * const embedding = await embed(
52
52
  * new OpenAITextEmbeddingModel(...),
53
53
  * "At first, Nox didn't know what to do with the pup."
54
54
  * );
55
55
  */
56
- function embedText(model, text, options) {
56
+ function embed(model, value, options) {
57
57
  return (0, executeCall_js_1.executeCall)({
58
- functionType: "text-embedding",
59
- input: text,
58
+ functionType: "embedding",
59
+ input: value,
60
60
  model,
61
61
  options,
62
62
  generateResponse: async (options) => [
63
- await model.generateEmbeddingResponse([text], options),
63
+ await model.generateEmbeddingResponse([value], options),
64
64
  ],
65
65
  extractOutputValue: (result) => model.extractEmbeddings(result[0])[0],
66
66
  });
67
67
  }
68
- exports.embedText = embedText;
68
+ exports.embed = embed;
@@ -0,0 +1,27 @@
1
+ import { Vector } from "../../core/Vector.js";
2
+ import { ModelFunctionOptions } from "../ModelFunctionOptions.js";
3
+ import { ModelFunctionPromise } from "../executeCall.js";
4
+ import { EmbeddingModel, EmbeddingModelSettings } from "./EmbeddingModel.js";
5
+ /**
6
+ * Generate embeddings for multiple values.
7
+ *
8
+ * @example
9
+ * const embeddings = await embedMany(
10
+ * new OpenAITextEmbeddingModel(...),
11
+ * [
12
+ * "At first, Nox didn't know what to do with the pup.",
13
+ * "He keenly observed and absorbed everything around him, from the birds in the sky to the trees in the forest.",
14
+ * ]
15
+ * );
16
+ */
17
+ export declare function embedMany<VALUE, RESPONSE, SETTINGS extends EmbeddingModelSettings>(model: EmbeddingModel<VALUE, RESPONSE, SETTINGS>, values: VALUE[], options?: ModelFunctionOptions<SETTINGS>): ModelFunctionPromise<Vector[], RESPONSE[]>;
18
+ /**
19
+ * Generate an embedding for a single value.
20
+ *
21
+ * @example
22
+ * const embedding = await embed(
23
+ * new OpenAITextEmbeddingModel(...),
24
+ * "At first, Nox didn't know what to do with the pup."
25
+ * );
26
+ */
27
+ export declare function embed<VALUE, RESPONSE, SETTINGS extends EmbeddingModelSettings>(model: EmbeddingModel<VALUE, RESPONSE, SETTINGS>, value: VALUE, options?: ModelFunctionOptions<SETTINGS>): ModelFunctionPromise<Vector, RESPONSE[]>;
@@ -1,9 +1,9 @@
1
1
  import { executeCall } from "../executeCall.js";
2
2
  /**
3
- * Generate embeddings for multiple texts.
3
+ * Generate embeddings for multiple values.
4
4
  *
5
5
  * @example
6
- * const embeddings = await embedTexts(
6
+ * const embeddings = await embedMany(
7
7
  * new OpenAITextEmbeddingModel(...),
8
8
  * [
9
9
  * "At first, Nox didn't know what to do with the pup.",
@@ -11,25 +11,25 @@ import { executeCall } from "../executeCall.js";
11
11
  * ]
12
12
  * );
13
13
  */
14
- export function embedTexts(model, texts, options) {
14
+ export function embedMany(model, values, options) {
15
15
  return executeCall({
16
- functionType: "text-embedding",
17
- input: texts,
16
+ functionType: "embedding",
17
+ input: values,
18
18
  model,
19
19
  options,
20
20
  generateResponse: (options) => {
21
- // split the texts into groups that are small enough to be sent in one call:
22
- const maxTextsPerCall = model.maxTextsPerCall;
23
- const textGroups = [];
24
- if (maxTextsPerCall == null) {
25
- textGroups.push(texts);
21
+ // split the values into groups that are small enough to be sent in one call:
22
+ const maxValuesPerCall = model.maxValuesPerCall;
23
+ const valueGroups = [];
24
+ if (maxValuesPerCall == null) {
25
+ valueGroups.push(values);
26
26
  }
27
27
  else {
28
- for (let i = 0; i < texts.length; i += maxTextsPerCall) {
29
- textGroups.push(texts.slice(i, i + maxTextsPerCall));
28
+ for (let i = 0; i < values.length; i += maxValuesPerCall) {
29
+ valueGroups.push(values.slice(i, i + maxValuesPerCall));
30
30
  }
31
31
  }
32
- return Promise.all(textGroups.map((textGroup) => model.generateEmbeddingResponse(textGroup, options)));
32
+ return Promise.all(valueGroups.map((valueGroup) => model.generateEmbeddingResponse(valueGroup, options)));
33
33
  },
34
34
  extractOutputValue: (result) => {
35
35
  const embeddings = [];
@@ -41,22 +41,22 @@ export function embedTexts(model, texts, options) {
41
41
  });
42
42
  }
43
43
  /**
44
- * Generate an embedding for a single text.
44
+ * Generate an embedding for a single value.
45
45
  *
46
46
  * @example
47
- * const embedding = await embedText(
47
+ * const embedding = await embed(
48
48
  * new OpenAITextEmbeddingModel(...),
49
49
  * "At first, Nox didn't know what to do with the pup."
50
50
  * );
51
51
  */
52
- export function embedText(model, text, options) {
52
+ export function embed(model, value, options) {
53
53
  return executeCall({
54
- functionType: "text-embedding",
55
- input: text,
54
+ functionType: "embedding",
55
+ input: value,
56
56
  model,
57
57
  options,
58
58
  generateResponse: async (options) => [
59
- await model.generateEmbeddingResponse([text], options),
59
+ await model.generateEmbeddingResponse([value], options),
60
60
  ],
61
61
  extractOutputValue: (result) => model.extractEmbeddings(result[0])[0],
62
62
  });
@@ -23,9 +23,9 @@ __exportStar(require("./SuccessfulModelCall.cjs"), exports);
23
23
  __exportStar(require("./describe-image/ImageDescriptionEvent.cjs"), exports);
24
24
  __exportStar(require("./describe-image/ImageDescriptionModel.cjs"), exports);
25
25
  __exportStar(require("./describe-image/describeImage.cjs"), exports);
26
- __exportStar(require("./embed-text/TextEmbeddingEvent.cjs"), exports);
27
- __exportStar(require("./embed-text/TextEmbeddingModel.cjs"), exports);
28
- __exportStar(require("./embed-text/embedText.cjs"), exports);
26
+ __exportStar(require("./embed/EmbeddingEvent.cjs"), exports);
27
+ __exportStar(require("./embed/EmbeddingModel.cjs"), exports);
28
+ __exportStar(require("./embed/embed.cjs"), exports);
29
29
  __exportStar(require("./generate-image/ImageGenerationEvent.cjs"), exports);
30
30
  __exportStar(require("./generate-image/ImageGenerationModel.cjs"), exports);
31
31
  __exportStar(require("./generate-image/generateImage.cjs"), exports);
@@ -7,9 +7,9 @@ export * from "./SuccessfulModelCall.js";
7
7
  export * from "./describe-image/ImageDescriptionEvent.js";
8
8
  export * from "./describe-image/ImageDescriptionModel.js";
9
9
  export * from "./describe-image/describeImage.js";
10
- export * from "./embed-text/TextEmbeddingEvent.js";
11
- export * from "./embed-text/TextEmbeddingModel.js";
12
- export * from "./embed-text/embedText.js";
10
+ export * from "./embed/EmbeddingEvent.js";
11
+ export * from "./embed/EmbeddingModel.js";
12
+ export * from "./embed/embed.js";
13
13
  export * from "./generate-image/ImageGenerationEvent.js";
14
14
  export * from "./generate-image/ImageGenerationModel.js";
15
15
  export * from "./generate-image/generateImage.js";
@@ -7,9 +7,9 @@ export * from "./SuccessfulModelCall.js";
7
7
  export * from "./describe-image/ImageDescriptionEvent.js";
8
8
  export * from "./describe-image/ImageDescriptionModel.js";
9
9
  export * from "./describe-image/describeImage.js";
10
- export * from "./embed-text/TextEmbeddingEvent.js";
11
- export * from "./embed-text/TextEmbeddingModel.js";
12
- export * from "./embed-text/embedText.js";
10
+ export * from "./embed/EmbeddingEvent.js";
11
+ export * from "./embed/EmbeddingModel.js";
12
+ export * from "./embed/embed.js";
13
13
  export * from "./generate-image/ImageGenerationEvent.js";
14
14
  export * from "./generate-image/ImageGenerationModel.js";
15
15
  export * from "./generate-image/generateImage.js";
@@ -5,9 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.CohereTextEmbeddingModel = exports.COHERE_TEXT_EMBEDDING_MODELS = void 0;
7
7
  const zod_1 = __importDefault(require("zod"));
8
- const AbstractModel_js_1 = require("../../model-function/AbstractModel.cjs");
9
8
  const callWithRetryAndThrottle_js_1 = require("../../core/api/callWithRetryAndThrottle.cjs");
10
9
  const postToApi_js_1 = require("../../core/api/postToApi.cjs");
10
+ const AbstractModel_js_1 = require("../../model-function/AbstractModel.cjs");
11
11
  const CohereApiConfiguration_js_1 = require("./CohereApiConfiguration.cjs");
12
12
  const CohereError_js_1 = require("./CohereError.cjs");
13
13
  const CohereTokenizer_js_1 = require("./CohereTokenizer.cjs");
@@ -31,7 +31,7 @@ exports.COHERE_TEXT_EMBEDDING_MODELS = {
31
31
  * @see https://docs.cohere.com/reference/embed
32
32
  *
33
33
  * @example
34
- * const embeddings = await embedTexts(
34
+ * const embeddings = await embedMany(
35
35
  * new CohereTextEmbeddingModel({ model: "embed-english-light-v2.0" }),
36
36
  * [
37
37
  * "At first, Nox didn't know what to do with the pup.",
@@ -48,7 +48,7 @@ class CohereTextEmbeddingModel extends AbstractModel_js_1.AbstractModel {
48
48
  writable: true,
49
49
  value: "cohere"
50
50
  });
51
- Object.defineProperty(this, "maxTextsPerCall", {
51
+ Object.defineProperty(this, "maxValuesPerCall", {
52
52
  enumerable: true,
53
53
  configurable: true,
54
54
  writable: true,
@@ -94,8 +94,8 @@ class CohereTextEmbeddingModel extends AbstractModel_js_1.AbstractModel {
94
94
  return this.tokenizer.detokenize(tokens);
95
95
  }
96
96
  async callAPI(texts, options) {
97
- if (texts.length > this.maxTextsPerCall) {
98
- throw new Error(`The Cohere embedding API only supports ${this.maxTextsPerCall} texts per API call.`);
97
+ if (texts.length > this.maxValuesPerCall) {
98
+ throw new Error(`The Cohere embedding API only supports ${this.maxValuesPerCall} texts per API call.`);
99
99
  }
100
100
  const run = options?.run;
101
101
  const settings = options?.settings;
@@ -1,8 +1,8 @@
1
1
  import z from "zod";
2
- import { AbstractModel } from "../../model-function/AbstractModel.js";
3
2
  import { ApiConfiguration } from "../../core/api/ApiConfiguration.js";
3
+ import { AbstractModel } from "../../model-function/AbstractModel.js";
4
4
  import { ModelFunctionOptions } from "../../model-function/ModelFunctionOptions.js";
5
- import { TextEmbeddingModel, TextEmbeddingModelSettings } from "../../model-function/embed-text/TextEmbeddingModel.js";
5
+ import { EmbeddingModel, EmbeddingModelSettings } from "../../model-function/embed/EmbeddingModel.js";
6
6
  import { FullTokenizer } from "../../model-function/tokenize-text/Tokenizer.js";
7
7
  export declare const COHERE_TEXT_EMBEDDING_MODELS: {
8
8
  "embed-english-light-v2.0": {
@@ -19,7 +19,7 @@ export declare const COHERE_TEXT_EMBEDDING_MODELS: {
19
19
  };
20
20
  };
21
21
  export type CohereTextEmbeddingModelType = keyof typeof COHERE_TEXT_EMBEDDING_MODELS;
22
- export interface CohereTextEmbeddingModelSettings extends TextEmbeddingModelSettings {
22
+ export interface CohereTextEmbeddingModelSettings extends EmbeddingModelSettings {
23
23
  api?: ApiConfiguration;
24
24
  model: CohereTextEmbeddingModelType;
25
25
  truncate?: "NONE" | "START" | "END";
@@ -30,7 +30,7 @@ export interface CohereTextEmbeddingModelSettings extends TextEmbeddingModelSett
30
30
  * @see https://docs.cohere.com/reference/embed
31
31
  *
32
32
  * @example
33
- * const embeddings = await embedTexts(
33
+ * const embeddings = await embedMany(
34
34
  * new CohereTextEmbeddingModel({ model: "embed-english-light-v2.0" }),
35
35
  * [
36
36
  * "At first, Nox didn't know what to do with the pup.",
@@ -38,11 +38,11 @@ export interface CohereTextEmbeddingModelSettings extends TextEmbeddingModelSett
38
38
  * ]
39
39
  * );
40
40
  */
41
- export declare class CohereTextEmbeddingModel extends AbstractModel<CohereTextEmbeddingModelSettings> implements TextEmbeddingModel<CohereTextEmbeddingResponse, CohereTextEmbeddingModelSettings>, FullTokenizer {
41
+ export declare class CohereTextEmbeddingModel extends AbstractModel<CohereTextEmbeddingModelSettings> implements EmbeddingModel<string, CohereTextEmbeddingResponse, CohereTextEmbeddingModelSettings>, FullTokenizer {
42
42
  constructor(settings: CohereTextEmbeddingModelSettings);
43
43
  readonly provider: "cohere";
44
44
  get modelName(): "embed-english-light-v2.0" | "embed-english-v2.0" | "embed-multilingual-v2.0";
45
- readonly maxTextsPerCall = 96;
45
+ readonly maxValuesPerCall = 96;
46
46
  readonly embeddingDimensions: number;
47
47
  readonly contextWindowSize: number;
48
48
  private readonly tokenizer;
@@ -1,7 +1,7 @@
1
1
  import z from "zod";
2
- import { AbstractModel } from "../../model-function/AbstractModel.js";
3
2
  import { callWithRetryAndThrottle } from "../../core/api/callWithRetryAndThrottle.js";
4
3
  import { createJsonResponseHandler, postJsonToApi, } from "../../core/api/postToApi.js";
4
+ import { AbstractModel } from "../../model-function/AbstractModel.js";
5
5
  import { CohereApiConfiguration } from "./CohereApiConfiguration.js";
6
6
  import { failedCohereCallResponseHandler } from "./CohereError.js";
7
7
  import { CohereTokenizer } from "./CohereTokenizer.js";
@@ -25,7 +25,7 @@ export const COHERE_TEXT_EMBEDDING_MODELS = {
25
25
  * @see https://docs.cohere.com/reference/embed
26
26
  *
27
27
  * @example
28
- * const embeddings = await embedTexts(
28
+ * const embeddings = await embedMany(
29
29
  * new CohereTextEmbeddingModel({ model: "embed-english-light-v2.0" }),
30
30
  * [
31
31
  * "At first, Nox didn't know what to do with the pup.",
@@ -42,7 +42,7 @@ export class CohereTextEmbeddingModel extends AbstractModel {
42
42
  writable: true,
43
43
  value: "cohere"
44
44
  });
45
- Object.defineProperty(this, "maxTextsPerCall", {
45
+ Object.defineProperty(this, "maxValuesPerCall", {
46
46
  enumerable: true,
47
47
  configurable: true,
48
48
  writable: true,
@@ -88,8 +88,8 @@ export class CohereTextEmbeddingModel extends AbstractModel {
88
88
  return this.tokenizer.detokenize(tokens);
89
89
  }
90
90
  async callAPI(texts, options) {
91
- if (texts.length > this.maxTextsPerCall) {
92
- throw new Error(`The Cohere embedding API only supports ${this.maxTextsPerCall} texts per API call.`);
91
+ if (texts.length > this.maxValuesPerCall) {
92
+ throw new Error(`The Cohere embedding API only supports ${this.maxValuesPerCall} texts per API call.`);
93
93
  }
94
94
  const run = options?.run;
95
95
  const settings = options?.settings;
@@ -22,7 +22,7 @@ const HuggingFaceApiConfiguration_js_1 = require("./HuggingFaceApiConfiguration.
22
22
  * retry: retryWithExponentialBackoff({ maxTries: 5 }),
23
23
  * });
24
24
  *
25
- * const embeddings = await embedTexts(
25
+ * const embeddings = await embedMany(
26
26
  * model,
27
27
  * [
28
28
  * "At first, Nox didn't know what to do with the pup.",
@@ -39,7 +39,7 @@ class HuggingFaceTextEmbeddingModel extends AbstractModel_js_1.AbstractModel {
39
39
  writable: true,
40
40
  value: "huggingface"
41
41
  });
42
- Object.defineProperty(this, "maxTextsPerCall", {
42
+ Object.defineProperty(this, "maxValuesPerCall", {
43
43
  enumerable: true,
44
44
  configurable: true,
45
45
  writable: true,
@@ -70,15 +70,15 @@ class HuggingFaceTextEmbeddingModel extends AbstractModel_js_1.AbstractModel {
70
70
  value: undefined
71
71
  });
72
72
  // There is no limit documented in the HuggingFace API. Use 1024 as a reasonable default.
73
- this.maxTextsPerCall = settings.maxTextsPerCall ?? 1024;
73
+ this.maxValuesPerCall = settings.maxValuesPerCall ?? 1024;
74
74
  this.embeddingDimensions = settings.embeddingDimensions;
75
75
  }
76
76
  get modelName() {
77
77
  return this.settings.model;
78
78
  }
79
79
  async callAPI(texts, options) {
80
- if (texts.length > this.maxTextsPerCall) {
81
- throw new Error(`The HuggingFace feature extraction API is configured to only support ${this.maxTextsPerCall} texts per API call.`);
80
+ if (texts.length > this.maxValuesPerCall) {
81
+ throw new Error(`The HuggingFace feature extraction API is configured to only support ${this.maxValuesPerCall} texts per API call.`);
82
82
  }
83
83
  const run = options?.run;
84
84
  const settings = options?.settings;
@@ -2,11 +2,11 @@ import z from "zod";
2
2
  import { AbstractModel } from "../../model-function/AbstractModel.js";
3
3
  import { ApiConfiguration } from "../../core/api/ApiConfiguration.js";
4
4
  import { ModelFunctionOptions } from "../../model-function/ModelFunctionOptions.js";
5
- import { TextEmbeddingModel, TextEmbeddingModelSettings } from "../../model-function/embed-text/TextEmbeddingModel.js";
6
- export interface HuggingFaceTextEmbeddingModelSettings extends TextEmbeddingModelSettings {
5
+ import { EmbeddingModel, EmbeddingModelSettings } from "../../model-function/embed/EmbeddingModel.js";
6
+ export interface HuggingFaceTextEmbeddingModelSettings extends EmbeddingModelSettings {
7
7
  api?: ApiConfiguration;
8
8
  model: string;
9
- maxTextsPerCall?: number;
9
+ maxValuesPerCall?: number;
10
10
  embeddingDimensions?: number;
11
11
  options?: {
12
12
  useCache?: boolean;
@@ -25,7 +25,7 @@ export interface HuggingFaceTextEmbeddingModelSettings extends TextEmbeddingMode
25
25
  * retry: retryWithExponentialBackoff({ maxTries: 5 }),
26
26
  * });
27
27
  *
28
- * const embeddings = await embedTexts(
28
+ * const embeddings = await embedMany(
29
29
  * model,
30
30
  * [
31
31
  * "At first, Nox didn't know what to do with the pup.",
@@ -33,11 +33,11 @@ export interface HuggingFaceTextEmbeddingModelSettings extends TextEmbeddingMode
33
33
  * ]
34
34
  * );
35
35
  */
36
- export declare class HuggingFaceTextEmbeddingModel extends AbstractModel<HuggingFaceTextEmbeddingModelSettings> implements TextEmbeddingModel<HuggingFaceTextEmbeddingResponse, HuggingFaceTextEmbeddingModelSettings> {
36
+ export declare class HuggingFaceTextEmbeddingModel extends AbstractModel<HuggingFaceTextEmbeddingModelSettings> implements EmbeddingModel<string, HuggingFaceTextEmbeddingResponse, HuggingFaceTextEmbeddingModelSettings> {
37
37
  constructor(settings: HuggingFaceTextEmbeddingModelSettings);
38
38
  readonly provider = "huggingface";
39
39
  get modelName(): string;
40
- readonly maxTextsPerCall: number;
40
+ readonly maxValuesPerCall: number;
41
41
  readonly contextWindowSize: undefined;
42
42
  readonly embeddingDimensions: number | undefined;
43
43
  readonly tokenizer: undefined;
@@ -16,7 +16,7 @@ import { HuggingFaceApiConfiguration } from "./HuggingFaceApiConfiguration.js";
16
16
  * retry: retryWithExponentialBackoff({ maxTries: 5 }),
17
17
  * });
18
18
  *
19
- * const embeddings = await embedTexts(
19
+ * const embeddings = await embedMany(
20
20
  * model,
21
21
  * [
22
22
  * "At first, Nox didn't know what to do with the pup.",
@@ -33,7 +33,7 @@ export class HuggingFaceTextEmbeddingModel extends AbstractModel {
33
33
  writable: true,
34
34
  value: "huggingface"
35
35
  });
36
- Object.defineProperty(this, "maxTextsPerCall", {
36
+ Object.defineProperty(this, "maxValuesPerCall", {
37
37
  enumerable: true,
38
38
  configurable: true,
39
39
  writable: true,
@@ -64,15 +64,15 @@ export class HuggingFaceTextEmbeddingModel extends AbstractModel {
64
64
  value: undefined
65
65
  });
66
66
  // There is no limit documented in the HuggingFace API. Use 1024 as a reasonable default.
67
- this.maxTextsPerCall = settings.maxTextsPerCall ?? 1024;
67
+ this.maxValuesPerCall = settings.maxValuesPerCall ?? 1024;
68
68
  this.embeddingDimensions = settings.embeddingDimensions;
69
69
  }
70
70
  get modelName() {
71
71
  return this.settings.model;
72
72
  }
73
73
  async callAPI(texts, options) {
74
- if (texts.length > this.maxTextsPerCall) {
75
- throw new Error(`The HuggingFace feature extraction API is configured to only support ${this.maxTextsPerCall} texts per API call.`);
74
+ if (texts.length > this.maxValuesPerCall) {
75
+ throw new Error(`The HuggingFace feature extraction API is configured to only support ${this.maxValuesPerCall} texts per API call.`);
76
76
  }
77
77
  const run = options?.run;
78
78
  const settings = options?.settings;
@@ -5,9 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.LlamaCppTextEmbeddingModel = void 0;
7
7
  const zod_1 = __importDefault(require("zod"));
8
- const AbstractModel_js_1 = require("../../model-function/AbstractModel.cjs");
9
8
  const callWithRetryAndThrottle_js_1 = require("../../core/api/callWithRetryAndThrottle.cjs");
10
9
  const postToApi_js_1 = require("../../core/api/postToApi.cjs");
10
+ const AbstractModel_js_1 = require("../../model-function/AbstractModel.cjs");
11
11
  const LlamaCppApiConfiguration_js_1 = require("./LlamaCppApiConfiguration.cjs");
12
12
  const LlamaCppError_js_1 = require("./LlamaCppError.cjs");
13
13
  const LlamaCppTokenizer_js_1 = require("./LlamaCppTokenizer.cjs");
@@ -20,7 +20,7 @@ class LlamaCppTextEmbeddingModel extends AbstractModel_js_1.AbstractModel {
20
20
  writable: true,
21
21
  value: "llamacpp"
22
22
  });
23
- Object.defineProperty(this, "maxTextsPerCall", {
23
+ Object.defineProperty(this, "maxValuesPerCall", {
24
24
  enumerable: true,
25
25
  configurable: true,
26
26
  writable: true,
@@ -54,8 +54,8 @@ class LlamaCppTextEmbeddingModel extends AbstractModel_js_1.AbstractModel {
54
54
  return this.tokenizer.tokenize(text);
55
55
  }
56
56
  async callAPI(texts, options) {
57
- if (texts.length > this.maxTextsPerCall) {
58
- throw new Error(`The Llama.cpp embedding API only supports ${this.maxTextsPerCall} texts per API call.`);
57
+ if (texts.length > this.maxValuesPerCall) {
58
+ throw new Error(`The Llama.cpp embedding API only supports ${this.maxValuesPerCall} texts per API call.`);
59
59
  }
60
60
  const run = options?.run;
61
61
  const settings = options?.settings;
@@ -1,17 +1,17 @@
1
1
  import z from "zod";
2
- import { AbstractModel } from "../../model-function/AbstractModel.js";
3
2
  import { ApiConfiguration } from "../../core/api/ApiConfiguration.js";
3
+ import { AbstractModel } from "../../model-function/AbstractModel.js";
4
4
  import { ModelFunctionOptions } from "../../model-function/ModelFunctionOptions.js";
5
- import { TextEmbeddingModel, TextEmbeddingModelSettings } from "../../model-function/embed-text/TextEmbeddingModel.js";
6
- export interface LlamaCppTextEmbeddingModelSettings extends TextEmbeddingModelSettings {
5
+ import { EmbeddingModel, EmbeddingModelSettings } from "../../model-function/embed/EmbeddingModel.js";
6
+ export interface LlamaCppTextEmbeddingModelSettings extends EmbeddingModelSettings {
7
7
  api?: ApiConfiguration;
8
8
  embeddingDimensions?: number;
9
9
  }
10
- export declare class LlamaCppTextEmbeddingModel extends AbstractModel<LlamaCppTextEmbeddingModelSettings> implements TextEmbeddingModel<LlamaCppTextEmbeddingResponse, LlamaCppTextEmbeddingModelSettings> {
10
+ export declare class LlamaCppTextEmbeddingModel extends AbstractModel<LlamaCppTextEmbeddingModelSettings> implements EmbeddingModel<string, LlamaCppTextEmbeddingResponse, LlamaCppTextEmbeddingModelSettings> {
11
11
  constructor(settings?: LlamaCppTextEmbeddingModelSettings);
12
12
  readonly provider: "llamacpp";
13
13
  get modelName(): null;
14
- readonly maxTextsPerCall = 1;
14
+ readonly maxValuesPerCall = 1;
15
15
  readonly contextWindowSize: undefined;
16
16
  readonly embeddingDimensions: number | undefined;
17
17
  private readonly tokenizer;
@@ -1,7 +1,7 @@
1
1
  import z from "zod";
2
- import { AbstractModel } from "../../model-function/AbstractModel.js";
3
2
  import { callWithRetryAndThrottle } from "../../core/api/callWithRetryAndThrottle.js";
4
3
  import { createJsonResponseHandler, postJsonToApi, } from "../../core/api/postToApi.js";
4
+ import { AbstractModel } from "../../model-function/AbstractModel.js";
5
5
  import { LlamaCppApiConfiguration } from "./LlamaCppApiConfiguration.js";
6
6
  import { failedLlamaCppCallResponseHandler } from "./LlamaCppError.js";
7
7
  import { LlamaCppTokenizer } from "./LlamaCppTokenizer.js";
@@ -14,7 +14,7 @@ export class LlamaCppTextEmbeddingModel extends AbstractModel {
14
14
  writable: true,
15
15
  value: "llamacpp"
16
16
  });
17
- Object.defineProperty(this, "maxTextsPerCall", {
17
+ Object.defineProperty(this, "maxValuesPerCall", {
18
18
  enumerable: true,
19
19
  configurable: true,
20
20
  writable: true,
@@ -48,8 +48,8 @@ export class LlamaCppTextEmbeddingModel extends AbstractModel {
48
48
  return this.tokenizer.tokenize(text);
49
49
  }
50
50
  async callAPI(texts, options) {
51
- if (texts.length > this.maxTextsPerCall) {
52
- throw new Error(`The Llama.cpp embedding API only supports ${this.maxTextsPerCall} texts per API call.`);
51
+ if (texts.length > this.maxValuesPerCall) {
52
+ throw new Error(`The Llama.cpp embedding API only supports ${this.maxValuesPerCall} texts per API call.`);
53
53
  }
54
54
  const run = options?.run;
55
55
  const settings = options?.settings;
@@ -24,7 +24,7 @@ class OpenAICostCalculator {
24
24
  settings: call.settings,
25
25
  });
26
26
  }
27
- case "text-embedding": {
27
+ case "embedding": {
28
28
  if (model == null) {
29
29
  return null;
30
30
  }
@@ -21,7 +21,7 @@ export class OpenAICostCalculator {
21
21
  settings: call.settings,
22
22
  });
23
23
  }
24
- case "text-embedding": {
24
+ case "embedding": {
25
25
  if (model == null) {
26
26
  return null;
27
27
  }
@@ -37,7 +37,7 @@ exports.calculateOpenAIEmbeddingCostInMillicents = calculateOpenAIEmbeddingCostI
37
37
  * @see https://platform.openai.com/docs/api-reference/embeddings
38
38
  *
39
39
  * @example
40
- * const embeddings = await embedTexts(
40
+ * const embeddings = await embedMany(
41
41
  * new OpenAITextEmbeddingModel({ model: "text-embedding-ada-002" }),
42
42
  * [
43
43
  * "At first, Nox didn't know what to do with the pup.",
@@ -54,7 +54,7 @@ class OpenAITextEmbeddingModel extends AbstractModel_js_1.AbstractModel {
54
54
  writable: true,
55
55
  value: "openai"
56
56
  });
57
- Object.defineProperty(this, "maxTextsPerCall", {
57
+ Object.defineProperty(this, "maxValuesPerCall", {
58
58
  enumerable: true,
59
59
  configurable: true,
60
60
  writable: true,
@@ -115,8 +115,8 @@ class OpenAITextEmbeddingModel extends AbstractModel_js_1.AbstractModel {
115
115
  return {};
116
116
  }
117
117
  generateEmbeddingResponse(texts, options) {
118
- if (texts.length > this.maxTextsPerCall) {
119
- throw new Error(`The OpenAI embedding API only supports ${this.maxTextsPerCall} texts per API call.`);
118
+ if (texts.length > this.maxValuesPerCall) {
119
+ throw new Error(`The OpenAI embedding API only supports ${this.maxValuesPerCall} texts per API call.`);
120
120
  }
121
121
  return this.callAPI(texts, options);
122
122
  }
@@ -2,7 +2,7 @@ import z from "zod";
2
2
  import { AbstractModel } from "../../model-function/AbstractModel.js";
3
3
  import { ModelFunctionOptions } from "../../model-function/ModelFunctionOptions.js";
4
4
  import { ApiConfiguration } from "../../core/api/ApiConfiguration.js";
5
- import { TextEmbeddingModel, TextEmbeddingModelSettings } from "../../model-function/embed-text/TextEmbeddingModel.js";
5
+ import { EmbeddingModel, EmbeddingModelSettings } from "../../model-function/embed/EmbeddingModel.js";
6
6
  import { TikTokenTokenizer } from "./TikTokenTokenizer.js";
7
7
  export declare const OPENAI_TEXT_EMBEDDING_MODELS: {
8
8
  "text-embedding-ada-002": {
@@ -17,7 +17,7 @@ export declare const calculateOpenAIEmbeddingCostInMillicents: ({ model, respons
17
17
  model: OpenAITextEmbeddingModelType;
18
18
  responses: OpenAITextEmbeddingResponse[];
19
19
  }) => number;
20
- export interface OpenAITextEmbeddingModelSettings extends TextEmbeddingModelSettings {
20
+ export interface OpenAITextEmbeddingModelSettings extends EmbeddingModelSettings {
21
21
  api?: ApiConfiguration;
22
22
  model: OpenAITextEmbeddingModelType;
23
23
  isUserIdForwardingEnabled?: boolean;
@@ -28,7 +28,7 @@ export interface OpenAITextEmbeddingModelSettings extends TextEmbeddingModelSett
28
28
  * @see https://platform.openai.com/docs/api-reference/embeddings
29
29
  *
30
30
  * @example
31
- * const embeddings = await embedTexts(
31
+ * const embeddings = await embedMany(
32
32
  * new OpenAITextEmbeddingModel({ model: "text-embedding-ada-002" }),
33
33
  * [
34
34
  * "At first, Nox didn't know what to do with the pup.",
@@ -36,11 +36,11 @@ export interface OpenAITextEmbeddingModelSettings extends TextEmbeddingModelSett
36
36
  * ]
37
37
  * );
38
38
  */
39
- export declare class OpenAITextEmbeddingModel extends AbstractModel<OpenAITextEmbeddingModelSettings> implements TextEmbeddingModel<OpenAITextEmbeddingResponse, OpenAITextEmbeddingModelSettings> {
39
+ export declare class OpenAITextEmbeddingModel extends AbstractModel<OpenAITextEmbeddingModelSettings> implements EmbeddingModel<string, OpenAITextEmbeddingResponse, OpenAITextEmbeddingModelSettings> {
40
40
  constructor(settings: OpenAITextEmbeddingModelSettings);
41
41
  readonly provider: "openai";
42
42
  get modelName(): "text-embedding-ada-002";
43
- readonly maxTextsPerCall = 2048;
43
+ readonly maxValuesPerCall = 2048;
44
44
  readonly embeddingDimensions: number;
45
45
  readonly tokenizer: TikTokenTokenizer;
46
46
  readonly contextWindowSize: number;
@@ -29,7 +29,7 @@ export const calculateOpenAIEmbeddingCostInMillicents = ({ model, responses, })
29
29
  * @see https://platform.openai.com/docs/api-reference/embeddings
30
30
  *
31
31
  * @example
32
- * const embeddings = await embedTexts(
32
+ * const embeddings = await embedMany(
33
33
  * new OpenAITextEmbeddingModel({ model: "text-embedding-ada-002" }),
34
34
  * [
35
35
  * "At first, Nox didn't know what to do with the pup.",
@@ -46,7 +46,7 @@ export class OpenAITextEmbeddingModel extends AbstractModel {
46
46
  writable: true,
47
47
  value: "openai"
48
48
  });
49
- Object.defineProperty(this, "maxTextsPerCall", {
49
+ Object.defineProperty(this, "maxValuesPerCall", {
50
50
  enumerable: true,
51
51
  configurable: true,
52
52
  writable: true,
@@ -107,8 +107,8 @@ export class OpenAITextEmbeddingModel extends AbstractModel {
107
107
  return {};
108
108
  }
109
109
  generateEmbeddingResponse(texts, options) {
110
- if (texts.length > this.maxTextsPerCall) {
111
- throw new Error(`The OpenAI embedding API only supports ${this.maxTextsPerCall} texts per API call.`);
110
+ if (texts.length > this.maxValuesPerCall) {
111
+ throw new Error(`The OpenAI embedding API only supports ${this.maxValuesPerCall} texts per API call.`);
112
112
  }
113
113
  return this.callAPI(texts, options);
114
114
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "modelfusion",
3
3
  "description": "Build multimodal applications, chatbots, and agents with JavaScript and TypeScript.",
4
- "version": "0.36.0",
4
+ "version": "0.38.0",
5
5
  "author": "Lars Grammel",
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -73,7 +73,7 @@
73
73
  "husky": "^8.0.3",
74
74
  "lint-staged": "14.0.1",
75
75
  "prettier": "3.0.3",
76
- "rimraf": "5.0.1",
76
+ "rimraf": "5.0.5",
77
77
  "typescript": "5.2.2",
78
78
  "vitest": "^0.34.5"
79
79
  },
@@ -1,5 +1,5 @@
1
1
  import { Vector } from "../core/Vector.js";
2
- export interface VectorIndex<DATA, INDEX> {
2
+ export interface VectorIndex<DATA, INDEX, FILTER> {
3
3
  upsertMany(data: Array<{
4
4
  id: string;
5
5
  vector: Vector;
@@ -9,6 +9,7 @@ export interface VectorIndex<DATA, INDEX> {
9
9
  queryVector: Vector;
10
10
  maxResults: number;
11
11
  similarityThreshold?: number;
12
+ filter?: FILTER;
12
13
  }): Promise<Array<{
13
14
  id: string;
14
15
  data: DATA;
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VectorIndexRetriever = void 0;
4
- const embedText_js_1 = require("../model-function/embed-text/embedText.cjs");
4
+ const embed_js_1 = require("../model-function/embed/embed.cjs");
5
5
  class VectorIndexRetriever {
6
- constructor({ vectorIndex, embeddingModel, maxResults, similarityThreshold, }) {
6
+ constructor({ vectorIndex, embeddingModel, maxResults, similarityThreshold, filter, }) {
7
7
  Object.defineProperty(this, "vectorIndex", {
8
8
  enumerable: true,
9
9
  configurable: true,
@@ -27,6 +27,7 @@ class VectorIndexRetriever {
27
27
  this.settings = {
28
28
  maxResults,
29
29
  similarityThreshold,
30
+ filter,
30
31
  };
31
32
  }
32
33
  async retrieve(query, options) {
@@ -37,7 +38,7 @@ class VectorIndexRetriever {
37
38
  run: options.run,
38
39
  });
39
40
  }
40
- const embedding = await (0, embedText_js_1.embedText)(this.embeddingModel, query, {
41
+ const embedding = await (0, embed_js_1.embed)(this.embeddingModel, query, {
41
42
  functionId: options?.functionId,
42
43
  run: options?.run,
43
44
  });
@@ -45,6 +46,7 @@ class VectorIndexRetriever {
45
46
  queryVector: embedding,
46
47
  maxResults: this.settings.maxResults ?? 1,
47
48
  similarityThreshold: this.settings.similarityThreshold,
49
+ filter: this.settings?.filter,
48
50
  });
49
51
  return queryResult.map((item) => item.data);
50
52
  }
@@ -1,19 +1,20 @@
1
+ import { EmbeddingModel, EmbeddingModelSettings } from "../model-function/embed/EmbeddingModel.js";
1
2
  import { ModelFunctionOptions } from "../model-function/ModelFunctionOptions.js";
2
- import { TextEmbeddingModel, TextEmbeddingModelSettings } from "../model-function/embed-text/TextEmbeddingModel.js";
3
3
  import { Retriever, RetrieverSettings } from "../retriever/Retriever.js";
4
4
  import { VectorIndex } from "./VectorIndex.js";
5
- export interface VectorIndexRetrieverSettings {
5
+ export interface VectorIndexRetrieverSettings<FILTER> {
6
6
  maxResults?: number;
7
7
  similarityThreshold?: number;
8
+ filter?: FILTER;
8
9
  }
9
- export declare class VectorIndexRetriever<OBJECT, INDEX> implements Retriever<OBJECT, string, VectorIndexRetrieverSettings> {
10
+ export declare class VectorIndexRetriever<OBJECT, VALUE, INDEX, FILTER> implements Retriever<OBJECT, VALUE, VectorIndexRetrieverSettings<FILTER>> {
10
11
  private readonly vectorIndex;
11
12
  private readonly embeddingModel;
12
13
  private readonly settings;
13
- constructor({ vectorIndex, embeddingModel, maxResults, similarityThreshold, }: {
14
- vectorIndex: VectorIndex<OBJECT, INDEX>;
15
- embeddingModel: TextEmbeddingModel<unknown, TextEmbeddingModelSettings>;
16
- } & VectorIndexRetrieverSettings);
17
- retrieve(query: string, options?: ModelFunctionOptions<RetrieverSettings>): Promise<OBJECT[]>;
18
- withSettings(additionalSettings: Partial<VectorIndexRetrieverSettings>): this;
14
+ constructor({ vectorIndex, embeddingModel, maxResults, similarityThreshold, filter, }: {
15
+ vectorIndex: VectorIndex<OBJECT, INDEX, FILTER>;
16
+ embeddingModel: EmbeddingModel<VALUE, unknown, EmbeddingModelSettings>;
17
+ } & VectorIndexRetrieverSettings<FILTER>);
18
+ retrieve(query: VALUE, options?: ModelFunctionOptions<RetrieverSettings>): Promise<OBJECT[]>;
19
+ withSettings(additionalSettings: Partial<VectorIndexRetrieverSettings<FILTER>>): this;
19
20
  }
@@ -1,6 +1,6 @@
1
- import { embedText } from "../model-function/embed-text/embedText.js";
1
+ import { embed } from "../model-function/embed/embed.js";
2
2
  export class VectorIndexRetriever {
3
- constructor({ vectorIndex, embeddingModel, maxResults, similarityThreshold, }) {
3
+ constructor({ vectorIndex, embeddingModel, maxResults, similarityThreshold, filter, }) {
4
4
  Object.defineProperty(this, "vectorIndex", {
5
5
  enumerable: true,
6
6
  configurable: true,
@@ -24,6 +24,7 @@ export class VectorIndexRetriever {
24
24
  this.settings = {
25
25
  maxResults,
26
26
  similarityThreshold,
27
+ filter,
27
28
  };
28
29
  }
29
30
  async retrieve(query, options) {
@@ -34,7 +35,7 @@ export class VectorIndexRetriever {
34
35
  run: options.run,
35
36
  });
36
37
  }
37
- const embedding = await embedText(this.embeddingModel, query, {
38
+ const embedding = await embed(this.embeddingModel, query, {
38
39
  functionId: options?.functionId,
39
40
  run: options?.run,
40
41
  });
@@ -42,6 +43,7 @@ export class VectorIndexRetriever {
42
43
  queryVector: embedding,
43
44
  maxResults: this.settings.maxResults ?? 1,
44
45
  similarityThreshold: this.settings.similarityThreshold,
46
+ filter: this.settings?.filter,
45
47
  });
46
48
  return queryResult.map((item) => item.data);
47
49
  }
@@ -40,8 +40,9 @@ class MemoryVectorIndex {
40
40
  this.entries.set(entry.id, entry);
41
41
  }
42
42
  }
43
- async queryByVector({ queryVector, similarityThreshold, maxResults, }) {
43
+ async queryByVector({ queryVector, similarityThreshold, maxResults, filter, }) {
44
44
  const results = [...this.entries.values()]
45
+ .filter((value) => filter?.(value.data) ?? true)
45
46
  .map((entry) => ({
46
47
  id: entry.id,
47
48
  similarity: (0, cosineSimilarity_js_1.cosineSimilarity)(entry.vector, queryVector),
@@ -6,7 +6,7 @@ import { VectorIndex } from "../VectorIndex.js";
6
6
  * a small number of entries and don't want to set up a real database, e.g. for conversational memory
7
7
  * that does not need to be persisted.
8
8
  */
9
- export declare class MemoryVectorIndex<DATA> implements VectorIndex<DATA, MemoryVectorIndex<DATA>> {
9
+ export declare class MemoryVectorIndex<DATA> implements VectorIndex<DATA, MemoryVectorIndex<DATA>, (value: DATA) => boolean> {
10
10
  static deserialize<DATA>({ serializedData, schema, }: {
11
11
  serializedData: string;
12
12
  schema?: z.ZodSchema<DATA>;
@@ -17,10 +17,11 @@ export declare class MemoryVectorIndex<DATA> implements VectorIndex<DATA, Memory
17
17
  vector: Vector;
18
18
  data: DATA;
19
19
  }>): Promise<void>;
20
- queryByVector({ queryVector, similarityThreshold, maxResults, }: {
20
+ queryByVector({ queryVector, similarityThreshold, maxResults, filter, }: {
21
21
  queryVector: Vector;
22
22
  maxResults: number;
23
23
  similarityThreshold?: number;
24
+ filter?: (value: DATA) => boolean;
24
25
  }): Promise<Array<{
25
26
  id: string;
26
27
  data: DATA;
@@ -34,8 +34,9 @@ export class MemoryVectorIndex {
34
34
  this.entries.set(entry.id, entry);
35
35
  }
36
36
  }
37
- async queryByVector({ queryVector, similarityThreshold, maxResults, }) {
37
+ async queryByVector({ queryVector, similarityThreshold, maxResults, filter, }) {
38
38
  const results = [...this.entries.values()]
39
+ .filter((value) => filter?.(value.data) ?? true)
39
40
  .map((entry) => ({
40
41
  id: entry.id,
41
42
  similarity: cosineSimilarity(entry.vector, queryVector),
@@ -2,7 +2,7 @@ import { VectorOperationsApi } from "@pinecone-database/pinecone/dist/pinecone-g
2
2
  import { z } from "zod";
3
3
  import { Vector } from "../../core/Vector.js";
4
4
  import { VectorIndex } from "../VectorIndex.js";
5
- export declare class PineconeVectorIndex<DATA extends object | undefined> implements VectorIndex<DATA, PineconeVectorIndex<DATA>> {
5
+ export declare class PineconeVectorIndex<DATA extends object | undefined> implements VectorIndex<DATA, PineconeVectorIndex<DATA>, null> {
6
6
  readonly index: VectorOperationsApi;
7
7
  readonly namespace?: string;
8
8
  readonly schema: z.ZodSchema<DATA>;
@@ -2,10 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.upsertIntoVectorIndex = void 0;
4
4
  const nanoid_1 = require("nanoid");
5
- const embedText_js_1 = require("../model-function/embed-text/embedText.cjs");
5
+ const embed_js_1 = require("../model-function/embed/embed.cjs");
6
6
  async function upsertIntoVectorIndex({ vectorIndex, embeddingModel, generateId = nanoid_1.nanoid, objects, getValueToEmbed, getId, }, options) {
7
7
  // many embedding models support bulk embedding, so we first embed all texts:
8
- const embeddings = await (0, embedText_js_1.embedTexts)(embeddingModel, objects.map(getValueToEmbed), options);
8
+ const embeddings = await (0, embed_js_1.embedMany)(embeddingModel, objects.map(getValueToEmbed), options);
9
9
  await vectorIndex.upsertMany(objects.map((object, i) => ({
10
10
  id: getId?.(object, i) ?? generateId(),
11
11
  vector: embeddings[i],
@@ -1,11 +1,11 @@
1
1
  import { ModelFunctionOptions } from "../model-function/ModelFunctionOptions.js";
2
- import { TextEmbeddingModel, TextEmbeddingModelSettings } from "../model-function/embed-text/TextEmbeddingModel.js";
2
+ import { EmbeddingModel, EmbeddingModelSettings } from "../model-function/embed/EmbeddingModel.js";
3
3
  import { VectorIndex } from "./VectorIndex.js";
4
- export declare function upsertIntoVectorIndex<OBJECT, SETTINGS extends TextEmbeddingModelSettings>({ vectorIndex, embeddingModel, generateId, objects, getValueToEmbed, getId, }: {
5
- vectorIndex: VectorIndex<OBJECT, unknown>;
6
- embeddingModel: TextEmbeddingModel<unknown, SETTINGS>;
4
+ export declare function upsertIntoVectorIndex<VALUE, OBJECT, SETTINGS extends EmbeddingModelSettings>({ vectorIndex, embeddingModel, generateId, objects, getValueToEmbed, getId, }: {
5
+ vectorIndex: VectorIndex<OBJECT, unknown, unknown>;
6
+ embeddingModel: EmbeddingModel<VALUE, unknown, SETTINGS>;
7
7
  generateId?: () => string;
8
8
  objects: OBJECT[];
9
- getValueToEmbed: (object: OBJECT, index: number) => string;
9
+ getValueToEmbed: (object: OBJECT, index: number) => VALUE;
10
10
  getId?: (object: OBJECT, index: number) => string | undefined;
11
11
  }, options?: ModelFunctionOptions<SETTINGS>): Promise<void>;
@@ -1,8 +1,8 @@
1
1
  import { nanoid as createId } from "nanoid";
2
- import { embedTexts } from "../model-function/embed-text/embedText.js";
2
+ import { embedMany } from "../model-function/embed/embed.js";
3
3
  export async function upsertIntoVectorIndex({ vectorIndex, embeddingModel, generateId = createId, objects, getValueToEmbed, getId, }, options) {
4
4
  // many embedding models support bulk embedding, so we first embed all texts:
5
- const embeddings = await embedTexts(embeddingModel, objects.map(getValueToEmbed), options);
5
+ const embeddings = await embedMany(embeddingModel, objects.map(getValueToEmbed), options);
6
6
  await vectorIndex.upsertMany(objects.map((object, i) => ({
7
7
  id: getId?.(object, i) ?? generateId(),
8
8
  vector: embeddings[i],
@@ -1,21 +0,0 @@
1
- import { Vector } from "../../core/Vector.js";
2
- import { BaseModelCallFinishedEvent, BaseModelCallStartedEvent } from "../ModelCallEvent.js";
3
- export interface TextEmbeddingStartedEvent extends BaseModelCallStartedEvent {
4
- functionType: "text-embedding";
5
- input: string | Array<string>;
6
- }
7
- export type TextEmbeddingFinishedEventResult = {
8
- status: "success";
9
- response: unknown;
10
- output: Vector | Array<Vector>;
11
- } | {
12
- status: "error";
13
- error: unknown;
14
- } | {
15
- status: "abort";
16
- };
17
- export interface TextEmbeddingFinishedEvent extends BaseModelCallFinishedEvent {
18
- functionType: "text-embedding";
19
- input: string | Array<string>;
20
- result: TextEmbeddingFinishedEventResult;
21
- }
@@ -1,21 +0,0 @@
1
- import { Vector } from "../../core/Vector.js";
2
- import { ModelFunctionOptions } from "../ModelFunctionOptions.js";
3
- import { Model, ModelSettings } from "../Model.js";
4
- export interface TextEmbeddingModelSettings extends ModelSettings {
5
- }
6
- export interface TextEmbeddingModel<RESPONSE, SETTINGS extends TextEmbeddingModelSettings> extends Model<SETTINGS> {
7
- /**
8
- * The limit of tokens for a single text.
9
- */
10
- readonly contextWindowSize: number | undefined;
11
- /**
12
- * The size of the embedding vector.
13
- */
14
- readonly embeddingDimensions: number | undefined;
15
- /**
16
- * Limit of how many texts can be sent in a single API call.
17
- */
18
- readonly maxTextsPerCall: number | undefined;
19
- generateEmbeddingResponse(texts: string[], options?: ModelFunctionOptions<SETTINGS>): PromiseLike<RESPONSE>;
20
- extractEmbeddings(response: RESPONSE): Vector[];
21
- }
@@ -1,27 +0,0 @@
1
- import { Vector } from "../../core/Vector.js";
2
- import { ModelFunctionOptions } from "../ModelFunctionOptions.js";
3
- import { ModelFunctionPromise } from "../executeCall.js";
4
- import { TextEmbeddingModel, TextEmbeddingModelSettings } from "./TextEmbeddingModel.js";
5
- /**
6
- * Generate embeddings for multiple texts.
7
- *
8
- * @example
9
- * const embeddings = await embedTexts(
10
- * new OpenAITextEmbeddingModel(...),
11
- * [
12
- * "At first, Nox didn't know what to do with the pup.",
13
- * "He keenly observed and absorbed everything around him, from the birds in the sky to the trees in the forest.",
14
- * ]
15
- * );
16
- */
17
- export declare function embedTexts<RESPONSE, SETTINGS extends TextEmbeddingModelSettings>(model: TextEmbeddingModel<RESPONSE, SETTINGS>, texts: string[], options?: ModelFunctionOptions<SETTINGS>): ModelFunctionPromise<Vector[], RESPONSE[]>;
18
- /**
19
- * Generate an embedding for a single text.
20
- *
21
- * @example
22
- * const embedding = await embedText(
23
- * new OpenAITextEmbeddingModel(...),
24
- * "At first, Nox didn't know what to do with the pup."
25
- * );
26
- */
27
- export declare function embedText<RESPONSE, SETTINGS extends TextEmbeddingModelSettings>(model: TextEmbeddingModel<RESPONSE, SETTINGS>, text: string, options?: ModelFunctionOptions<SETTINGS>): ModelFunctionPromise<Vector, RESPONSE[]>;