sendConversationMessage method

void sendConversationMessage(
  1. String message, {
  2. List<String>? base64Images,
  3. @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);
}