mirror of
https://github.com/aljazceru/Auto-GPT.git
synced 2025-12-17 14:04:27 +01:00
Added the downloadArtifact method to the ChatService class, enabling the download of artifacts in the Flutter web application. The function uses the dart:html package to trigger a browser-based file download, allowing users to save artifacts locally. This implementation complements the existing REST API and enhances the user experience.
91 lines
2.8 KiB
Dart
91 lines
2.8 KiB
Dart
import 'dart:io';
|
|
import 'dart:typed_data';
|
|
import 'package:auto_gpt_flutter_client/models/step_request_body.dart';
|
|
import 'package:auto_gpt_flutter_client/utils/rest_api_utility.dart';
|
|
import 'dart:html' as html;
|
|
|
|
/// Service class for performing chat-related operations.
|
|
class ChatService {
|
|
final RestApiUtility api;
|
|
|
|
ChatService(this.api);
|
|
|
|
/// Executes a step in a specific task.
|
|
///
|
|
/// [taskId] is the ID of the task.
|
|
/// [stepRequestBody] is a Map representing the request body for executing a step.
|
|
Future<Map<String, dynamic>> executeStep(
|
|
String taskId, StepRequestBody stepRequestBody) async {
|
|
try {
|
|
return await api.post(
|
|
'agent/tasks/$taskId/steps', stepRequestBody.toJson());
|
|
} catch (e) {
|
|
throw Exception('Failed to execute step: $e');
|
|
}
|
|
}
|
|
|
|
/// Gets details about a specific task step.
|
|
///
|
|
/// [taskId] is the ID of the task.
|
|
/// [stepId] is the ID of the step.
|
|
Future<Map<String, dynamic>> getStepDetails(
|
|
String taskId, String stepId) async {
|
|
try {
|
|
return await api.get('agent/tasks/$taskId/steps/$stepId');
|
|
} catch (e) {
|
|
throw Exception('Failed to get step details: $e');
|
|
}
|
|
}
|
|
|
|
/// Lists all steps for a specific task.
|
|
///
|
|
/// [taskId] is the ID of the task.
|
|
/// [currentPage] and [pageSize] are optional pagination parameters.
|
|
Future<Map<String, dynamic>> listTaskSteps(String taskId,
|
|
{int currentPage = 1, int pageSize = 10}) async {
|
|
try {
|
|
return await api.get(
|
|
'agent/tasks/$taskId/steps?current_page=$currentPage&page_size=$pageSize');
|
|
} catch (e) {
|
|
throw Exception('Failed to list task steps: $e');
|
|
}
|
|
}
|
|
|
|
/// Uploads an artifact for a specific task.
|
|
///
|
|
/// [taskId] is the ID of the task.
|
|
/// [artifactFile] is the File to be uploaded.
|
|
/// [uri] is the URI of the artifact.
|
|
Future<Map<String, dynamic>> uploadArtifact(
|
|
String taskId, File artifactFile, String uri) async {
|
|
return Future.value({'status': 'Not implemented yet'});
|
|
}
|
|
|
|
/// Downloads a specific artifact.
|
|
///
|
|
/// [taskId] is the ID of the task.
|
|
/// [artifactId] is the ID of the artifact.
|
|
Future<void> downloadArtifact(String taskId, String artifactId) async {
|
|
try {
|
|
final Uint8List bytes =
|
|
await api.getBinary('agent/tasks/$taskId/artifacts/$artifactId');
|
|
|
|
// Create a blob from the Uint8List
|
|
final blob = html.Blob([bytes]);
|
|
|
|
// Generate a URL from the Blob
|
|
final url = html.Url.createObjectUrlFromBlob(blob);
|
|
|
|
// Create an anchor HTML element
|
|
final anchor = html.AnchorElement(href: url)
|
|
..setAttribute("download", "artifact_$artifactId")
|
|
..click();
|
|
|
|
// Cleanup: Revoke the object URL
|
|
html.Url.revokeObjectUrl(url);
|
|
} catch (e) {
|
|
throw Exception('An error occurred while downloading the artifact: $e');
|
|
}
|
|
}
|
|
}
|