janhq/jan · error · Error

Provider must have base_url configured

Error message

Provider must have base_url configured

What it means

Thrown by TauriProviderService.fetchModelsFromProvider (providers/tauri.ts:149) when the provider object has no base_url. The method needs base_url to build the `${base_url}/models` GET request via fetchTauri. Identical message to catalog error [147] but on the provider-service code path used to populate the model list in Settings.

Source

Thrown at web-app/src/services/providers/tauri.ts:149

      return runtimeProviders.concat(builtinProviders as ModelProvider[])
    } catch (error: unknown) {
      console.error('Error getting providers in Tauri:', error)
      return []
    }
  }

  async deleteProviderKeys(providerName: string): Promise<void> {
    try {
      await invoke('delete_provider_keys', { provider: providerName })
    } catch (error) {
      console.error(`Failed to delete keyring keys for ${providerName}:`, error)
    }
  }

  async fetchModelsFromProvider(provider: ModelProvider): Promise<string[]> {
    if (!provider.base_url) {
      throw new Error('Provider must have base_url configured')
    }

    try {
      const keyChain = providerRemoteApiKeyChain(provider)
      const keyAttempts: (string | undefined)[] =
        keyChain.length > 0 ? keyChain : [undefined]

      let lastStatus = 0
      let lastStatusText = ''

      for (let ki = 0; ki < keyAttempts.length; ki++) {
        const key = keyAttempts[ki]
        const headers: Record<string, string> = {
          'Content-Type': 'application/json',
        }

        if (
          provider.base_url.includes('localhost:') ||

View on GitHub (pinned to fad3f12a14)

Solutions

  1. Open Settings > Model Providers and set the base URL for the provider (e.g. https://api.openai.com/v1).
  2. Validate base_url in the provider form before allowing 'fetch models'.
  3. Pre-fill known providers' base URLs from a defaults table on creation.

Example fix

// before
if (!provider.base_url) {
  throw new Error('Provider must have base_url configured')
}
// after: guard at the UI; disable the 'Fetch Models' button
const canFetch = Boolean(provider.base_url?.trim())
// <Button disabled={!canFetch} onClick={() => fetchModelsFromProvider(provider)}>Fetch Models</Button>
Defensive patterns

Strategy: validation

Validate before calling

function hasBaseUrl(p: ModelProvider): boolean {
  return typeof p.base_url === 'string' && p.base_url.trim().length > 0
}
// before fetchModelsFromProvider:
if (!hasBaseUrl(provider)) {
  throw new Error('Set a base URL for this provider in Settings.')
}

Type guard

function providerHasBaseUrl(p: unknown): p is ModelProvider & { base_url: string } {
  return typeof p === 'object' && p !== null && typeof (p as ModelProvider).base_url === 'string' && (p as ModelProvider).base_url!.trim().length > 0
}

Try / catch

try {
  return await providerService.fetchModelsFromProvider(provider)
} catch (e) {
  if (e instanceof Error && e.message === 'Provider must have base_url configured') {
    promptForBaseUrl(provider.provider)
    return []
  }
  throw e
}

Prevention

When it happens

Trigger: fetchModelsFromProvider is called for a provider with base_url === undefined/null/''. Common when a custom OpenAI-compatible provider was saved without an endpoint, or the field was cleared.

Common situations: Custom provider created with only an API key; base_url cleared by the user but provider retained; config deserialized from an older schema without base_url; user expects the provider's default endpoint to be inferred but it is not.

Related errors


AI-assisted analysis of janhq/jan@fad3f12a14 (2026-08-12). Data as JSON: /api/errors/1d16bbafeea33f04. Report an issue: GitHub.