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 accountingEmbed 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 inputThe 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
| Provider | Model type | Key |
|---|---|---|
| OpenAI | OpenAIEmbeddingModel("text-embedding-3-small") | OPENAI_API_KEY |
| Cohere | CohereEmbeddingModel("embed-v4.0") | COHERE_API_KEY |
| Custom compatible endpoint | OpenAIEmbeddingModel(..., baseURL: ...) | Explicit or provider-specific |
If you already have candidate documents and want a provider to reorder them, use reranking.