AI配置化
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../api/ai_api.dart';
|
||||
import '../core/storage/local_storage.dart';
|
||||
import '../models/ai_config.dart';
|
||||
|
||||
/// 可选的 AI 配置列表(含虚拟的「默认」项)
|
||||
final aiConfigsProvider = FutureProvider.autoDispose<List<AiConfigItem>>((ref) {
|
||||
return ref.watch(aiApiProvider).configs();
|
||||
});
|
||||
|
||||
/// 当前选中的配置。
|
||||
///
|
||||
/// **不设 autoDispose**:用户在设置页选完,回到对话页要立刻生效;
|
||||
/// 而且这是本地状态,重新读一遍没什么成本,但保持常驻能避免
|
||||
/// 「切个页面选择就丢了」这种困惑。
|
||||
class SelectedAiConfigNotifier extends Notifier<int?> {
|
||||
@override
|
||||
int? build() {
|
||||
// 存的就是「真实 id」,null = 用默认。
|
||||
// 默认项在列表里的 id 也是 null,两边语义天然一致。
|
||||
return LocalStorage.instance.getAiConfigId();
|
||||
}
|
||||
|
||||
void select(int? id) {
|
||||
state = id;
|
||||
LocalStorage.instance.saveAiConfigId(id);
|
||||
}
|
||||
}
|
||||
|
||||
final selectedAiConfigProvider =
|
||||
NotifierProvider<SelectedAiConfigNotifier, int?>(SelectedAiConfigNotifier.new);
|
||||
|
||||
/// 从配置列表里挑出当前选中的那一条。
|
||||
///
|
||||
/// 三种情况都要兜住:
|
||||
/// · 还没选过 → 用列表第一项(也就是「默认」)
|
||||
/// · 选过但那条被删了 → 退回第一项,并顺手把本地选择改掉
|
||||
/// · 列表还没加载出来 → 返回 null,界面显示「--」
|
||||
final activeAiConfigProvider = Provider.autoDispose<AiConfigItem?>((ref) {
|
||||
final configs = ref.watch(aiConfigsProvider).value;
|
||||
if (configs == null || configs.isEmpty) return null;
|
||||
|
||||
final selectedId = ref.watch(selectedAiConfigProvider);
|
||||
if (selectedId == null) return configs.first;
|
||||
|
||||
for (final item in configs) {
|
||||
if (item.selectionKey == selectedId) return item;
|
||||
}
|
||||
|
||||
// 选中的那条已经不存在了(被删了)。退回默认。
|
||||
// 放在微任务里改 state —— build 过程中不能同步改另一个 provider。
|
||||
Future.microtask(() {
|
||||
ref.read(selectedAiConfigProvider.notifier).select(null);
|
||||
});
|
||||
return configs.first;
|
||||
});
|
||||
@@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import '../api/ai_api.dart';
|
||||
import '../core/network/api_exception.dart';
|
||||
import '../models/ai.dart';
|
||||
import 'ai_config_provider.dart';
|
||||
import 'bill_refresh.dart';
|
||||
import 'note_provider.dart';
|
||||
|
||||
@@ -157,9 +158,11 @@ class AssistantNotifier extends Notifier<AssistantState> {
|
||||
// 这次对话动过哪些数据
|
||||
final mutated = <_Mutated>{};
|
||||
try {
|
||||
// 带上用户选中的配置。null = 用服务端 .env 那套(虚拟的「默认」项)
|
||||
final configId = ref.read(selectedAiConfigProvider);
|
||||
await for (final event in ref
|
||||
.read(aiApiProvider)
|
||||
.chat(sessionId: state.sessionId, content: trimmed)) {
|
||||
.chat(sessionId: state.sessionId, configId: configId, content: trimmed)) {
|
||||
if (!ref.mounted) return;
|
||||
|
||||
switch (event.type) {
|
||||
|
||||
Reference in New Issue
Block a user