We respect your privacy.

We use strictly necessary cookies to keep you signed in and to protect against CSRF. With your permission we also use a small amount of first-party analytics to improve the product. We do not sell your data and we do not use third-party advertising trackers. See our cookie policy and privacy policy .

← All posts

Why ChatGPT cited nothing, and the one parameter that fixed it

Crawlmind Engineering··4 min read

tool_choice is an API parameter that controls whether a model is allowed to use a tool or required to use it, and getting it wrong is why a citation-tracking query can come back with zero cited sources even when the model clearly should have searched the web. We ran into this measuring share-of-voice in ChatGPT: identical queries, real questions that needed current information, and the engine returned a confident answer with no url_citations attached at all. The fix was a single field in the request, not anything about the content being measured.

This is a short field report, because the lesson is small and specific: when you ask a model a question with a web-search tool available, "available" and "used" are not the same thing.

#The setup

To track which domains an AI engine cites for a query, you send the query to the model, give it a web-search tool, and read back the citations from its response. With OpenAI's web search, results come back as url_citation annotations pointing at the pages the model actually consulted. Those URLs are the raw material for any share-of-voice or AI-visibility metric.

Our first runs returned answers but almost no citations. Across a batch of test queries, the average was close to 0 cited domains per run. The answers themselves were plausible, which made it look like the engine simply was not citing sources, or that our parsing was broken.

#The cause: optional tools stay optional

Neither was true. By default, when you attach a tool to a request, the model decides for itself whether to call it. For a question it believes it can answer from its training data, it often just answers, skips the search entirely, and therefore has no sources to cite. The web-search tool was present in the request but the model was choosing not to use it.

OpenAI documents this behavior in the function-calling and tool-choice reference: the default tool_choice is auto, which means "call a tool if you think it helps." A model that thinks it already knows the answer will not search. No search means no retrieved pages, which means no citations, which means a citation tracker measures zero through no fault of the content.

The change was to stop letting the model opt out. Instead of leaving tool_choice on auto, we set it to require the web-search tool, so every tracked query performs an actual web search before answering.

The effect was immediate. On the same queries that had returned roughly 0 citations, forcing the search produced 8 to 10 cited domains per run. A live probe of a single query went from 0 url_citation annotations unforced to 9 forced. The content, the prompt, and the parsing were unchanged. The only difference was removing the model's ability to skip the search.

#Why this matters for measuring AI visibility

If you are building or buying anything that reports "which sites does ChatGPT cite for X," this distinction is the whole ballgame:

  • A zero is ambiguous. Zero citations can mean "nobody is cited for this query" or it can mean "the engine never searched." Those are completely different signals, and only the first is about your visibility. A tracker that leaves tools optional conflates them.
  • Forcing the search makes runs comparable. When every run is guaranteed to perform a retrieval, a zero for your domain means you genuinely were not cited, which is the thing you actually want to measure.
  • It changes what "improving" looks like. Once the measurement is honest, the lever is the familiar one: be the kind of source an answer engine wants to lift from. Concrete, well-structured, current pages get cited; vague ones do not.

#A caveat on cost and realism

Forcing a search on every query costs more than letting the model answer from memory, because every request now does retrieval. For a tracker that is the right trade: you are paying for a real measurement instead of a cheap, ambiguous one. It is also worth remembering that forcing the tool makes the engine behave more like its search-grounded product surface than its bare chat mode, which is usually what you want when the question is "who gets cited."

#The summary

A citation tracker that returns zero is not necessarily telling you that nobody gets cited. With tool_choice left on auto, the model can skip the web search entirely and answer from memory, producing zero citations regardless of who deserves them. Forcing the web-search tool took our runs from about 0 to 8 to 10 cited domains on the same queries. If you are measuring AI visibility, make sure the engine is actually searching before you trust a number, because an optional tool is an optional measurement.

Related field notes

Share or discuss

Field notes in your inbox

New posts, no spam. Roughly monthly. Unsubscribe with one click.