Skip to content

refactor(webview): canonicalize provider and model message identifiers - #1143

Merged
edelauna merged 2 commits into
Zoo-Code-Org:mainfrom
WebMad:refactor/944-provider-settings-identifiers
Aug 16, 2026
Merged

refactor(webview): canonicalize provider and model message identifiers#1143
edelauna merged 2 commits into
Zoo-Code-Org:mainfrom
WebMad:refactor/944-provider-settings-identifiers

Conversation

@WebMad

@WebMad WebMad commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Summary

Canonicalizes provider settings identifiers and centralizes model-related webview message identifiers across the shared types package, extension host, and webview.

  • replaces provider string literals with providerIdentifiers in provider settings, model lookups, refresh requests, OAuth callbacks, and response filters
  • refreshes provider-scoped and shared router-model caches without invalidating unrelated providers
  • introduces shared typed constants and schemas for router, OpenAI, Ollama, LM Studio, and VS Code LM model messages
  • uses the shared message identifiers consistently in webview hooks/components, extension message contracts, and the extension-side message handler
  • centralizes the shared all-provider router-model cache sentinel
  • adds focused coverage for provider identifiers, model-message contracts, refresh flows, cache invalidation, OAuth routes, and error handling

Serialized provider values and webview message values remain unchanged.

Validation

  • provider-focused webview suites: 35 tests passed
  • backend router-model and NanoGPT suites: 30 tests passed
  • @roo-code/types: 364 tests passed
  • pnpm check-types in webview-ui
  • ESLint with --prune-suppressions --max-warnings=0 for changed runtime and UI files
  • git diff --check

Related to #944. Extracted from #1141.

@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Provider settings now use centralized providerIdentifiers values for model lookup, refresh requests, OAuth callbacks, error filtering, cache invalidation, and model-change effects. Tests cover these provider-specific flows.

Changes

Provider identifier migration

Layer / File(s) Summary
Canonical model lookup wiring
webview-ui/src/components/settings/providers/{Kenari,KimiCode,OpenCodeGo,VercelAiGateway,ZooGateway}.tsx
Model pickers and router-model lookups use shared provider identifiers.
Refresh, error, and side-effect handling
webview-ui/src/components/settings/providers/{KimiCode,LiteLLM,Moonshot,OpenCodeGo,Poe,Requesty,Unbound}.tsx
Refresh payloads, OAuth callbacks, error checks, cache invalidation, and model-change effects use centralized identifiers.
Provider flow validation
webview-ui/src/components/settings/providers/__tests__/{KimiCode,LiteLLM,Moonshot,Poe,Requesty,ProviderRouting}.spec.tsx
Tests cover model fallback, cache invalidation, refresh errors, provider filtering, OAuth requests, routing, and model-change cleanup.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

Suggested reviewers: edelauna

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly summarizes the main refactor by identifying provider and model message identifier canonicalization.
Description check ✅ Passed The description explains the implementation, preserved behavior, issue reference, and validation results, although it does not reproduce every template section.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
webview-ui/src/components/settings/providers/__tests__/Requesty.spec.tsx (1)

45-45: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert the Requesty callback route.

Line 45 only checks that the URL contains callback_url. In webview-ui/src/oauth/urls.ts, Lines 3-5 add this parameter for every provider. The test passes if the callback route uses another provider. Parse the URL and assert that the callback route ends in /${providerIdentifiers.requesty}.

Proposed test update
-		expect(screen.getByRole("link")).toHaveAttribute("href", expect.stringContaining("callback_url="))
+		const callbackUrl = new URL(screen.getByRole("link").getAttribute("href") ?? "").searchParams.get(
+			"callback_url",
+		)
+		expect(callbackUrl ?? "").toMatch(new RegExp(`/${providerIdentifiers.requesty}$`))
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@webview-ui/src/components/settings/providers/__tests__/Requesty.spec.tsx` at
line 45, Strengthen the link assertion in the Requesty test by parsing the
generated href and verifying its callback route ends with
`/${providerIdentifiers.requesty}`. Keep the existing `callback_url` check if
useful, but ensure the assertion specifically confirms Requesty rather than
merely any provider callback.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@webview-ui/src/components/settings/providers/LiteLLM.tsx`:
- Around line 64-65: Update the Save-handler invalidation calls using
queryClient.invalidateQueries for the LiteLLM and "all" routerModels keys so
their returned promises are explicitly handled; either await both invalidations
together or mark each intentional non-blocking call with void, preserving the
existing invalidation keys.

In `@webview-ui/src/components/settings/providers/OpenAICodex.tsx`:
- Line 3: Update the OpenAICodex component tests to remove calls to getByRole
for the deleted “Speed” combobox and instead assert that the
OpenAICodexSpeedSelector is absent in both affected tests. Leave the
service-tier compatibility tests in the API provider suite unchanged.

---

Nitpick comments:
In `@webview-ui/src/components/settings/providers/__tests__/Requesty.spec.tsx`:
- Line 45: Strengthen the link assertion in the Requesty test by parsing the
generated href and verifying its callback route ends with
`/${providerIdentifiers.requesty}`. Keep the existing `callback_url` check if
useful, but ensure the assertion specifically confirms Requesty rather than
merely any provider callback.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5a7309f4-7f15-4c4c-886e-f0419ee0f25f

📥 Commits

Reviewing files that changed from the base of the PR and between 7918f6b and b88090a.

📒 Files selected for processing (17)
  • webview-ui/src/components/settings/providers/Kenari.tsx
  • webview-ui/src/components/settings/providers/KimiCode.tsx
  • webview-ui/src/components/settings/providers/LiteLLM.tsx
  • webview-ui/src/components/settings/providers/Moonshot.tsx
  • webview-ui/src/components/settings/providers/OpenAICodex.tsx
  • webview-ui/src/components/settings/providers/OpenCodeGo.tsx
  • webview-ui/src/components/settings/providers/Poe.tsx
  • webview-ui/src/components/settings/providers/Requesty.tsx
  • webview-ui/src/components/settings/providers/Unbound.tsx
  • webview-ui/src/components/settings/providers/VercelAiGateway.tsx
  • webview-ui/src/components/settings/providers/ZooGateway.tsx
  • webview-ui/src/components/settings/providers/__tests__/CanonicalProviderIdentifiers.spec.tsx
  • webview-ui/src/components/settings/providers/__tests__/KimiCode.spec.tsx
  • webview-ui/src/components/settings/providers/__tests__/LiteLLM.spec.tsx
  • webview-ui/src/components/settings/providers/__tests__/Moonshot.spec.tsx
  • webview-ui/src/components/settings/providers/__tests__/Poe.spec.tsx
  • webview-ui/src/components/settings/providers/__tests__/Requesty.spec.tsx

Comment thread webview-ui/src/components/settings/providers/LiteLLM.tsx Outdated
Comment thread webview-ui/src/components/settings/providers/OpenAICodex.tsx Outdated
@github-actions github-actions Bot added the awaiting-review PR changes are ready and waiting for maintainer re-review label Aug 5, 2026
Comment thread webview-ui/src/components/settings/providers/__tests__/KimiCode.spec.tsx Outdated
Comment thread webview-ui/src/components/settings/providers/__tests__/KimiCode.spec.tsx Outdated
@WebMad

WebMad commented Aug 5, 2026

Copy link
Copy Markdown
Contributor Author

A note on the two LiteLLM invalidations: there are currently two independent React Query entries for router models. useSelectedModel() uses the provider-scoped ["routerModels", providerIdentifiers.litellm] key, while ApiOptions calls useRouterModels() without a provider and uses ["routerModels", "all"]. The refresh message does not update either cache directly, so both exact keys must be invalidated to keep model IDs/metadata and the settings model list in sync. Using the broader ["routerModels"] prefix would also refetch unrelated provider-scoped queries. This is the minimal fix without consolidating the router-model caches.

@WebMad
WebMad force-pushed the refactor/944-provider-settings-identifiers branch from c6cac6d to a38deb9 Compare August 5, 2026 12:10
@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@webview-ui/src/components/settings/providers/LiteLLM.tsx`:
- Around line 61-62: Update the refresh handler in LiteLLM to invalidate both
the provider-scoped ["routerModels", providerIdentifiers.litellm] cache used by
useSelectedModel() and the shared ["routerModels", "all"] cache used by
ApiOptions, preserving explicit void handling. Extend LiteLLM.spec.tsx to assert
that both invalidations occur after a successful refresh.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5820d26f-bf4b-48ff-b6c0-1e105545943a

📥 Commits

Reviewing files that changed from the base of the PR and between a38deb9 and d22864b.

📒 Files selected for processing (2)
  • webview-ui/src/components/settings/providers/LiteLLM.tsx
  • webview-ui/src/components/settings/providers/__tests__/LiteLLM.spec.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • webview-ui/src/components/settings/providers/tests/LiteLLM.spec.tsx

Comment thread webview-ui/src/components/settings/providers/LiteLLM.tsx Outdated
@WebMad
WebMad force-pushed the refactor/944-provider-settings-identifiers branch from a55d21e to a38deb9 Compare August 5, 2026 16:25

@edelauna edelauna left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the change! Had a comment around preventing busting the cache.

Comment thread webview-ui/src/components/settings/providers/LiteLLM.tsx Outdated
Comment thread webview-ui/src/components/settings/providers/Moonshot.tsx Outdated
Comment thread webview-ui/src/components/settings/providers/Poe.tsx
@github-actions github-actions Bot added awaiting-author PR is waiting for the author to address requested changes and removed awaiting-review PR changes are ready and waiting for maintainer re-review labels Aug 9, 2026
@WebMad
WebMad force-pushed the refactor/944-provider-settings-identifiers branch from a38deb9 to a6b23c3 Compare August 16, 2026 20:41
@WebMad WebMad changed the title refactor(webview): canonicalize provider settings identifiers refactor(webview): canonicalize provider and model message identifiers Aug 16, 2026
@WebMad
WebMad requested a review from edelauna August 16, 2026 21:45
@edelauna
edelauna added this pull request to the merge queue Aug 16, 2026
Merged via the queue into Zoo-Code-Org:main with commit 9081dde Aug 16, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-author PR is waiting for the author to address requested changes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants