How intent extraction works

Intent extraction is the bridge between English and a structured ProductSearchRequest. It’s why the chat works.

This page is a peek under the hood — useful when chat behaves unexpectedly or when you’re trying to write better prompts.

In this guide:

  • The two-tool design
  • What gets extracted
  • How Claude decides
  • Common edge cases

The two-tool design

Claude is given exactly two tools:

extract_search_params

Use this when the message describes a research goal that should run a search.

Returns a structured object:

{
  "keyword": "bamboo socks",
  "marketplace": "UK",
  "category": null,
  "fulfillment": "FBA",
  "min_price": null,
  "max_price": 20,
  "margin_floor": null,
  "competition_filter": "Low",
  "free_text": null
}

Hilal then runs that search.

no_search_intent

Use this when the message is a question, comment, or exploration that doesn’t need a search.

Returns nothing structured. Claude responds in plain text.

How Claude decides

A system prompt tells Claude to pick extract_search_params only when:

  • The message describes a product the user wants to find (“show me”, “find”, “what are good [products]”).
  • The message contains enough specificity to make a search useful (at least a noun phrase or a category).
  • The message is asking for results, not for an explanation.

Otherwise, no_search_intent.

Examples and how Claude routes them:

MessageToolWhy
“bamboo socks under $20 in UK”extract_search_paramsClear product, marketplace, price band.
“what’s a good niche for a new seller?”no_search_intentBroad question, not a specific product request.
“how does SFR work?”no_search_intentDefinition question.
“find products in beauty under $30”extract_search_paramsSpecific category and price.
“any update on AutoSearch?”no_search_intentMeta-question about the product.
“show me top sellers in pet care”extract_search_paramsCategory + intent to search.

Claude is conservative: if the message is genuinely ambiguous, it picks no_search_intent and asks a clarifying question rather than guessing the parameters.

Defaults when fields are missing

If your message doesn’t mention everything, Claude fills in defaults:

FieldDefault if missing
marketplaceYour primary marketplace from Settings → Marketplaces.
categoryNone (search across all).
fulfillment“Either” (no filter).
min_price / max_priceNone (no price filter).
margin_floorNone.
competition_filter“Any”.

The search_triggered event in the chat shows you exactly what Claude extracted, so you can confirm before the search costs you a credit.

Common edge cases

Claude triggered a search you didn’t want

Sometimes a comment that sounds like a search request gets misclassified. Two options:

  • The chat shows the extracted params before the search runs; you have a moment to cancel (tap Stop).
  • After the fact, the search appears in your history and you can soft-delete it. Credit is still charged though.

To minimize this, prefix conversational messages with phrases like “explain…” or “what’s the…” — these strongly cue no_search_intent.

Claude didn’t trigger a search you wanted

The reverse: you wrote what felt like a search request, Claude treated it as conversational. Usually this is because you didn’t include a noun phrase (“show me good products”) — Claude needs what you’re searching for.

Add specificity: instead of “show me good products”, write “show me good products in the home-fitness category.”

Claude extracted weird params

Claude occasionally infers a constraint you didn’t write (e.g., assumes “under $30” because you said “affordable”). The search_triggered event always displays the actual params; you’ll see it before the search runs.

How prompt caching helps

The intent-extraction system prompt is cached in Claude’s prompt-caching layer. That means each chat message:

  • Doesn’t re-pay the cost of re-loading the system prompt.
  • Routes faster (fewer tokens to process per message).
  • Keeps the chat affordable to operate.

You don’t see this; it just makes the chat snappier.

Related articles