# Pull Request Template ## Description Routes OSS reply-box and small Captain tasks through feature-specific LLM model resolution. Rewrite, reply suggestion, summary, follow-up, and CSAT utility analysis now resolve through the `editor` feature; label suggestion resolves through `label_suggestion`. Existing credentials, account OpenAI hook behavior, and instrumentation event names remain unchanged. Linear: https://linear.app/chatwoot/issue/CW-7425/test-new-models Depends on #14839 ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality not to work as expected) - [ ] This change requires a documentation update ## How Has This Been Tested? - `bundle exec rspec spec/lib/captain/base_task_service_spec.rb spec/lib/captain/rewrite_service_spec.rb spec/lib/captain/reply_suggestion_service_spec.rb spec/lib/captain/summary_service_spec.rb spec/lib/captain/label_suggestion_service_spec.rb spec/lib/captain/csat_utility_analysis_service_spec.rb spec/lib/captain/follow_up_service_spec.rb` passed with 81 examples, 0 failures. - `bundle exec rubocop lib/captain/base_task_service.rb lib/captain/rewrite_service.rb lib/captain/reply_suggestion_service.rb lib/captain/summary_service.rb lib/captain/label_suggestion_service.rb lib/captain/csat_utility_analysis_service.rb lib/captain/follow_up_service.rb enterprise/lib/enterprise/captain/reply_suggestion_service.rb spec/lib/captain/base_task_service_spec.rb spec/lib/captain/rewrite_service_spec.rb spec/lib/captain/reply_suggestion_service_spec.rb spec/lib/captain/summary_service_spec.rb spec/lib/captain/label_suggestion_service_spec.rb spec/lib/captain/csat_utility_analysis_service_spec.rb spec/lib/captain/follow_up_service_spec.rb` passed with no offenses. - `git diff --check` passed. ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
56 lines
2.0 KiB
Ruby
56 lines
2.0 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe Captain::CsatUtilityAnalysisService do
|
|
let(:account) { create(:account) }
|
|
let(:service) { described_class.new(account: account, message: 'Test message', language: 'en', baseline: {}) }
|
|
|
|
before do
|
|
create(:installation_config, name: 'CAPTAIN_OPEN_AI_API_KEY', value: 'test-key')
|
|
allow(Integrations::Openai::KeyValidator).to receive(:valid?).and_return(true)
|
|
end
|
|
|
|
describe '#perform' do
|
|
before do
|
|
allow(account).to receive(:feature_enabled?).and_call_original
|
|
allow(account).to receive(:feature_enabled?).with('captain_tasks').and_return(true)
|
|
allow(service).to receive(:make_api_call).and_return({
|
|
message: '{"classification":"LIKELY_UTILITY","optimized_message":"Utility-safe message"}'
|
|
})
|
|
end
|
|
|
|
it 'returns parsed payload and preserves raw message for usage metering' do
|
|
result = service.perform
|
|
|
|
expect(result[:classification]).to eq('LIKELY_UTILITY')
|
|
expect(result[:optimized_message]).to eq('Utility-safe message')
|
|
expect(result[:message]).to eq('{"classification":"LIKELY_UTILITY","optimized_message":"Utility-safe message"}')
|
|
end
|
|
|
|
it 'routes through the editor feature' do
|
|
expect(service).to receive(:make_api_call).with(
|
|
hash_including(feature: 'editor')
|
|
).and_return({ message: '{"classification":"LIKELY_UTILITY"}' })
|
|
|
|
service.perform
|
|
end
|
|
end
|
|
|
|
describe '#api_key' do
|
|
context 'when account has an OpenAI hook key' do
|
|
before do
|
|
create(:integrations_hook, :openai, account: account, settings: { 'api_key' => 'customer-own-key' })
|
|
end
|
|
|
|
it 'uses the account hook key' do
|
|
expect(service.send(:api_key)).to eq('customer-own-key')
|
|
end
|
|
end
|
|
|
|
context 'when account does not have an OpenAI hook key' do
|
|
it 'uses the system key' do
|
|
expect(service.send(:api_key)).to eq('test-key')
|
|
end
|
|
end
|
|
end
|
|
end
|