Which embedding model should you use in 2026? Shortlist by constraints, then decide on your own data. On price and simplicity, OpenAI's text-embedding-3-small ($0.02 per million tokens) and -large ($0.13) remain the reference points1. For images, audio and video in the same space, Gemini Embedding 2 ($0.20 per million text tokens, $0.10 on Batch)2. For a range of sizes and domain models with a large free allowance, Voyage 43. For very long and mixed inputs, Cohere Embed v5 and v4, with 128K-token inputs including images and PDFs4. Then measure recall on real queries, because the model you choose is the hardest one in your stack to change.
The current options
| Model | Rate per 1M tokens | Default dimensions | Max input | Modalities |
|---|---|---|---|---|
| OpenAI text-embedding-3-small | $0.02 | 1,536 (shortenable) | 8,192 tokens | Text |
| OpenAI text-embedding-3-large | $0.13 | 3,072 (shortenable) | 8,192 tokens | Text |
| Gemini Embedding 2 | $0.20 text ($0.10 Batch) | See Google's docs | See Google's docs | Text, image, audio, video |
| Voyage 4 lite / 4 / 4 large | $0.02 / $0.06 / $0.12 | See Voyage's docs | See Voyage's docs | Text |
| Voyage code 4, context 4 | $0.12 | See Voyage's docs | See Voyage's docs | Text and code |
| Cohere Embed v5 pro / fast | Not published on the pricing page opened | 2,048 (256–1,536 options) | 128K tokens | Text, images, mixed |
| Cohere Embed v4 | Not published on the pricing page opened | 1,536 (256–1,024 options) | 128K tokens | Text, images, mixed |
| Mistral Embed, Codestral Embed | See Mistral's pricing | See Mistral's docs | See Mistral's docs | Text, code |
Notes from those pages:
- OpenAI vectors are normalised to length 1, so a dot product gives cosine similarity, and the
dimensionsparameter trims a vector "without fully losing" its meaning5. - Gemini Embedding 2 also prices image input at $0.00012 per image, audio at $0.00016 per second and video at $0.00079 per frame on its standard tier, with half those rates on Batch, and has a free tier for text2.
- Voyage gives 200 million free tokens on its version-4 models and lists separate law, finance and code models at $0.12 with 50 million free tokens; its multimodal models charge per text token plus per pixel3.
- Cohere's Embed v5 comes in pro and fast variants with dimension options from 256 to 2,048; its English and multilingual v3 models still take 512-token inputs4. Its pricing page lists dedicated-instance rates rather than per-token rates.
- Mistral lists Mistral Embed and Codestral Embed, the latter for code6.
The cost that matters: the whole corpus, twice
Embedding rates look negligible per request. They are not negligible per corpus, and you pay for the corpus more than once.
Query embeddings are a second, ongoing cost: every search embeds the query. At high query volumes a small model's per-query cost and latency matter more than its per-corpus cost. Where the tokens go in a RAG pipeline breaks this down.
Dimensions decide storage and search cost
Vector databases store and compare every dimension. Float32 vectors take 4 bytes per dimension:
| Dimensions | 10M vectors (float32) |
|---|---|
| 512 | about 20 GB |
| 1,024 | about 41 GB |
| 1,536 | about 61 GB |
| 3,072 | about 123 GB |
Memory-resident indexes multiply that cost again. Models that can shorten vectors (OpenAI's dimensions parameter, Cohere's dimension options) let you test 512 or 1,024 dimensions against the full size on your own queries. If recall barely moves, the smaller vectors are a lasting saving on every query.
How to choose on your own data
- Build a query set. 100 to 300 real queries with the documents that should answer them, from search logs or support tickets.
- Embed a sample corpus with each shortlisted model, at its default and one reduced dimension.
- Measure recall@k (is the right document in the top 5 or 10?) and, if you rerank, the final answer quality.
- Check languages and domains you serve. A model that is strong in English can be weaker in your second language; domain models (code, law, finance) can beat general ones on their domain.
- Price the winner on corpus size, re-embed frequency, query volume and storage, not on the rate per token alone.
Evaluating LLMs on real workloads covers building the query set.
Rules that save a migration
- Never mix models in one index. Vectors from different models are not comparable; a query embedded with model B against documents embedded with model A returns noise without an error.
- Record the model and dimensions with every vector, so a migration knows exactly what it is replacing.
- Migrate with a parallel index. Embed the corpus with the new model into a new index, compare results on the query set, switch reads, then delete the old index.
- Failover means the same model. If the primary embedding provider fails, the only safe fallback is the same model on another account or platform; a different model would write vectors your index cannot use.
- Rerank instead of re-embedding when the problem is ordering rather than recall. A reranker on the top 50 results is often a smaller change than a new embedding model.
Embeddings through INFRO
INFRO serves POST /v1/embeddings in OpenAI's shape on your own provider connection, so OpenAI's SDKs, LangChain and LlamaIndex work with only the base URL and key changed. It serves OpenAI's and Mistral's embedding models, Azure OpenAI deployments and models on your own OpenAI-compatible server. Each request carries an estimated provider cost and is attributed by project, key and workflow, so corpus jobs and query traffic can be budgeted separately. An embeddings request may only fail over to the same model, so a fallback never writes vectors from a different space into your index. INFRO stores no documents and no vectors and runs no retrieval; your vector database stays yours.
Summary
Shortlist embedding models by modality, input length and budget; choose by recall on your own queries; size dimensions by measured quality, because storage and search scale with them; and treat a model change as a migration, because every vector has to be recomputed.
