这是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
15 changes: 13 additions & 2 deletions lib/services/ollama_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -116,6 +118,15 @@ class OllamaService implements LlmService {
return await _secureStorage.read(key: _modelKey) ?? _defaultModel;
}

Future<void> setEmbeddingModel(String model) async {
await _secureStorage.write(key: _embeddingModelKey, value: model);
}

Future<String> getCurrentEmbeddingModel() async {
return await _secureStorage.read(key: _embeddingModelKey) ??
_defaultEmbeddingModel;
}

Future<void> setEndpoint(String endpoint) async {
await _secureStorage.write(key: _endpointKey, value: endpoint);
}
Expand All @@ -127,11 +138,11 @@ class OllamaService implements LlmService {
@override
Future<List<double>> 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,
Expand Down
18 changes: 18 additions & 0 deletions lib/ui/screens/settings_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,7 @@ class OllamaSettings extends ConsumerStatefulWidget {

class _OllamaSettingsState extends ConsumerState<OllamaSettings> {
final TextEditingController _endpointController = TextEditingController();
final TextEditingController _embeddingModelController = TextEditingController();
String? _selectedModel;
List<String> _availableModels = [];
bool _isLoading = false;
Expand All @@ -448,6 +449,7 @@ class _OllamaSettingsState extends ConsumerState<OllamaSettings> {
@override
void dispose() {
_endpointController.dispose();
_embeddingModelController.dispose();
super.dispose();
}

Expand All @@ -466,6 +468,10 @@ class _OllamaSettingsState extends ConsumerState<OllamaSettings> {
// 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();

Expand Down Expand Up @@ -504,6 +510,10 @@ class _OllamaSettingsState extends ConsumerState<OllamaSettings> {
await ollamaService.setModel(_selectedModel!);
}

await ollamaService.setEmbeddingModel(
_embeddingModelController.text.trim(),
);

await _loadSettings();

ScaffoldMessenger.of(
Expand Down Expand Up @@ -557,6 +567,14 @@ class _OllamaSettingsState extends ConsumerState<OllamaSettings> {
},
),
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'),
Expand Down