Skip to main content
Wildo.ai Coming soon

Generated documents

Let your assistant find answers in selected documents

Choose which file fields contribute to retrieval, how their text is split, and how access to the source records governs results.

Selected knowledge documents contribute text to retrieval while other attachments stay outside.

Let your assistant find answers in selected documents

An attachment can be more than a file someone downloads. Mark the document fields that should inform answers, and Wildo turns their extracted text into passages the application can retrieve.

You choose the sources and how their contents should be split. The retrieval system keeps those passages connected to the owning records and their access rules, so an assistant can use relevant material without treating every uploaded file as shared knowledge.

Example — Use the project brief, leave private attachments out

A project knowledge document can contribute passages to an assistant’s answer. A separate identity attachment remains outside the corpus because its field was never selected as a source. Membership in the corpus and permission to read the owning record both matter.

For engineers

Keep extraction and chunking as separate decisions

This file field comes from Wonder Todos’ knowledge-documents.schemas.ts, with source comments omitted:

document: z_file({
  allowedMimeTypes: [
    'application/pdf',
    'text/plain',
    'text/markdown',
    'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    'application/vnd.openxmlformats-officedocument.presentationml.presentation',
    'application/vnd.oasis.opendocument.text',
    'application/vnd.oasis.opendocument.spreadsheet',
    'application/vnd.oasis.opendocument.presentation',
  ],
  multiple: false,
  ragSource: {
    chunkingStrategy: RAGChunkingStrategy.RECURSIVE,
    chunkSize: 1_500,
    chunkOverlap: 200,
  },
  textExtraction: { ocr: false },
}).optional(),

allowedMimeTypes matches the document formats this application reads locally. ragSource enables ingestion and chooses recursive splitting into paragraphs, sentences and smaller units. chunkSize sets the target size; chunkOverlap carries context across adjacent passages and must stay smaller than the chunk size. These lengths use JavaScript string units (UTF-16 code units), not model tokens or file bytes. The example targets 1,500 units with 200 units of overlap; it is not a 1,500-token model budget.

textExtraction: { ocr: false } keeps this field’s text recovery local. Enabling recognition would be a separate decision, requiring a selected provider as well. A file field without ragSource contributes no corpus, even if its bytes could be extracted.

Keep the corpus current when content or settings change

Ingestion reads the committed field, extracts its text and compares both content and chunking settings with the existing chunk set. This is the replacement decision in rag-ingestion.backend.service.ts:

const chunkingConfigHash = computeRagChunkingConfigHash(input.fieldMeta.config);
const contentChanged = existing === undefined || existing.contentHash !== provided.contentHash;
const chunkingConfigChanged = existing === undefined || existing.chunkingConfigHash !== chunkingConfigHash;

if (!contentChanged && !chunkingConfigChanged) {
  this.logDebug('RAG field text and chunking config unchanged — chunk set kept (embedded vectors survive)', { ...ref });
  return RagFieldIngestionOutcome.SKIPPED_UNCHANGED;
}

const chunks = chunkRagSourceText(provided.text, input.fieldMeta.config, {
  debug: (message, context) => this.logDebug(message, context),
});
await this.ragChunkStore.replaceFieldChunks(ref, chunks, {
  contentHash: provided.contentHash,
  chunkingConfigHash,
  scope: resolveRowScopeStamp(input.row, this.resolveDeclaredPrimaryScope(input.resourceType)),
});

An unchanged source keeps its chunks and embeddings. Changing the text or chunking settings causes a replacement, carrying the owning record’s scope. That makes retuning the passage boundaries a real indexing change rather than a setting only new uploads receive.

Retrieve under the caller’s access

Use the retrieval service with the caller’s execution context. Retrieval narrows candidates by scope and checks whether the matched records remain readable before returning their passages. The application can use those passages as grounded context for an assistant or show them directly with their sources.

Wonder Todos’ knowledge-base ASK implementation calls the service with the existing caller context:

const result = await retrievalService.retrieve({
  query: question,
  executionContext,
  resourceTypes: [TasksManager_ResourceType.KNOWLEDGE_DOCUMENTS],
  ...(limit !== undefined && { limit }),
  ...(maxContextCharacters !== undefined && { maxContextCharacters }),
});

retrievalService is the injected RagRetrievalBackendService, available through SAAS_SERVICE_TYPES.RagRetrievalService. The resource-type list narrows the corpus; it cannot widen the caller’s authority. The request belongs inside an application operation, not a new unprotected retrieval endpoint.

ResultWhat the application should do with it
rowsUse the passages and their source attribution as context or displayable results.
modeExplain which retrieval path supplied the result.
refusedResourceTypesDistinguish an excluded corpus from a searched corpus with no matches.
truncationSurface the relevant hit, expansion or context limits instead of presenting a bounded answer as exhaustive.

An empty row list alone does not tell the caller whether nothing matched, a corpus was refused, or reading failed. Preserve the result’s diagnostics when presenting the answer.

The resource adapter selects a PostgreSQL or MongoDB chunk store. PostgreSQL semantic search needs vector support; MongoDB search needs the corresponding mongot indexes to be ready. Configure embeddings for semantic retrieval; lexical retrieval can run without an embeddings provider. Choose which fields carry human-authored knowledge. Generated answers remain application behavior on top of the retrieved material; the retrieval result supplies passages and source attribution.

Building a B2B product or an internal tool?

Wildo is not self-service yet. Tell us what you have in mind and we will say plainly whether it fits, and what happens next.