fix: Retry job if file not found (#11683)
Removed StandardError rescue blocks and added retry_on for ResponseBuilderJob and AudioTranscriptionJob
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
class Captain::Conversation::ResponseBuilderJob < ApplicationJob
|
class Captain::Conversation::ResponseBuilderJob < ApplicationJob
|
||||||
MAX_MESSAGE_LENGTH = 10_000
|
MAX_MESSAGE_LENGTH = 10_000
|
||||||
|
retry_on ActiveStorage::FileNotFoundError, attempts: 3
|
||||||
|
|
||||||
def perform(conversation, assistant)
|
def perform(conversation, assistant)
|
||||||
@conversation = conversation
|
@conversation = conversation
|
||||||
@@ -12,6 +13,8 @@ class Captain::Conversation::ResponseBuilderJob < ApplicationJob
|
|||||||
generate_and_process_response
|
generate_and_process_response
|
||||||
end
|
end
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
|
raise e if e.is_a?(ActiveJob::FileNotFoundError)
|
||||||
|
|
||||||
handle_error(e)
|
handle_error(e)
|
||||||
ensure
|
ensure
|
||||||
Current.executed_by = nil
|
Current.executed_by = nil
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
class Messages::AudioTranscriptionJob < ApplicationJob
|
class Messages::AudioTranscriptionJob < ApplicationJob
|
||||||
queue_as :low
|
queue_as :low
|
||||||
|
|
||||||
|
retry_on ActiveStorage::FileNotFoundError, wait: 2.seconds, attempts: 3
|
||||||
|
|
||||||
def perform(attachment_id)
|
def perform(attachment_id)
|
||||||
attachment = Attachment.find_by(id: attachment_id)
|
attachment = Attachment.find_by(id: attachment_id)
|
||||||
return if attachment.blank?
|
return if attachment.blank?
|
||||||
|
|
||||||
Messages::AudioTranscriptionService.new(attachment).perform
|
Messages::AudioTranscriptionService.new(attachment).perform
|
||||||
rescue StandardError => e
|
|
||||||
Rails.logger.error "Error in AudioTranscriptionJob: #{e.message}"
|
|
||||||
ChatwootExceptionTracker.new(e).capture_exception
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -12,15 +12,9 @@ class Messages::AudioTranscriptionService < Llm::BaseOpenAiService
|
|||||||
return { error: 'Transcription limit exceeded' } unless can_transcribe?
|
return { error: 'Transcription limit exceeded' } unless can_transcribe?
|
||||||
return { error: 'Message not found' } if message.blank?
|
return { error: 'Message not found' } if message.blank?
|
||||||
|
|
||||||
begin
|
|
||||||
transcriptions = transcribe_audio
|
transcriptions = transcribe_audio
|
||||||
Rails.logger.info "Audio transcription successful: #{transcriptions}"
|
Rails.logger.info "Audio transcription successful: #{transcriptions}"
|
||||||
{ success: true, transcriptions: transcriptions }
|
{ success: true, transcriptions: transcriptions }
|
||||||
rescue StandardError => e
|
|
||||||
ChatwootExceptionTracker.new(e).capture_exception
|
|
||||||
Rails.logger.error "Audio transcription failed: #{e.message}"
|
|
||||||
{ error: "Transcription failed: #{e.message}" }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -53,18 +53,5 @@ RSpec.describe Messages::AudioTranscriptionService, type: :service do
|
|||||||
expect(result).to eq({ success: true, transcriptions: 'Existing transcription' })
|
expect(result).to eq({ success: true, transcriptions: 'Existing transcription' })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when transcription fails' do
|
|
||||||
before do
|
|
||||||
allow(service).to receive(:can_transcribe?).and_return(true)
|
|
||||||
allow(service).to receive(:transcribe_audio).and_raise(StandardError.new('API error'))
|
|
||||||
allow(ChatwootExceptionTracker).to receive(:new).and_return(instance_double(ChatwootExceptionTracker, capture_exception: nil))
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns error response' do
|
|
||||||
result = service.perform
|
|
||||||
expect(result).to eq({ error: 'Transcription failed: API error' })
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user