Skip to content

Search

What this is for. Search has two jobs. The top-bar query finds hits across board, memory, documents, and code. Search Sources is where you register those trees (one Odoo checkout per source) and reindex them. Conversation and project pins then decide which tree an agent may search, so versions do not silently mix.

  • You want a file, a memory note, or a document without knowing which module holds it.
  • You are adding an Odoo checkout (or any codebase) so agents can cite it instead of guessing.
  • Several Odoo versions are indexed and you must pin 18c vs 18e on a conversation or project.
  • An agent returned needsPin — you need to select sources before it will search.
  • You want to reindex after the tree on disk changed.
  1. Type in the shell search bar (Search across all indexed sources…) or open results — that is global search.
  2. To add a tree: Settings → Search Sources (sidebar Settings, Modules group) — route /search-sources.
  3. Add Source (one absolute root, Label e.g. 18c, Family: odoo) → Create Source → Reindex until status is ready.
  4. On a project, check Default code sources; open a conversation and confirm the Sources tab shows the same pins. Search hits and agent citations should then stay inside those trees.
ControlMeaning
Search across all indexed sources…Query box (also in the shell search bar)
Results listHits across board, memory, docs, code, …
No results for ”…”Empty result set
Type to search…Empty query hint
Footer N results in M filesAggregate counts
Select a result to view the filePreview pane empty state
N linesSize of a hit file preview

EYAS fuses full-text (FTS / Orama) with an in-memory vector cosine index using RRF (reciprocal rank fusion) and query-adaptive weights. When embeddings are unavailable, search degrades to FTS only (honest fallback — not silent empty results).

FeatureMeaning
Embed-on-indexChunks store embeddings when an embed provider (Ollama / OpenAI, …) is configured; vectors reload on startup
Content-hash reuseReindex reuses embeddings when chunk content is unchanged
CitationsAgent-facing search_indexed results include stable citationId / cite ([source:…]) so answers can cite sources
list_search_sourcesTool for agents to list configured sources before inventing facts
GroundingCompleteness critic expects retrieval evidence for research / implement-from-source goals — agents should search before claiming facts

Add codebases and docs under Search Sources so agents can ground work in your material rather than guessing.


Route: /search-sources (Settings → Search sources).
Subtitle: Manage indexed sources for semantic and full-text search.

Best practice for multi-version Odoo: register one source per checkout (e.g. Community 18, Enterprise 18, custom addons). Do not dump several Odoo versions into a single path list.

Field / controlMeaning
Counts sources / chunks / collectionsIndex statistics
Add Source / New SourceCreate form
NameDisplay name (e.g. Odoo 18 Community)
TypeSource kind (code, filesystem, …)
IndexerPipeline (code for source trees)
Paths / URLs (one per line)Prefer one absolute root per source
LabelShort pin id for multi-version (e.g. 18c, 18e, eyssen-erp)
VersionFree-form version string (e.g. 18, 19)
EditionFree-form edition (e.g. community, enterprise)
FamilyUse odoo for Odoo checkouts so multi-version pin safety applies
Exclude dirs / globsSkip noise (i18n, static, node_modules, …). Family odoo gets sensible defaults if empty
Create SourcePersist (status idle until reindex)
Last indexedTimestamp of last successful index
ReindexCrawl in file batches (server stays responsive). Unchanged files are skipped by mtime; embeddings reuse content hashes. Chunk count updates live while status is indexing. Interrupted runs resume on the next Reindex.
Delete sourceRemove source and its chunks

Badges on the list show label, version, edition, family, and status.

StatusMeaning
idleNot running / not yet indexed
indexingCrawl/embed in progress — chunk count grows as batches persist
readySearchable
errorLast index failed — check logs / paths
EnvMeaning
EYAS_ODOO_SOURCES_JSONPreferred: JSON array of { path, label?, version?, edition?, family?, name?, tags? } — creates idle named sources on start if missing
EYAS_ODOO_SOURCE_PATHSColon- or semicolon-separated roots; used for lightweight odoo_search_* and for bootstrap when no labeled sources exist yet

After bootstrap, open Search Sources and Reindex each source.


Multi-version pin (which tree may the agent use?)

Section titled “Multi-version pin (which tree may the agent use?)”

When several odoo-family sources are ready, EYAS will not silently mix versions. Resolution order:

  1. Explicit tool args (sourceIds, labels, version, edition on search_indexed / odoo_search_*)
  2. Conversation pin — Context rail → Sources tab (checkboxes)
  3. Project default — Projects → Default code sources
  4. Project type indexed_sources (if set)
  5. Fallback — if multi-version conflict remains, tools return needsPin and list available labels

On an open conversation, right-hand context rail:

History | Sources | Next | Files

ControlMeaning
Source listAll search sources (name, label, version, status, path, chunk count)
CheckboxesMulti-select which sources this conversation may use
Select all / Clear (auto)Bulk pin / clear
Auto badgeNo pin — project default / needsPin logic
N pinnedActive pin count
Manage search sources →Link to /search-sources

Saving updates searchContext: { sourceIds: […] } on the conversation. Agents call get_search_context / set_search_context for the same pin.

Under Projects → edit project → Default code sources:

ControlMeaning
CheckboxesSearch sources to pin by default for this project
N selected / ClearSummary and reset

Applied automatically when:

  • You create a conversation in that project (Board or new chat with project)
  • You change a conversation’s Project field (unless you send an explicit searchContext in the same update)

You can still override per conversation on the Sources tab.

ToolPurpose
list_search_sourcesList sources (label, version, family, paths, status)
get_search_contextActive pin for this conversation
set_search_contextPin / clear (labels, sourceIds, version, edition, or clear: true)
search_indexedHybrid search — respects pin; optional filters override
odoo_search_model / field / xml_idLocal Odoo scan on pinned roots only; cites [source:odoo-src:label:file:line]