From 4388878dbbf465771c50477e4dc9dbafa1598a9b Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 9 Mar 2025 22:41:46 +0100 Subject: [PATCH 1/5] [#INTERNAL-498] Remove repeated sentence in seeds https://bitcrowd.atlassian.net/browse/INTERNAL-498 --- .github/workflows/pull.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index aa8de94..22c2f10 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -23,6 +23,7 @@ jobs: --health-timeout 5s --health-retries 5 + runs-on: ubuntu-22.04 name: Build and test strategy: @@ -125,7 +126,11 @@ jobs: assets: +<<<<<<< HEAD runs-on: ubuntu-22.04 +======= + runs-on: ubuntu-22 +>>>>>>> 0fdc37d ([#INTERNAL-498] Remove repeated sentence in seeds) name: Assets steps: - uses: actions/checkout@v3 From 92c4c21847ef5bd1d10db47a126591b35a306a67 Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 9 Mar 2025 22:58:16 +0100 Subject: [PATCH 2/5] [#INTERNAL-499] Standard system prompt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The assistant gets a bit to funny in it’s answers 😄 https://bitcrowd.atlassian.net/browse/INTERNAL-499 --- .github/workflows/pull.yml | 5 ++++- lib/chatbot/chat.ex | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index 22c2f10..edfd965 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -23,7 +23,6 @@ jobs: --health-timeout 5s --health-retries 5 - runs-on: ubuntu-22.04 name: Build and test strategy: @@ -126,11 +125,15 @@ jobs: assets: +<<<<<<< HEAD <<<<<<< HEAD runs-on: ubuntu-22.04 ======= runs-on: ubuntu-22 >>>>>>> 0fdc37d ([#INTERNAL-498] Remove repeated sentence in seeds) +======= + runs-on: ubuntu-22.04 +>>>>>>> f108e37 ([#INTERNAL-499] Standard system prompt) name: Assets steps: - uses: actions/checkout@v3 diff --git a/lib/chatbot/chat.ex b/lib/chatbot/chat.ex index d172f50..bfb1d83 100644 --- a/lib/chatbot/chat.ex +++ b/lib/chatbot/chat.ex @@ -28,9 +28,9 @@ defmodule Chatbot.Chat do end @llm LangChain.ChatModels.ChatOllamaAI.new!(%{ - model: "llama3.2:latest", - stream: false - }) + model: "llama3.2:latest", + stream: false + }) @chain LLMChain.new!(%{llm: @llm}) |> LLMChain.add_message(LangChain.Message.new_system!("You are a helpful assistant.")) From f0e2cb3addffeb91b56158609bdf301e76a3c09f Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 10 Mar 2025 00:12:36 +0100 Subject: [PATCH 3/5] [#INTERNAL-500] Add Markdown to chatbot rendering LLM frequently use Markdown to structure their output. sth like \ # lib/chatbot_web/live/chat_live.ex # (..) markdown_html = String.trim(assigns.content) |> Earmark.as_html!() |> Phoenix.HTML.raw() assigns = assigns |> assign(:class, "u-max-width-75 u-bg-white " <> justify_self) |> assign(:markdown, markdown_html) ~H""" <.ui_card id={@id} class={@class}> <%= @markdown %> https://bitcrowd.atlassian.net/browse/INTERNAL-500 --- .github/workflows/pull.yml | 8 -------- lib/chatbot/chat.ex | 6 +++--- lib/chatbot_web/live/chat_live.ex | 14 ++++++++++++-- mix.exs | 1 + mix.lock | 1 + 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/.github/workflows/pull.yml b/.github/workflows/pull.yml index edfd965..aa8de94 100644 --- a/.github/workflows/pull.yml +++ b/.github/workflows/pull.yml @@ -125,15 +125,7 @@ jobs: assets: -<<<<<<< HEAD -<<<<<<< HEAD runs-on: ubuntu-22.04 -======= - runs-on: ubuntu-22 ->>>>>>> 0fdc37d ([#INTERNAL-498] Remove repeated sentence in seeds) -======= - runs-on: ubuntu-22.04 ->>>>>>> f108e37 ([#INTERNAL-499] Standard system prompt) name: Assets steps: - uses: actions/checkout@v3 diff --git a/lib/chatbot/chat.ex b/lib/chatbot/chat.ex index bfb1d83..d172f50 100644 --- a/lib/chatbot/chat.ex +++ b/lib/chatbot/chat.ex @@ -28,9 +28,9 @@ defmodule Chatbot.Chat do end @llm LangChain.ChatModels.ChatOllamaAI.new!(%{ - model: "llama3.2:latest", - stream: false - }) + model: "llama3.2:latest", + stream: false + }) @chain LLMChain.new!(%{llm: @llm}) |> LLMChain.add_message(LangChain.Message.new_system!("You are a helpful assistant.")) diff --git a/lib/chatbot_web/live/chat_live.ex b/lib/chatbot_web/live/chat_live.ex index 131f0b6..1167d4e 100644 --- a/lib/chatbot_web/live/chat_live.ex +++ b/lib/chatbot_web/live/chat_live.ex @@ -63,10 +63,20 @@ defmodule ChatbotWeb.ChatLive do justify_self = if assigns.role == :user, do: "u-justify-self-end", else: "u-justify-self-start" - assigns = assign(assigns, :class, "u-max-width-75 u-bg-white " <> justify_self) + markdown_html = + String.trim(assigns.content) + |> Earmark.as_html!() + |> Phoenix.HTML.raw() + + assigns = + assigns + |> assign(:class, "u-max-width-75 u-bg-white " <> justify_self) + |> assign(:markdown, markdown_html) ~H""" - <.ui_card id={@id} class={@class}><%= @content %> + <.ui_card id={@id} class={@class}> + <%= @markdown %> + """ end diff --git a/mix.exs b/mix.exs index 2ba07ec..26baa8b 100644 --- a/mix.exs +++ b/mix.exs @@ -39,6 +39,7 @@ defmodule Chatbot.MixProject do {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, {:langchain, "~> 0.3.0-rc.0"}, {:phoenix, "~> 1.7.14"}, + {:earmark, "~> 1.0"}, {:phoenix_ecto, "~> 4.5"}, {:ecto_sql, "~> 3.10"}, {:postgrex, ">= 0.0.0"}, diff --git a/mix.lock b/mix.lock index 64551ca..a71cc19 100644 --- a/mix.lock +++ b/mix.lock @@ -10,6 +10,7 @@ "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, "dialyxir": {:hex, :dialyxir, "1.4.4", "fb3ce8741edeaea59c9ae84d5cec75da00fa89fe401c72d6e047d11a61f65f70", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "cd6111e8017ccd563e65621a4d9a4a1c5cd333df30cebc7face8029cacb4eff6"}, "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"}, + "earmark": {:hex, :earmark, "1.4.47", "7e7596b84fe4ebeb8751e14cbaeaf4d7a0237708f2ce43630cfd9065551f94ca", [:mix], [], "hexpm", "3e96bebea2c2d95f3b346a7ff22285bc68a99fbabdad9b655aa9c6be06c698f8"}, "ecto": {:hex, :ecto, "3.12.4", "267c94d9f2969e6acc4dd5e3e3af5b05cdae89a4d549925f3008b2b7eb0b93c3", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ef04e4101688a67d061e1b10d7bc1fbf00d1d13c17eef08b71d070ff9188f747"}, "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, From 901e9b1dc8e2c03899dd00db17f8ec2f5d501c89 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 10 Mar 2025 19:10:47 +0100 Subject: [PATCH 4/5] =?UTF-8?q?[#INTERNAL-501]=20Update=20to=20langchain?= =?UTF-8?q?=20to=200.3.1=20on=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …chatbot.ex Langchain.ex has progressed to 0.3.1. We should update to that. However, it introduces a breaking change: Compiling 10 files (.ex) error: module LangChain.Utils.ApiOverride is not loaded and could not be found │ 12 │ import LangChain.Utils.ApiOverride │ ^ │ └─ lib/chatbot/llm_mock.ex:12:3: Chatbot.LLMMock (module) The background is [this PR](https://github.com/brainlid/langchain/pull/155): > This change includes the Mimic testing library for mocking out live > calls and forcing a specific return value. > > Originally, was using `LangChain.Utils.ApiOverride` which provided > process-level result overrides. However, it had the negative > requirement of requiring testing-aware to be in the production code, > specifically in the ChatXYZ.call functions. > > Using Mimic removes that requirement, keeping the production level > code cleaner. The reasoning is sound, however, it crashes with what we do in `Chatbot.LLMMock`. As LLM Mock is not used in tests (and `LLMMock` does not have tests itself), I would take it out for now. https://bitcrowd.atlassian.net/browse/INTERNAL-501 --- config/runtime.exs | 5 ---- lib/chatbot/chat.ex | 11 +-------- lib/chatbot/llm_mock.ex | 51 ----------------------------------------- mix.exs | 2 +- mix.lock | 16 ++++++------- 5 files changed, 10 insertions(+), 75 deletions(-) delete mode 100644 lib/chatbot/llm_mock.ex diff --git a/config/runtime.exs b/config/runtime.exs index 622b180..4a53aa6 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -37,9 +37,6 @@ defmodule RuntimeConfig do defp default("DNS_CLUSTER_QUERY", _env), do: nil - defp default("MOCK_LLM_API", :test), do: true - defp default("MOCK_LLM_API", _env), do: false - defp default(key, env), do: raise("environment variable #{key} not set and no default for #{inspect(env)}") end @@ -76,5 +73,3 @@ config :chatbot, ChatbotWeb.Endpoint, config :chatbot, :dns_cluster_query, RuntimeConfig.get("DNS_CLUSTER_QUERY") config :langchain, openai_key: "your key" - -config :chatbot, :mock_llm_api, RuntimeConfig.get("MOCK_LLM_API", cast: :boolean) diff --git a/lib/chatbot/chat.ex b/lib/chatbot/chat.ex index d172f50..69971e6 100644 --- a/lib/chatbot/chat.ex +++ b/lib/chatbot/chat.ex @@ -3,7 +3,7 @@ defmodule Chatbot.Chat do Context for chat related functions. """ import Ecto.Query, only: [from: 2] - alias Chatbot.{Chat.Message, LLMMock, Repo} + alias Chatbot.{Chat.Message, Repo} alias LangChain.Chains.LLMChain # There is currently a bug in the LangChain type specs: # `add_callback/2` expects a map with all possible handler functions. @@ -42,8 +42,6 @@ defmodule Chatbot.Chat do @spec request_assistant_message([Message.t()]) :: {:ok, Message.t()} | {:error, String.t() | Ecto.Changeset.t()} def request_assistant_message(messages) do - maybe_mock_llm() - messages = Enum.map(messages, &to_langchain_message/1) @chain @@ -82,11 +80,8 @@ defmodule Chatbot.Chat do } Task.Supervisor.start_child(Chatbot.TaskSupervisor, fn -> - maybe_mock_llm(stream: true) - @chain |> LLMChain.add_callback(handler) - |> LLMChain.add_llm_callback(handler) |> LLMChain.add_messages(messages) |> LLMChain.run() end) @@ -100,10 +95,6 @@ defmodule Chatbot.Chat do defp to_langchain_message(%{role: :assistant, content: content}), do: LangChain.Message.new_assistant!(content) - defp maybe_mock_llm(opts \\ []) do - if Application.fetch_env!(:chatbot, :mock_llm_api), do: LLMMock.mock(opts) - end - @doc """ Lists all messages ordered by insertion date. """ diff --git a/lib/chatbot/llm_mock.ex b/lib/chatbot/llm_mock.ex deleted file mode 100644 index 68f108a..0000000 --- a/lib/chatbot/llm_mock.ex +++ /dev/null @@ -1,51 +0,0 @@ -defmodule Chatbot.LLMMock do - @moduledoc """ - This module provides functions to mock the messages from the - LLM. - - Note: - We are using `set_api_override/1` from LangChain.Utils.ApiOverride - for this, which uses the process dictionary. So make sure to call - the functions of this module from within the process that calls - `LangChain.Chains.LLMChain.run/0`. - """ - import LangChain.Utils.ApiOverride - alias LangChain.{Message, MessageDelta} - - def mock(opts) do - if Keyword.get(opts, :stream, false) do - do_mock() - else - do_mock_stream() - end - end - - def do_mock do - content = """ - Thanks for your question. - I don't have an answer right now. - Please try another question. - Maybe I can help with that. - """ - - set_api_override({:ok, Message.new_assistant!(%{content: content}), :on_llm_new_message}) - end - - def do_mock_stream do - fake_messages = [ - [MessageDelta.new!(%{role: :assistant, content: nil, status: :incomplete})], - [MessageDelta.new!(%{content: "Thanks for your question. ", status: :incomplete})], - [MessageDelta.new!(%{content: "Let me think about that. ", status: :incomplete})], - [MessageDelta.new!(%{content: "... ", status: :incomplete})], - [MessageDelta.new!(%{content: "I don't have an answer right now. ", status: :incomplete})], - [ - MessageDelta.new!(%{ - content: "Please try another question. Maybe I can help with that.", - status: :complete - }) - ] - ] - - set_api_override({:ok, fake_messages, :on_llm_new_delta}) - end -end diff --git a/mix.exs b/mix.exs index 26baa8b..551a475 100644 --- a/mix.exs +++ b/mix.exs @@ -37,7 +37,7 @@ defmodule Chatbot.MixProject do {:bitcrowd_ecto, "~> 1.0"}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, - {:langchain, "~> 0.3.0-rc.0"}, + {:langchain, "~> 0.3.1"}, {:phoenix, "~> 1.7.14"}, {:earmark, "~> 1.0"}, {:phoenix_ecto, "~> 4.5"}, diff --git a/mix.lock b/mix.lock index a71cc19..0fa17dd 100644 --- a/mix.lock +++ b/mix.lock @@ -4,14 +4,14 @@ "bitcrowd_ecto": {:hex, :bitcrowd_ecto, "1.0.0", "b255cf7b8e22bc17adeb8bbc9907ef02dcdc751fd68ab3e444b0a098dac99b65", [:mix], [{:ecto, "~> 3.6", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ex_money, "~> 5.12", [hex: :ex_money, repo: "hexpm", optional: true]}, {:jason, "> 0.0.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "862effc5eba425176472c2f01dd50b9994622089fa4bc2a11d75732b47dcdab9"}, "bitstyles_phoenix": {:hex, :bitstyles_phoenix, "2.5.0", "c02aae26fcf6ff752738b35aa97f3991c67533412eda381abaad3e22aa2e2215", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.18.12 or ~> 0.19.0 or ~> 0.20.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}], "hexpm", "fe018f0eeec6c84afedc1785495efe0a651ecf34656c4b52f6da09d5149a9f28"}, "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, - "castore": {:hex, :castore, "1.0.9", "5cc77474afadf02c7c017823f460a17daa7908e991b0cc917febc90e466a375c", [:mix], [], "hexpm", "5ea956504f1ba6f2b4eb707061d8e17870de2bee95fb59d512872c2ef06925e7"}, + "castore": {:hex, :castore, "1.0.12", "053f0e32700cbec356280c0e835df425a3be4bc1e0627b714330ad9d0f05497f", [:mix], [], "hexpm", "3dca286b2186055ba0c9449b4e95b97bf1b57b47c1f2644555879e659960c224"}, "credo": {:hex, :credo, "1.7.10", "6e64fe59be8da5e30a1b96273b247b5cf1cc9e336b5fd66302a64b25749ad44d", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "71fbc9a6b8be21d993deca85bf151df023a3097b01e09a2809d460348561d8cd"}, "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, - "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, + "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, "dialyxir": {:hex, :dialyxir, "1.4.4", "fb3ce8741edeaea59c9ae84d5cec75da00fa89fe401c72d6e047d11a61f65f70", [:mix], [{:erlex, ">= 0.2.7", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "cd6111e8017ccd563e65621a4d9a4a1c5cd333df30cebc7face8029cacb4eff6"}, "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"}, "earmark": {:hex, :earmark, "1.4.47", "7e7596b84fe4ebeb8751e14cbaeaf4d7a0237708f2ce43630cfd9065551f94ca", [:mix], [], "hexpm", "3e96bebea2c2d95f3b346a7ff22285bc68a99fbabdad9b655aa9c6be06c698f8"}, - "ecto": {:hex, :ecto, "3.12.4", "267c94d9f2969e6acc4dd5e3e3af5b05cdae89a4d549925f3008b2b7eb0b93c3", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ef04e4101688a67d061e1b10d7bc1fbf00d1d13c17eef08b71d070ff9188f747"}, + "ecto": {:hex, :ecto, "3.12.5", "4a312960ce612e17337e7cefcf9be45b95a3be6b36b6f94dfb3d8c361d631866", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6eb18e80bef8bb57e17f5a7f068a1719fbda384d40fc37acb8eb8aeca493b6ea"}, "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, "erlex": {:hex, :erlex, "0.2.7", "810e8725f96ab74d17aac676e748627a07bc87eb950d2b83acd29dc047a30595", [:mix], [], "hexpm", "3ed95f79d1a844c3f6bf0cea61e0d5612a42ce56da9c03f01df538685365efb0"}, "esbuild": {:hex, :esbuild, "0.8.1", "0cbf919f0eccb136d2eeef0df49c4acf55336de864e63594adcea3814f3edf41", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"}, @@ -20,12 +20,12 @@ "file_system": {:hex, :file_system, "1.0.1", "79e8ceaddb0416f8b8cd02a0127bdbababe7bf4a23d2a395b983c1f8b3f73edd", [:mix], [], "hexpm", "4414d1f38863ddf9120720cd976fce5bdde8e91d8283353f0e31850fa89feb9e"}, "finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"}, "floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"}, - "gettext": {:hex, :gettext, "0.26.1", "38e14ea5dcf962d1fc9f361b63ea07c0ce715a8ef1f9e82d3dfb8e67e0416715", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "01ce56f188b9dc28780a52783d6529ad2bc7124f9744e571e1ee4ea88bf08734"}, - "hpax": {:hex, :hpax, "1.0.0", "28dcf54509fe2152a3d040e4e3df5b265dcb6cb532029ecbacf4ce52caea3fd2", [:mix], [], "hexpm", "7f1314731d711e2ca5fdc7fd361296593fc2542570b3105595bb0bc6d0fad601"}, + "gettext": {:hex, :gettext, "0.26.2", "5978aa7b21fada6deabf1f6341ddba50bc69c999e812211903b169799208f2a8", [:mix], [{:expo, "~> 0.5.1 or ~> 1.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "aa978504bcf76511efdc22d580ba08e2279caab1066b76bb9aa81c4a1e0a32a5"}, + "hpax": {:hex, :hpax, "1.0.2", "762df951b0c399ff67cc57c3995ec3cf46d696e41f0bba17da0518d94acd4aac", [:mix], [], "hexpm", "2f09b4c1074e0abd846747329eaa26d535be0eb3d189fa69d812bfb8bfefd32f"}, "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, - "langchain": {:hex, :langchain, "0.3.0-rc.0", "930d22170fff2c599e8a63a664e437f896555b3cebe3055276bca37e7ae17d1b", [:mix], [{:abacus, "~> 2.1.0", [hex: :abacus, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10", [hex: :ecto, repo: "hexpm", optional: false]}, {:gettext, "~> 0.20", [hex: :gettext, repo: "hexpm", optional: false]}, {:nx, ">= 0.7.0", [hex: :nx, repo: "hexpm", optional: true]}, {:req, ">= 0.5.0", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "c1f4f563cfddc502d3cfa5180fef154b8e194ef0f6f7bf0fe540761d2439b7ab"}, + "langchain": {:hex, :langchain, "0.3.1", "df63af8f928438bd98253e569099109041ce985092227cbe8e1216612b0d4f23", [:mix], [{:abacus, "~> 2.1.0", [hex: :abacus, repo: "hexpm", optional: true]}, {:ecto, "~> 3.10", [hex: :ecto, repo: "hexpm", optional: false]}, {:gettext, "~> 0.20", [hex: :gettext, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: true]}, {:nx, ">= 0.7.0", [hex: :nx, repo: "hexpm", optional: true]}, {:req, ">= 0.5.2", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "0cc40659e9a76e4e6599727d71fc841122f0aefc036a09a145caeaca8e45558b"}, "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, - "mint": {:hex, :mint, "1.6.2", "af6d97a4051eee4f05b5500671d47c3a67dac7386045d87a904126fd4bbcea2e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5ee441dffc1892f1ae59127f74afe8fd82fda6587794278d924e4d90ea3d63f9"}, + "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, "phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"}, @@ -39,7 +39,7 @@ "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, "postgrex": {:hex, :postgrex, "0.19.1", "73b498508b69aded53907fe48a1fee811be34cc720e69ef4ccd568c8715495ea", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "8bac7885a18f381e091ec6caf41bda7bb8c77912bb0e9285212829afe5d8a8f8"}, - "req": {:hex, :req, "0.5.6", "8fe1eead4a085510fe3d51ad854ca8f20a622aae46e97b302f499dfb84f726ac", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "cfaa8e720945d46654853de39d368f40362c2641c4b2153c886418914b372185"}, + "req": {:hex, :req, "0.5.8", "50d8d65279d6e343a5e46980ac2a70e97136182950833a1968b371e753f6a662", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "d7fc5898a566477e174f26887821a3c5082b243885520ee4b45555f5d53f40ef"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "telemetry_metrics": {:hex, :telemetry_metrics, "1.0.0", "29f5f84991ca98b8eb02fc208b2e6de7c95f8bb2294ef244a176675adc7775df", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f23713b3847286a534e005126d4c959ebcca68ae9582118ce436b521d1d47d5d"}, "telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"}, From 99a71324ac89cdba54af7c0d624cbcd54fdf5575 Mon Sep 17 00:00:00 2001 From: Joel Koch Date: Wed, 12 Mar 2025 16:40:11 +0100 Subject: [PATCH 5/5] Update match to work with langchain 0.3.1 --- lib/chatbot/chat.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/chatbot/chat.ex b/lib/chatbot/chat.ex index 69971e6..0c59a14 100644 --- a/lib/chatbot/chat.ex +++ b/lib/chatbot/chat.ex @@ -48,8 +48,8 @@ defmodule Chatbot.Chat do |> LLMChain.add_messages(messages) |> LLMChain.run() |> case do - {:ok, _chain, response} -> - create_message(%{role: :assistant, content: response.content}) + {:ok, chain} -> + create_message(%{role: :assistant, content: chain.last_message.content}) _error -> {:error, "I failed, I'm sorry"}