From 429d281501be22d45ac431f929a70f9629eb1830 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Thu, 22 Aug 2024 10:24:13 +0530 Subject: [PATCH] fix: Handle OpenAI API errors (#9560) --- .../accounts/integrations/hooks_controller.rb | 7 ++++++- app/javascript/dashboard/mixins/aiMixin.js | 6 +++++- app/models/integrations/hook.rb | 2 +- .../integrations/openai_processor_service.rb | 2 +- lib/integrations/openai_base_service.rb | 6 +++++- .../integrations/hooks_controller_spec.rb | 5 ++--- .../openai/processor_service_spec.rb | 18 +++++++++--------- spec/models/integrations/hook_spec.rb | 2 +- 8 files changed, 30 insertions(+), 18 deletions(-) diff --git a/app/controllers/api/v1/accounts/integrations/hooks_controller.rb b/app/controllers/api/v1/accounts/integrations/hooks_controller.rb index d09ea2f00..13bb2738b 100644 --- a/app/controllers/api/v1/accounts/integrations/hooks_controller.rb +++ b/app/controllers/api/v1/accounts/integrations/hooks_controller.rb @@ -11,7 +11,12 @@ class Api::V1::Accounts::Integrations::HooksController < Api::V1::Accounts::Base end def process_event - render json: { message: @hook.process_event(params[:event]) } + response = @hook.process_event(params[:event]) + if response[:error] + render json: { error: response[:error] }, status: :unprocessable_entity + else + render json: { message: response[:message] } + end end def destroy diff --git a/app/javascript/dashboard/mixins/aiMixin.js b/app/javascript/dashboard/mixins/aiMixin.js index a775b2ecd..8263ca8c2 100644 --- a/app/javascript/dashboard/mixins/aiMixin.js +++ b/app/javascript/dashboard/mixins/aiMixin.js @@ -100,7 +100,11 @@ export default { } = result; return generatedMessage; } catch (error) { - useAlert(this.$t('INTEGRATION_SETTINGS.OPEN_AI.GENERATE_ERROR')); + const errorData = error.response.data.error; + const errorMessage = + errorData?.error?.message || + this.$t('INTEGRATION_SETTINGS.OPEN_AI.GENERATE_ERROR'); + useAlert(errorMessage); return ''; } }, diff --git a/app/models/integrations/hook.rb b/app/models/integrations/hook.rb index 076a5fce9..f523af4a5 100644 --- a/app/models/integrations/hook.rb +++ b/app/models/integrations/hook.rb @@ -56,7 +56,7 @@ class Integrations::Hook < ApplicationRecord when 'openai' Integrations::Openai::ProcessorService.new(hook: self, event: event).perform if app_id == 'openai' else - 'No processor found' + { error: 'No processor found' } end end diff --git a/enterprise/lib/enterprise/integrations/openai_processor_service.rb b/enterprise/lib/enterprise/integrations/openai_processor_service.rb index b3cf9aeee..55b7d33cd 100644 --- a/enterprise/lib/enterprise/integrations/openai_processor_service.rb +++ b/enterprise/lib/enterprise/integrations/openai_processor_service.rb @@ -31,7 +31,7 @@ module Enterprise::Integrations::OpenaiProcessorService # To what you ask? Sometimes, the response includes # "Labels:" in it's response in some format. This is a hacky way to remove it # TODO: Fix with with a better prompt - response.present? ? response.gsub(/^(label|labels):/i, '') : '' + response[:message] ? response[:message].gsub(/^(label|labels):/i, '') : '' end private diff --git a/lib/integrations/openai_base_service.rb b/lib/integrations/openai_base_service.rb index da2878aab..056ec998a 100644 --- a/lib/integrations/openai_base_service.rb +++ b/lib/integrations/openai_base_service.rb @@ -77,8 +77,12 @@ class Integrations::OpenaiBaseService response = HTTParty.post(API_URL, headers: headers, body: body) Rails.logger.info("OpenAI API response: #{response.body}") + return { error: response.parsed_response, error_code: response.code } unless response.success? + choices = JSON.parse(response.body)['choices'] - choices.present? ? choices.first['message']['content'] : nil + return { message: choices.first['message']['content'] } if choices.present? + + { message: nil } end end diff --git a/spec/controllers/api/v1/accounts/integrations/hooks_controller_spec.rb b/spec/controllers/api/v1/accounts/integrations/hooks_controller_spec.rb index 562272f14..23c1045c5 100644 --- a/spec/controllers/api/v1/accounts/integrations/hooks_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/integrations/hooks_controller_spec.rb @@ -97,9 +97,8 @@ RSpec.describe 'Integration Hooks API', type: :request do params: params, headers: agent.create_new_auth_token, as: :json - - expect(response).to have_http_status(:success) - expect(response.parsed_body['message']).to eq('No processor found') + expect(response).to have_http_status(:unprocessable_entity) + expect(response.parsed_body['error']).to eq 'No processor found' end end end diff --git a/spec/lib/integrations/openai/processor_service_spec.rb b/spec/lib/integrations/openai/processor_service_spec.rb index 4d8443ea1..ec0a7bc91 100644 --- a/spec/lib/integrations/openai/processor_service_spec.rb +++ b/spec/lib/integrations/openai/processor_service_spec.rb @@ -52,7 +52,7 @@ RSpec.describe Integrations::Openai::ProcessorService do .to_return(status: 200, body: openai_response, headers: {}) result = subject.perform - expect(result).to eq('This is a reply from openai.') + expect(result).to eq({ :message => 'This is a reply from openai.' }) end end @@ -76,7 +76,7 @@ RSpec.describe Integrations::Openai::ProcessorService do .to_return(status: 200, body: openai_response, headers: {}) result = subject.perform - expect(result).to eq('This is a reply from openai.') + expect(result).to eq({ :message => 'This is a reply from openai.' }) end end @@ -101,7 +101,7 @@ RSpec.describe Integrations::Openai::ProcessorService do .to_return(status: 200, body: openai_response, headers: {}) result = subject.perform - expect(result).to eq('This is a reply from openai.') + expect(result).to eq({ :message => 'This is a reply from openai.' }) end end @@ -140,7 +140,7 @@ RSpec.describe Integrations::Openai::ProcessorService do .to_return(status: 200, body: openai_response, headers: {}) result = subject.perform - expect(result).to eq('This is a reply from openai.') + expect(result).to eq({ :message => 'This is a reply from openai.' }) end end @@ -162,7 +162,7 @@ RSpec.describe Integrations::Openai::ProcessorService do .to_return(status: 200, body: openai_response, headers: {}) result = subject.perform - expect(result).to eq('This is a reply from openai.') + expect(result).to eq({ :message => 'This is a reply from openai.' }) end end @@ -184,7 +184,7 @@ RSpec.describe Integrations::Openai::ProcessorService do .to_return(status: 200, body: openai_response, headers: {}) result = subject.perform - expect(result).to eq('This is a reply from openai.') + expect(result).to eq({ :message => 'This is a reply from openai.' }) end end @@ -206,7 +206,7 @@ RSpec.describe Integrations::Openai::ProcessorService do .to_return(status: 200, body: openai_response, headers: {}) result = subject.perform - expect(result).to eq('This is a reply from openai.') + expect(result).to eq({ :message => 'This is a reply from openai.' }) end end @@ -228,7 +228,7 @@ RSpec.describe Integrations::Openai::ProcessorService do .to_return(status: 200, body: openai_response, headers: {}) result = subject.perform - expect(result).to eq('This is a reply from openai.') + expect(result).to eq({ :message => 'This is a reply from openai.' }) end end @@ -250,7 +250,7 @@ RSpec.describe Integrations::Openai::ProcessorService do .to_return(status: 200, body: openai_response, headers: {}) result = subject.perform - expect(result).to eq('This is a reply from openai.') + expect(result).to eq({ :message => 'This is a reply from openai.' }) end end end diff --git a/spec/models/integrations/hook_spec.rb b/spec/models/integrations/hook_spec.rb index fbad9192e..aecb2981c 100644 --- a/spec/models/integrations/hook_spec.rb +++ b/spec/models/integrations/hook_spec.rb @@ -37,7 +37,7 @@ RSpec.describe Integrations::Hook do it 'returns no processor found for hooks with out processor defined' do hook = create(:integrations_hook, account: account) - expect(hook.process_event(params)).to eq('No processor found') + expect(hook.process_event(params)).to eq({ :error => 'No processor found' }) end it 'returns results from procesor for openai hook' do