feat(ml): better multilingual search with nllb models (#13567)

This commit is contained in:
Mert
2025-03-31 11:06:57 -04:00
committed by GitHub
parent 838a8dd9a6
commit 6789c2ac19
16 changed files with 301 additions and 18 deletions
@@ -236,6 +236,7 @@ class SearchFilter {
String? context;
String? filename;
String? description;
String? language;
Set<Person> people;
SearchLocationFilter location;
SearchCameraFilter camera;
@@ -249,6 +250,7 @@ class SearchFilter {
this.context,
this.filename,
this.description,
this.language,
required this.people,
required this.location,
required this.camera,
@@ -279,6 +281,7 @@ class SearchFilter {
String? context,
String? filename,
String? description,
String? language,
Set<Person>? people,
SearchLocationFilter? location,
SearchCameraFilter? camera,
@@ -290,6 +293,7 @@ class SearchFilter {
context: context ?? this.context,
filename: filename ?? this.filename,
description: description ?? this.description,
language: language ?? this.language,
people: people ?? this.people,
location: location ?? this.location,
camera: camera ?? this.camera,
@@ -301,7 +305,7 @@ class SearchFilter {
@override
String toString() {
return 'SearchFilter(context: $context, filename: $filename, description: $description, people: $people, location: $location, camera: $camera, date: $date, display: $display, mediaType: $mediaType)';
return 'SearchFilter(context: $context, filename: $filename, description: $description, language: $language, people: $people, location: $location, camera: $camera, date: $date, display: $display, mediaType: $mediaType)';
}
@override
@@ -311,6 +315,7 @@ class SearchFilter {
return other.context == context &&
other.filename == filename &&
other.description == description &&
other.language == language &&
other.people == people &&
other.location == location &&
other.camera == camera &&
@@ -324,6 +329,7 @@ class SearchFilter {
return context.hashCode ^
filename.hashCode ^
description.hashCode ^
language.hashCode ^
people.hashCode ^
location.hashCode ^
camera.hashCode ^
+2
View File
@@ -48,6 +48,8 @@ class SearchPage extends HookConsumerWidget {
isFavorite: false,
),
mediaType: prefilter?.mediaType ?? AssetType.other,
language:
"${context.locale.languageCode}-${context.locale.countryCode}",
),
);
+1
View File
@@ -60,6 +60,7 @@ class SearchService {
response = await _apiService.searchApi.searchSmart(
SmartSearchDto(
query: filter.context!,
language: filter.language,
country: filter.location.country,
state: filter.location.state,
city: filter.location.city,
+18 -1
View File
@@ -25,6 +25,7 @@ class SmartSearchDto {
this.isNotInAlbum,
this.isOffline,
this.isVisible,
this.language,
this.lensModel,
this.libraryId,
this.make,
@@ -132,6 +133,14 @@ class SmartSearchDto {
///
bool? isVisible;
///
/// Please note: This property should have been non-nullable! Since the specification file
/// does not include a default value (using the "default:" property), however, the generated
/// source code must fall back to having a nullable type.
/// Consider adding a "default:" property in the specification file to hide this note.
///
String? language;
String? lensModel;
String? libraryId;
@@ -271,6 +280,7 @@ class SmartSearchDto {
other.isNotInAlbum == isNotInAlbum &&
other.isOffline == isOffline &&
other.isVisible == isVisible &&
other.language == language &&
other.lensModel == lensModel &&
other.libraryId == libraryId &&
other.make == make &&
@@ -308,6 +318,7 @@ class SmartSearchDto {
(isNotInAlbum == null ? 0 : isNotInAlbum!.hashCode) +
(isOffline == null ? 0 : isOffline!.hashCode) +
(isVisible == null ? 0 : isVisible!.hashCode) +
(language == null ? 0 : language!.hashCode) +
(lensModel == null ? 0 : lensModel!.hashCode) +
(libraryId == null ? 0 : libraryId!.hashCode) +
(make == null ? 0 : make!.hashCode) +
@@ -331,7 +342,7 @@ class SmartSearchDto {
(withExif == null ? 0 : withExif!.hashCode);
@override
String toString() => 'SmartSearchDto[city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, deviceId=$deviceId, isArchived=$isArchived, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, isVisible=$isVisible, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, page=$page, personIds=$personIds, query=$query, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, withArchived=$withArchived, withDeleted=$withDeleted, withExif=$withExif]';
String toString() => 'SmartSearchDto[city=$city, country=$country, createdAfter=$createdAfter, createdBefore=$createdBefore, deviceId=$deviceId, isArchived=$isArchived, isEncoded=$isEncoded, isFavorite=$isFavorite, isMotion=$isMotion, isNotInAlbum=$isNotInAlbum, isOffline=$isOffline, isVisible=$isVisible, language=$language, lensModel=$lensModel, libraryId=$libraryId, make=$make, model=$model, page=$page, personIds=$personIds, query=$query, rating=$rating, size=$size, state=$state, tagIds=$tagIds, takenAfter=$takenAfter, takenBefore=$takenBefore, trashedAfter=$trashedAfter, trashedBefore=$trashedBefore, type=$type, updatedAfter=$updatedAfter, updatedBefore=$updatedBefore, withArchived=$withArchived, withDeleted=$withDeleted, withExif=$withExif]';
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
@@ -395,6 +406,11 @@ class SmartSearchDto {
} else {
// json[r'isVisible'] = null;
}
if (this.language != null) {
json[r'language'] = this.language;
} else {
// json[r'language'] = null;
}
if (this.lensModel != null) {
json[r'lensModel'] = this.lensModel;
} else {
@@ -508,6 +524,7 @@ class SmartSearchDto {
isNotInAlbum: mapValueOfType<bool>(json, r'isNotInAlbum'),
isOffline: mapValueOfType<bool>(json, r'isOffline'),
isVisible: mapValueOfType<bool>(json, r'isVisible'),
language: mapValueOfType<String>(json, r'language'),
lensModel: mapValueOfType<String>(json, r'lensModel'),
libraryId: mapValueOfType<String>(json, r'libraryId'),
make: mapValueOfType<String>(json, r'make'),