diff --git a/enterprise/app/jobs/captain/conversation/v1_action_classifier.rb b/enterprise/app/jobs/captain/conversation/v1_action_classifier.rb
index 0607342d2..081bc8f30 100644
--- a/enterprise/app/jobs/captain/conversation/v1_action_classifier.rb
+++ b/enterprise/app/jobs/captain/conversation/v1_action_classifier.rb
@@ -25,7 +25,7 @@ module Captain::Conversation::V1ActionClassifier
def apply_v1_action_classification(classification)
action = classification['action']
- unless action.in?(%w[continue handoff])
+ unless Captain::Llm::AssistantActionClassifierService::VALID_ACTIONS.include?(action)
Rails.logger.warn(
"[CAPTAIN][ResponseBuilderJob] V1 action classifier returned invalid action for account=#{account.id} " \
"conversation=#{@conversation.display_id}: #{classification['error'] || classification['raw_response']}"
diff --git a/enterprise/app/services/captain/llm/assistant_action_classifier_service.rb b/enterprise/app/services/captain/llm/assistant_action_classifier_service.rb
index 56663b621..821c76dfe 100644
--- a/enterprise/app/services/captain/llm/assistant_action_classifier_service.rb
+++ b/enterprise/app/services/captain/llm/assistant_action_classifier_service.rb
@@ -15,8 +15,10 @@ class Captain::Llm::AssistantActionClassifierService < Llm::BaseAiService
end
def classify(message_history:, assistant_response:)
- payload = classification_payload(message_history, assistant_response)
- user_prompt = classification_user_prompt(payload)
+ user_prompt = classification_user_prompt(
+ message_history: message_history,
+ assistant_response: assistant_response
+ )
response = instrument_llm_call(instrumentation_params(user_prompt)) do
chat(model: @model, temperature: @temperature)
@@ -37,28 +39,18 @@ class Captain::Llm::AssistantActionClassifierService < Llm::BaseAiService
private
- def classification_payload(message_history, assistant_response)
- normalized_messages = normalize_messages(message_history)
-
- {
- 'account_custom_instructions' => account_custom_instructions,
- 'conversation_context' => format_conversation_context(normalized_messages),
- 'assistant_response_to_classify' => assistant_response.to_s
- }
- end
-
- def classification_user_prompt(payload)
+ def classification_user_prompt(message_history:, assistant_response:)
<<~PROMPT
- #{payload['account_custom_instructions']}
+ #{@assistant.config['instructions']}
- #{payload['conversation_context']}
+ #{format_conversation_context(message_history)}
- #{payload['assistant_response_to_classify']}
+ #{assistant_response}
PROMPT
end
@@ -86,7 +78,7 @@ class Captain::Llm::AssistantActionClassifierService < Llm::BaseAiService
end
def format_conversation_context(messages)
- context_messages(messages).filter_map do |message|
+ normalize_messages(messages).last(MAX_CONTEXT_MESSAGES).filter_map do |message|
content = message[:content].to_s.strip
next if content.blank?
@@ -94,10 +86,6 @@ class Captain::Llm::AssistantActionClassifierService < Llm::BaseAiService
end.join("\n")
end
- def context_messages(messages)
- messages.last(MAX_CONTEXT_MESSAGES)
- end
-
def role_label(role)
return 'User' if role == 'user'
return 'Assistant' if role == 'assistant'
@@ -105,10 +93,6 @@ class Captain::Llm::AssistantActionClassifierService < Llm::BaseAiService
role.to_s.titleize
end
- def account_custom_instructions
- @assistant.config['instructions'].to_s
- end
-
def parse_response(content)
JSON.parse(sanitize_json_response(content))
rescue JSON::ParserError, TypeError