fix: cosmetic changes

This commit is contained in:
cogwheel0
2025-08-17 00:26:12 +05:30
parent 3623422475
commit 7a38c645a1
3 changed files with 132 additions and 21 deletions

View File

@@ -275,7 +275,7 @@ final conversationsProvider = FutureProvider<List<Conversation>>((ref) async {
try {
foundation.debugPrint('DEBUG: Fetching conversations from OpenWebUI API...');
final conversations = await api.getConversations(limit: 50);
final conversations = await api.getConversations(); // Fetch all conversations
foundation.debugPrint(
'DEBUG: Successfully fetched ${conversations.length} conversations',
);
@@ -328,9 +328,17 @@ final conversationsProvider = FutureProvider<List<Conversation>>((ref) async {
}
foundation.debugPrint('DEBUG: Final conversation count: ${updatedConversations.length}');
// Sort conversations by updatedAt in descending order (most recent first)
updatedConversations.sort((a, b) => b.updatedAt.compareTo(a.updatedAt));
foundation.debugPrint('DEBUG: Sorted conversations by updatedAt (most recent first)');
return updatedConversations;
} catch (e) {
foundation.debugPrint('DEBUG: Failed to fetch folder information: $e');
// Sort conversations even when folder fetch fails
conversations.sort((a, b) => b.updatedAt.compareTo(a.updatedAt));
foundation.debugPrint('DEBUG: Sorted conversations by updatedAt (fallback case)');
return conversations; // Return original conversations if folder fetch fails
}
} catch (e, stackTrace) {

View File

@@ -325,30 +325,65 @@ class ApiService {
debugPrint('DEBUG: Making request to ${serverConfig.url}/api/v1/chats/');
debugPrint('DEBUG: Auth token present: ${authToken != null}');
// Fetch regular, pinned, and archived conversations
final regularResponse = await _dio.get(
'/api/v1/chats/',
queryParameters: {
if (limit != null && limit > 0)
'page': ((skip ?? 0) / limit)
.floor(), // OpenWebUI uses page-based pagination with proper bounds checking
},
);
List<dynamic> allRegularChats = [];
if (limit == null) {
// Fetch all conversations using pagination
debugPrint('DEBUG: Fetching ALL conversations using pagination');
int currentPage = 0;
while (true) {
debugPrint('DEBUG: Fetching page $currentPage');
final response = await _dio.get(
'/api/v1/chats/',
queryParameters: {'page': currentPage},
);
if (response.data is! List) {
throw Exception('Expected array of chats, got ${response.data.runtimeType}');
}
final pageChats = response.data as List;
debugPrint('DEBUG: Page $currentPage returned ${pageChats.length} conversations');
if (pageChats.isEmpty) {
debugPrint('DEBUG: No more conversations, stopping pagination');
break;
}
allRegularChats.addAll(pageChats);
currentPage++;
// Safety break to avoid infinite loops (adjust as needed)
if (currentPage > 100) {
debugPrint('WARNING: Reached maximum page limit (100), stopping pagination');
break;
}
}
debugPrint('DEBUG: Fetched total of ${allRegularChats.length} conversations across $currentPage pages');
} else {
// Original single page fetch
final regularResponse = await _dio.get(
'/api/v1/chats/',
queryParameters: {
if (limit > 0)
'page': ((skip ?? 0) / limit).floor(),
},
);
if (regularResponse.data is! List) {
throw Exception('Expected array of chats, got ${regularResponse.data.runtimeType}');
}
allRegularChats = regularResponse.data as List;
}
final pinnedResponse = await _dio.get('/api/v1/chats/pinned');
final archivedResponse = await _dio.get('/api/v1/chats/all/archived');
debugPrint('DEBUG: Regular response status: ${regularResponse.statusCode}');
debugPrint('DEBUG: Pinned response status: ${pinnedResponse.statusCode}');
debugPrint(
'DEBUG: Archived response status: ${archivedResponse.statusCode}',
);
if (regularResponse.data is! List) {
throw Exception(
'Expected array of chats, got ${regularResponse.data.runtimeType}',
);
}
debugPrint('DEBUG: Archived response status: ${archivedResponse.statusCode}');
if (pinnedResponse.data is! List) {
throw Exception(
@@ -362,7 +397,7 @@ class ApiService {
);
}
final regularChatList = regularResponse.data as List;
final regularChatList = allRegularChats;
final pinnedChatList = pinnedResponse.data as List;
final archivedChatList = archivedResponse.data as List;
@@ -548,6 +583,16 @@ class ApiService {
// Parse messages from the 'chat' object or top-level messages
final chatObject = chatData['chat'] as Map<String, dynamic>?;
final messages = <ChatMessage>[];
// Extract model from chat.models array
String? model;
if (chatObject != null && chatObject['models'] != null) {
final models = chatObject['models'] as List?;
if (models != null && models.isNotEmpty) {
model = models.first as String;
debugPrint('DEBUG: Extracted model from chat.models: $model');
}
}
// Try multiple locations for messages - prefer list format to avoid duplication
List? messagesList;
@@ -610,6 +655,7 @@ class ApiService {
title: title,
createdAt: createdAt,
updatedAt: updatedAt,
model: model,
pinned: pinned,
archived: archived,
shareId: shareId,

View File

@@ -53,6 +53,9 @@ class ChatMessagesNotifier extends StateNotifier<List<ChatMessage>> {
'DEBUG: Loading ${next.messages.length} messages for conversation ${next.id}',
);
state = next.messages;
// Update selected model if conversation has a different model
_updateModelForConversation(next);
} else {
debugPrint('DEBUG: Clearing messages - no active conversation');
state = [];
@@ -71,6 +74,57 @@ class ChatMessagesNotifier extends StateNotifier<List<ChatMessage>> {
_messageStream = null;
}
Future<void> _updateModelForConversation(Conversation conversation) async {
debugPrint('DEBUG: _updateModelForConversation called for conversation ${conversation.id}');
// Check if conversation has a model specified
if (conversation.model == null || conversation.model!.isEmpty) {
debugPrint('DEBUG: Conversation has no model specified');
return;
}
debugPrint('DEBUG: Conversation model: ${conversation.model}');
final currentSelectedModel = _ref.read(selectedModelProvider);
// If the conversation's model is different from the currently selected one
if (currentSelectedModel?.id != conversation.model) {
debugPrint(
'DEBUG: Conversation model (${conversation.model}) differs from selected model (${currentSelectedModel?.id})',
);
// Get available models to find the matching one
try {
final models = await _ref.read(modelsProvider.future);
debugPrint('DEBUG: Available models count: ${models.length}');
if (models.isEmpty) {
debugPrint('DEBUG: No models available, cannot update selected model');
return;
}
// Look for exact match first
final conversationModel = models.where(
(model) => model.id == conversation.model,
).firstOrNull;
if (conversationModel != null) {
// Update the selected model
_ref.read(selectedModelProvider.notifier).state = conversationModel;
debugPrint(
'DEBUG: Updated selected model to ${conversationModel.name} (${conversationModel.id}) for conversation ${conversation.id}',
);
} else {
debugPrint(
'DEBUG: Conversation model ${conversation.model} not found in available models: ${models.map((m) => m.id).join(', ')}',
);
}
} catch (e) {
debugPrint('DEBUG: Failed to update model for conversation: $e');
}
}
}
void setMessageStream(StreamSubscription stream) {
_cancelMessageStream();
_messageStream = stream;
@@ -526,6 +580,9 @@ Future<void> _sendMessageInternal(
debugPrint(
'DEBUG: Server conversation ID: ${serverConversation.id}, Title: ${serverConversation.title}',
);
// Invalidate conversations provider to refresh the list
ref.invalidate(conversationsProvider);
} catch (e) {
debugPrint(
'DEBUG: Failed to create conversation on server, using local: $e',