Skip to content

refactor(webview): canonicalize provider settings identifiers - #1143

Open
WebMad wants to merge 1 commit into
Zoo-Code-Org:mainfrom
WebMad:refactor/944-provider-settings-identifiers
Open

refactor(webview): canonicalize provider settings identifiers#1143
WebMad wants to merge 1 commit 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

Extracts the provider-settings portion of #1141 into a focused pull request:

  • replaces provider string literals with providerIdentifiers in webview-ui/src/components/settings/providers
  • canonicalizes router-model lookups, refresh requests, OAuth callbacks, and provider response filters
  • refreshes both provider-scoped and shared LiteLLM model caches
  • adds focused coverage for provider identifier behavior

Serialized provider values and runtime behavior remain unchanged.

Validation

  • 6 focused provider test files: 28 tests passed
  • pnpm check-types in webview-ui
  • ESLint with --prune-suppressions --max-warnings=0 for all changed files
  • repository pre-push type checks
  • git diff --check

Related to #944. Extracted from #1141.

Summary by CodeRabbit

  • Bug Fixes

    • Improved consistency when refreshing and selecting models across multiple providers.
    • Ensured provider-specific refresh errors are handled correctly without affecting unrelated providers.
    • Improved cache updates after successful model refreshes.
    • Ensured model-specific settings are cleared when changing models.
    • Standardized OAuth and model-refresh provider handling.
  • Tests

    • Added coverage for model discovery, fallback models, refresh flows, error handling, caching, OAuth links, and model changes.

@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 | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description includes validation results and context (issue references), but omits required template sections: Related GitHub Issue, Test Procedure, Pre-Submission Checklist, and Documentation Updates. Add the required PR template sections: link the GitHub issue number in 'Related GitHub Issue', describe manual or automated test procedures in 'Test Procedure', complete the 'Pre-Submission Checklist', and clarify documentation impact in 'Documentation Updates'.
✅ Passed checks (4 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 identifies the main change: replacing provider string literals with canonicalized identifiers from a shared constant across provider settings components.
✨ 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
@codecov

codecov Bot commented Aug 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@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 on lines +61 to +62
// Refresh the shared cache used by ApiOptions without invalidating unrelated queries.
void queryClient.invalidateQueries({ queryKey: ["routerModels", "all"] })

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.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Invalidate both LiteLLM router-model caches.

LiteLLM uses two independent React Query entries. The provider-scoped entry ["routerModels", providerIdentifiers.litellm] serves useSelectedModel(). The shared entry ["routerModels", "all"] serves ApiOptions. This handler invalidates only the shared entry, so the selected-model path can retain stale models after a successful refresh.

Invalidate both keys. Keep the explicit void handling, and extend LiteLLM.spec.tsx to assert both invalidations.

Suggested fix
+						void queryClient.invalidateQueries({
+							queryKey: ["routerModels", providerIdentifiers.litellm],
+						})
 						void queryClient.invalidateQueries({ queryKey: ["routerModels", "all"] })
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Refresh the shared cache used by ApiOptions without invalidating unrelated queries.
void queryClient.invalidateQueries({ queryKey: ["routerModels", "all"] })
// Refresh the shared cache used by ApiOptions without invalidating unrelated queries.
void queryClient.invalidateQueries({
queryKey: ["routerModels", providerIdentifiers.litellm],
})
void queryClient.invalidateQueries({ queryKey: ["routerModels", "all"] })
🤖 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/LiteLLM.tsx` around lines 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.

@WebMad
WebMad force-pushed the refactor/944-provider-settings-identifiers branch from a55d21e to a38deb9 Compare August 5, 2026 16:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-review PR changes are ready and waiting for maintainer re-review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant