Files
Auto-GPT/lib/viewmodels/chat_viewmodel.dart
hunteraraujo 7966b81e96 Update ViewModel classes for Chat and Task to handle structured responses
This commit updates the ViewModel classes for both Chat and Task to accommodate the new structured responses received from the API. These changes are essential for the correct functioning of the application as they deal with the new TaskResponse and Step objects.

Updates in ChatViewModel:
- Modified `fetchChatsForTask` to handle structured step data
- Updated how steps are retrieved and processed

Updates in TaskViewModel:
- Updated `fetchTasks` to use the new TaskResponse object
- Refactored task fetching and selection logic

These updates ensure that the ViewModel classes are aligned with the new structured API responses, improving data handling and UI updates.
2023-09-02 15:42:54 -07:00

142 lines
4.2 KiB
Dart

import 'package:auto_gpt_flutter_client/models/step.dart';
import 'package:auto_gpt_flutter_client/models/step_request_body.dart';
import 'package:flutter/foundation.dart';
import 'package:auto_gpt_flutter_client/services/chat_service.dart';
import 'package:auto_gpt_flutter_client/models/chat.dart';
import 'package:auto_gpt_flutter_client/models/message_type.dart';
class ChatViewModel with ChangeNotifier {
final ChatService _chatService;
List<Chat> _chats = [];
String? _currentTaskId;
ChatViewModel(this._chatService);
/// Returns the current list of chats.
List<Chat> get chats => _chats;
String? get currentTaskId => _currentTaskId;
void setCurrentTaskId(String taskId) {
if (_currentTaskId != taskId) {
_currentTaskId = taskId;
fetchChatsForTask();
}
}
void clearCurrentTaskAndChats() {
_currentTaskId = null;
_chats.clear();
notifyListeners(); // Notify listeners to rebuild UI
}
/// Fetches chats from the data source for a specific task.
void fetchChatsForTask() async {
if (_currentTaskId == null) {
print("Error: Task ID is not set.");
return;
}
try {
// Fetch task steps from the data source
final Map<String, dynamic> stepsResponse =
await _chatService.listTaskSteps(_currentTaskId!);
// Extract steps from the response
final List<dynamic> stepsJsonList = stepsResponse['steps'] ?? [];
// Convert each map into a Step object
List<Step> steps =
stepsJsonList.map((stepMap) => Step.fromMap(stepMap)).toList();
// Initialize an empty list to store Chat objects
List<Chat> chats = [];
// Generate current timestamp
DateTime currentTimestamp = DateTime.now();
for (Step step in steps) {
// Create a Chat object for 'input' if it exists and is not empty
if (step.input.isNotEmpty) {
chats.add(Chat(
id: step.stepId,
taskId: step.taskId,
message: step.input,
timestamp: currentTimestamp,
messageType: MessageType.user,
));
}
// Create a Chat object for 'output'
chats.add(Chat(
id: step.stepId,
taskId: step.taskId,
message: step.output,
timestamp: currentTimestamp,
messageType: MessageType.agent,
));
}
// Assign the chats list
_chats = chats;
// Notify listeners to rebuild UI
notifyListeners();
print(
"Chats (and steps) fetched successfully for task ID: $_currentTaskId");
} catch (error) {
print("Error fetching chats: $error");
// TODO: Handle additional error scenarios or log them as required
}
}
/// Sends a chat message for a specific task.
void sendChatMessage(String message) async {
if (_currentTaskId == null) {
print("Error: Task ID is not set.");
return;
}
try {
// Create the request body for executing the step
StepRequestBody requestBody = StepRequestBody(input: message);
// Execute the step and get the response
Map<String, dynamic> executedStepResponse =
await _chatService.executeStep(_currentTaskId!, requestBody);
// Create a Chat object from the returned step
Step executedStep = Step.fromMap(executedStepResponse);
// Create a Chat object for the user message
final userChat = Chat(
id: executedStep.stepId,
taskId: executedStep.taskId,
message: executedStep.input,
timestamp: DateTime.now(),
messageType: MessageType.user,
);
// Create a Chat object for the agent message
final agentChat = Chat(
id: executedStep.stepId,
taskId: executedStep.taskId,
message: executedStep.output,
timestamp: DateTime.now(),
messageType: MessageType.agent,
);
// Add the user and agent chats to the list
_chats.add(userChat);
_chats.add(agentChat);
// Notify UI of the new chats
notifyListeners();
print("Chats added for task ID: $_currentTaskId");
} catch (error) {
print("Error sending chat: $error");
// TODO: Handle additional error scenarios or log them as required
}
}
}