diff --git a/packages/core/src/config/types/generative.ts b/packages/core/src/config/types/generative.ts index 3b3b7363..d05fd355 100644 --- a/packages/core/src/config/types/generative.ts +++ b/packages/core/src/config/types/generative.ts @@ -115,6 +115,17 @@ export type GenerativeContextualAIConfig = { avoidCommentary?: boolean; }; +export type GenerativeMetaConfig = { + baseURL?: string; + model?: string; + temperature?: number; + topP?: number; + maxTokens?: number; + frequencyPenalty?: number; + presencePenalty?: number; + reasoningEffort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh'; +}; + export type GenerativeConfig = | GenerativeAnthropicConfig | GenerativeAnyscaleConfig @@ -125,6 +136,7 @@ export type GenerativeConfig = | GenerativeDatabricksConfig | GenerativeGoogleConfig | GenerativeFriendliAIConfig + | GenerativeMetaConfig | GenerativeMistralConfig | GenerativeOllamaConfig | GenerativeOpenAIConfig @@ -151,6 +163,8 @@ export type GenerativeConfigType = G extends 'generative-anthropic' ? GenerativeGoogleConfig : G extends 'generative-friendliai' ? GenerativeFriendliAIConfig + : G extends 'generative-meta' + ? GenerativeMetaConfig : G extends 'generative-mistral' ? GenerativeMistralConfig : G extends 'generative-ollama' @@ -178,6 +192,7 @@ export type GenerativeSearch = | 'generative-databricks' | 'generative-google' | 'generative-friendliai' + | 'generative-meta' | 'generative-mistral' | 'generative-ollama' | 'generative-openai' diff --git a/packages/core/src/configure/generative.ts b/packages/core/src/configure/generative.ts index 7292174b..076f0be4 100644 --- a/packages/core/src/configure/generative.ts +++ b/packages/core/src/configure/generative.ts @@ -7,6 +7,7 @@ import { GenerativeContextualAIConfigCreate, GenerativeDatabricksConfigCreate, GenerativeFriendliAIConfigCreate, + GenerativeMetaConfigCreate, GenerativeMistralConfigCreate, GenerativeNvidiaConfigCreate, GenerativeOllamaConfigCreate, @@ -24,6 +25,7 @@ import { GenerativeDatabricksConfig, GenerativeFriendliAIConfig, GenerativeGoogleConfig, + GenerativeMetaConfig, GenerativeMistralConfig, GenerativeNvidiaConfig, GenerativeOllamaConfig, @@ -184,6 +186,22 @@ export default { config, }; }, + /** + * Create a `ModuleConfig<'generative-meta', GenerativeMetaConfig | undefined>` object for use when performing AI generation using the `generative-meta` module. + * + * See the [documentation](https://weaviate.io/developers/weaviate/model-providers/meta/generative) for detailed usage. + * + * @param {GenerativeMetaConfigCreate} [config] The configuration for the `generative-meta` module. + * @returns {ModuleConfig<'generative-meta', GenerativeMetaConfig | undefined>} The configuration object. + */ + meta( + config?: GenerativeMetaConfigCreate + ): ModuleConfig<'generative-meta', GenerativeMetaConfig | undefined> { + return { + name: 'generative-meta', + config, + }; + }, /** * Create a `ModuleConfig<'generative-mistral', GenerativeMistralConfig | undefined>` object for use when performing AI generation using the `generative-mistral` module. * diff --git a/packages/core/src/configure/types/generative.ts b/packages/core/src/configure/types/generative.ts index 0de8fd86..d920ced7 100644 --- a/packages/core/src/configure/types/generative.ts +++ b/packages/core/src/configure/types/generative.ts @@ -4,6 +4,7 @@ import { GenerativeAnyscaleConfig, GenerativeDatabricksConfig, GenerativeFriendliAIConfig, + GenerativeMetaConfig, GenerativeMistralConfig, GenerativeNvidiaConfig, GenerativeOllamaConfig, @@ -44,6 +45,8 @@ export type GenerativeDatabricksConfigCreate = GenerativeDatabricksConfig; export type GenerativeFriendliAIConfigCreate = GenerativeFriendliAIConfig; +export type GenerativeMetaConfigCreate = GenerativeMetaConfig; + export type GenerativeMistralConfigCreate = GenerativeMistralConfig; export type GenerativeNvidiaConfigCreate = GenerativeNvidiaConfig; @@ -76,6 +79,7 @@ export type GenerativeConfigCreate = | GenerativeContextualAIConfigCreate | GenerativeDatabricksConfigCreate | GenerativeFriendliAIConfigCreate + | GenerativeMetaConfigCreate | GenerativeMistralConfigCreate | GenerativeNvidiaConfigCreate | GenerativeOllamaConfigCreate @@ -99,6 +103,8 @@ export type GenerativeConfigCreateType = G extends 'generative-anthropic' ? GenerativeDatabricksConfigCreate : G extends 'generative-friendliai' ? GenerativeFriendliAIConfigCreate + : G extends 'generative-meta' + ? GenerativeMetaConfigCreate : G extends 'generative-mistral' ? GenerativeMistralConfigCreate : G extends 'generative-nvidia' diff --git a/packages/core/src/deserialize/index.ts b/packages/core/src/deserialize/index.ts index d0d69819..f6b70605 100644 --- a/packages/core/src/deserialize/index.ts +++ b/packages/core/src/deserialize/index.ts @@ -532,7 +532,10 @@ export class Deserialize { objects: verbose ? reply.objects.map((obj) => { return { - id: stringify(obj.uuid), + // stringify() throws on anything but a 16-byte uuid; the server + // can omit the uuid on a BatchDeleteObject, so guard it here + // instead of letting an opaque TypeError escape. + id: obj.uuid.length === 16 ? stringify(obj.uuid) : undefined, successful: obj.successful, error: obj.error, }; diff --git a/packages/core/src/types/data.ts b/packages/core/src/types/data.ts index 0a4d33be..763ab3a7 100644 --- a/packages/core/src/types/data.ts +++ b/packages/core/src/types/data.ts @@ -9,7 +9,8 @@ export type DataObject = { }; export type DeleteManyObject = { - id: string; + /** Undefined when the server returned no uuid for this object. */ + id?: string; successful: boolean; error?: string; }; diff --git a/packages/test/node/configure/unit.test.ts b/packages/test/node/configure/unit.test.ts index 6d2cbed9..c9737ea8 100644 --- a/packages/test/node/configure/unit.test.ts +++ b/packages/test/node/configure/unit.test.ts @@ -9,6 +9,7 @@ import { GenerativeDatabricksConfig, GenerativeFriendliAIConfig, GenerativeGoogleConfig, + GenerativeMetaConfig, GenerativeMistralConfig, GenerativeOllamaConfig, GenerativeOpenAIConfig, @@ -2072,6 +2073,40 @@ describe('Unit testing of the generative factory class', () => { }); }); + it('should create the correct GenerativeMetaConfig type with required & default values', () => { + const config = configure.generative.meta(); + expect(config).toEqual>({ + name: 'generative-meta', + config: undefined, + }); + }); + + it('should create the correct GenerativeMetaConfig type with all values', () => { + const config = configure.generative.meta({ + baseURL: 'base-url', + model: 'muse-spark-1.2', + temperature: 0.5, + topP: 0.9, + maxTokens: 100, + frequencyPenalty: 0.1, + presencePenalty: 0.2, + reasoningEffort: 'medium', + }); + expect(config).toEqual>({ + name: 'generative-meta', + config: { + baseURL: 'base-url', + model: 'muse-spark-1.2', + temperature: 0.5, + topP: 0.9, + maxTokens: 100, + frequencyPenalty: 0.1, + presencePenalty: 0.2, + reasoningEffort: 'medium', + }, + }); + }); + it('should create the correct GenerativeMistralConfig type with required & default values', () => { const config = configure.generative.mistral(); expect(config).toEqual>({ diff --git a/packages/test/node/deserialize/unit.test.ts b/packages/test/node/deserialize/unit.test.ts new file mode 100644 index 00000000..b18cad85 --- /dev/null +++ b/packages/test/node/deserialize/unit.test.ts @@ -0,0 +1,30 @@ +import { v4 } from 'uuid'; +import { describe, expect, it } from 'vitest'; +import { BatchDeleteReply } from '@weaviate/core/proto/v1/batch_delete'; +import { Deserialize } from '@weaviate/core/deserialize'; + +describe('Unit testing of Deserialize.deleteMany', () => { + const baseReply = (uuid: Uint8Array): BatchDeleteReply => ({ + took: 0, + failed: 0, + matches: 1, + successful: 1, + objects: [{ uuid, successful: true, error: '' }], + }); + + it('should stringify a well-formed 16-byte uuid', () => { + const id = v4(); + const uuid = Uint8Array.from(Buffer.from(id.replace(/-/g, ''), 'hex')); + + const result = Deserialize.deleteMany(baseReply(uuid), true); + + expect(result.objects![0].id).toBe(id); + }); + + it('should return an undefined id instead of throwing when the server omits the uuid', () => { + const result = Deserialize.deleteMany(baseReply(new Uint8Array(0)), true); + + expect(result.objects![0].id).toBeUndefined(); + expect(result.objects![0].successful).toBe(true); + }); +}); diff --git a/packages/test/node/journey.test.ts b/packages/test/node/journey.test.ts index 2ae96216..207955b5 100644 --- a/packages/test/node/journey.test.ts +++ b/packages/test/node/journey.test.ts @@ -13,7 +13,7 @@ describe('Journey testing of the client using a WCD cluster', () => { dateOfBirth: Date; }; - afterAll(() => client.collections.delete(collectionName)); + afterAll(() => client?.collections.delete(collectionName)); beforeAll(async () => { client = await weaviate.connectToWeaviateCloud(