@@ -7,6 +7,15 @@ import { GenerateOptions, GroupByOptions } from '../types/index.js';
77
88const maybe = process . env . OPENAI_APIKEY ? describe : describe . skip ;
99
10+ const makeOpenAIClient = ( ) =>
11+ weaviate . connectToLocal ( {
12+ port : 8086 ,
13+ grpcPort : 50057 ,
14+ headers : {
15+ 'X-Openai-Api-Key' : process . env . OPENAI_APIKEY ! ,
16+ } ,
17+ } ) ;
18+
1019maybe ( 'Testing of the collection.generate methods with a simple collection' , ( ) => {
1120 let client : WeaviateClient ;
1221 let collection : Collection < TestCollectionGenerateSimple , 'TestCollectionGenerateSimple' > ;
@@ -32,13 +41,7 @@ maybe('Testing of the collection.generate methods with a simple collection', ()
3241 } ) ;
3342
3443 beforeAll ( async ( ) => {
35- client = await weaviate . connectToLocal ( {
36- port : 8086 ,
37- grpcPort : 50057 ,
38- headers : {
39- 'X-Openai-Api-Key' : process . env . OPENAI_APIKEY ! ,
40- } ,
41- } ) ;
44+ client = await makeOpenAIClient ( ) ;
4245 collection = client . collections . get ( collectionName ) ;
4346 id = await client . collections
4447 . create ( {
@@ -179,13 +182,7 @@ maybe('Testing of the groupBy collection.generate methods with a simple collecti
179182 } ) ;
180183
181184 beforeAll ( async ( ) => {
182- client = await weaviate . connectToLocal ( {
183- port : 8086 ,
184- grpcPort : 50057 ,
185- headers : {
186- 'X-Openai-Api-Key' : process . env . OPENAI_APIKEY ! ,
187- } ,
188- } ) ;
185+ client = await makeOpenAIClient ( ) ;
189186 collection = client . collections . get ( collectionName ) ;
190187 id = await client . collections
191188 . create ( {
@@ -314,3 +311,116 @@ maybe('Testing of the groupBy collection.generate methods with a simple collecti
314311 expect ( ret . objects [ 0 ] . belongsToGroup ) . toEqual ( 'test' ) ;
315312 } ) ;
316313} ) ;
314+
315+ maybe ( 'Testing of the collection.generate methods with a multi vector collection' , ( ) => {
316+ let client : WeaviateClient ;
317+ let collection : Collection ;
318+ const collectionName = 'TestCollectionQueryWithMultiVector' ;
319+
320+ let id1 : string ;
321+ let id2 : string ;
322+ let titleVector : number [ ] ;
323+ let title2Vector : number [ ] ;
324+
325+ afterAll ( ( ) => {
326+ return client . collections . delete ( collectionName ) . catch ( ( err ) => {
327+ console . error ( err ) ;
328+ throw err ;
329+ } ) ;
330+ } ) ;
331+
332+ beforeAll ( async ( ) => {
333+ client = await makeOpenAIClient ( ) ;
334+ collection = client . collections . get ( collectionName ) ;
335+ const query = ( ) =>
336+ client . collections
337+ . create ( {
338+ name : collectionName ,
339+ properties : [
340+ {
341+ name : 'title' ,
342+ dataType : 'text' ,
343+ vectorizePropertyName : false ,
344+ } ,
345+ ] ,
346+ vectorizers : [
347+ weaviate . configure . vectorizer . text2VecOpenAI ( {
348+ name : 'title' ,
349+ sourceProperties : [ 'title' ] ,
350+ } ) ,
351+ weaviate . configure . vectorizer . text2VecOpenAI ( {
352+ name : 'title2' ,
353+ sourceProperties : [ 'title' ] ,
354+ } ) ,
355+ ] ,
356+ } )
357+ . then ( async ( ) => {
358+ id1 = await collection . data . insert ( {
359+ properties : {
360+ title : 'test' ,
361+ } ,
362+ } ) ;
363+ id2 = await collection . data . insert ( {
364+ properties : {
365+ title : 'other' ,
366+ } ,
367+ } ) ;
368+ const res = await collection . query . fetchObjectById ( id1 , { includeVector : true } ) ;
369+ titleVector = res ! . vectors . title ! ;
370+ title2Vector = res ! . vectors . title2 ! ;
371+ } ) ;
372+ if ( await client . getWeaviateVersion ( ) . then ( ( ver ) => ver . isLowerThan ( 1 , 24 , 0 ) ) ) {
373+ await expect ( query ( ) ) . rejects . toThrow ( WeaviateUnsupportedFeatureError ) ;
374+ return ;
375+ }
376+ return query ( ) ;
377+ } ) ;
378+
379+ it ( 'should generate with a near vector search on multi vectors' , async ( ) => {
380+ const query = ( ) =>
381+ collection . generate . nearVector (
382+ [ titleVector , title2Vector ] ,
383+ {
384+ groupedTask : 'What is the value of title here? {title}' ,
385+ groupedProperties : [ 'title' ] ,
386+ singlePrompt : 'Write a haiku about ducks for {title}' ,
387+ } ,
388+ {
389+ targetVector : [ 'title' , 'title2' ] ,
390+ }
391+ ) ;
392+ if ( await client . getWeaviateVersion ( ) . then ( ( ver ) => ver . isLowerThan ( 1 , 26 , 0 ) ) ) {
393+ await expect ( query ( ) ) . rejects . toThrow ( WeaviateUnsupportedFeatureError ) ;
394+ return ;
395+ }
396+ const ret = await query ( ) ;
397+ expect ( ret . objects . length ) . toEqual ( 2 ) ;
398+ expect ( ret . generated ) . toBeDefined ( ) ;
399+ expect ( ret . objects [ 0 ] . generated ) . toBeDefined ( ) ;
400+ expect ( ret . objects [ 1 ] . generated ) . toBeDefined ( ) ;
401+ } ) ;
402+
403+ it ( 'should generate with a near vector search on multi vectors' , async ( ) => {
404+ const query = ( ) =>
405+ collection . generate . nearVector (
406+ { title : titleVector , title2 : title2Vector } ,
407+ {
408+ groupedTask : 'What is the value of title here? {title}' ,
409+ groupedProperties : [ 'title' ] ,
410+ singlePrompt : 'Write a haiku about ducks for {title}' ,
411+ } ,
412+ {
413+ targetVector : [ 'title' , 'title2' ] ,
414+ }
415+ ) ;
416+ if ( await client . getWeaviateVersion ( ) . then ( ( ver ) => ver . isLowerThan ( 1 , 26 , 0 ) ) ) {
417+ await expect ( query ( ) ) . rejects . toThrow ( WeaviateUnsupportedFeatureError ) ;
418+ return ;
419+ }
420+ const ret = await query ( ) ;
421+ expect ( ret . objects . length ) . toEqual ( 2 ) ;
422+ expect ( ret . generated ) . toBeDefined ( ) ;
423+ expect ( ret . objects [ 0 ] . generated ) . toBeDefined ( ) ;
424+ expect ( ret . objects [ 1 ] . generated ) . toBeDefined ( ) ;
425+ } ) ;
426+ } ) ;
0 commit comments