sendConversationMessage method
void
sendConversationMessage(
- String message, {
- List<
String> ? base64Images, - @Deprecated('Use base64Images parameter instead for better support of multiple images') String? base64Image,
AI Assistant Conversation Method. Sends a conversation message to an assistant agent with optional image attachments.
@param message The text message to send
@param base64Images Optional list of base64 encoded images to attach to the message.
Can be null (no images), a single image, or multiple images.
@param base64Image DEPRECATED Optional single base64 encoded image. Use base64Images instead.
This parameter is kept for backward compatibility.
Note: In order to provide images to your assistant, you need to make sure that you are using a vision-capable model. The base64 images should be base64 encoded strings of the image data.
Example usage:
// Send text only
call.sendConversationMessage("Hello");
// Send text with single image
call.sendConversationMessage("What's in this image?", base64Images: ["data:image/jpeg;base64,..."]);
// Send text with multiple images
call.sendConversationMessage("Compare these images", base64Images: [
"data:image/jpeg;base64,...",
"data:image/png;base64,...",
"data:image/jpeg;base64,..."
]);
// Backward compatibility - single image (deprecated)
call.sendConversationMessage("What's in this image?", base64Image: "data:image/jpeg;base64,...");
Implementation
void sendConversationMessage(
String message, {
List<String>? base64Images,
@Deprecated(
'Use base64Images parameter instead for better support of multiple images')
String? base64Image,
}) {
final uuid = const Uuid().v4();
final messageId = const Uuid().v4();
// Create content list, adding text message only if it's not empty
final List<ConversationContentData> content = [];
if (message.isNotEmpty) {
content.add(ConversationContentData(type: 'input_text', text: message));
}
// Handle images - prioritize base64Images over deprecated base64Image
List<String>? imagesToProcess;
if (base64Images != null && base64Images.isNotEmpty) {
imagesToProcess = base64Images;
} else if (base64Image != null && base64Image.isNotEmpty) {
// Backward compatibility: convert single image to list
imagesToProcess = [base64Image];
}
// Add image content for each provided image
if (imagesToProcess != null) {
for (String imageData in imagesToProcess) {
if (imageData.isNotEmpty) {
// Ensure the base64 string has the proper data URL format
String imageDataUrl = imageData;
if (!imageData.startsWith('data:image/')) {
// Default to JPEG if no format is specified
imageDataUrl = 'data:image/jpeg;base64,$imageData';
}
content.add(ConversationContentData(
type: 'image_url',
imageUrl: ConversationImageUrl(url: imageDataUrl),
));
}
}
}
final conversationItem = ConversationItemData(
id: messageId,
type: 'message',
role: 'user',
content: content,
);
final conversationParams = ConversationMessageParams(
type: 'conversation.item.create',
previousItemId: null,
item: conversationItem,
);
final conversationMessage = ConversationMessage(
id: uuid,
jsonrpc: JsonRPCConstant.jsonrpc,
method: SocketMethod.aiConversation,
params: conversationParams,
);
final String jsonConversationMessage = jsonEncode(conversationMessage);
txSocket.send(jsonConversationMessage);
}