modelfusion 0.36.0 → 0.37.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/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.37.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;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VectorIndexRetriever = void 0;
4
4
  const embedText_js_1 = require("../model-function/embed-text/embedText.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,6 +38,11 @@ class VectorIndexRetriever {
37
38
  run: options.run,
38
39
  });
39
40
  }
41
+ let filter = this.settings?.filter;
42
+ if (typeof query === "object") {
43
+ filter = query.filter ?? filter; // use filter from query if available
44
+ query = query.text;
45
+ }
40
46
  const embedding = await (0, embedText_js_1.embedText)(this.embeddingModel, query, {
41
47
  functionId: options?.functionId,
42
48
  run: options?.run,
@@ -45,6 +51,7 @@ class VectorIndexRetriever {
45
51
  queryVector: embedding,
46
52
  maxResults: this.settings.maxResults ?? 1,
47
53
  similarityThreshold: this.settings.similarityThreshold,
54
+ filter,
48
55
  });
49
56
  return queryResult.map((item) => item.data);
50
57
  }
@@ -2,18 +2,24 @@ import { ModelFunctionOptions } from "../model-function/ModelFunctionOptions.js"
2
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
+ type VectorIndexRetrieverQuery<FILTER> = string | {
11
+ text: string;
12
+ filter?: FILTER;
13
+ };
14
+ export declare class VectorIndexRetriever<OBJECT, INDEX, FILTER> implements Retriever<OBJECT, VectorIndexRetrieverQuery<FILTER>, VectorIndexRetrieverSettings<FILTER>> {
10
15
  private readonly vectorIndex;
11
16
  private readonly embeddingModel;
12
17
  private readonly settings;
13
- constructor({ vectorIndex, embeddingModel, maxResults, similarityThreshold, }: {
14
- vectorIndex: VectorIndex<OBJECT, INDEX>;
18
+ constructor({ vectorIndex, embeddingModel, maxResults, similarityThreshold, filter, }: {
19
+ vectorIndex: VectorIndex<OBJECT, INDEX, FILTER>;
15
20
  embeddingModel: TextEmbeddingModel<unknown, TextEmbeddingModelSettings>;
16
- } & VectorIndexRetrieverSettings);
17
- retrieve(query: string, options?: ModelFunctionOptions<RetrieverSettings>): Promise<OBJECT[]>;
18
- withSettings(additionalSettings: Partial<VectorIndexRetrieverSettings>): this;
21
+ } & VectorIndexRetrieverSettings<FILTER>);
22
+ retrieve(query: VectorIndexRetrieverQuery<FILTER>, options?: ModelFunctionOptions<RetrieverSettings>): Promise<OBJECT[]>;
23
+ withSettings(additionalSettings: Partial<VectorIndexRetrieverSettings<FILTER>>): this;
19
24
  }
25
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { embedText } from "../model-function/embed-text/embedText.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,6 +35,11 @@ export class VectorIndexRetriever {
34
35
  run: options.run,
35
36
  });
36
37
  }
38
+ let filter = this.settings?.filter;
39
+ if (typeof query === "object") {
40
+ filter = query.filter ?? filter; // use filter from query if available
41
+ query = query.text;
42
+ }
37
43
  const embedding = await embedText(this.embeddingModel, query, {
38
44
  functionId: options?.functionId,
39
45
  run: options?.run,
@@ -42,6 +48,7 @@ export class VectorIndexRetriever {
42
48
  queryVector: embedding,
43
49
  maxResults: this.settings.maxResults ?? 1,
44
50
  similarityThreshold: this.settings.similarityThreshold,
51
+ filter,
45
52
  });
46
53
  return queryResult.map((item) => item.data);
47
54
  }
@@ -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,7 +2,7 @@ import { ModelFunctionOptions } from "../model-function/ModelFunctionOptions.js"
2
2
  import { TextEmbeddingModel, TextEmbeddingModelSettings } from "../model-function/embed-text/TextEmbeddingModel.js";
3
3
  import { VectorIndex } from "./VectorIndex.js";
4
4
  export declare function upsertIntoVectorIndex<OBJECT, SETTINGS extends TextEmbeddingModelSettings>({ vectorIndex, embeddingModel, generateId, objects, getValueToEmbed, getId, }: {
5
- vectorIndex: VectorIndex<OBJECT, unknown>;
5
+ vectorIndex: VectorIndex<OBJECT, unknown, unknown>;
6
6
  embeddingModel: TextEmbeddingModel<unknown, SETTINGS>;
7
7
  generateId?: () => string;
8
8
  objects: OBJECT[];