Knowledge
Library files, folders, sources, datasources, tags, and the search_knowledge tool.
Knowledge flows one way: files land in the Library, folders parse and
embed them, sources are the parsed documents, and datasources keep
folders filled from outside systems. Tags label sources along the way.
Agents read it all through search_knowledge.
Library
One page for everything stored: uploads, chat attachments, and agent-generated
files list together, because every file is a Source with an origin (upload,
chat, or agent). Three tabs — Files, Folders, Skills — each its own path.
Uploading straight into the Library stores and previews the file but never parses or embeds it: not knowledge, just a file. These uploads take most document, image, audio, video, and archive types, up to 10 MB. Knowledge starts when a file is uploaded into a folder.
Folders
A folder is a knowledge base: a named collection of sources with its own parsing, chunking, and indexing settings. Names are unique, and your plan caps how many folders you can have.
| Setting | Default | Options |
|---|---|---|
| Indexing | Off (on for folders a datasource creates) | On embeds sources for vector search. Off still parses them and keeps the text, which stays reachable by keyword search and whole-document reads. |
| Parsing strategy | basic | none (store files, never read them), basic, basic_with_visuals, structured, structured_with_visuals |
| Chunking | recursive, 500 / 50 | recursive or token, with chunk size and overlap. Used only when indexing is on. The form takes size 100–2000 and overlap 0–500; overlap must be smaller than size. |
| Sharing | Not shared | Who may attach the folder in chat. |
Folders are the exception to the platform sharing rule: absent sharing means
not shared, so only people using an agent whose knowledge tool already covers
the folder can attach it. Over the API, chunkStrategy takes type,
chunk_size, and chunk_overlap.
Changing parsing or chunking reports how many sources went stale; reindexing is an idempotent background job, so re-running it after a partial failure picks up the remainder. Deleting a folder deletes its sources and their indexed chunks. It is refused while a datasource keeps its pages there — delete the datasource first.
Folder Settings
One workspace-wide setting for every folder, behind the gear on Library → Folders.
- Embedding model — turns sources into vectors. Dimensions follow the
model. If nothing is saved, creating the first folder sets
BAAI/bge-large-en-v1.5at 1024 dimensions. The Free plan embeds with FastEmbed only. - Image Reading — how text comes out of images and scanned pages. OCR
(the default) reads locally at no cost. Vision model sends each image to
a vision model you pick (
gpt-6-lunaby default, orgpt-6.1-sol,claude-sonnet-5-5,claude-opus-5-5,gemini-3.8-flash,gemini-4-argon), billed per image.
| Model | Provider | Dimensions |
|---|---|---|
text-embedding-3-large | OpenAI | 3072 |
text-embedding-3-small | OpenAI | 1536 |
text-embedding-ada-002 | OpenAI | 1536 |
BAAI/bge-large-en-v1.5 | FastEmbed | 1024 |
sentence-transformers/all-MiniLM-L6-v2 | FastEmbed | 384 |
voyage-3 | Voyage AI | 1024 |
voyage-3-lite | Voyage AI | 512 |
text-embedding-004 | 768 |
Pick the model before adding sources. Sources keep the vectors and image text they were processed with: after changing either setting, run Index on existing sources to process them again.
Sources
The single collection for all documents: files, pasted text, and web pages (a URL, with optional CSS selectors to keep or drop parts of the page). Each source carries its type, status, folder, tags, size, content, and sync provenance (which datasource and external version it came from). Titles are unique within a folder.
Files a folder accepts:
| Kind | Formats |
|---|---|
| Documents | PDF, Word (.doc, .docx), Excel (.xls, .xlsx), PowerPoint (.ppt, .pptx) |
| Text | Plain text, Markdown, CSV, HTML, JSON, XML |
| Images | JPEG, PNG, GIF — read by the Image Reading setting |
| Video | MP4, MOV, AVI, MKV, WebM, WMV, FLV — transcribed with Whisper |
The largest file and the folder count depend on your plan:
| Plan | Folders | Largest file |
|---|---|---|
| Free | 1 | 10 MB |
| Basic | 2 | 25 MB |
| Starter | 5 | 50 MB |
| Pro | 20 | 100 MB |
| Enterprise | Unlimited | 100 MB |
A source moves through these statuses:
| Status | Meaning |
|---|---|
created | Stored, not processed yet. Stays here in a none folder. |
processing | Being parsed (and embedded). |
processed | Text extracted, no vectors — the folder has indexing off. |
indexed | Parsed and embedded; vector search finds it. |
failed | Shows a one-sentence reason and a link to the trace whose logs hold the full text. |
A source page has Preview and Chunks tabs. Chunks shows what indexing cut the source into, in document order, for indexed sources. The row menu re-runs processing: Index in an indexed folder, Extract otherwise.
The API covers the lifecycle: composable list (by folder, type, origin, or
title), JSON create for text and web sources, multipart upload, a dry-run
extract that parses without indexing, content streaming and byte
replacement, a chunk list, and per-source get/update/delete/process. Uploads
into a folder need the create permission; guest chat attachments don't.
POST /sources/search is the folder search box. It matches titles and
retrieves content in one call, across every folder unless folderIds narrows
it:
| Field | Default | Notes |
|---|---|---|
query | — | Required. |
strategy | semantic | semantic, hybrid, fulltext, or auto (runs hybrid). |
fields | both | title, content, or both. |
limit | 10 | Sources returned, max 50. |
includeChunkText | false | Return each matching chunk in full. |
Results come back in raw retriever order with no reranking, which makes the box the place to compare strategies before setting one on an agent. If retrieval is down, content falls back to scanning stored text and the response says so.
Searching knowledge
Agents read folders through the search_knowledge tool (see
Tools). One configured tool gives the model up to three tools that
share its folder scope: search_knowledge, plus
list_folder_sources and read_source. The tool
needs at least one folder. A chat turn's attached folders or
scope.folderIds (see Chat) narrow it for that turn; when none of
the tool's folders is in scope, the tool is not offered.
Options
Set on the tool. Out-of-range numbers clamp to the range.
| Option | Default | Range | Effect |
|---|---|---|---|
folderIds | — | at least 1 | Folders the tool searches. |
k (Top-K) | 20 | 1–100 | Results per call in previews mode. |
searchStrategy | semantic | see below | How results are ranked. |
overFetchRatio | 4 | 1–10 | Candidates pulled per result slot before filtering. |
decomposeQuery | off | — | Split the query into sub-queries and fuse the results. The original query is always searched. Ignored when the call uses text_match. |
maxSubQueries | 4 | 2–8 | Sub-queries, counting the original. |
decomposeModel | platform default | — | Model for the split. |
diversityGate | on | — | Collapse near-duplicate chunks and cap each source's share. |
maxChunksPerSource | 5 | 1–50 | That cap. |
rerank | on | — | An LLM judges each candidate's relevance. It is the only relevance gate: off, results come back in retriever order and the tool can't report that nothing relevant was found. |
rerankTopN | k | 1–100 | Results the reranker keeps. |
rerankModel | platform default | — | Model for the rerank. |
expandNeighbors | off | — | Stitch each hit together with the chunks around it. content mode only. |
neighborWindow | 1 | 1–3 | Chunks fetched either side of a hit. |
maxStitchedChars | 4000 | 1000–20000 | Character budget per stitched result. |
exposeRetrievalStats | off | — | Add a stats banner to the results card and a stats block to the result the model reads. |
contextFilters | none | — | Narrow results per user — see Context filters. |
Retrieval modes
semantic— ranks by meaning. Catches paraphrase; can miss exact identifiers.hybrid— meaning plus keyword ranking, fused. The best all-round recall.fulltext— keyword ranking only, with no semantic drift. For error codes, names, and quoted strings.auto— the model picks one of the three per call through thestrategyinput, defaulting tohybrid.
hybrid, fulltext, and auto need the keyword lane; without it they run as
semantic.
Per-call inputs
What the model sends on each call:
| Input | Values | Notes |
|---|---|---|
query | text | Required. |
output_mode | previews (default), content | previews returns up to k hits with chunk id, title, snippet, and score. content returns the full text of the top 5 hits inline, with citations, so the model can answer in one call. |
text_match | off (default), all, any, phrase | Keep only chunks containing every word, any word, or the exact phrase of query. Ranking still follows the strategy. |
source_ids | source ids | Restrict the search to these sources. |
folder_ids | folder ids | Offered only when the tool covers more than one folder. Ids outside the tool's scope are ignored. |
strategy | semantic, hybrid, fulltext | Offered only when searchStrategy is auto. |
Calling again in the same turn skips chunks already returned, so a repeat
query pages deeper. A beforeExecute hook receives { query } and may return a
rewritten query; afterExecute can reshape the result.
Folders without vectors
Each folder is searched by what it holds:
- Indexed — vector search with the full pipeline above.
- Indexing off — keyword match over the extracted text. Hits are whole documents with a snippet.
- Parsing
none— nothing to search. The tool says the documents were stored without being read and points the model atlist_folder_sources.
Reading whole documents
Search returns fragments, which is the wrong shape for "compare these two documents". The two companion tools cover that:
list_folder_sources— no inputs. Lists up to 200 documents with titles, sizes, folders, and whether each can be read; says when the list was cut off.read_source— takes asource_idfrom that list and returns the document's text, up to 60,000 characters. Longer documents are truncated and say so. A document stored without being read returns an error rather than empty text.
Context filters
contextFilters narrows results to the caller's own records. Each rule is
{ field, operator, value }:
field— a chunk field such asmetadata.source_id, orcf.<key>for a key in a source's metadata.operator—eq(one value),any(one of a list), orexcept.value— a static value, a list, or a placeholder such as${user.id}or${user.email}.
Filters fail closed: a placeholder that doesn't resolve, or an unsupported
operator, drops the tool for the turn. With filters set, only indexed folders
are searched, and list_folder_sources and read_source are not offered,
since they can't apply the filters. There is no form for filters yet; set them
through the API.
Datasources
Connectors that fill one folder from an external system and keep it in sync on a schedule. Two kinds: Notion (OAuth consent, then page sync) and crawl (website discovery within a scope). A connector owns its folder and creates it, with indexing on, when none is given — named after the Notion workspace, or after the crawl, whose default name is the site's host. Datasource names are unique.
- Schedule is a five-field cron that runs at most every 15 minutes, in the organization's timezone. Leave it empty for manual-only sync.
- Syncs are incremental. New and changed pages are fetched; unchanged ones are skipped. A crawl spots changes by the sitemap's last-modified date or a hash of the page. Pages gone from a complete listing are removed; a listing cut short by a cap removes nothing.
- Preview runs a real discovery crawl and lists the pages it would read, with their depth and whether a cap stopped it. Sync is async (202 — follow the row's status).
- Disconnect is for Notion: it drops the credentials and stops the schedule, keeping fetched pages. A crawl has nothing to disconnect — clear its schedule or delete it.
- Delete stops the connector. Its pages stay in the folder as ordinary sources.
Crawl settings:
| Setting | Default | Range |
|---|---|---|
startUrl | — | Fixed after creation; repointing means a new crawl. |
scope | path | path (under the start URL's path), host, subdomains |
maxPages | 100 | 1–5000 |
maxDepth | 3 | 0–10 link hops from the start URL |
include / exclude | none | Up to 50 path globs each. * stays within a segment, ** crosses them. Matched on path and query; exclude wins. |
sitemap | auto | auto, only (never follow links), skip |
includeSelectors / excludeSelectors | none | Up to 50 CSS selectors each, applied to every page. |
Robots.txt is always respected. Saving new crawl settings starts a sync; changing the selectors re-reads every stored page.
List rows carry folder, status (pending, active, syncing, error,
revoked), schedule, last sync stats (scanned/created/updated/deleted/
skipped/failed), and account info — credentials never appear on the row; they
live on the integration.
Tags
Lightweight labels with an optional color, attached to sources by name at upload or edit — the tag picker can create one on the spot. Names are unique, 1–64 characters; a source takes up to 100 tags. Managed as a global list.