convertMessage method

Map<String, dynamic> convertMessage(
  1. ChatMessage message
)

Convert ChatMessage to OpenAI API format

Implementation

Map<String, dynamic> convertMessage(ChatMessage message) {
  final result = <String, dynamic>{'role': message.role.name};

  // Add name field if present (useful for system messages)
  if (message.name != null) {
    result['name'] = message.name;
  }

  switch (message.messageType) {
    case TextMessage():
      result['content'] = message.content;
      break;
    case ImageMessage(mime: final mime, data: final data):
      // Handle base64 encoded images
      final base64Data = base64Encode(data);
      result['content'] = [
        {
          'type': 'image_url',
          'image_url': {'url': 'data:${mime.mimeType};base64,$base64Data'},
        },
      ];
      break;
    case ImageUrlMessage(url: final url):
      result['content'] = [
        {
          'type': 'image_url',
          'image_url': {'url': url},
        },
      ];
      break;
    case ToolUseMessage(toolCalls: final toolCalls):
      result['tool_calls'] = toolCalls.map((tc) => tc.toJson()).toList();
      break;
    case ToolResultMessage(results: final results):
      // Tool results need to be converted to separate tool messages
      // This case should not happen in normal message conversion
      // as tool results are handled separately in buildRequestBody
      result['content'] =
          message.content.isNotEmpty ? message.content : 'Tool result';
      result['tool_call_id'] = results.isNotEmpty ? results.first.id : null;
      break;
    default:
      result['content'] = message.content;
  }

  return result;
}