From fff69a3be77f6066f5fc727011262591fa5dc94e Mon Sep 17 00:00:00 2001 From: Allison Browne <abrowne@gitlab.com> Date: Wed, 24 Jul 2024 00:32:10 +0000 Subject: [PATCH] AI abstraction layer: Fix error handling to pass error message to logger --- .../chain/agents/single_action_executor.rb | 2 + .../llm/chain/agents/zero_shot/executor.rb | 2 + ee/lib/gitlab/llm/chain/answer.rb | 4 +- .../llm/chain/concerns/reader_tooling.rb | 3 +- ee/lib/gitlab/llm/chain/tools/identifier.rb | 1 + ee/spec/lib/gitlab/llm/chain/answer_spec.rb | 40 ++++++++++++++++++- 6 files changed, 47 insertions(+), 5 deletions(-) diff --git a/ee/lib/gitlab/llm/chain/agents/single_action_executor.rb b/ee/lib/gitlab/llm/chain/agents/single_action_executor.rb index e61cb31743092..f52b7c26e051b 100644 --- a/ee/lib/gitlab/llm/chain/agents/single_action_executor.rb +++ b/ee/lib/gitlab/llm/chain/agents/single_action_executor.rb @@ -72,6 +72,7 @@ def execute rescue Net::ReadTimeout => error Gitlab::ErrorTracking.track_exception(error) Answer.error_answer( + error: error, context: context, content: _("I'm sorry, I couldn't respond in time. Please try again."), error_code: "A1000" @@ -79,6 +80,7 @@ def execute rescue Gitlab::Llm::AiGateway::Client::ConnectionError => error Gitlab::ErrorTracking.track_exception(error) Answer.error_answer( + error: error, context: context, error_code: "A1001" ) diff --git a/ee/lib/gitlab/llm/chain/agents/zero_shot/executor.rb b/ee/lib/gitlab/llm/chain/agents/zero_shot/executor.rb index a1a707dded293..5ebcb120046f2 100644 --- a/ee/lib/gitlab/llm/chain/agents/zero_shot/executor.rb +++ b/ee/lib/gitlab/llm/chain/agents/zero_shot/executor.rb @@ -75,6 +75,7 @@ def execute rescue Net::ReadTimeout => error Gitlab::ErrorTracking.track_exception(error) Answer.error_answer( + error: error, context: context, content: _("I'm sorry, I couldn't respond in time. Please try again."), error_code: 'A1000' @@ -82,6 +83,7 @@ def execute rescue Gitlab::Llm::AiGateway::Client::ConnectionError => error Gitlab::ErrorTracking.track_exception(error) Answer.error_answer( + error: error, context: context, error_code: "A1001" ) diff --git a/ee/lib/gitlab/llm/chain/answer.rb b/ee/lib/gitlab/llm/chain/answer.rb index e1ee0d8694911..0cb224d2363d2 100644 --- a/ee/lib/gitlab/llm/chain/answer.rb +++ b/ee/lib/gitlab/llm/chain/answer.rb @@ -68,8 +68,8 @@ def self.default_final_message "Please try a more specific request or enter /clear to start a new chat.") end - def self.error_answer(context:, error_code: nil, content: default_error_answer) - logger.error(message: "Error", error: content, error_code: error_code) + def self.error_answer(context:, error_code: nil, content: default_error_answer, error: nil) + logger.error(message: error ? error.message : "Error", error: content, error_code: error_code) track_event(context, 'error_answer') new( diff --git a/ee/lib/gitlab/llm/chain/concerns/reader_tooling.rb b/ee/lib/gitlab/llm/chain/concerns/reader_tooling.rb index 79d62a34cb413..98e16c0cdfa24 100644 --- a/ee/lib/gitlab/llm/chain/concerns/reader_tooling.rb +++ b/ee/lib/gitlab/llm/chain/concerns/reader_tooling.rb @@ -14,8 +14,9 @@ def passed_content(_json) .resource_serialized(content_limit: provider_prompt_class::MAX_CHARACTERS * 0.6) "Please use this information about identified #{resource_name}: #{resource_serialized}" - rescue ArgumentError + rescue ArgumentError => error Answer.error_answer( + error: error, context: context, error_code: "M5000" ) diff --git a/ee/lib/gitlab/llm/chain/tools/identifier.rb b/ee/lib/gitlab/llm/chain/tools/identifier.rb index eed86cefa2c0c..c3c8d4e2b48f6 100644 --- a/ee/lib/gitlab/llm/chain/tools/identifier.rb +++ b/ee/lib/gitlab/llm/chain/tools/identifier.rb @@ -47,6 +47,7 @@ def perform(&_block) Gitlab::ErrorTracking.track_exception(e) return Answer.error_answer( + error: e, context: context, error_code: "M4001" ) diff --git a/ee/spec/lib/gitlab/llm/chain/answer_spec.rb b/ee/spec/lib/gitlab/llm/chain/answer_spec.rb index 845c0b8e2469a..94a31726dd9dd 100644 --- a/ee/spec/lib/gitlab/llm/chain/answer_spec.rb +++ b/ee/spec/lib/gitlab/llm/chain/answer_spec.rb @@ -141,9 +141,17 @@ end describe '.error_answer' do - subject(:answer) { described_class.error_answer(context: context, content: "error", error_code: error_code) } + subject(:answer) do + described_class.error_answer( + context: context, + content: "error", + error_code: error_code, + error: error + ) + end let(:error_code) { nil } + let(:error) { StandardError.new('hello world') } context 'when the answer has no error code' do it 'returns final answer with error response' do @@ -173,7 +181,35 @@ it 'logs the error code' do answer - expect(logger).to have_received(:error).with(message: "Error", error: "error", error_code: error_code) + expect(logger).to have_received(:error).with(error: "error", error_code: error_code, + message: 'hello world') + end + + context 'when error has no message' do + let(:error) { StandardError.new } + + it 'logs the error code' do + answer + + expect(logger).to have_received(:error).with(error: "error", error_code: error_code, + message: 'StandardError') + end + end + + context 'when error is not passed' do + subject(:answer) do + described_class.error_answer( + context: context, + content: "error", + error_code: error_code + ) + end + + it 'logs the error code' do + answer + + expect(logger).to have_received(:error).with(message: "Error", error: "error", error_code: error_code) + end end end -- GitLab