modelfusion 0.37.0 → 0.39.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 (66) hide show
  1. package/README.md +7 -8
  2. package/core/structure/JsonSchemaProducer.d.ts +9 -0
  3. package/core/structure/Schema.d.ts +1 -5
  4. package/core/structure/StructureDefinition.d.ts +2 -1
  5. package/core/structure/{UncheckedJsonSchemaSchema.cjs → UncheckedSchema.cjs} +3 -3
  6. package/core/structure/{UncheckedJsonSchemaSchema.d.ts → UncheckedSchema.d.ts} +3 -3
  7. package/core/structure/{UncheckedJsonSchemaSchema.js → UncheckedSchema.js} +1 -1
  8. package/core/structure/{UncheckedJsonSchemaStructureDefinition.cjs → UncheckedStructureDefinition.cjs} +5 -5
  9. package/core/structure/{UncheckedJsonSchemaStructureDefinition.d.ts → UncheckedStructureDefinition.d.ts} +3 -3
  10. package/core/structure/{UncheckedJsonSchemaStructureDefinition.js → UncheckedStructureDefinition.js} +3 -3
  11. package/core/structure/ZodStructureDefinition.d.ts +2 -2
  12. package/core/structure/index.cjs +3 -2
  13. package/core/structure/index.d.ts +3 -2
  14. package/core/structure/index.js +3 -2
  15. package/event-source/index.cjs +1 -0
  16. package/event-source/index.d.ts +1 -0
  17. package/event-source/index.js +1 -0
  18. package/event-source/readEventSource.cjs +27 -0
  19. package/event-source/readEventSource.d.ts +7 -0
  20. package/event-source/readEventSource.js +20 -0
  21. package/event-source/readEventSourceStream.cjs +6 -1
  22. package/event-source/readEventSourceStream.d.ts +2 -1
  23. package/event-source/readEventSourceStream.js +6 -1
  24. package/model-function/ModelCallEvent.d.ts +3 -3
  25. package/model-function/embed/EmbeddingEvent.d.ts +21 -0
  26. package/model-function/embed/EmbeddingModel.cjs +2 -0
  27. package/model-function/embed/EmbeddingModel.d.ts +17 -0
  28. package/model-function/embed/EmbeddingModel.js +1 -0
  29. package/model-function/{embed-text/embedText.cjs → embed/embed.cjs} +22 -22
  30. package/model-function/embed/embed.d.ts +27 -0
  31. package/model-function/{embed-text/embedText.js → embed/embed.js} +19 -19
  32. package/model-function/index.cjs +3 -3
  33. package/model-function/index.d.ts +3 -3
  34. package/model-function/index.js +3 -3
  35. package/model-provider/cohere/CohereTextEmbeddingModel.cjs +5 -5
  36. package/model-provider/cohere/CohereTextEmbeddingModel.d.ts +6 -6
  37. package/model-provider/cohere/CohereTextEmbeddingModel.js +5 -5
  38. package/model-provider/huggingface/HuggingFaceTextEmbeddingModel.cjs +5 -5
  39. package/model-provider/huggingface/HuggingFaceTextEmbeddingModel.d.ts +6 -6
  40. package/model-provider/huggingface/HuggingFaceTextEmbeddingModel.js +5 -5
  41. package/model-provider/llamacpp/LlamaCppTextEmbeddingModel.cjs +4 -4
  42. package/model-provider/llamacpp/LlamaCppTextEmbeddingModel.d.ts +5 -5
  43. package/model-provider/llamacpp/LlamaCppTextEmbeddingModel.js +4 -4
  44. package/model-provider/openai/OpenAICostCalculator.cjs +1 -1
  45. package/model-provider/openai/OpenAICostCalculator.js +1 -1
  46. package/model-provider/openai/OpenAITextEmbeddingModel.cjs +4 -4
  47. package/model-provider/openai/OpenAITextEmbeddingModel.d.ts +5 -5
  48. package/model-provider/openai/OpenAITextEmbeddingModel.js +4 -4
  49. package/package.json +1 -1
  50. package/tool/Tool.d.ts +3 -2
  51. package/vector-index/VectorIndexRetriever.cjs +3 -8
  52. package/vector-index/VectorIndexRetriever.d.ts +4 -9
  53. package/vector-index/VectorIndexRetriever.js +3 -8
  54. package/vector-index/memory/MemoryVectorIndex.cjs +15 -8
  55. package/vector-index/memory/MemoryVectorIndex.d.ts +2 -2
  56. package/vector-index/memory/MemoryVectorIndex.js +15 -8
  57. package/vector-index/upsertIntoVectorIndex.cjs +2 -2
  58. package/vector-index/upsertIntoVectorIndex.d.ts +4 -4
  59. package/vector-index/upsertIntoVectorIndex.js +2 -2
  60. package/model-function/embed-text/TextEmbeddingEvent.d.ts +0 -21
  61. package/model-function/embed-text/TextEmbeddingModel.d.ts +0 -21
  62. package/model-function/embed-text/embedText.d.ts +0 -27
  63. /package/{model-function/embed-text/TextEmbeddingEvent.cjs → core/structure/JsonSchemaProducer.cjs} +0 -0
  64. /package/{model-function/embed-text/TextEmbeddingEvent.js → core/structure/JsonSchemaProducer.js} +0 -0
  65. /package/model-function/{embed-text/TextEmbeddingModel.cjs → embed/EmbeddingEvent.cjs} +0 -0
  66. /package/model-function/{embed-text/TextEmbeddingModel.js → embed/EmbeddingEvent.js} +0 -0
@@ -1,5 +1,11 @@
1
+ import SecureJSON from "secure-json-parse";
1
2
  import z from "zod";
2
3
  import { cosineSimilarity } from "../../util/cosineSimilarity.js";
4
+ const jsonDataSchema = z.array(z.object({
5
+ id: z.string(),
6
+ vector: z.array(z.number()),
7
+ data: z.unknown(),
8
+ }));
3
9
  /**
4
10
  * A very simple vector index that stores all entries in memory. Useful when you only have
5
11
  * a small number of entries and don't want to set up a real database, e.g. for conversational memory
@@ -15,15 +21,16 @@ export class MemoryVectorIndex {
15
21
  });
16
22
  }
17
23
  static async deserialize({ serializedData, schema, }) {
18
- let json = JSON.parse(serializedData);
24
+ // validate the outer structure:
25
+ const json = jsonDataSchema.parse(SecureJSON.parse(serializedData));
19
26
  if (schema != null) {
20
- json = z
21
- .array(z.object({
22
- id: z.string(),
23
- vector: z.array(z.number()),
24
- data: schema,
25
- }))
26
- .parse(json);
27
+ // when a schema is provided, validate all entries:
28
+ for (const entry of json) {
29
+ const validationResult = schema.validate(entry.data);
30
+ if (!validationResult.success) {
31
+ throw validationResult.error;
32
+ }
33
+ }
27
34
  }
28
35
  const vectorIndex = new MemoryVectorIndex();
29
36
  vectorIndex.upsertMany(json);
@@ -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, }: {
4
+ export declare function upsertIntoVectorIndex<VALUE, OBJECT, SETTINGS extends EmbeddingModelSettings>({ vectorIndex, embeddingModel, generateId, objects, getValueToEmbed, getId, }: {
5
5
  vectorIndex: VectorIndex<OBJECT, unknown, unknown>;
6
- embeddingModel: TextEmbeddingModel<unknown, SETTINGS>;
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[]>;