diff --git a/.github/workflows/pull.yaml b/.github/workflows/ci.yaml similarity index 98% rename from .github/workflows/pull.yaml rename to .github/workflows/ci.yaml index 384c62a..8e704f6 100644 --- a/.github/workflows/pull.yaml +++ b/.github/workflows/ci.yaml @@ -1,7 +1,8 @@ -name: QA +name: CI on: pull_request: + push: branches: - main @@ -79,4 +80,5 @@ jobs: v2-${{ runner.os }}-plts - run: mix deps.get - run: mix compile --warnings-as-errors + - run: mix deps.unlock --check-unused - run: mix lint diff --git a/lib/mix/tasks/rag.gen_eval.ex b/lib/mix/tasks/rag.gen_eval.ex index ac0eee4..7e03327 100644 --- a/lib/mix/tasks/rag.gen_eval.ex +++ b/lib/mix/tasks/rag.gen_eval.ex @@ -1,5 +1,6 @@ defmodule Mix.Tasks.Rag.GenEval do use Igniter.Mix.Task + alias Igniter.Project @example "mix rag.gen_eval" @@ -40,7 +41,7 @@ defmodule Mix.Tasks.Rag.GenEval do rag_module = Module.concat(root_module, "Rag") igniter - |> Igniter.Project.Config.configure( + |> Project.Config.configure( "config.exs", app_name, [:openai_key], diff --git a/lib/mix/tasks/rag.install.ex b/lib/mix/tasks/rag.install.ex index 2ccf35b..5cce1dd 100644 --- a/lib/mix/tasks/rag.install.ex +++ b/lib/mix/tasks/rag.install.ex @@ -1,5 +1,6 @@ defmodule Mix.Tasks.Rag.Install do use Igniter.Mix.Task + alias Igniter.{Libs, Project} @example "mix rag.install --vector-store pgvector" @@ -57,10 +58,10 @@ defmodule Mix.Tasks.Rag.Install do igniter = igniter - |> Igniter.Project.Deps.add_dep({:text_chunker, "~> 0.3.1"}) - |> Igniter.Project.Deps.add_dep({:bumblebee, "~> 0.6.0"}) - |> Igniter.Project.Deps.add_dep({:exla, "~> 0.9.1"}) - |> Igniter.Project.Config.configure("config.exs", :nx, [:default_backend], EXLA.Backend) + |> Project.Deps.add_dep({:text_chunker, "~> 0.3.1"}) + |> Project.Deps.add_dep({:bumblebee, "~> 0.6.0"}) + |> Project.Deps.add_dep({:exla, "~> 0.9.1"}) + |> Project.Config.configure("config.exs", :nx, [:default_backend], EXLA.Backend) |> Igniter.compose_task("rag.gen_eval") |> Igniter.compose_task("rag.gen_servings") |> Igniter.compose_task("rag.gen_rag_module") @@ -79,15 +80,15 @@ defmodule Mix.Tasks.Rag.Install do defp with_chroma(igniter) do igniter - |> Igniter.Project.Deps.add_dep({:chroma, "~> 0.1.3"}) + |> Project.Deps.add_dep({:chroma, "~> 0.1.3"}) |> Igniter.apply_and_fetch_dependencies() - |> Igniter.Project.Config.configure("config.exs", :chroma, [:host], "http://localhost:8000") - |> Igniter.Project.Config.configure("config.exs", :chroma, [:api_base], "api") - |> Igniter.Project.Config.configure("config.exs", :chroma, [:api_version], "v1") + |> Project.Config.configure("config.exs", :chroma, [:host], "http://localhost:8000") + |> Project.Config.configure("config.exs", :chroma, [:api_base], "api") + |> Project.Config.configure("config.exs", :chroma, [:api_version], "v1") end defp with_pgvector(igniter) do - app_name = Igniter.Project.Application.app_name(igniter) + app_name = Project.Application.app_name(igniter) root_module = app_name @@ -99,9 +100,9 @@ defmodule Mix.Tasks.Rag.Install do schema_module = Module.concat(root_module, "Rag.Chunk") igniter - |> Igniter.Project.Deps.add_dep({:ecto, "~> 3.0"}) - |> Igniter.Project.Deps.add_dep({:ecto_sql, "~> 3.10"}) - |> Igniter.Project.Deps.add_dep({:pgvector, "~> 0.3.0"}) + |> Project.Deps.add_dep({:ecto, "~> 3.0"}) + |> Project.Deps.add_dep({:ecto_sql, "~> 3.10"}) + |> Project.Deps.add_dep({:pgvector, "~> 0.3.0"}) |> Igniter.apply_and_fetch_dependencies() |> Igniter.include_or_create_file( "lib/postgrex_types.ex", @@ -109,13 +110,13 @@ defmodule Mix.Tasks.Rag.Install do Postgrex.Types.define(#{inspect(postgrex_types_module)}, [Pgvector.Extensions.Vector] ++ Ecto.Adapters.Postgres.extensions(), []) """ ) - |> Igniter.Project.Config.configure( + |> Project.Config.configure( "config.exs", app_name, [repo_module, :types], postgrex_types_module ) - |> Igniter.Project.Module.create_module( + |> Project.Module.create_module( schema_module, """ @moduledoc \""" @@ -138,7 +139,7 @@ defmodule Mix.Tasks.Rag.Install do end """ ) - |> Igniter.Libs.Ecto.gen_migration(repo_module, "create_chunks_table", + |> Libs.Ecto.gen_migration(repo_module, "create_chunks_table", body: """ def up() do execute("CREATE EXTENSION IF NOT EXISTS vector") diff --git a/lib/rag/ai/nx.ex b/lib/rag/ai/nx.ex index b872c52..8634168 100644 --- a/lib/rag/ai/nx.ex +++ b/lib/rag/ai/nx.ex @@ -25,16 +25,14 @@ defmodule Rag.Ai.Nx do end def generate_embeddings(%__MODULE__{} = provider, texts, _opts) when is_list(texts) do - try do - embeddings = - Nx.Serving.batched_run(provider.embeddings_serving, texts) - |> Enum.map(&Nx.to_list(&1.embedding)) - - {:ok, embeddings} - rescue - error -> - {:error, error} - end + embeddings = + Nx.Serving.batched_run(provider.embeddings_serving, texts) + |> Enum.map(&Nx.to_list(&1.embedding)) + + {:ok, embeddings} + rescue + error -> + {:error, error} end @impl Rag.Ai.Provider @@ -46,14 +44,12 @@ defmodule Rag.Ai.Nx do end def generate_text(%__MODULE__{} = provider, prompt, _opts) when is_binary(prompt) do - try do - %{results: [result]} = - Nx.Serving.batched_run(provider.text_serving, prompt) - - {:ok, result.text} - rescue - error -> - {:error, error} - end + %{results: [result]} = + Nx.Serving.batched_run(provider.text_serving, prompt) + + {:ok, result.text} + rescue + error -> + {:error, error} end end diff --git a/mix.exs b/mix.exs index 920d3ca..ad63c99 100644 --- a/mix.exs +++ b/mix.exs @@ -66,7 +66,8 @@ defmodule Rag.MixProject do defp aliases do [ lint: [ - "format --check-formatted" + "format --check-formatted", + "credo --strict" ] ] end diff --git a/test/rag/embedding/http_test.exs b/test/rag/embedding/http_test.exs index 3739830..ad0f464 100644 --- a/test/rag/embedding/http_test.exs +++ b/test/rag/embedding/http_test.exs @@ -2,9 +2,7 @@ defmodule Rag.Embedding.HttpTest do use ExUnit.Case use Mimic - alias Rag.Embedding - alias Rag.Generation - alias Rag.Ai + alias Rag.{Ai, Embedding, Generation} setup do %{provider: Ai.OpenAI.new(%{})} diff --git a/test/rag/embedding/nx_test.exs b/test/rag/embedding/nx_test.exs index 8d4f398..f20a636 100644 --- a/test/rag/embedding/nx_test.exs +++ b/test/rag/embedding/nx_test.exs @@ -2,11 +2,10 @@ defmodule Rag.Embedding.NxTest do use ExUnit.Case use Mimic - alias Rag.Embedding - alias Rag.Generation + alias Rag.{Ai, Embedding, Generation} setup do - %{provider: Rag.Ai.Nx.new(%{embeddings_serving: TestEmbeddingsServing})} + %{provider: Ai.Nx.new(%{embeddings_serving: TestEmbeddingsServing})} end describe "generate_embedding/3" do diff --git a/test/rag/evaluation/http_test.exs b/test/rag/evaluation/http_test.exs index 63d830b..f25f6a4 100644 --- a/test/rag/evaluation/http_test.exs +++ b/test/rag/evaluation/http_test.exs @@ -2,9 +2,7 @@ defmodule Rag.Evaluation.HttpTest do use ExUnit.Case use Mimic - alias Rag.Generation - alias Rag.Evaluation - alias Rag.Ai + alias Rag.{Ai, Evaluation, Generation} setup do %{provider: Ai.OpenAI.new(%{})} diff --git a/test/rag/evaluation/nx_test.exs b/test/rag/evaluation/nx_test.exs index 9ab9e9d..96ab77b 100644 --- a/test/rag/evaluation/nx_test.exs +++ b/test/rag/evaluation/nx_test.exs @@ -2,9 +2,7 @@ defmodule Rag.Evaluation.NxTest do use ExUnit.Case use Mimic - alias Rag.Generation - alias Rag.Evaluation - alias Rag.Ai + alias Rag.{Ai, Evaluation, Generation} setup do %{provider: Ai.Nx.new(%{text_serving: TestTextServing})} diff --git a/test/rag/evaluation_test.exs b/test/rag/evaluation_test.exs index 8f40bfa..a0cc129 100644 --- a/test/rag/evaluation_test.exs +++ b/test/rag/evaluation_test.exs @@ -1,8 +1,7 @@ defmodule Rag.EvaluationTest do use ExUnit.Case - alias Rag.Generation - alias Rag.Evaluation + alias Rag.{Ai, Evaluation, Generation} describe "evaluate_rag_triad/2" do test "takes a query, context, and response and returns an evaluation with scores and reasoning" do @@ -207,7 +206,7 @@ defmodule Rag.EvaluationTest do @tag :integration_test test "openai evaluation" do api_key = System.get_env("OPENAI_API_KEY") - provider = Rag.Ai.OpenAI.new(text_model: "gpt-4o-mini", api_key: api_key) + provider = Ai.OpenAI.new(text_model: "gpt-4o-mini", api_key: api_key) query = "When was Elixir 1.18.1 released?" context = "Elixir 1.18.1 was released on 2024-12-24" @@ -222,7 +221,7 @@ defmodule Rag.EvaluationTest do @tag :integration_test test "cohere evaluation" do api_key = System.get_env("COHERE_API_KEY") - provider = Rag.Ai.Cohere.new(text_model: "command-r-plus-08-2024", api_key: api_key) + provider = Ai.Cohere.new(text_model: "command-r-plus-08-2024", api_key: api_key) query = "When was Elixir 1.18.1 released?" context = "Elixir 1.18.1 was released on 2024-12-24" diff --git a/test/rag/generation/http_test.exs b/test/rag/generation/http_test.exs index 05469e2..9b9edb0 100644 --- a/test/rag/generation/http_test.exs +++ b/test/rag/generation/http_test.exs @@ -2,8 +2,7 @@ defmodule Rag.Generation.HttpTest do use ExUnit.Case use Mimic - alias Rag.Generation - alias Rag.Ai + alias Rag.{Ai, Generation} setup do %{provider: Ai.OpenAI.new(%{})} diff --git a/test/rag/generation/nx_test.exs b/test/rag/generation/nx_test.exs index c3194e8..590ae6f 100644 --- a/test/rag/generation/nx_test.exs +++ b/test/rag/generation/nx_test.exs @@ -2,8 +2,7 @@ defmodule Rag.Generation.NxTest do use ExUnit.Case use Mimic - alias Rag.Generation - alias Rag.Ai + alias Rag.{Ai, Generation} setup do %{provider: Ai.Nx.new(%{text_serving: TestTextServing})}