Skip to content
GitHub
Get started →

AI says it can't find information that exists

The most common “the AI is wrong” complaint isn’t hallucination — it’s the opposite. The visitor asks a question, the agent says “I don’t have that information”, but the answer is on your site or in your database. The visitor leaves frustrated.

Five categories of root cause. Work down the list — first one that matches is usually it.

1. The crawl hasn’t run yet (or hasn’t refreshed)

search_knowledge_base queries content that was indexed at the last crawl. New pages, edited copy, freshly added FAQs — if you haven’t re-crawled, the AI can’t see them.

Check:

Dashboard → your site → Knowledge → look at Last crawled. If it’s >24h ago, click Refresh crawl.

Fix:

  • Run a manual crawl from the dashboard
  • For high-edit sites, schedule a daily crawl (Pro+ tier)
  • For breaking news / time-sensitive content, use the Sites API POST /v1/sites/:id/crawl/trigger programmatically after a publish

After the crawl finishes (typically 2-10 minutes), the AI will start returning the new content.

2. Page exists in the crawl, but the section isn’t indexed

The crawler indexes content by section. A section is delimited by a heading (<h1>, <h2>, <h3>) or an explicit data-spelo-section-id attribute. If your relevant content is buried inside a <div> with no heading, the crawler joins it to whatever the previous heading was — and the AI never finds it under the right topic.

Check:

Dashboard → your site → Knowledge → click into the page → look at the section list. Each section should be a meaningful unit (“Pricing”, “Hours”, “Booking process”). If you see giant unbroken blocks like “main”, the page structure isn’t crawler-friendly.

Fix:

  • Add a heading above the content the AI is missing
  • Or add data-spelo-section-id="warranty" to a wrapping element to explicitly mark a section
  • Re-crawl

Per the perception tools docs, the AI uses search_knowledge_base → returns {url, section_id} → calls read_section to read it back to the visitor. If section_id doesn’t exist (because the content wasn’t structured as a section), neither step works.

3. The DOM scraper missed dynamic content

read_page scrapes the DOM at the moment the tool is called. If your content loads after the agent starts speaking (lazy-loaded sections, accordions that need a click to expand, SPA route changes), the AI sees an empty container.

Symptoms:

  • Agent says “this page is about [generic topic]” instead of citing your real headings
  • Works on direct page loads but fails after in-app navigation
  • Works on desktop but fails on mobile (where lazy-loading is more aggressive)

Diagnose:

Open your site in DevTools. With the orb open, run in console:

window.SpeloSystem?._debug?.scrape()

Returns what the scraper saw. Compare to what’s actually rendered.

Fix:

  • Pre-render the critical content (server-side render in Next.js, ssr in Nuxt, etc.)
  • Or crawl the page so the content is in the knowledge base and reachable via search_knowledge_base instead of relying on the live DOM
  • Or expand accordions / disclose sections on page load (give up the UX nicety for accessibility — and for the voice agent)

4. Database content exists but isn’t reachable

You connected a Postgres / Shopify / Airtable adapter, you can see the data in the dashboard’s Test connection preview, but the AI still says it can’t find the answer.

Three sub-causes:

4a. The collection’s description is vague

When the AI decides whether to call search_database and which collection to query, it reads the description field on each collection. If your description says “Data”, the AI doesn’t know when to use it.

Fix: make descriptions specific:

"properties": {
"source": "listings",
"description": "Available rental listings in Los Angeles with beds, baths, price, and amenities. Use this when the visitor asks about specific apartments or rental criteria."
}

4b. The visitor’s question doesn’t trigger the right filterable_field

The search_database tool uses your filterable_fields allowlist. If the visitor asks “do you have any pet-friendly units?” but pets_allowed isn’t in filterable_fields, the AI can’t construct the filter.

Fix: review filterable_fields per collection and add anything the AI might need to filter by. Each field listed here is one the AI is allowed to use in queries.

4c. The DFY tier isn’t enabled (default bundle)

On the default openai-direct transport, search_database is schema-removed — the AI doesn’t see it as an available tool. Only search_knowledge_base (RAG over crawled content) is exposed.

Fix: for DB-backed answers via voice, either:

  • Upgrade to DFY tier (enables search_database in the LLM toolset)
  • Switch to the voice-relay transport (used for Gemini sites)
  • Index your DB content via the crawler so it becomes accessible via search_knowledge_base
  • Or call /v1/<siteId>/query from your own backend in response to webhooks

5. Restricted topics is blocking the answer

If restricted_topics includes a category that overlaps with the visitor’s question, the AI will refuse on purpose.

Check:

Dashboard → your site → Settings → Restricted topics. Read each entry; if any could plausibly include the visitor’s question, that’s your culprit.

Fix: remove the over-restrictive entry, or refine its wording. See Restricted topics.

Diagnostic — inspect a real call

Every voice call is recorded with a full transcript and every tool call. To debug a specific “empty results” complaint:

  1. Find the call in Dashboard → Conversations (filter by date / visitor / topic).

  2. Open the transcript. Look for tool calls.

  3. For each search_knowledge_base call, check:

    • The query argument — is it what the visitor asked?
    • The returned results — empty? wrong topic? right topic but wrong section?
  4. If the AI never called search_knowledge_base at all, the system prompt routing is off. Either the question was too vague, or the personality prompt is over-restricting tool use. Tighten the personality to encourage searching: “When the visitor asks a specific question you don’t already know the answer to, call search_knowledge_base before guessing.”

You can also get the same data programmatically via GET /v1/conversations/:id.

Quick-check checklist

When in doubt, walk this list:

  • Last crawl < 24h old, or content is in DOM at first paint
  • Page has clear heading structure (one section per topic)
  • Adapter description fields are specific and behavioural
  • filterable_fields cover everything visitors might filter by
  • restricted_topics doesn’t accidentally include the answer
  • The personality prompt encourages tool use, not avoidance

If everything checks out and the AI still misses, open a support ticket with the conversation ID — we can replay the exact LLM context the model saw.

See also