127 lines
3.4 KiB
Dart
127 lines
3.4 KiB
Dart
// ignore_for_file: depend_on_referenced_packages, avoid_web_libraries_in_flutter
|
|
|
|
import 'dart:async';
|
|
import 'dart:convert';
|
|
import 'package:didvan/services/storage/storage.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:http/http.dart' as http;
|
|
import 'package:http_parser/http_parser.dart';
|
|
import 'package:image_picker/image_picker.dart';
|
|
import 'package:mime/mime.dart';
|
|
|
|
class AiApiService {
|
|
static const String baseUrl = 'https://api.didvan.app/ai';
|
|
|
|
static Future<http.MultipartRequest> initial(
|
|
{required final String url,
|
|
required final String message,
|
|
final int? chatId,
|
|
final XFile? file,
|
|
final bool? edite}) async {
|
|
final headers = {
|
|
"Authorization": "Bearer ${await StorageService.getValue(key: 'token')}",
|
|
'Content-Type': 'multipart/form-data'
|
|
};
|
|
|
|
var request = http.MultipartRequest('POST', Uri.parse(baseUrl + url))
|
|
..headers.addAll(headers);
|
|
|
|
request.fields['prompt'] = message;
|
|
if (chatId != null) {
|
|
request.fields['chatId'] = chatId.toString();
|
|
}
|
|
if (edite != null) {
|
|
request.fields['edit'] = edite.toString().toLowerCase();
|
|
}
|
|
|
|
if (file != null) {
|
|
// if (file.duration != null) {
|
|
// request.fields['duration'] = file.duration!.inSeconds.toString();
|
|
// }
|
|
Uint8List bytes;
|
|
String filename;
|
|
String mimeType;
|
|
|
|
bytes = await file.readAsBytes();
|
|
filename = file.name;
|
|
mimeType = lookupMimeType(filename) ?? 'application/octet-stream';
|
|
print("mimeType: $mimeType");
|
|
|
|
// switch (file.extname) {
|
|
// case '.mp3':
|
|
// mimeType = 'audio/mpeg';
|
|
// break;
|
|
// case '.wav':
|
|
// mimeType = 'audio/wav';
|
|
// break;
|
|
// case '.aac':
|
|
// mimeType = 'audio/aac';
|
|
// break;
|
|
// case '.m4a':
|
|
// mimeType = 'audio/x-m4a'; // or 'audio/aac'
|
|
// break;
|
|
// case '.ogg':
|
|
// mimeType = 'audio/ogg';
|
|
// break;
|
|
// case '.flac':
|
|
// mimeType = 'audio/x-flac';
|
|
// break;
|
|
// case '.wma':
|
|
// mimeType = 'audio/x-ms-wma';
|
|
// break;
|
|
// case '.amr':
|
|
// mimeType = 'audio/amr';
|
|
// break;
|
|
// case '.midi':
|
|
// mimeType = 'audio/midi';
|
|
// break;
|
|
// case '.weba':
|
|
// mimeType = 'audio/webm';
|
|
// break;
|
|
// case '.png':
|
|
// mimeType = 'image/png';
|
|
// break;
|
|
// case '.jpg':
|
|
// mimeType = 'image/jpeg';
|
|
// break;
|
|
// case '.pdf':
|
|
// mimeType = 'application/pdf';
|
|
// break;
|
|
// default:
|
|
// mimeType = lookupMimeType(filename) ?? 'application/octet-stream';
|
|
// }
|
|
|
|
request.files.add(http.MultipartFile.fromBytes(
|
|
'file',
|
|
bytes,
|
|
filename: filename,
|
|
contentType: MediaType.parse(mimeType),
|
|
));
|
|
}
|
|
|
|
// print("req: ${request.fields}");
|
|
|
|
return request;
|
|
}
|
|
|
|
Future<Stream<List<int>>> getResponse(http.MultipartRequest req) async {
|
|
try {
|
|
final response = await http.Client().send(req);
|
|
if (response.statusCode == 400) {
|
|
// Handle 400 response
|
|
final errorResponse = await response.stream.bytesToString();
|
|
final errorJson = jsonDecode(errorResponse);
|
|
throw Exception(errorJson['error'] ?? 'Bad Request');
|
|
} else if (response.statusCode != 200) {
|
|
// Handle other non-200 responses
|
|
throw Exception('Failed to load data');
|
|
} else {
|
|
return response.stream.asBroadcastStream();
|
|
}
|
|
} catch (e) {
|
|
// Handle any other errors
|
|
throw Exception('Failed to load data');
|
|
}
|
|
}
|
|
}
|