local ai killswitch

This commit is contained in:
Fabian Freund
2025-07-25 22:18:08 +02:00
parent 9ae21190f4
commit dd40676b36
8 changed files with 100 additions and 27 deletions
@@ -25,6 +25,7 @@ import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/ta
import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab_search.dart';
import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/container_chips.dart';
import 'package:weblibre/features/tor/presentation/controllers/start_tor_proxy.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
import 'package:weblibre/presentation/hooks/listenable_callback.dart';
import 'package:weblibre/presentation/widgets/speech_to_text_button.dart';
@@ -108,6 +109,12 @@ class _TabSheetHeader extends HookConsumerWidget {
() => searchTextController.text.isNotEmpty,
);
final enableAiFeatures = ref.watch(
generalSettingsRepositoryProvider.select(
(settings) => settings.enableLocalAiFeatures,
),
);
useListenableCallback(searchTextController, () async {
await ref
.read(
@@ -160,27 +167,29 @@ class _TabSheetHeader extends HookConsumerWidget {
.toggle();
},
),
Consumer(
builder: (context, ref, child) {
final tabSuggestionsEnabled = ref.watch(
tabSuggestionsControllerProvider,
);
if (enableAiFeatures)
Consumer(
builder: (context, ref, child) {
final tabSuggestionsEnabled = ref.watch(
tabSuggestionsControllerProvider,
);
return IconButton.filledTonal(
icon: const Icon(MdiIcons.imageAutoAdjust),
isSelected: tabSuggestionsEnabled,
iconSize: 18,
padding: EdgeInsets.zero,
onPressed: () {
ref
.read(
tabSuggestionsControllerProvider.notifier,
)
.toggle();
},
);
},
),
return IconButton.filledTonal(
icon: const Icon(MdiIcons.imageAutoAdjust),
isSelected: tabSuggestionsEnabled,
iconSize: 18,
padding: EdgeInsets.zero,
onPressed: () {
ref
.read(
tabSuggestionsControllerProvider
.notifier,
)
.toggle();
},
);
},
),
],
),
TextButton.icon(
@@ -215,9 +224,9 @@ class _TabSheetHeader extends HookConsumerWidget {
);
if (result == true) {
await ref
.read(tabDataRepositoryProvider.notifier)
.closeAllTabsByContainer(container);
await ref
.read(tabDataRepositoryProvider.notifier)
.closeAllTabsByContainer(container);
}
},
icon: const Icon(MdiIcons.closeBoxMultiple),
@@ -380,9 +389,16 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
final tabSuggestionsEnabled = ref.watch(
tabSuggestionsControllerProvider,
);
final enableAiFeatures = ref.watch(
generalSettingsRepositoryProvider.select(
(settings) => settings.enableLocalAiFeatures,
),
);
final suggestedTabEntities = ref.watch(
suggestedTabEntitiesProvider(
tabSuggestionsEnabled ? containerId : null,
(enableAiFeatures && tabSuggestionsEnabled)
? containerId
: null,
),
);
@@ -10,6 +10,7 @@ import 'package:synchronized/synchronized.dart';
import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart';
import 'package:weblibre/features/geckoview/features/tabs/utils/embedding_text_processing.dart';
import 'package:weblibre/features/geckoview/features/tabs/utils/nearest_neighbor.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
import 'package:weblibre/utils/lru_cache.dart';
part 'gecko_inference.g.dart';
@@ -41,6 +42,14 @@ class GeckoInferenceRepository extends _$GeckoInferenceRepository {
}
Future<String?> predictDocumentTopic(Set<String> titles) async {
if (!ref.read(
generalSettingsRepositoryProvider.select(
(settings) => settings.enableLocalAiFeatures,
),
)) {
return null;
}
if (titles.isNotEmpty) {
if (_topicCache.get(titles) case final String title) {
return title;
@@ -69,6 +78,14 @@ class GeckoInferenceRepository extends _$GeckoInferenceRepository {
required List<String> assignedDocumentsInput,
required List<String> unassignedDocumentsInput,
}) async {
if (!ref.read(
generalSettingsRepositoryProvider.select(
(settings) => settings.enableLocalAiFeatures,
),
)) {
return null;
}
final processedDocuments = <String, String>{};
final unassignedDocumentsProcessed = unassignedDocumentsInput.map((doc) {
final processed = preprocessText(doc);
@@ -276,7 +276,7 @@ class _ContainerTabSuggestionsProviderElement
}
String _$geckoInferenceRepositoryHash() =>
r'bdae6dab14c33c6503f37f2e17b8d50fb820ac26';
r'170bd0b67e5f1edc43ed97d4535f41353fb8796e';
/// See also [GeckoInferenceRepository].
@ProviderFor(GeckoInferenceRepository)