diff --git a/.github/workflows/pre-release-tests.yml b/.github/workflows/pre-release-tests.yml index 5d7e43ec..2b3889a8 100644 --- a/.github/workflows/pre-release-tests.yml +++ b/.github/workflows/pre-release-tests.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - version: ["3.0.0"] + version: ['latest'] name: integration-tests-against-rc (dart ${{ matrix.version }}) steps: - name: Checkout diff --git a/lib/src/results/experimental_features.dart b/lib/src/results/experimental_features.dart index bc71ec64..715af463 100644 --- a/lib/src/results/experimental_features.dart +++ b/lib/src/results/experimental_features.dart @@ -11,12 +11,7 @@ part 'experimental_features.g.dart'; createToJson: false, ) class ExperimentalFeatures { - @JsonKey(name: 'vectorStore') - final bool vectorStore; - - const ExperimentalFeatures({ - required this.vectorStore, - }); + const ExperimentalFeatures(); factory ExperimentalFeatures.fromJson(Map src) { return _$ExperimentalFeaturesFromJson(src); @@ -29,12 +24,7 @@ class ExperimentalFeatures { createFactory: false, ) class UpdateExperimentalFeatures { - @JsonKey(name: 'vectorStore') - final bool? vectorStore; - - const UpdateExperimentalFeatures({ - this.vectorStore, - }); + const UpdateExperimentalFeatures(); Map toJson() => _$UpdateExperimentalFeaturesToJson(this); } diff --git a/lib/src/results/experimental_features.g.dart b/lib/src/results/experimental_features.g.dart index 8dfcaa57..3c0198d9 100644 --- a/lib/src/results/experimental_features.g.dart +++ b/lib/src/results/experimental_features.g.dart @@ -8,20 +8,8 @@ part of 'experimental_features.dart'; ExperimentalFeatures _$ExperimentalFeaturesFromJson( Map json) => - ExperimentalFeatures( - vectorStore: json['vectorStore'] as bool, - ); + ExperimentalFeatures(); Map _$UpdateExperimentalFeaturesToJson( - UpdateExperimentalFeatures instance) { - final val = {}; - - void writeNotNull(String key, dynamic value) { - if (value != null) { - val[key] = value; - } - } - - writeNotNull('vectorStore', instance.vectorStore); - return val; -} + UpdateExperimentalFeatures instance) => + {}; diff --git a/test/search_test.dart b/test/search_test.dart index 0d9ca03e..0d7b501f 100644 --- a/test/search_test.dart +++ b/test/search_test.dart @@ -1,5 +1,4 @@ import 'package:meilisearch/meilisearch.dart'; -import 'package:meilisearch/src/results/experimental_features.dart'; import 'package:test/test.dart'; import 'utils/books.dart'; @@ -8,6 +7,8 @@ import 'utils/client.dart'; import 'utils/wait_for.dart'; void main() { + final openAiKeyValue = openAiKey; + group('Search', () { setUpClient(); late String uid; @@ -542,55 +543,62 @@ void main() { }); // Commented because of https://github.com/meilisearch/meilisearch-dart/issues/369 - group('Experimental', () { + group('Vector search', () { setUpClient(); late String uid; late MeiliSearchIndex index; - late ExperimentalFeatures features; - setUp(() async { - features = await client.http.updateExperimentalFeatures( - UpdateExperimentalFeatures( - vectorStore: true, + late IndexSettings settings; + + setUpAll(() { + settings = IndexSettings(embedders: { + 'default': OpenAiEmbedder( + model: 'text-embedding-3-small', + apiKey: openAiKeyValue, + documentTemplate: "a book titled '{{ doc.title }}'", ), - ); - expect(features.vectorStore, true); + }); + }); + setUp(() async { uid = randomUid(); index = await createIndexWithData(uid: uid, data: vectorBooks); + // Configure embedder before running vector search + await index.updateSettings(settings).waitFor(client: client); }); test('vector search', () async { - final vector = [0, 1, 2]; + // Create a vector with 1536 dimensions (filled with zeros for test purposes) + final vector = List.filled(1536, 0.0); final res = await index .search( null, SearchQuery( vector: vector, + hybrid: HybridSearch( + embedder: 'default', + semanticRatio: 1.0, + ), ), ) .asSearchResult() .mapToContainer(); - expect(res.vector, vector); expect( res.hits, everyElement( - isA>>() - .having( - (p0) => p0.vectors, - 'vectors', - isNotNull, - ) - .having( - (p0) => p0.semanticScore, - 'semanticScore', - isNotNull, - ), + isA>>().having( + (p0) => p0.parsed, + 'parsed', + isNotNull, + ), ), ); }); - }, skip: "Requires Experimental API"); - final openAiKeyValue = openAiKey; + }, + skip: openAiKeyValue == null || openAiKeyValue.isEmpty + ? "Requires OPEN_AI_API_KEY environment variable" + : null); + group('Embedders', () { group( 'Unit test', @@ -665,9 +673,6 @@ void main() { }); setUp(() async { - final features = await client.http.updateExperimentalFeatures( - UpdateExperimentalFeatures(vectorStore: true)); - expect(features.vectorStore, true); uid = randomUid(); index = await createBooksIndex(uid: uid); }); diff --git a/test/utils/books_data.dart b/test/utils/books_data.dart index f9d00c39..1cd0e74e 100644 --- a/test/utils/books_data.dart +++ b/test/utils/books_data.dart @@ -60,23 +60,43 @@ final vectorBooks = [ { "id": 0, "title": "Across The Universe", - "_vectors": [0, 0.8, -0.2], + "_vectors": { + "default": { + "embeddings": [0, 0.8, -0.2], + "regenerate": false, + } + } }, { "id": 1, "title": "All Things Must Pass", - "_vectors": [1, -0.2, 0], + "_vectors": { + "default": { + "embeddings": [1, -0.2, 0], + "regenerate": false, + } + } }, { "id": 2, "title": "And Your Bird Can Sing", - "_vectors": [-0.2, 4, 6], + "_vectors": { + "default": { + "embeddings": [-0.2, 4, 6], + "regenerate": false, + } + } }, { "id": 3, "title": "The Matrix", - "_vectors": [5, -0.5, 0.3], - }, + "_vectors": { + "default": { + "embeddings": [5, -0.5, 0.3], + "regenerate": false, + } + }, + } ]; enum CSVHeaderTypes {