app/models/ruby_conversations/concerns/conversation_messages.rb



# frozen_string_literal: true

module RubyConversations
  module Concerns
    # Handles message-related functionality for Conversation
    module ConversationMessages
      extend ActiveSupport::Concern

      def initialize_messages(message_attributes)
        (message_attributes || []).each do |msg_data|
          processed_prompts = process_message_prompts(msg_data)

          message_instance = RubyConversations::Message.new(msg_data.except('id', 'conversation_id', 'created_at',
                                                                            'updated_at'))
          message_instance.message_prompts = processed_prompts
          @messages << message_instance # Add to the messages array
        end
      end

      def with_prompts(prompt_inputs, description: nil)
        message = MessageBuilder.new(self).build_from_multiple_prompts(prompt_inputs, description: description)
        with_model(message)
        self
      end

      def with_prompt(name, description: nil, inputs: {})
        message = MessageBuilder.new(self).build_from_single_prompt(name, description: description, inputs: inputs)
        with_model(message)
        self
      end

      def with_user_message(message, description: nil)
        MessageBuilder.new(self).build_from_user_message(message, description: description)
        self
      end

      private

      def with_model(message)
        return unless message.message_prompts.first.llm.present?

        model = message.message_prompts.first.llm
        chat.with_model(model)
        with_message_llm(message, chat.model.id)
      end

      def with_message_llm(message, llm)
        message.llm = llm
        message.model_identifier = llm
      end
    end
  end
end