The three kinds of source
Documents
PDF, Markdown, plain text, Word (
.docx) and HTML, up to 10 MB per file.URLs
A page wondeya fetches and reads for you.
Claims
Short facts you write by hand, in Spanish and English.
Documents
The console’s uploader takes PDF, Markdown, plain text and Word (.docx). The API additionally accepts HTML (text/html). A file the pipeline cannot read is refused with an unsupported-format error rather than half-indexed, and the cap is 10 MB per file either way.
Uploading the same file twice updates the existing source instead of creating a second one: the bytes are the identity of an upload, so dragging the same PDF in again does not double your knowledge base.
URLs
You give a page address; wondeya fetches it and reads it. Onlyhttp and https are allowed, and addresses that resolve to private, loopback or link-local ranges are refused. The check runs when you add the URL and again at fetch time, because DNS can change in between.
A URL source can keep itself current. Give it a re-sync window (syncTtlMinutes; the console offers Once, Daily and Weekly) and wondeya re-fetches the page on that schedule. Choosing Once means no re-fetch at all. The re-crawl is deterministic: it compares the fetched bytes against what it already indexed and only re-reads a page that actually changed, so a page that never moves costs nothing and never re-runs the enrichment step. You can still Retry a URL by hand at any time; with the same content it is just as cheap.
Claims
A claim is a title plus the approved copy in both Spanish and English. Claims are stored verbatim: never cut into fragments, never machine-translated at answer time. A claim is copy someone approved, and re-cutting it would be editing it. At answer time the visitor’s language wins, and the other language of the same claim is set aside so one fact never arrives twice.Automatic enrichment
When you add a document or a URL, wondeya reads it once with a model before it is indexed. That single pass does three things you would otherwise do by hand:- Names it. The source gets a title and a one-line summary of what it covers, so the agent knows the document exists even before it reads inside it.
- Translates it to English. The chunks are indexed and retrieved in English, which costs fewer tokens on every future answer. This is invisible to your visitors: they still read and are answered in their own language. A source shows the language it arrived in and a “translated” mark so nothing is hidden.
- Divides it into topics. The document is split into focused topics (several when the material calls for it, one when it is short), and each topic is given a short English description. A one-paragraph note becomes one topic; a long policy becomes several.
Topics
Topics are how retrieval routes a question to the right material. They are the deterministic half of retrieval (no model, no index, no network), and they are the cheapest quality win available. A source with no topics is universal: the topic map matches it against every question, so it is always retrievable. Tagging it is what focuses it. Every source carries up to 12 topic tags: lowercase words likepricing, warranty, shipping. You can set them by hand, and enrichment proposes them for you.
The topic taxonomy
Each agent keeps a managed taxonomy: the set of topics its knowledge is organized under, each with aslug (the stable key that tags the material), a title, and a description. The description is not decoration: it is what steers the agent toward the right topic when it answers, so a clear description is a direct quality lever.
The console does not have a Topics screen. Curate the taxonomy over API v1 (
GET /v1/knowledge/topics, PATCH /v1/knowledge/topics/:slug, POST /v1/knowledge/topics/merge, DELETE /v1/knowledge/topics/:slug) or MCP (list_knowledge_topics, update_knowledge_topic, merge_knowledge_topics, delete_knowledge_topic).auto; the moment you rename it or rewrite its description it becomes manual, and enrichment never overwrites your wording again. From there you curate what the model proposed:
- Rename a topic or rewrite its description.
- Merge two topics the model split too finely (for example
pricesintopricing); the material is re-tagged, never lost. - Delete a topic; the row goes and the tag is pulled from every source, but the material stays: a passage left with no topics simply becomes universal, matched by every question. Deleting a topic never makes the agent forget a document.
A topic that grows too broad is a quality signal. Retrieval synthesizes each selected topic on its own, so a topic carrying a very large number of chunks produces a longer, less focused summary. The console flags it; the fix is to split the underlying material, not the topic.
What happens after you add a source
Indexing never runs inside your upload request. The request stores the bytes and queues the work; the queue does the reading. Every source counts against your plan’s document allowance, whether it is a document, a URL or a claim. At the cap, the API answers 402 carrying the limit and the current count. Editing a claim or retrying a failed ingest never spends a document. A source moves through four states:
A failure is a state with a machine-readable reason, never a crash:
unsupported_document, ingest_failed, or a fetch_… reason for a URL (timeout, DNS failure, response too large, blocked address). Retry re-runs the ingest with the file, URL or claim wondeya already holds, so recovering costs one click and no re-upload.
How documents are cut up
Documents are split along their own structure first (headings for Markdown and HTML, pages for PDF) and only then by size, targeting about 512 tokens with a small overlap. Very short fragments are merged rather than indexed on their own, because an orphan fragment is noise in every future search. Each chunk carries the document title and the heading trail it came from, which is what lets a passage make sense out of context.How retrieval works at answer time
Two searches run in parallel over the agent’s chunks (plus the workspace pool it reads) and their rankings are fused:- the topic map, deterministic and instant;
- vector search, filtered to your workspace and agent before it looks at a single vector.
Test retrieval
Today this runs over MCP only, withprobe_retrieval: it runs exactly the search the agent runs and shows you what came back, each passage, which source it belongs to, its heading trail, and how many candidates each half of the search contributed. The console does not have a retrieval-testing screen yet.
It answers the question that matters when an answer is disappointing: is the agent choosing badly, or is the material simply not there?
Agent scope and workspace scope
A source belongs to one agent, named byagentId. A source created without agentId goes to a workspace pool that every agent of the workspace reads by default, and several pages sharing one agent share its knowledge. An agent can be cut off from the pool with its useWorkspaceKnowledge setting, so a workspace running two unrelated products can keep them from answering in each other’s name. That setting is editable through the API and MCP today; the console does not expose it yet.
In the console, a source lands on the agent whose Knowledge tab you are in. Filing a source in the workspace pool is done through the API by omitting
agentId.