Embeddings

Embed one or many values and compare vectors with cosine similarity.

Embedding models conform to EmbeddingModel, so OpenAI, Cohere, and custom OpenAI-compatible embedding endpoints use the same functions.

Embed one value

let model = OpenAIEmbeddingModel("text-embedding-3-small")
let result = try await embed(model: model, value: "sunny day at the beach")

result.embedding // [Double]
result.usage     // token accounting

Embed many values

embedMany preserves input order and can split inputs into provider-sized batches:

let result = try await embedMany(
  model: model,
  values: documents,
  maxBatchSize: 96
)

result.embeddings // one vector per input

The batches run sequentially, retry independently, and combine their usage.

Similarity

let query = try await embed(model: model, value: "coastal weather")
let documents = try await embedMany(model: model, values: values)

let ranked = zip(values, documents.embeddings)
  .map { value, vector in
    (value, cosineSimilarity(query.embedding, vector))
  }
  .sorted { $0.1 > $1.1 }

cosineSimilarity returns 0 for empty vectors, mismatched lengths, or a zero-norm vector.

Models

ProviderModel typeKey
OpenAIOpenAIEmbeddingModel("text-embedding-3-small")OPENAI_API_KEY
CohereCohereEmbeddingModel("embed-v4.0")COHERE_API_KEY
Custom compatible endpointOpenAIEmbeddingModel(..., baseURL: ...)Explicit or provider-specific

If you already have candidate documents and want a provider to reorder them, use reranking.