Skip to content

fix: name the Microsoft search provider Web IQ - #283

Closed
Menci wants to merge 5 commits into
fluent-dashboardfrom
fluent-dashboard-search
Closed

fix: name the Microsoft search provider Web IQ#283
Menci wants to merge 5 commits into
fluent-dashboardfrom
fluent-dashboard-search

Conversation

@Menci

@Menci Menci commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Stacked on #277.

Summary

Name the provider what it is. The Microsoft web search provider has always called api.microsoft.ai/v3/search/web and /v3/browse with an x-apikey header. Those are Microsoft Web IQ endpoints. The product was unreleased and documented only on Microsoft's intranet when the provider landed, so it shipped under the internal name "Microsoft Grounding" — a name that was never public.

That matters beyond tidiness. The name it most resembles, Grounding with Bing Search, is a different service that is still generally available, on api.bing.microsoft.com behind an Azure Microsoft.Bing/accounts resource. An operator reading the old label would provision that resource and receive a key this provider cannot use; the Web IQ endpoint ignores Ocp-Apim-Subscription-Key outright and answers AuthNoToken. Microsoft's own FAQ keeps both products alive side by side, so this was a misnomer pointing at a live product, not a stale name.

  • rename the provider identifier to web-iq across the config contract, the stored column, and recorded usage, migrating existing rows so credentials keep working and per-provider usage history stays continuous
  • label it Microsoft Web IQ, the name the product uses for itself, and link to the Web IQ portal where its keys are actually issued rather than the retired Bing APIs page
  • drop the Bing mark for the Microsoft one — Web IQ publishes no mark of its own, only the Microsoft four-square
  • derive the search-usage provider rejection message from the provider list; it named two of the three providers and would have drifted again here

Retire the pre-rename export format. A backup written before this change spells the provider key microsoftGrounding, which strict parsing rejects with a field-level complaint about a file that is simply too old. Bumping the envelope to 18 makes it fail on the version with an actionable message, and keeps compatibility shims out of the parser. The dashboard kept its own copy of that version, which the bump would have left one behind — enough to reject every backup file the deployment writes — so it is now annotated with the gateway's own literal and the next bump breaks the build instead of failing at runtime.

Finish the Fluent migration on this page. Driving it in a browser against a live Web IQ rejection surfaced four rough edges:

  • the OK/Error pill and the failure box carried hardcoded light-dark() hex pairs; they are a Fluent Badge and a MessageBar now, the same MessageBar the save path already uses
  • the upstream and model pickers had become bare native selects, dropping the per-option descriptions the previous dashboard showed; they are Fluent Dropdowns again, an upstream carrying the same kind description the upstreams list uses and a model carrying its id only when it differs from the display name
  • the summary line printed the raw provider identifier with hardcoded English around it; it reads the provider's label now, falls back to the id verbatim for a provider this build does not know, and goes through i18n
  • the provider error extractor had no rung for Web IQ's error envelope, so its whole JSON body reached the operator and overflowed the panel; reading userMessage turns that into the one sentence Microsoft wrote for it

References

Verification

  • pnpm run lint
  • pnpm run typecheck
  • pnpm run test — 423 files, 4,754 tests passed
  • manual: drove the page in a headless browser against a Node gateway — provider picker, both passthrough pickers with their descriptions, and a live AuthInvalidApiKey rejection from Web IQ

Menci added 5 commits July 28, 2026 23:42
The endpoints this provider has always called -- api.microsoft.ai/v3/search/web
and /v3/browse, authenticated with x-apikey -- belong to Microsoft Web IQ, which
was unreleased and documented only internally when the provider landed, so it
was carried under the internal name "Microsoft Grounding". That name was never
public, and the product it most resembles, Grounding with Bing Search, is a
different service that is still generally available on api.bing.microsoft.com
behind an Azure Microsoft.Bing/accounts resource. An operator reading the old
label would provision that resource and receive a key this provider cannot use;
the endpoint ignores Ocp-Apim-Subscription-Key outright.

Rename the provider identifier to web-iq across the config contract, the stored
column, and recorded usage, and migrate existing rows so credentials keep
working and per-provider history stays continuous. The dashboard now labels it
"Microsoft Web IQ", the name the product uses for itself, links to the Web IQ
portal where its keys are actually issued, and drops the Bing mark for the
Microsoft one -- Web IQ ships no mark of its own.

The search-usage provider rejection message named two of the three providers and
would have drifted again here, so derive it from the provider list.
The dump's searchConfig carries the web search provider under its own key, so a
backup taken before the Web IQ rename spells it microsoftGrounding and names the
provider microsoft-grounding. Strict parsing already rejects both, but it would
report a field-level complaint about a file that is simply too old.

Bump the export format to 18 instead. Import already gates on an exact version
with an actionable message, so a stale backup now fails on the envelope and says
to re-export, and no key-shape compatibility has to live in the parser.

The dashboard kept a hand-copied version constant, which the bump would have
left one behind — enough to reject every fresh backup file as unreadable. Type
it against the gateway's own literal so the next bump breaks the build here
rather than at runtime.
Three textual conflicts, all where the base reworked something this branch had
also touched:

- apps/web/src/api/types.ts now derives its contracts from the Hono client, so
  the hand-written SearchConfig this branch had renamed is gone entirely and the
  derived type picks the rename up from the gateway.
- The dashboard's backup-file parsing moved into its own module. The export
  version bump and its pin to the gateway's literal move with it.
- A search-usage assertion gained a view check on one side and the renamed
  provider on the other; both apply.

The base's new backup-file suite pinned the envelope version as a literal, which
the bump would have broken, and it never exercised the version gate it was
testing around. It now reads the constant and rejects a superseded envelope.
Three things the Fluent migration left rough on this page, found by driving it
in a browser against a live Web IQ rejection.

The OK/Error pill and the failure box carried hardcoded light-dark() hex pairs,
which do not track the theme the way every other surface here does. They become
a Fluent Badge and a MessageBar -- the same MessageBar the save path above
already uses, so a failed test now reads like every other failure on the page.

The upstream and model pickers had become bare native selects, dropping the
per-option descriptions the previous dashboard showed. They are Fluent Dropdowns
again: an upstream carries the same kind description the upstreams list uses,
and a model carries its id when the display name differs, staying silent when
the two are the same rather than printing it twice.

The summary line printed the raw provider identifier and hardcoded English
around it. It now reads the provider's own label, falling back to the id
verbatim if the gateway names one this build does not know, and both fragments
go through i18n.

Behind the panel, the provider error extractor had no rung for Web IQ's error
envelope, so its whole JSON body reached the operator and overflowed the panel.
Reading userMessage -- with technicalDetails behind it -- turns that into the
one sentence Microsoft wrote for exactly this purpose.
@Menci

Menci commented Jul 28, 2026

Copy link
Copy Markdown
Owner Author

Codex agent: Consolidating this follow-up into #277 as requested; the branch remains available while its changes are merged and verified there.

@Menci Menci closed this Jul 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant