dart_openai: ^5.1.0
< /code>
Проблема возникает при отправке необработанных данных изображения в качестве строки Base64. Есть ли способ разрешить это, или ImageUrl () ожидает URL, который общедоступен после сохранения в облаке? < /P>
if (m.imageUrls.isNotEmpty) {
for (final imagePath in m.imageUrls) {
print('processing image...');
print('image path $imagePath');
try {
final compressedBytes = await compressImage(imagePath);
// final imageBytes = await File(imagePath).readAsBytes();
final base64Image = base64Encode(compressedBytes);
contentItems.add(
OpenAIChatCompletionChoiceMessageContentItemModel.imageUrl(
'data:image/jpeg;base64,$base64Image',
),
);
} catch (e) {
print('Error processing image: $e');
}
}
}
< /code>
для полной ссылки < /p>
openai_service.dart (service) < /p>
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:dart_openai/dart_openai.dart';
import 'package:flutter_template/features/chat/models/chat_model.dart';
import 'package:path_provider/path_provider.dart';
import 'package:image/image.dart' as img;
Future compressImage(String imagePath) async {
final imageFile = File(imagePath);
final bytes = await imageFile.readAsBytes();
// Decode image
final image = img.decodeImage(bytes)!;
// Resize to maximum 1024px width (maintain aspect ratio)
final resized = img.copyResize(image, width: 1024);
// Compress with 80% quality
return Uint8List.fromList(img.encodeJpg(resized, quality: 80));
}
class OpenAIService {
OpenAIService(String apiKey) {
OpenAI.apiKey = apiKey;
}
// New method to transcribe audio
Future transcribeAudio(File audioFile) async {
final transcription = await OpenAI.instance.audio.createTranscription(
file: audioFile,
model: 'whisper-1',
);
return transcription.text;
}
Stream streamChatCompletion(List messages) async* {
final recentMessages = messages.length > 10
? messages.sublist(messages.length - 10)
: messages;
for (final message in recentMessages) {
if (message.audioBytes != null) {
print('Audio bytes length: ${message.audioBytes!.length}');
}
}
// Convert ChatMessages to OpenAI messages
final openaiMessages = await Future.wait(recentMessages.map((m) async {
final contentItems =
[];
// Handle text content
if (m.content.isNotEmpty) {
contentItems.add(
OpenAIChatCompletionChoiceMessageContentItemModel.text(m.content),
);
}
// Handle images (convert to base64)
if (m.imageUrls.isNotEmpty) {
for (final imagePath in m.imageUrls) {
print('processing image...');
print('image path $imagePath');
try {
final compressedBytes = await compressImage(imagePath);
// final imageBytes = await File(imagePath).readAsBytes();
final base64Image = base64Encode(compressedBytes);
contentItems.add(
OpenAIChatCompletionChoiceMessageContentItemModel.imageUrl(
'data:image/jpeg;base64,$base64Image',
),
);
} catch (e) {
print('Error processing image: $e');
}
}
}
// Handle audio (transcribe to text)
if (m.audioBytes != null) {
print('transcribing audio...');
// Create temp file for audio
final tempDir = await getTemporaryDirectory();
final tempFile = File('${tempDir.path}/audio_temp.wav')
..writeAsBytesSync(m.audioBytes!);
final transcription = await transcribeAudio(tempFile);
print('audio transcribed: $transcription');
contentItems.add(
OpenAIChatCompletionChoiceMessageContentItemModel.text(
'[Audio transcription]: $transcription'),
);
}
return OpenAIChatCompletionChoiceMessageModel(
content: contentItems,
role: m.isUser
? OpenAIChatMessageRole.user
: OpenAIChatMessageRole.assistant,
);
}));
// Determine model based on content
final hasImages = messages.any((m) => m.imageUrls.isNotEmpty);
final model = hasImages ? 'gpt-4-turbo' : 'gpt-3.5-turbo';
final stream = OpenAI.instance.chat.createStream(
model: model,
messages: openaiMessages,
);
// Process stream
await for (final chunk in stream) {
final content = chunk.choices.first.delta.content;
if (content != null) {
// Combine all text content
final textContent = content
.where((item) => item?.type == 'text')
.map((item) => item?.text)
.join();
if (textContent.isNotEmpty) {
yield textContent;
}
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... t1-image-u