diff --git a/lib/services/ollama_service.dart b/lib/services/ollama_service.dart index 2715c93..3930185 100644 --- a/lib/services/ollama_service.dart +++ b/lib/services/ollama_service.dart @@ -6,8 +6,10 @@ import 'llm_service.dart'; class OllamaService implements LlmService { static const String _endpointKey = 'ollama_endpoint'; static const String _modelKey = 'ollama_model'; + static const String _embeddingModelKey = 'ollama_embedding_model'; static const String _defaultEndpoint = 'http://localhost:11434'; static const String _defaultModel = 'llama2'; + static const String _defaultEmbeddingModel = 'nomic-embed-text'; final Dio _dio = Dio(); final FlutterSecureStorage _secureStorage = const FlutterSecureStorage(); @@ -116,6 +118,15 @@ class OllamaService implements LlmService { return await _secureStorage.read(key: _modelKey) ?? _defaultModel; } + Future setEmbeddingModel(String model) async { + await _secureStorage.write(key: _embeddingModelKey, value: model); + } + + Future getCurrentEmbeddingModel() async { + return await _secureStorage.read(key: _embeddingModelKey) ?? + _defaultEmbeddingModel; + } + Future setEndpoint(String endpoint) async { await _secureStorage.write(key: _endpointKey, value: endpoint); } @@ -127,11 +138,11 @@ class OllamaService implements LlmService { @override Future> embedText(String text) async { final endpoint = await _secureStorage.read(key: _endpointKey) ?? _defaultEndpoint; - final model = await getCurrentModel(); + final model = await getCurrentEmbeddingModel(); try { final response = await _dio.post( - '$endpoint/api/embeddings', + '$endpoint/api/embed', options: Options(headers: {'Content-Type': 'application/json'}), data: { 'model': model, diff --git a/lib/ui/screens/settings_screen.dart b/lib/ui/screens/settings_screen.dart index 1774627..65c2b4f 100644 --- a/lib/ui/screens/settings_screen.dart +++ b/lib/ui/screens/settings_screen.dart @@ -435,6 +435,7 @@ class OllamaSettings extends ConsumerStatefulWidget { class _OllamaSettingsState extends ConsumerState { final TextEditingController _endpointController = TextEditingController(); + final TextEditingController _embeddingModelController = TextEditingController(); String? _selectedModel; List _availableModels = []; bool _isLoading = false; @@ -448,6 +449,7 @@ class _OllamaSettingsState extends ConsumerState { @override void dispose() { _endpointController.dispose(); + _embeddingModelController.dispose(); super.dispose(); } @@ -466,6 +468,10 @@ class _OllamaSettingsState extends ConsumerState { // Load current model final currentModel = await ollamaService.getCurrentModel(); + // Load embedding model + final embeddingModel = await ollamaService.getCurrentEmbeddingModel(); + _embeddingModelController.text = embeddingModel; + // Load available models final models = await ollamaService.getAvailableModels(); @@ -504,6 +510,10 @@ class _OllamaSettingsState extends ConsumerState { await ollamaService.setModel(_selectedModel!); } + await ollamaService.setEmbeddingModel( + _embeddingModelController.text.trim(), + ); + await _loadSettings(); ScaffoldMessenger.of( @@ -557,6 +567,14 @@ class _OllamaSettingsState extends ConsumerState { }, ), const SizedBox(height: 16), + TextField( + controller: _embeddingModelController, + decoration: const InputDecoration( + labelText: 'Embedding Model', + border: OutlineInputBorder(), + ), + ), + const SizedBox(height: 16), ElevatedButton( onPressed: _isLoading ? null : _saveSettings, child: const Text('Save Settings'),