mirror of
https://github.com/cline/cline.git
synced 2026-09-19 02:05:44 +08:00
Migrates the vscode extension off its hand-curated static model catalogs
in apps/vscode/src/shared/api.ts and on to the @cline/llms SDK as the
single source of truth for provider/model metadata, end-to-end across
the extension host and the webview.
Net impact on the static catalog file:
apps/vscode/src/shared/api.ts: 5092 -> 468 lines (~90% gone).
What changed at each layer
--------------------------
SDK / catalog plumbing (apps/vscode/src/sdk/model-catalog/):
- New `ProviderCatalog.peekModels(providerId)` synchronous cache read.
- `resolveModelInfo` rewritten: committed selection -> catalog peek
-> await catalog.resolveModels on cache miss. No race with a
background warmer; if the catalog truly has nothing, returns
source: "unknown" and the webview renders a neutral loading state.
- `applyHostModelInfoOverrides` is the canonical seam for the few
fields the SDK does not yet carry. Today it carries only the Vertex
`supportsGlobalEndpoint` allowlist (vertex-global-endpoint.ts, with
a TODO to upstream into the SDK).
- `ProviderListing` extended with SDK metadata (`is_popular`,
`popular_rank`, `usage_cost_display`, `capabilities[]`) and plumbed
through proto + conversion.
Extension-host handlers (apps/vscode/src/core/api/providers/):
- New shared helper `apps/vscode/src/shared/sdk-handler-models.ts`:
`getProviderModelFromSdk(providerId, requestedModelId, committedInfo?)`
returns `{ id, info }` from `getProviderCollectionSync` with
Vertex global-endpoint overrides applied.
- 27 handlers converted to a one-liner `getModel()` through that
helper. Per-handler nuances preserved:
* Anthropic: strips `:fast` and `:1m` host-side suffixes before
SDK lookup; carries them back on the returned id so the
per-request betas still flip.
* Bedrock: keeps the custom Application Inference Profile ARN
branch; base-model info from the SDK.
* Cerebras: keeps the `qwen-3-coder-480b-free` -> `qwen-3-coder-480b`
paid alias.
* Qwen / ZAi: SDK has a single catalog each; handlers keep the
regional base-URL switch but no longer fork the catalog.
* Wandb: keeps the "unknown id falls through to safe defaults"
escape hatch via `MODEL_COLLECTIONS_BY_PROVIDER_ID`.
Refresh-models background tasks:
- `refreshBasetenModels`, `refreshGroqModels`, `refreshHuggingFaceModels`
source their offline-fallback catalog from the SDK via
`getProviderCollectionSync` + `adaptSdkModelInfo`. Live fetch path
unchanged; only the seeding/fallback data changed.
Webview (apps/vscode/webview-ui/):
- `useNormalizedApiConfiguration` always routes through gRPC
`resolveModelInfo`. Removed the `isMigratedSdkProvider` /
`MIGRATED_SDK_PROVIDER_IDS` feature flag and the legacy
`normalizeApiConfiguration` switch entirely.
- New `useStaticProviderSelection` hook for the 22 settings
components whose catalog is now SDK-driven, and
`useDynamicProviderSelection` for the 12 dynamic-list pickers
(openrouter, cline, openai-compatible, ollama, lmstudio, requesty,
litellm, hicap, groq, baseten, huggingface, vercel-ai-gateway,
aihubmix, oca, huawei-cloud-maas, dify, fireworks, together,
vscode-lm) so all of them stop calling the legacy switch.
- `ModelInfoView` reads its `isGemini` check via
`useProviderModels("gemini")` instead of importing `geminiModels`.
- `App.stories.tsx` ships a small inline fixture instead of
importing `bedrockModels`.
- `ExtensionStateContext` no longer seeds `groqModelsState` /
`basetenModelsState` from the deleted catalog; the slices start
empty and the SDK-curated catalog is layered in by the pickers at
render time.
Misc:
- `src/utils/model-utils.ts`: `isAnthropicModelId` consults
`MODEL_COLLECTIONS_BY_PROVIDER_ID["anthropic"]` instead of the
deleted `anthropicModels` map.
- `src/shared/storage/provider-keys.ts`: `getProviderDefaultModelId`
no longer hard-codes 24 per-provider defaults. The function now
consults the SDK catalog and only keeps an override map for
providers whose default is intentionally not the SDK default
(openrouter-shared dynamic providers and local-only providers).
- `src/shared/openai-codex-models.ts`: relative path for
`shape-adapter` import so both the extension and webview build
contexts resolve it identically.
Tests retargeted to assert SDK behavior, not static-map shapes
--------------------------------------------------------------
- claude-code, anthropic, bedrock, vertex, wandb, provider-keys
test suites had assertions tied to deleted shapes. Rewrote them
to either assert through the SDK catalog
(anthropic compares against `adaptSdkModelInfo(sdkCollection.models[id])`,
wandb uses the SDK-declared default, etc.) or focus on the
host-side semantics (bedrock's "global endpoint" block now tests
`vertexModelSupportsGlobalEndpoint` directly).
- claude-code test trimmed its 8 `[1m]`/version-pin variants down
to three SDK-shaped cases. The 8 deleted assertions exercised
extension-only model-id derivations that the SDK does not carry;
matching the CLI's behavior was the explicit goal.
- resolveModelInfo test rewritten around the new peek -> await
-> unknown contract.
- proto-lint: added missing `go_package` option to
`proto/cline/remote_config.proto`.
Verification (npm scripts under apps/vscode/):
- npm run protos OK
- npm run check-types OK (apps/vscode + apps/vscode/webview-ui)
- npm run lint OK (biome + proto-lint)
- npm run build:webview OK (tsc -b && vite build)
- node esbuild.mjs OK (dist/extension.js produced)
- Runtime smoke test: 27/27 provider collections resolve from the
SDK with correct model counts, defaults, and usage-cost-display
flags. openai-codex returns cost=hide as expected; every other
provider returns cost=show.
The file is empty.