How it works
Minaya is a retrieval-augmented system. Nothing is fine-tuned and no model is trained on your data — your content is stored, indexed, and searched at question time.
Ingestion
When you add a source, a background job:
- Extracts text — crawls the URL, parses the PDF, or takes your pasted text.
- Chunks it into ~600-token pieces with ~100 tokens of overlap, so a sentence split across a boundary is still findable.
- Embeds each chunk into a vector.
- Stores the chunks and vectors in Postgres via pgvector.
Ingestion runs in a separate worker process from the API. If sources never leave
pending, that worker is not running.
Answering a question
- The visitor's message is embedded with the same model as your content.
- The closest chunks are retrieved by cosine similarity.
- Weak matches are discarded. If the best match is still too weak, the question is treated as uncovered.
- Surviving chunks become context, and the model is instructed to answer only from them.
- If MCP servers are connected, the model may call a tool before answering.
Embedding and chat providers
Which provider runs depends on whether the business supplied its own key, and which one — decided per request, not at purchase.
You can pick the bring-your-own-key price and add the key afterwards, but the widget only starts replying once the key is saved: that price excludes inference, so we do not serve our own model against it. The dashboard flags this on the Overview page until a key is present.
| Provider | When | Chat | Embeddings |
|---|---|---|---|
| OpenAI | Business supplied an OpenAI key | gpt-4o | text-embedding-3-large (1536-dim) |
| Anthropic | Business supplied a Claude key | claude-sonnet-5 | Cloudflare bge-base-en-v1.5 (768-dim) |
| Cloudflare | No key (free tier) | llama-3.1-8b-instruct | bge-base-en-v1.5 (768-dim) |
Anthropic has no embeddings API, so a Claude business is indexed on Cloudflare and searched against the 768-dimension column — the same path a keyless business takes. We absorb that embedding cost rather than asking for a second key. Claude answers the chat, which is where essentially all the cost sits.
The two produce different-sized vectors, so they are stored in separate columns and never compared against each other.
Adding or removing a key changes which column is searched. Content ingested on the free tier is not automatically re-embedded, so re-add or re-crawl your sources after switching.
Session limits
- 50 messages per chat session.
- 10 MCP tool calls per session, counted separately.
- 2,000 characters per visitor message (the widget caps input at 500).
Free-tier businesses also have a daily message cap. See Security for the rest of the guardrails.