From 76518b25e64c13db490cedd3c0c50f3c3e024439 Mon Sep 17 00:00:00 2001 From: Tommy Smith Date: Wed, 15 May 2024 10:32:36 +0100 Subject: [PATCH 1/3] Fix missing fields in Multi2VecPalm --- src/collections/config/types/vectorizer.ts | 3 +++ src/collections/configure/types/vectorizer.ts | 15 +-------------- src/collections/configure/unit.test.ts | 6 ++++++ 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/collections/config/types/vectorizer.ts b/src/collections/config/types/vectorizer.ts index 3b2538da..3a0c41bb 100644 --- a/src/collections/config/types/vectorizer.ts +++ b/src/collections/config/types/vectorizer.ts @@ -53,6 +53,9 @@ export type Multi2VecBindConfig = { export type Multi2VecPalmConfig = { projectId: string; + imageFields?: string[]; + textFields?: string[]; + videoFields?: string[]; location?: string; modelId?: string; dimensions?: number; diff --git a/src/collections/configure/types/vectorizer.ts b/src/collections/configure/types/vectorizer.ts index a8c529f3..1285685d 100644 --- a/src/collections/configure/types/vectorizer.ts +++ b/src/collections/configure/types/vectorizer.ts @@ -1,18 +1,5 @@ import { VectorIndexConfigCreateType, VectorIndexConfigUpdateType } from './vectorIndex.js'; -import { - Img2VecNeuralConfig, - ModuleConfig, - Multi2VecBindConfig, - Multi2VecClipConfig, - Multi2VecPalmConfig, - Ref2VecCentroidConfig, - Text2VecAWSConfig, - Text2VecAzureOpenAIConfig, - Text2VecCohereConfig, - VectorIndexType, - Vectorizer, - VectorizerConfigType, -} from '../../config/types/index.js'; +import { ModuleConfig, VectorIndexType, Vectorizer, VectorizerConfigType } from '../../config/types/index.js'; import { PrimitiveKeys } from '../../types/internal.js'; export type VectorizerCreateOptions = { diff --git a/src/collections/configure/unit.test.ts b/src/collections/configure/unit.test.ts index 6b047b0f..c86ed00c 100644 --- a/src/collections/configure/unit.test.ts +++ b/src/collections/configure/unit.test.ts @@ -354,6 +354,9 @@ describe('Unit testing of the vectorizer factory class', () => { it('should create the correct Multi2VecPalmConfig type with custom values', () => { const config = configure.vectorizer.multi2VecPalm('test', { projectId: 'project-id', + imageFields: ['field1', 'field2'], + textFields: ['field3', 'field4'], + videoFields: ['field5', 'field6'], location: 'location', modelId: 'model-id', dimensions: 256, @@ -369,6 +372,9 @@ describe('Unit testing of the vectorizer factory class', () => { name: 'multi2vec-palm', config: { projectId: 'project-id', + imageFields: ['field1', 'field2'], + textFields: ['field3', 'field4'], + videoFields: ['field5', 'field6'], location: 'location', modelId: 'model-id', dimensions: 256, From 3d1c879b8f1176f300cc14adee248fa85b004d46 Mon Sep 17 00:00:00 2001 From: Tommy Smith Date: Wed, 15 May 2024 11:11:54 +0100 Subject: [PATCH 2/3] Fix inputs to generative methods and add unit tests for them --- src/collections/config/types/generative.ts | 3 +- src/collections/configure/generative.ts | 56 +++++-- src/collections/configure/types/generative.ts | 47 ++++++ src/collections/configure/types/index.ts | 1 + src/collections/configure/unit.test.ts | 147 +++++++++++++++++- 5 files changed, 241 insertions(+), 13 deletions(-) create mode 100644 src/collections/configure/types/generative.ts diff --git a/src/collections/config/types/generative.ts b/src/collections/config/types/generative.ts index 34af876d..cc149292 100644 --- a/src/collections/config/types/generative.ts +++ b/src/collections/config/types/generative.ts @@ -1,7 +1,8 @@ type GenerativeOpenAIConfigBase = { + baseURL?: string; frequencyPenaltyProperty?: number; - presencePenaltyProperty?: number; maxTokensProperty?: number; + presencePenaltyProperty?: number; temperatureProperty?: number; topPProperty?: number; }; diff --git a/src/collections/configure/generative.ts b/src/collections/configure/generative.ts index 7695593b..abea28ca 100644 --- a/src/collections/configure/generative.ts +++ b/src/collections/configure/generative.ts @@ -5,6 +5,12 @@ import { GenerativePaLMConfig, ModuleConfig, } from '../config/types/index.js'; +import { + GenerativeAzureOpenAIConfigCreate, + GenerativeCohereConfigCreate, + GenerativeOpenAIConfigCreate, + GenerativePaLMConfigCreate, +} from '../index.js'; export default { /** @@ -12,15 +18,24 @@ export default { * * See the [documentation](https://weaviate.io/developers/weaviate/modules/reader-generator-modules/generative-openai) for detailed usage. * - * @param {GenerativeAzureOpenAIConfig} config The configuration for the `generative-openai` module. + * @param {GenerativeAzureOpenAIConfigCreate} config The configuration for the `generative-openai` module. * @returns {ModuleConfig<'generative-openai', GenerativeAzureOpenAIConfig>} The configuration object. */ azureOpenAI: ( - config: GenerativeAzureOpenAIConfig + config: GenerativeAzureOpenAIConfigCreate ): ModuleConfig<'generative-openai', GenerativeAzureOpenAIConfig> => { return { name: 'generative-openai', - config: config, + config: { + deploymentId: config.deploymentId, + resourceName: config.resourceName, + baseURL: config.baseURL, + frequencyPenaltyProperty: config.frequencyPenalty, + maxTokensProperty: config.maxTokens, + presencePenaltyProperty: config.presencePenalty, + temperatureProperty: config.temperature, + topPProperty: config.topP, + }, }; }, /** @@ -28,15 +43,24 @@ export default { * * See the [documentation](https://weaviate.io/developers/weaviate/modules/reader-generator-modules/generative-cohere) for detailed usage. * - * @param {GenerativeCohereConfig} [config] The configuration for the `generative-cohere` module. + * @param {GenerativeCohereConfigCreate} [config] The configuration for the `generative-cohere` module. * @returns {ModuleConfig<'generative-cohere', GenerativeCohereConfig>} The configuration object. */ cohere: ( - config?: GenerativeCohereConfig + config?: GenerativeCohereConfigCreate ): ModuleConfig<'generative-cohere', GenerativeCohereConfig | undefined> => { return { name: 'generative-cohere', - config: config, + config: config + ? { + kProperty: config.k, + maxTokensProperty: config.maxTokens, + model: config.model, + returnLikelihoodsProperty: config.returnLikelihoods, + stopSequencesProperty: config.stopSequences, + temperatureProperty: config.temperature, + } + : undefined, }; }, /** @@ -44,15 +68,25 @@ export default { * * See the [documentation](https://weaviate.io/developers/weaviate/modules/reader-generator-modules/generative-openai) for detailed usage. * - * @param {GenerativeOpenAIConfig} [config] The configuration for the `generative-openai` module. + * @param {GenerativeOpenAIConfigCreate} [config] The configuration for the `generative-openai` module. * @returns {ModuleConfig<'generative-openai', GenerativeOpenAIConfig>} The configuration object. */ openAI: ( - config?: GenerativeOpenAIConfig + config?: GenerativeOpenAIConfigCreate ): ModuleConfig<'generative-openai', GenerativeOpenAIConfig | undefined> => { return { name: 'generative-openai', - config: config, + config: config + ? { + baseURL: config.baseURL, + frequencyPenaltyProperty: config.frequencyPenalty, + maxTokensProperty: config.maxTokens, + model: config.model, + presencePenaltyProperty: config.presencePenalty, + temperatureProperty: config.temperature, + topPProperty: config.topP, + } + : undefined, }; }, /** @@ -60,10 +94,10 @@ export default { * * See the [documentation](https://weaviate.io/developers/weaviate/modules/reader-generator-modules/generative-palm) for detailed usage. * - * @param {GenerativePaLMConfig} config The configuration for the `generative-palm` module. + * @param {GenerativePaLMConfigCreate} config The configuration for the `generative-palm` module. * @returns {ModuleConfig<'generative-palm', GenerativePaLMConfig>} The configuration object. */ - palm: (config: GenerativePaLMConfig): ModuleConfig<'generative-palm', GenerativePaLMConfig> => { + palm: (config: GenerativePaLMConfigCreate): ModuleConfig<'generative-palm', GenerativePaLMConfig> => { return { name: 'generative-palm', config: config, diff --git a/src/collections/configure/types/generative.ts b/src/collections/configure/types/generative.ts new file mode 100644 index 00000000..c52a5341 --- /dev/null +++ b/src/collections/configure/types/generative.ts @@ -0,0 +1,47 @@ +import { GenerativePaLMConfig } from '../../index.js'; + +type GenerativeOpenAIConfigBaseCreate = { + baseURL?: string; + frequencyPenalty?: number; + maxTokens?: number; + presencePenalty?: number; + temperature?: number; + topP?: number; +}; + +export type GenerativeOpenAIConfigCreate = GenerativeOpenAIConfigBaseCreate & { + model?: string; +}; + +export type GenerativeAzureOpenAIConfigCreate = GenerativeOpenAIConfigBaseCreate & { + resourceName: string; + deploymentId: string; +}; + +export type GenerativeCohereConfigCreate = { + k?: number; + maxTokens?: number; + model?: string; + returnLikelihoods?: string; + stopSequences?: string[]; + temperature?: number; +}; + +export type GenerativePaLMConfigCreate = GenerativePaLMConfig; + +export type GenerativeConfigCreate = + | GenerativeOpenAIConfigCreate + | GenerativeCohereConfigCreate + | GenerativePaLMConfigCreate + | Record + | undefined; + +export type GenerativeConfigCreateType = G extends 'generative-openai' + ? GenerativeOpenAIConfigCreate + : G extends 'generative-cohere' + ? GenerativeCohereConfigCreate + : G extends 'generative-palm' + ? GenerativePaLMConfigCreate + : G extends 'none' + ? undefined + : Record | undefined; diff --git a/src/collections/configure/types/index.ts b/src/collections/configure/types/index.ts index 9a760ee1..4a00d3cf 100644 --- a/src/collections/configure/types/index.ts +++ b/src/collections/configure/types/index.ts @@ -1,3 +1,4 @@ export * from './base.js'; +export * from './generative.js'; export * from './vectorIndex.js'; export * from './vectorizer.js'; diff --git a/src/collections/configure/unit.test.ts b/src/collections/configure/unit.test.ts index c86ed00c..8ba313fe 100644 --- a/src/collections/configure/unit.test.ts +++ b/src/collections/configure/unit.test.ts @@ -1,5 +1,12 @@ import { configure } from './index.js'; -import { ModuleConfig, VectorConfigCreate } from '../types/index.js'; +import { + GenerativeAzureOpenAIConfig, + GenerativeCohereConfig, + GenerativeOpenAIConfig, + GenerativePaLMConfig, + ModuleConfig, + VectorConfigCreate, +} from '../types/index.js'; import { InvertedIndexConfigCreate, MultiTenancyConfigCreate, @@ -833,4 +840,142 @@ describe('Unit testing of the vectorizer factory class', () => { }, }); }); + + it('should create the correct GenerativeAzureOpenAIConfig type with default values', () => { + const config = configure.generative.azureOpenAI({ + resourceName: 'resource-name', + deploymentId: 'deployment-id', + }); + expect(config).toEqual>({ + name: 'generative-openai', + config: { + resourceName: 'resource-name', + deploymentId: 'deployment-id', + }, + }); + }); + + it('should create the correct GenerativeAzureOpenAIConfig type with custom values', () => { + const config = configure.generative.azureOpenAI({ + resourceName: 'resource-name', + deploymentId: 'deployment-id', + baseURL: 'base-url', + frequencyPenalty: 0.5, + maxTokens: 100, + presencePenalty: 0.3, + temperature: 0.7, + topP: 0.8, + }); + expect(config).toEqual>({ + name: 'generative-openai', + config: { + resourceName: 'resource-name', + deploymentId: 'deployment-id', + baseURL: 'base-url', + frequencyPenaltyProperty: 0.5, + maxTokensProperty: 100, + presencePenaltyProperty: 0.3, + temperatureProperty: 0.7, + topPProperty: 0.8, + }, + }); + }); + + it('should create the correct GenerativeCohereConfig type with default values', () => { + const config = configure.generative.cohere(); + expect(config).toEqual>({ + name: 'generative-cohere', + config: undefined, + }); + }); + + it('should create the correct GenerativeCohereConfig type with custom values', () => { + const config = configure.generative.cohere({ + k: 5, + maxTokens: 100, + model: 'model', + returnLikelihoods: 'return-likelihoods', + stopSequences: ['stop1', 'stop2'], + temperature: 0.5, + }); + expect(config).toEqual>({ + name: 'generative-cohere', + config: { + kProperty: 5, + maxTokensProperty: 100, + model: 'model', + returnLikelihoodsProperty: 'return-likelihoods', + stopSequencesProperty: ['stop1', 'stop2'], + temperatureProperty: 0.5, + }, + }); + }); + + it('should create the correct GenerativeOpenAIConfig type with default values', () => { + const config = configure.generative.openAI(); + expect(config).toEqual>({ + name: 'generative-openai', + config: undefined, + }); + }); + + it('should create the correct GenerativeOpenAIConfig type with custom values', () => { + const config = configure.generative.openAI({ + baseURL: 'base-url', + frequencyPenalty: 0.5, + maxTokens: 100, + model: 'model', + presencePenalty: 0.3, + temperature: 0.7, + topP: 0.8, + }); + expect(config).toEqual>({ + name: 'generative-openai', + config: { + baseURL: 'base-url', + frequencyPenaltyProperty: 0.5, + maxTokensProperty: 100, + model: 'model', + presencePenaltyProperty: 0.3, + temperatureProperty: 0.7, + topPProperty: 0.8, + }, + }); + }); + + it('should create the correct GenerativePaLMConfig type with default values', () => { + const config = configure.generative.palm({ + projectId: 'project-id', + }); + expect(config).toEqual>({ + name: 'generative-palm', + config: { + projectId: 'project-id', + }, + }); + }); + + it('should create the correct GenerativePaLMConfig type with custom values', () => { + const config = configure.generative.palm({ + apiEndpoint: 'api-endpoint', + maxOutputTokens: 100, + modelId: 'model-id', + projectId: 'project-id', + temperature: 0.5, + topK: 5, + topP: 0.8, + }); + expect(config).toEqual>({ + name: 'generative-palm', + config: { + apiEndpoint: 'api-endpoint', + maxOutputTokens: 100, + modelId: 'model-id', + projectId: 'project-id', + temperature: 0.5, + topK: 5, + topP: 0.8, + }, + }); + }); }); From b61a9c787fa70a12be91a84a7047446695815fe5 Mon Sep 17 00:00:00 2001 From: Tommy Smith Date: Wed, 15 May 2024 11:14:43 +0100 Subject: [PATCH 3/3] Make projectId in Text2VecPalm optional --- src/collections/config/types/vectorizer.ts | 4 ++-- src/collections/configure/unit.test.ts | 8 ++------ src/collections/configure/vectorizer.ts | 6 +++--- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/collections/config/types/vectorizer.ts b/src/collections/config/types/vectorizer.ts index 3a0c41bb..f5071c7b 100644 --- a/src/collections/config/types/vectorizer.ts +++ b/src/collections/config/types/vectorizer.ts @@ -125,7 +125,7 @@ export type Text2VecOpenAIConfig = { export type Text2VecPalmConfig = { apiEndpoint?: string; modelId?: string; - projectId: string; + projectId?: string; vectorizeCollectionName?: boolean; }; @@ -170,7 +170,7 @@ export type VectorizerConfigType = V extends 'img2vec-neural' : V extends 'text2vec-azure-openai' ? Text2VecAzureOpenAIConfig : V extends 'text2vec-palm' - ? Text2VecPalmConfig + ? Text2VecPalmConfig | undefined : V extends 'text2vec-transformers' ? Text2VecTransformersConfig | undefined : V extends 'text2vec-voyageai' diff --git a/src/collections/configure/unit.test.ts b/src/collections/configure/unit.test.ts index 8ba313fe..5b43842f 100644 --- a/src/collections/configure/unit.test.ts +++ b/src/collections/configure/unit.test.ts @@ -722,9 +722,7 @@ describe('Unit testing of the vectorizer factory class', () => { }); it('should create the correct Text2VecPalmConfig type with defaults', () => { - const config = configure.vectorizer.text2VecPalm('test', { - projectId: 'project-id', - }); + const config = configure.vectorizer.text2VecPalm('test'); expect(config).toEqual>({ vectorName: 'test', vectorIndex: { @@ -733,9 +731,7 @@ describe('Unit testing of the vectorizer factory class', () => { }, vectorizer: { name: 'text2vec-palm', - config: { - projectId: 'project-id', - }, + config: undefined, }, }); }); diff --git a/src/collections/configure/vectorizer.ts b/src/collections/configure/vectorizer.ts index 1619714b..d768c0c8 100644 --- a/src/collections/configure/vectorizer.ts +++ b/src/collections/configure/vectorizer.ts @@ -337,15 +337,15 @@ export const vectorizer = { */ text2VecPalm: ( name: N, - opts: ConfigureTextVectorizerOptions + opts?: ConfigureTextVectorizerOptions ): VectorConfigCreate, N, I, 'text2vec-palm'> => { - const { sourceProperties, vectorIndexConfig, ...config } = opts; + const { sourceProperties, vectorIndexConfig, ...config } = opts || {}; return makeVectorizer(name, { sourceProperties, vectorIndexConfig, vectorizerConfig: { name: 'text2vec-palm', - config, + config: Object.keys(config).length === 0 ? undefined : config, }, }); },