<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def create_conversation(self, body, recipients, attachment_ids=None, context_code=None, filter=None, filter_mode=None, group_conversation=None, media_comment_id=None, media_comment_type=None, mode=None, scope=None, subject=None, user_note=None):

 """
 Create a conversation.
 
 Create a new conversation with one or more recipients. If there is already
 an existing private conversation with the given recipients, it will be
 reused.
 """

        path = {}
        data = {}
        params = {}

        # REQUIRED - recipients
        """An array of recipient ids. These may be user ids or course/group ids
        prefixed with "course_" or "group_" respectively, e.g.
        recipients[]=1&recipients[]=2&recipients[]=course_3"""
        data["recipients"] = recipients

        # OPTIONAL - subject
        """The subject of the conversation. This is ignored when reusing a
        conversation. Maximum length is 255 characters."""
        if subject is not None:
            data["subject"] = subject

        # REQUIRED - body
        """The message to be sent"""
        data["body"] = body

        # OPTIONAL - group_conversation
        """Defaults to false. If true, this will be a group conversation (i.e. all
        recipients may see all messages and replies). If false, individual private
        conversations will be started with each recipient. Must be set false if the
        number of recipients is over the set maximum (default is 100)."""
        if group_conversation is not None:
            data["group_conversation"] = group_conversation

        # OPTIONAL - attachment_ids
        """An array of attachments ids. These must be files that have been previously
        uploaded to the sender's "conversation attachments" folder."""
        if attachment_ids is not None:
            data["attachment_ids"] = attachment_ids

        # OPTIONAL - media_comment_id
        """Media comment id of an audio of video file to be associated with this
        message."""
        if media_comment_id is not None:
            data["media_comment_id"] = media_comment_id

        # OPTIONAL - media_comment_type
        """Type of the associated media file"""
        if media_comment_type is not None:
            self._validate_enum(media_comment_type, ["audio", "video"])
            data["media_comment_type"] = media_comment_type

        # OPTIONAL - user_note
        """Will add a faculty journal entry for each recipient as long as the user
        making the api call has permission, the recipient is a student and
        faculty journals are enabled in the account."""
        if user_note is not None:
            data["user_note"] = user_note

        # OPTIONAL - mode
        """Determines whether the messages will be created/sent synchronously or
        asynchronously. Defaults to sync, and this option is ignored if this is a
        group conversation or there is just one recipient (i.e. it must be a bulk
        private message). When sent async, the response will be an empty array
        (batch status can be queried via the {api:ConversationsController#batches batches API})"""
        if mode is not None:
            self._validate_enum(mode, ["sync", "async"])
            data["mode"] = mode

        # OPTIONAL - scope
        """Used when generating "visible" in the API response. See the explanation
        under the {api:ConversationsController#index index API action}"""
        if scope is not None:
            self._validate_enum(scope, ["unread", "starred", "archived"])
            data["scope"] = scope

        # OPTIONAL - filter
        """Used when generating "visible" in the API response. See the explanation
        under the {api:ConversationsController#index index API action}"""
        if filter is not None:
            data["filter"] = filter

        # OPTIONAL - filter_mode
        """Used when generating "visible" in the API response. See the explanation
        under the {api:ConversationsController#index index API action}"""
        if filter_mode is not None:
            self._validate_enum(filter_mode, ["and", "or", "default or"])
            data["filter_mode"] = filter_mode

        # OPTIONAL - context_code
        """The course or group that is the context for this conversation. Same format
        as courses or groups in the recipients argument."""
        if context_code is not None:
            data["context_code"] = context_code

        self.logger.debug("POST /api/v1/conversations with query params: {params} and form data: {data}".format(params=params, data=data, **path))
        return self.generic_request("POST", "/api/v1/conversations".format(**path), data=data, params=params, no_data=True)