diff --git a/lib/captain/base_editor_service.rb b/lib/captain/base_editor_service.rb index 12bf29687..ae4a1f78c 100644 --- a/lib/captain/base_editor_service.rb +++ b/lib/captain/base_editor_service.rb @@ -158,6 +158,61 @@ class Captain::BaseEditorService { error: error.message, request_messages: messages } end + def conversation_messages(in_array_format: false, start_from: 0) + messages = init_messages_body(in_array_format) + add_messages_until_token_limit(conversation, messages, in_array_format, start_from) + end + + def init_messages_body(in_array_format) + in_array_format ? [] : '' + end + + def add_messages_until_token_limit(conversation, messages, in_array_format, start_from = 0) + character_count = start_from + conversation.messages + .where(message_type: [:incoming, :outgoing]) + .where(private: false) + .reorder('id desc') + .each do |message| + character_count, message_added = add_message_if_within_limit(character_count, message, messages, in_array_format) + break unless message_added + end + messages + end + + def add_message_if_within_limit(character_count, message, messages, in_array_format) + content = message.content_for_llm + if valid_message?(content, character_count) + add_message_to_list(message, messages, in_array_format, content) + character_count += content.length + [character_count, true] + else + [character_count, false] + end + end + + def valid_message?(content, character_count) + content.present? && character_count + content.length <= TOKEN_LIMIT + end + + def add_message_to_list(message, messages, in_array_format, content) + formatted_message = format_message(message, in_array_format, content) + messages.prepend(formatted_message) + end + + def format_message(message, in_array_format, content) + in_array_format ? format_message_in_array(message, content) : format_message_in_string(message, content) + end + + def format_message_in_array(message, content) + { role: (message.incoming? ? 'user' : 'assistant'), content: content } + end + + def format_message_in_string(message, content) + sender_type = message.incoming? ? 'Customer' : 'Agent' + "#{sender_type} #{message.sender&.name} : #{content}\n" + end + def api_key @api_key ||= openai_hook&.settings&.dig('api_key') || system_api_key end diff --git a/lib/captain/label_suggestion_service.rb b/lib/captain/label_suggestion_service.rb index 57c49a2e9..8cd022217 100644 --- a/lib/captain/label_suggestion_service.rb +++ b/lib/captain/label_suggestion_service.rb @@ -40,10 +40,7 @@ class Captain::LabelSuggestionService < Captain::BaseEditorService return nil unless valid_conversation?(conversation) labels = account.labels.pluck(:title).join(', ') - character_count = labels.length - - messages = init_messages_body(false) - add_messages_until_token_limit(conversation, messages, false, character_count) + messages = conversation_messages(in_array_format: false, start_from: labels.length) return nil if messages.blank? || labels.blank? @@ -58,54 +55,4 @@ class Captain::LabelSuggestionService < Captain::BaseEditorService true end - - def init_messages_body(in_array_format) - in_array_format ? [] : '' - end - - def add_messages_until_token_limit(conversation, messages, in_array_format, start_from = 0) - character_count = start_from - conversation.messages - .where(message_type: [:incoming, :outgoing]) - .where(private: false) - .reorder('id desc') - .each do |message| - character_count, message_added = add_message_if_within_limit(character_count, message, messages, in_array_format) - break unless message_added - end - messages - end - - def add_message_if_within_limit(character_count, message, messages, in_array_format) - content = message.content_for_llm - if valid_message?(content, character_count) - add_message_to_list(message, messages, in_array_format, content) - character_count += content.length - [character_count, true] - else - [character_count, false] - end - end - - def valid_message?(content, character_count) - content.present? && character_count + content.length <= TOKEN_LIMIT - end - - def add_message_to_list(message, messages, in_array_format, content) - formatted_message = format_message(message, in_array_format, content) - messages.prepend(formatted_message) - end - - def format_message(message, in_array_format, content) - in_array_format ? format_message_in_array(message, content) : format_message_in_string(message, content) - end - - def format_message_in_array(message, content) - { role: (message.incoming? ? 'user' : 'assistant'), content: content } - end - - def format_message_in_string(message, content) - sender_type = message.incoming? ? 'Customer' : 'Agent' - "#{sender_type} #{message.sender&.name} : #{content}\n" - end end diff --git a/lib/captain/reply_suggestion_service.rb b/lib/captain/reply_suggestion_service.rb index 841fd57bc..340c325eb 100644 --- a/lib/captain/reply_suggestion_service.rb +++ b/lib/captain/reply_suggestion_service.rb @@ -13,59 +13,4 @@ class Captain::ReplySuggestionService < Captain::BaseEditorService ].concat(conversation_messages(in_array_format: true)) } end - - def conversation_messages(in_array_format: false) - messages = init_messages_body(in_array_format) - add_messages_until_token_limit(conversation, messages, in_array_format) - end - - def init_messages_body(in_array_format) - in_array_format ? [] : '' - end - - def add_messages_until_token_limit(conversation, messages, in_array_format, start_from = 0) - character_count = start_from - conversation.messages - .where(message_type: [:incoming, :outgoing]) - .where(private: false) - .reorder('id desc') - .each do |message| - character_count, message_added = add_message_if_within_limit(character_count, message, messages, in_array_format) - break unless message_added - end - messages - end - - def add_message_if_within_limit(character_count, message, messages, in_array_format) - content = message.content_for_llm - if valid_message?(content, character_count) - add_message_to_list(message, messages, in_array_format, content) - character_count += content.length - [character_count, true] - else - [character_count, false] - end - end - - def valid_message?(content, character_count) - content.present? && character_count + content.length <= TOKEN_LIMIT - end - - def add_message_to_list(message, messages, in_array_format, content) - formatted_message = format_message(message, in_array_format, content) - messages.prepend(formatted_message) - end - - def format_message(message, in_array_format, content) - in_array_format ? format_message_in_array(message, content) : format_message_in_string(message, content) - end - - def format_message_in_array(message, content) - { role: (message.incoming? ? 'user' : 'assistant'), content: content } - end - - def format_message_in_string(message, content) - sender_type = message.incoming? ? 'Customer' : 'Agent' - "#{sender_type} #{message.sender&.name} : #{content}\n" - end end diff --git a/lib/captain/summary_service.rb b/lib/captain/summary_service.rb index e6bc12ff9..7ccbf1917 100644 --- a/lib/captain/summary_service.rb +++ b/lib/captain/summary_service.rb @@ -14,59 +14,4 @@ class Captain::SummaryService < Captain::BaseEditorService ] } end - - def conversation_messages(in_array_format: false) - messages = init_messages_body(in_array_format) - add_messages_until_token_limit(conversation, messages, in_array_format) - end - - def init_messages_body(in_array_format) - in_array_format ? [] : '' - end - - def add_messages_until_token_limit(conversation, messages, in_array_format, start_from = 0) - character_count = start_from - conversation.messages - .where(message_type: [:incoming, :outgoing]) - .where(private: false) - .reorder('id desc') - .each do |message| - character_count, message_added = add_message_if_within_limit(character_count, message, messages, in_array_format) - break unless message_added - end - messages - end - - def add_message_if_within_limit(character_count, message, messages, in_array_format) - content = message.content_for_llm - if valid_message?(content, character_count) - add_message_to_list(message, messages, in_array_format, content) - character_count += content.length - [character_count, true] - else - [character_count, false] - end - end - - def valid_message?(content, character_count) - content.present? && character_count + content.length <= TOKEN_LIMIT - end - - def add_message_to_list(message, messages, in_array_format, content) - formatted_message = format_message(message, in_array_format, content) - messages.prepend(formatted_message) - end - - def format_message(message, in_array_format, content) - in_array_format ? format_message_in_array(message, content) : format_message_in_string(message, content) - end - - def format_message_in_array(message, content) - { role: (message.incoming? ? 'user' : 'assistant'), content: content } - end - - def format_message_in_string(message, content) - sender_type = message.incoming? ? 'Customer' : 'Agent' - "#{sender_type} #{message.sender&.name} : #{content}\n" - end end