Quickstart
On this page
Fully local, zero API keys
The simplest path uses HuggingFaceEmbedder, which downloads and runs a sentence-transformers model on your machine:
from zerda.embeddings import HuggingFaceEmbedder
embedder = HuggingFaceEmbedder() # defaults to paraphrase-multilingual-MiniLM-L12-v2
vector = embedder.encode("Hello, world")
print(vector.shape) # (384,)
vectors = embedder.encode(["first text", "second text"])
print(vectors.shape) # (2, 384)
Arabic-optimized local embedding
ArabicEmbedder wraps the same local pipeline but adds Arabic-specific text normalization (diacritic removal, hamza normalization, etc.) before encoding:
from zerda.embeddings import ArabicEmbedder
embedder = ArabicEmbedder(normalization_level="standard")
vector = embedder.encode("مرحباً بكم في عالم الذكاء الاصطناعي")
print(embedder.embedding_dim)
Hosted APIs
All three hosted embedders follow the same shape — pass (or export) an API key, then call .encode():
import os
from zerda.embeddings import OpenAIEmbedder
os.environ["OPENAI_API_KEY"] = "sk-..."
embedder = OpenAIEmbedder(model_name="text-embedding-3-small")
vectors = embedder.encode(["first document", "second document"])
from zerda.embeddings import GeminiEmbedder
embedder = GeminiEmbedder(api_key="your-google-api-key", task_type="RETRIEVAL_DOCUMENT")
vectors = embedder.encode(["first document", "second document"])
from zerda.embeddings import MistralEmbedder
embedder = MistralEmbedder(api_key="your-mistral-api-key")
vectors = embedder.encode(["first document", "second document"])
Local server via Ollama
from zerda.embeddings import OllamaEmbedder
embedder = OllamaEmbedder(model_name="nomic-embed-text") # auto-starts `ollama serve` if needed
vector = embedder.encode("مرحباً Hello")
Computing similarity
Every embedder inherits similarity() and batch_similarity() from BaseEmbedder:
score = embedder.similarity("cats are great", "dogs are great", metric="cosine")
top = embedder.batch_similarity(
query="machine learning",
texts=["deep learning", "cooking recipes", "neural networks"],
top_k=2,
) # -> [(index, score), (index, score)]
ArabicEmbedder additionally provides its own compute_similarity() and find_most_similar() helpers — see ArabicEmbedder.
Context managers
Every embedder implements __enter__/__exit__ (and BaseEmbedder also implements the async equivalents __aenter__/__aexit__), which log a usage summary and call cleanup() on exit:
with OpenAIEmbedder() as embedder:
vectors = embedder.encode(texts)
# usage/cost summary logged here
Async usage
BaseEmbedder provides aencode(), aencode_with_cache(), and abatch_similarity(), all of which run the corresponding synchronous method in a thread via asyncio.to_thread — no embedder overrides these, so async support is uniform across the whole package:
import asyncio
async def main():
vectors = await embedder.aencode(["a", "b", "c"])
asyncio.run(main())