ragembed
bge-m3

Text in, vectors out.

An OpenAI-compatible embeddings API over bge-m3. Point any OpenAI client at it, send a batch, get your vectors back. Your key carries its own limits and its own token budget.

base url https://embed.ituoga.lt

01 Quickstart

One request, one vector. Swap in the key your operator issued you.

curl https://embed.ituoga.lt/v1/embeddings \
  -H "Authorization: Bearer sk-rag-…" \
  -H "Content-Type: application/json" \
  -d '{"model":"bge-m3","input":"hello world"}'

02 Batching

Send an array to embed up to 25 texts in one call — far faster than one request each. Over that limit the request is refused with 400 rather than silently truncated.

curl https://embed.ituoga.lt/v1/embeddings \
  -H "Authorization: Bearer sk-rag-…" \
  -H "Content-Type: application/json" \
  -d '{"model":"bge-m3","input":["first text","second text","third text"]}'

Vectors come back in the same order you sent them, so you can zip them straight back onto your rows.

03 Ollama's native endpoint

If your client speaks Ollama rather than OpenAI, use /api/embed. Same key, same limits, same batching — only the response shape differs.

curl https://embed.ituoga.lt/api/embed \
  -H "Authorization: Bearer sk-rag-…" \
  -H "Content-Type: application/json" \
  -d '{"model":"bge-m3","input":["first text","second text"]}'

04 From the OpenAI SDK

No special client needed — set the base URL and carry on.

from openai import OpenAI

client = OpenAI(base_url="https://embed.ituoga.lt/v1", api_key="sk-rag-…")

vectors = client.embeddings.create(
    model="bge-m3",
    input=["first text", "second text"],
)
print(len(vectors.data), "vectors")

05 What your key allows

batch
25 inputs / request
rate
100 requests / min
budget
per key tokens

Those are the defaults a new key is issued with; yours may differ — your operator sets them per key. Every response to a budgeted key carries X-Token-Budget-Remaining, so you can watch your own consumption without asking anyone.

06 When the pool is busy

Requests are queued, not dropped. Under load your call waits for a free slot instead of failing, so a burst shows up as latency rather than errors — no retry storm needed. Nobody is starved: a request that has been waiting is promoted ahead of higher-priority traffic.

07 What the statuses mean

CodeMeaningWhat to do
200Embeddings returned
400Bad JSON, or more inputs than your batch limitFix the request
401Missing, invalid or revoked keyCheck your key
402Token budget spentWait for the monthly reset, or ask for a top-up
429Too many requests this minuteRetry after the Retry-After header
502Embedding backend unavailableRetry shortly
503Cancelled while queuedRetry

Errors use the OpenAI envelope ({"error":{"message","type"}}), so an OpenAI SDK surfaces them through its normal error handling.

08 Getting a key

Keys are issued by the operator — there is no self-service signup. Email us and say roughly how much you expect to embed, so your batch, rate and budget can be set sensibly.

info@ituoga.lt

Keep the key secret: only its hash is stored here, so a lost key cannot be recovered, only replaced.