chenbhao Claude Big Pickle commited on
Commit
609b0a7
·
1 Parent(s): 0892211

fix: use sidecar for NVIDIA, direct fetch for OpenRouter/OpenCode

Browse files

NVIDIA API blocks browser CORS so needs server-side proxy (sidecar).
OpenRouter/OpenCode allow browser fetch so can use direct API calls
via fetchProviderModels(). This restores OpenRouter/OpenCode model
lists while keeping NVIDIA working via sidecar proxy.

Co-Authored-By: Claude Big Pickle <noreply@anthropic.com>

Files changed (1) hide show
  1. desktop/src/stores/settingsStore.ts +21 -13
desktop/src/stores/settingsStore.ts CHANGED
@@ -3,6 +3,7 @@ import { ApiError } from '../api/client'
3
  import { settingsApi } from '../api/settings'
4
  import { modelsApi } from '../api/models'
5
  import { h5AccessApi } from '../api/h5Access'
 
6
  import { getTuiConfig, saveTuiConfigPatch, clearConfigCache } from '../api/config'
7
  import {
8
  isThemeMode,
@@ -198,7 +199,8 @@ export const useSettingsStore = create<SettingsStore>((set, get) => ({
198
  try {
199
  const previousH5Access = get().h5Access
200
  const [sidecarResult, { mode }, config, userSettings, h5AccessResult] = await Promise.all([
201
- // Fetch models from sidecar proxy (server-side, bypasses CORS)
 
202
  modelsApi.list().catch(() => ({ models: [] as ModelInfo[], provider: null as { id: string; name: string } | null })),
203
  settingsApi.getPermissionMode(),
204
  // Read model + effort from ~/.claude.json (TUI-style)
@@ -225,11 +227,13 @@ export const useSettingsStore = create<SettingsStore>((set, get) => ({
225
  if (authProvider) {
226
  activeProviderId = `cli-${authProvider}`
227
  activeProviderName = CLI_NAMES[authProvider] ?? authProvider
228
- // Use sidecar models if available (from proxy), else build defaults
229
- if (sidecarResult.models.length > 0) {
 
230
  availableModels = sidecarResult.models
231
  } else {
232
- availableModels = buildDefaultCliModels(authProvider)
 
233
  }
234
  } else {
235
  activeProviderId = sidecarResult.provider?.id ?? null
@@ -342,15 +346,19 @@ export const useSettingsStore = create<SettingsStore>((set, get) => ({
342
  const cliProviderId = `cli-${authProvider}`
343
  const cliProviderName = CLI_NAMES[authProvider] ?? authProvider
344
 
345
- // Fetch models from sidecar proxy (server-side, bypasses CORS)
346
- const sidecarResult = await modelsApi.list().catch(() => ({
347
- models: [] as ModelInfo[],
348
- provider: null as { id: string; name: string } | null,
349
- }))
350
-
351
- // Fallback chain: sidecar models default CLI models
352
- const defaults = buildDefaultCliModels(authProvider)
353
- const availableModels = sidecarResult.models.length > 0 ? sidecarResult.models : defaults
 
 
 
 
354
  set({
355
  activeProviderId: cliProviderId,
356
  activeProviderName: cliProviderName,
 
3
  import { settingsApi } from '../api/settings'
4
  import { modelsApi } from '../api/models'
5
  import { h5AccessApi } from '../api/h5Access'
6
+ import { fetchProviderModels } from '../api/providerModels'
7
  import { getTuiConfig, saveTuiConfigPatch, clearConfigCache } from '../api/config'
8
  import {
9
  isThemeMode,
 
199
  try {
200
  const previousH5Access = get().h5Access
201
  const [sidecarResult, { mode }, config, userSettings, h5AccessResult] = await Promise.all([
202
+ // Fetch models from sidecar proxy for NVIDIA (bypasses CORS).
203
+ // OpenRouter/OpenCode models come from fetchProviderModels below.
204
  modelsApi.list().catch(() => ({ models: [] as ModelInfo[], provider: null as { id: string; name: string } | null })),
205
  settingsApi.getPermissionMode(),
206
  // Read model + effort from ~/.claude.json (TUI-style)
 
227
  if (authProvider) {
228
  activeProviderId = `cli-${authProvider}`
229
  activeProviderName = CLI_NAMES[authProvider] ?? authProvider
230
+ // NVIDIA: use sidecar proxy (bypasses CORS).
231
+ // OpenRouter/OpenCode: use direct fetch (works in browser).
232
+ if (authProvider === 'nvidia' && sidecarResult.models.length > 0) {
233
  availableModels = sidecarResult.models
234
  } else {
235
+ const { models } = await fetchProviderModels().catch(() => ({ models: [] as ModelInfo[], provider: null }))
236
+ availableModels = models.length > 0 ? models : buildDefaultCliModels(authProvider)
237
  }
238
  } else {
239
  activeProviderId = sidecarResult.provider?.id ?? null
 
346
  const cliProviderId = `cli-${authProvider}`
347
  const cliProviderName = CLI_NAMES[authProvider] ?? authProvider
348
 
349
+ // NVIDIA: use sidecar proxy (bypasses CORS).
350
+ // OpenRouter/OpenCode: use direct fetch (works in browser).
351
+ let availableModels: ModelInfo[]
352
+ if (authProvider === 'nvidia') {
353
+ const sidecarResult = await modelsApi.list().catch(() => ({
354
+ models: [] as ModelInfo[],
355
+ provider: null as { id: string; name: string } | null,
356
+ }))
357
+ availableModels = sidecarResult.models.length > 0 ? sidecarResult.models : buildDefaultCliModels(authProvider)
358
+ } else {
359
+ const { models } = await fetchProviderModels().catch(() => ({ models: [] as ModelInfo[], provider: null }))
360
+ availableModels = models.length > 0 ? models : buildDefaultCliModels(authProvider)
361
+ }
362
  set({
363
  activeProviderId: cliProviderId,
364
  activeProviderName: cliProviderName,