Vectors for your documents, computed in France.
Evanesca's embeddings endpoint turns text into vectors for search and retrieval-augmented generation (RAG), in OpenAI's format. Both embedding models run in France — at Scaleway in Paris — and each call is paid per input token, from the same prepaid credit as chat.
SoonOpening soon: what follows describes the service as it will work.
One call, one vector per text
Send model and input — one string or an array of strings — to POST /embeddings. The answer is a list with one vector per input, in the order you sent them, and a usage block with the input tokens you pay for. The key is the same as for chat (how keys work).
curl https://evanesca.app/api/v1/embeddings \
-H "Authorization: Bearer $EVANESCA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3-embedding-8b",
"input": ["Contract clause 4.2", "Payroll export, March"]
}'import os
from openai import OpenAI
client = OpenAI(base_url="https://evanesca.app/api/v1", api_key=os.environ["EVANESCA_API_KEY"])
vectors = client.embeddings.create(
model="qwen3-embedding-8b",
input=["Contract clause 4.2", "Payroll export, March"],
)
print(len(vectors.data[0].embedding)) # 4096import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://evanesca.app/api/v1", apiKey: process.env.EVANESCA_API_KEY });
const vectors = await client.embeddings.create({
model: "qwen3-embedding-8b",
input: ["Contract clause 4.2", "Payroll export, March"],
});
console.log(vectors.data[0].embedding.length); // 4096package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{"model": "qwen3-embedding-8b", "input": ["Contract clause 4.2", "Payroll export, March"]}`)
req, err := http.NewRequest("POST", "https://evanesca.app/api/v1/embeddings", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("EVANESCA_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}{
"object": "list",
"model": "qwen3-embedding-8b",
"data": [
{ "object": "embedding", "index": 0, "embedding": [ … ] },
{ "object": "embedding", "index": 1, "embedding": [ … ] }
],
"usage": { "prompt_tokens": 14, "total_tokens": 14 }
}The embedding models
All of them run in France, at a French operator with no US parent. Dimensions were measured with a real call; the context window is the limit the operator announces.
| Model | ID | Dimensions | Context (tokens) | Licence | Run by | Where | Price / M input tokens | Card |
|---|---|---|---|---|---|---|---|---|
qwen3-embedding-8b | 4,096 | 40,960 | Apache-2.0 | Scaleway | Paris, France | €0.168 | Model card | |
| BGE Multilingual Gemma2 | bge-multilingual-gemma2 | 3,584 | 8,192 | Gemma Terms of Use | Scaleway | Paris, France | €0.168 | Model card |
Prices per million input tokens, margin and VAT included. An embedding has no output price.
What the operators keep
Scaleway applies zero data retention by default; when requests cause errors or look abusive, it may keep and read their content for up to 14 days (Scaleway).
BGE-M3 is paused
Since 20 October 2026, OVHcloud, the only European operator that runs BGE-M3 (bge-m3) for Evanesca, has not been serving it: a call answers 503 and is not billed. Meanwhile, use Qwen3 Embedding 8B or BGE Multilingual Gemma2 — and re-index first, since vectors from two models cannot be compared.
How to choose
Decide before you index anything: the vector length becomes part of your storage schema, and switching models later means computing every vector again.
- Shortest vectors: BGE Multilingual Gemma2, 3,584 dimensions — lighter to store and to search.
- Longest vectors: Qwen3 Embedding 8B, 4,096 dimensions.
- Longest texts: Qwen3 Embedding 8B reads up to 40,960 tokens per input, the others stop at 8,192. Cut your documents to fit.
- Lowest price: Qwen3 Embedding 8B and BGE Multilingual Gemma2, €0.168 per million input tokens.
- Licence: Qwen3 Embedding 8B under permissive licences (Apache-2.0); BGE Multilingual Gemma2 comes under Google's Gemma Terms of Use, not an open-source licence — read them before you build on it.
Retrieval and answer, both in Europe
RAG takes two models: one turns your documents and the question into vectors, the other writes the answer from the passages you find. With an embedding model from this page, run in France, and any of Evanesca's chat models, all run in Europe, both halves stay in Europe, with the same key.
- Chunk
Split your documents into passages that fit the model's context window.
- Embed and store
Send the passages to /embeddings and keep the vectors in your vector database, next to the text.
- Retrieve
Embed the question with the same model and look up the nearest passages.
- Answer
Send the question and those passages to /chat/completions, with one of Evanesca's chat models, all run in Europe.
Your vectors live in your own store. Of an embeddings call, Evanesca records the model, the token count and the cost — no text, no vector.
Billing
An embeddings call uses input tokens only, paid at the model's input price from your prepaid credit. No output price, no subscription: credit starts at €2 and never expires (pricing).
Frequently asked questions
Can I use OpenAI's SDK for embeddings?
Yes: set base_url to Evanesca's base URL, and client.embeddings.create works as it is. Keep the same model for indexing and for queries: vectors from two different models cannot be compared.
Does Evanesca keep my documents or my vectors?
No. The texts stay in memory while the operator computes the vectors; of the call, Evanesca records the model, the token count and the cost. The vectors come back to you and live in your own store. One exception on the operator's side: when requests cause errors or look abusive, Scaleway may keep and read their content for up to 14 days.
Which embedding model is the cheapest?
Qwen3 Embedding 8B and BGE Multilingual Gemma2, at €0.168 per million input tokens, VAT included. There is no output price: an embedding produces no output tokens.
Can I pair an embedding model with any chat model?
Yes. Retrieval and answer are two separate calls, so any chat model can use the passages you found. Evanesca's all run in Europe, so both halves of your RAG stay there.
Your vectors, computed in France.
One key, the OpenAI SDK you already use, and Evanesca's base URL.