Packages
nous
0.13.2
0.17.0
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.17
0.12.16
0.12.15
0.12.14
0.12.13
0.12.12
0.12.11
0.12.9
0.12.7
0.12.6
0.12.5
0.12.3
0.12.2
0.12.0
0.11.3
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.5.0
AI agent framework for Elixir with multi-provider LLM support
Current section
Files
Jump to
Current section
Files
lib/nous/memory/embedding.ex
defmodule Nous.Memory.Embedding do
@moduledoc """
Behaviour for embedding providers.
Implement this behaviour to use any embedding provider with the memory system.
If no embedding provider is configured, the memory system falls back to keyword-only search.
"""
@callback embed(text :: String.t(), opts :: keyword()) :: {:ok, [float()]} | {:error, term()}
@callback embed_batch(texts :: [String.t()], opts :: keyword()) ::
{:ok, [[float()]]} | {:error, term()}
@callback dimension() :: pos_integer()
@optional_callbacks [embed_batch: 2]
@doc """
Embed a single text using the given provider module and options.
Returns {:ok, embedding} or {:error, reason}.
"""
def embed(provider, text, opts \\ []) when is_atom(provider) do
provider.embed(text, opts)
end
@doc """
Embed a batch of texts. Falls back to sequential embed/2 calls if embed_batch/2 is not implemented.
"""
def embed_batch(provider, texts, opts \\ []) when is_atom(provider) do
if function_exported?(provider, :embed_batch, 2) do
provider.embed_batch(texts, opts)
else
results = Enum.map(texts, &provider.embed(&1, opts))
case Enum.split_with(results, &match?({:ok, _}, &1)) do
{successes, []} ->
{:ok, Enum.map(successes, fn {:ok, emb} -> emb end)}
{_, [{:error, reason} | _]} ->
{:error, reason}
end
end
end
@doc """
Get the embedding dimension for a provider.
"""
def dimension(provider) when is_atom(provider) do
provider.dimension()
end
end