这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions lib/services/ollama_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,27 @@ class OllamaService implements LlmService {
return await _secureStorage.read(key: _modelKey) ?? _defaultModel;
}

Future<List<String>> getAvailableEmbeddingModels() async {
final endpoint =
await _secureStorage.read(key: _endpointKey) ?? _defaultEndpoint;

try {
final response = await _dio.get('$endpoint/api/tags');

if (response.statusCode == 200) {
final models = (response.data['models'] as List)
.map((model) => model['name'] as String)
.where((name) => name.contains('embed'))
.toList();
return models.isEmpty ? [_defaultEmbeddingModel] : models;
} else {
return [_defaultEmbeddingModel];
}
} catch (e) {
return [_defaultEmbeddingModel];
}
}

Future<void> setEmbeddingModel(String model) async {
await _secureStorage.write(key: _embeddingModelKey, value: model);
}
Expand Down
35 changes: 27 additions & 8 deletions lib/ui/screens/settings_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -435,9 +435,10 @@ class OllamaSettings extends ConsumerStatefulWidget {

class _OllamaSettingsState extends ConsumerState<OllamaSettings> {
final TextEditingController _endpointController = TextEditingController();
final TextEditingController _embeddingModelController = TextEditingController();
String? _selectedModel;
String? _selectedEmbeddingModel;
List<String> _availableModels = [];
List<String> _availableEmbeddingModels = [];
bool _isLoading = false;

@override
Expand All @@ -449,7 +450,6 @@ class _OllamaSettingsState extends ConsumerState<OllamaSettings> {
@override
void dispose() {
_endpointController.dispose();
_embeddingModelController.dispose();
super.dispose();
}

Expand All @@ -470,18 +470,26 @@ class _OllamaSettingsState extends ConsumerState<OllamaSettings> {

// Load embedding model
final embeddingModel = await ollamaService.getCurrentEmbeddingModel();
_embeddingModelController.text = embeddingModel;

// Load available models
final models = await ollamaService.getAvailableModels();
// Load available embedding models
final embeddingModels =
await ollamaService.getAvailableEmbeddingModels();

setState(() {
_availableModels = models;
_availableEmbeddingModels = embeddingModels;
if (models.contains(currentModel)) {
_selectedModel = currentModel;
} else {
_selectedModel = null;
}
if (embeddingModels.contains(embeddingModel)) {
_selectedEmbeddingModel = embeddingModel;
} else {
_selectedEmbeddingModel = null;
}
});
} catch (e) {
// Handle error
Expand Down Expand Up @@ -510,9 +518,9 @@ class _OllamaSettingsState extends ConsumerState<OllamaSettings> {
await ollamaService.setModel(_selectedModel!);
}

await ollamaService.setEmbeddingModel(
_embeddingModelController.text.trim(),
);
if (_selectedEmbeddingModel != null) {
await ollamaService.setEmbeddingModel(_selectedEmbeddingModel!);
}

await _loadSettings();

Expand Down Expand Up @@ -567,12 +575,23 @@ class _OllamaSettingsState extends ConsumerState<OllamaSettings> {
},
),
const SizedBox(height: 16),
TextField(
controller: _embeddingModelController,
DropdownButtonFormField<String>(
decoration: const InputDecoration(
labelText: 'Embedding Model',
border: OutlineInputBorder(),
),
value: _selectedEmbeddingModel,
items: _availableEmbeddingModels.map((model) {
return DropdownMenuItem<String>(
value: model,
child: Text(model),
);
}).toList(),
onChanged: (value) {
setState(() {
_selectedEmbeddingModel = value;
});
},
),
const SizedBox(height: 16),
ElevatedButton(
Expand Down