Skip to content

Commit

Permalink
Render Apollo Error Messages in the AI Assistant (#2744)
Browse files Browse the repository at this point in the history
* Handle Apollo errors and render better messages

* Display errors coming from Apollo

* Put back apollo_resp variable

* More tests for different type of Apollo errors

* Test error_message/1

* Fallback error for unknown error formats
  • Loading branch information
elias-ba authored Dec 9, 2024
1 parent b6be15e commit 3f92914
Show file tree
Hide file tree
Showing 5 changed files with 405 additions and 164 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ and this project adheres to

### Added

- Handle errors from the AI Assistant more gracefully
[#2741](https://github.com/OpenFn/lightning/issues/2741)

### Changed

### Fixed
Expand Down
21 changes: 18 additions & 3 deletions lib/lightning/ai_assistant/ai_assistant.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ defmodule Lightning.AiAssistant do
alias Lightning.Services.UsageLimiter
alias Lightning.Workflows.Job

require Logger

@spec put_expression_and_adaptor(ChatSession.t(), String.t(), String.t()) ::
ChatSession.t()
def put_expression_and_adaptor(session, expression, adaptor) do
Expand Down Expand Up @@ -90,7 +92,7 @@ defmodule Lightning.AiAssistant do
"""
@spec query(ChatSession.t(), String.t()) ::
{:ok, ChatSession.t()}
| {:error, Ecto.Changeset.t() | :apollo_unavailable}
| {:error, String.t() | Ecto.Changeset.t()}
def query(session, content) do
apollo_resp =
ApolloClient.query(
Expand All @@ -104,8 +106,21 @@ defmodule Lightning.AiAssistant do
message = body["history"] |> Enum.reverse() |> hd()
save_message(session, message)

_ ->
{:error, :apollo_unavailable}
{:ok, %Tesla.Env{body: %{"message" => message}}} ->
{:error, message}

{:error, :timeout} ->
{:error, "Request timed out. Please try again."}

{:error, :econnrefused} ->
{:error, "Unable to reach the AI server. Please try again later."}

unexpected_error ->
Logger.warning(
"Received an unexpected error: #{inspect(unexpected_error)}"
)

{:error, "Oops! Something went wrong. Please try again."}
end
end

Expand Down
22 changes: 11 additions & 11 deletions lib/lightning_web/live/workflow_live/ai_assistant_component.ex
Original file line number Diff line number Diff line change
Expand Up @@ -143,19 +143,19 @@ defmodule LightningWeb.WorkflowLive.AiAssistantComponent do
end
end

defp error_message({:error, %Ecto.Changeset{}}) do
"Oops! Could not save message. Please try again."
def error_message({:error, message}) when is_binary(message) do
message
end

defp error_message({:error, :apollo_unavailable}) do
"Oops! Could not reach the Ai Server. Please try again later."
def error_message({:error, %Ecto.Changeset{}}) do
"Could not save message. Please try again."
end

defp error_message({:error, _reason, %{text: text_message}}) do
def error_message({:error, _reason, %{text: text_message}}) do
text_message
end

defp error_message(_error) do
def error_message(_error) do
"Oops! Something went wrong. Please try again."
end

Expand Down Expand Up @@ -706,17 +706,17 @@ defmodule LightningWeb.WorkflowLive.AiAssistantComponent do
id="assistant-failed-message"
class="mr-auto p-2 rounded-lg break-words text-wrap flex flex-row gap-x-2"
>
<div class="">
<div class="flex-shrink-0">
<div class="rounded-full p-2 bg-indigo-200 text-indigo-700 ring-4 ring-white">
<.icon name="hero-sparkles" class="" />
<.icon name="hero-sparkles" />
</div>
</div>
<div class="flex gap-2">
<div class="flex-1 flex items-center gap-2 bg-red-50 p-3 rounded-lg">
<.icon
name="hero-exclamation-triangle"
class="text-amber-400 h-8 w-8"
class="h-5 w-5 flex-shrink-0 text-red-400"
/>
<span><%= error_message(failure) %></span>
<span class="text-red-700"><%= error_message(failure) %></span>
</div>
</div>
</:failed>
Expand Down
Loading

0 comments on commit 3f92914

Please sign in to comment.