View Source LadybugEx.LLM (LadybugEx v0.2.0)

Interface for generating text embeddings using the llm extension.

This module provides functions for generating embeddings via external LLM providers like OpenAI, Google, AWS Bedrock, and others.

Prerequisites

The llm extension must be installed and loaded before using this module:

# Install once
LadybugEx.Extensions.install(conn, "llm")

# Load for each connection
LadybugEx.Extensions.load(conn, "llm")

This module will automatically ensure the extension is loaded when calling its functions.

Supported Providers

  • :amazon_bedrock - AWS Bedrock (requires AWS credentials)
  • :google_vertex - Google Vertex AI
  • :google_gemini - Google Gemini
  • :ollama - Local Ollama server
  • :openai - OpenAI API
  • :voyageai - Voyage AI

Required Environment Variables

Each provider requires specific environment variables:

  • OpenAI: OPENAI_API_KEY
  • Google Vertex: GOOGLE_API_KEY or service account credentials
  • Google Gemini: GOOGLE_API_KEY
  • AWS Bedrock: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
  • Voyage AI: VOYAGEAI_API_KEY
  • Ollama: None (local server)

Usage Examples

# Generate embedding with OpenAI
{:ok, embedding} = LLM.create_embedding(conn,
  "Machine learning is fascinating",
  provider: :openai,
  model: "text-embedding-ada-002"
)

# Generate with specific dimensions
{:ok, embedding} = LLM.create_embedding(conn,
  "Graph databases are powerful",
  provider: :openai,
  model: "text-embedding-3-small",
  dimensions: 512
)

# Use local Ollama
{:ok, embedding} = LLM.create_embedding(conn,
  "Local embeddings",
  provider: :ollama,
  model: "nomic-embed-text",
  endpoint: "http://localhost:11434"
)

# Batch processing
texts = ["Text 1", "Text 2", "Text 3"]
embeddings = Enum.map(texts, fn text ->
  {:ok, emb} = LLM.create_embedding(conn, text, provider: :openai)
  emb
end)

Summary

Functions

Check if required environment variables are set for a provider.

Generate an embedding for the given text using an LLM provider.

Generate an embedding for the given text using an LLM provider.

Generate embeddings for multiple texts in batch.

Generate embeddings for multiple texts in batch.

Get information about all supported providers.

Get the list of supported models for a provider.

Types

embedding()

@type embedding() :: [float()]

provider()

@type provider() ::
  :amazon_bedrock
  | :google_vertex
  | :google_gemini
  | :ollama
  | :openai
  | :voyageai

Functions

check_provider_config(provider)

@spec check_provider_config(provider()) :: {:ok, map()} | {:error, String.t()}

Check if required environment variables are set for a provider.

Examples

iex> LLM.check_provider_config(:openai)
{:ok, %{api_key_set: true}}

iex> LLM.check_provider_config(:openai)
{:error, "Missing environment variable: OPENAI_API_KEY"}

create_embedding(conn, text, opts)

@spec create_embedding(LadybugEx.Connection.t(), String.t(), keyword()) ::
  {:ok, embedding()} | {:error, String.t()}

Generate an embedding for the given text using an LLM provider.

Options

  • :provider - (required) The LLM provider to use
  • :model - Model to use (defaults to provider's default model)
  • :dimensions - Embedding dimensions (provider-specific support)
  • :region - AWS region for Bedrock (default: us-east-1)
  • :endpoint - Custom endpoint URL (for Ollama or custom deployments)

Examples

# OpenAI with default model
{:ok, embedding} = LLM.create_embedding(conn,
  "This is my text",
  provider: :openai
)

# OpenAI with specific model and dimensions
{:ok, embedding} = LLM.create_embedding(conn,
  "Advanced text processing",
  provider: :openai,
  model: "text-embedding-3-large",
  dimensions: 3072
)

# AWS Bedrock
{:ok, embedding} = LLM.create_embedding(conn,
  "Cloud computing",
  provider: :amazon_bedrock,
  model: "amazon.titan-embed-text-v2",
  region: "us-west-2"
)

# Local Ollama server
{:ok, embedding} = LLM.create_embedding(conn,
  "Local processing",
  provider: :ollama,
  model: "nomic-embed-text",
  endpoint: "http://localhost:11434"
)

create_embedding!(conn, text, opts)

@spec create_embedding!(LadybugEx.Connection.t(), String.t(), keyword()) ::
  embedding()

Generate an embedding for the given text using an LLM provider.

Raises an error if embedding generation fails.

Examples

embedding = LLM.create_embedding!(conn,
  "This is my text",
  provider: :openai
)

create_embeddings(conn, texts, opts)

@spec create_embeddings(LadybugEx.Connection.t(), [String.t()], keyword()) ::
  {:ok, [embedding()]} | {:error, String.t()}

Generate embeddings for multiple texts in batch.

More efficient than individual calls for some providers. Falls back to sequential processing if batch is not supported.

Options

Same as create_embedding/3

Examples

texts = ["Text 1", "Text 2", "Text 3"]
{:ok, embeddings} = LLM.create_embeddings(conn, texts,
  provider: :openai
)

create_embeddings!(conn, texts, opts)

@spec create_embeddings!(LadybugEx.Connection.t(), [String.t()], keyword()) :: [
  embedding()
]

Generate embeddings for multiple texts in batch.

Raises an error if embedding generation fails.

Examples

texts = ["Text 1", "Text 2", "Text 3"]
embeddings = LLM.create_embeddings!(conn, texts,
  provider: :openai
)

provider_info()

@spec provider_info() :: map()

Get information about all supported providers.

Examples

info = LLM.provider_info()
Enum.each(info, fn {provider, details} ->
  IO.inspect({provider, details.models, details.env_vars})
end)

supported_models(provider)

@spec supported_models(provider()) :: [String.t()]

Get the list of supported models for a provider.

Examples

iex> LLM.supported_models(:openai)
["text-embedding-ada-002", "text-embedding-3-small", "text-embedding-3-large"]