fix: use sidecar for NVIDIA, direct fetch for OpenRouter/OpenCode
Browse filesNVIDIA 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>
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
|
|
|
|
| 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 |
-
//
|
| 229 |
-
|
|
|
|
| 230 |
availableModels = sidecarResult.models
|
| 231 |
} else {
|
| 232 |
-
|
|
|
|
| 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 |
-
//
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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,
|