chatboxai/chatbox · error · Error

Invalid knowledge base ID

Error message

Invalid knowledge base ID

What it means

Thrown at the bottom of getModel() after both code paths (builtin registry via getProviderDefinition, and custom provider via getProviderSettings + isCustom) have been exhausted without returning a ModelInterface. It is the fallthrough for a provider id that exists in getProviderSettings (so providerBaseInfo was found) but is neither registered in the new registry nor flagged `isCustom` — an inconsistent state where the provider is known but has no factory.

Source

Thrown at src/main/knowledge-base/ipc-handlers.ts:157

          scope.setExtra('documentParser', documentParser?.type)
          sentry.captureException(error)
        })
        throw error
      }
    }
  )

  ipcMain.handle(
    'kb:update',
    async (
      _event,
      { id, name, rerankModel, visionModel }: { id: number; name?: string; rerankModel?: string; visionModel?: string }
    ) => {
      try {
        log.info(`ipcMain: kb:update, id=${id}, name=${name}, rerankModel=${rerankModel}, visionModel=${visionModel}`)

        if (!id || id <= 0) {
          throw new Error('Invalid knowledge base ID')
        }

        if (!name && rerankModel === undefined && visionModel === undefined) {
          return 0
        }

        const db = getDatabase()
        let sql = 'UPDATE knowledge_base SET '
        const args: (string | number)[] = []

        if (name !== undefined) {
          if (!name.trim()) {
            throw new Error('Knowledge base name cannot be empty')
          }
          sql += 'name = ?'
          args.push(name.trim())
        }
        if (rerankModel !== undefined) {

View on GitHub (pinned to 81571269ad)

Solutions

  1. Confirm the provider is either registered via defineProvider (check `getProviderDefinition(provider)` returns truthy) OR present in globalSettings.customProviders with `isCustom: true`.
  2. Re-register the provider through the normal UI flow (add custom provider) so the `isCustom` flag is set, instead of hand-editing settings.json.
  3. On settings load, validate that every provider referenced by sessions satisfies one of the two conditions and repair/migrate orphaned entries.
  4. If a builtin provider was removed by an upgrade, remap its id to a current one during migration.

Example fix

// before
const model = getModel(session, globals, config, deps)
// throws 'Cannot find model with provider: x' even though x is in globals

// after: ensure custom provider has the isCustom flag
const cp = globals.customProviders?.find(p => p.id === session.provider)
if (cp && !cp.isCustom) cp.isCustom = true
const model = getModel(session, globals, config, deps)
Defensive patterns

Strategy: validation

Validate before calling

function providerIsResolvable(provider: string, globals: Settings): boolean {
  if (getProviderDefinition(provider)) return true
  const cp = (globals.customProviders || []).find(p => p.id === provider)
  return !!cp && cp.isCustom === true
}

Type guard

function isResolvableProvider(provider: string, globals: Settings): boolean {
  return getProviderDefinition(provider) !== undefined
    || (globals.customProviders || []).some(p => p.id === provider && p.isCustom === true)
}

Try / catch

try { return getModel(settings, globals, config, deps) }
catch (e) {
  if (e instanceof Error && e.message.startsWith('Cannot find model with provider')) {
    const cp = (globals.customProviders || []).find(p => p.id === settings.provider)
    if (cp) cp.isCustom = true  // repair missing flag
    return getModel(settings, globals, config, deps)
  }
  throw e
}

Prevention

When it happens

Trigger: A provider id exists in globalSettings but is not in the builtin registry and is not marked `isCustom: true` (e.g. a half-migrated or hand-edited custom provider entry); a builtin provider was de-registered at runtime via clearProviderRegistry but its settings entry remains; the providerBaseInfo came from a stale source (e.g. old customProviders list) that lacks the `isCustom` flag; race between registry clear and model resolution.

Common situations: Manual edits to settings.json adding a provider object without `isCustom`; app version downgrade where a builtin provider id exists in the session but the older codebase lacks its registry entry; a custom provider import dropped the `isCustom` flag; plugin/provider extension unloaded but session still references it.

Related errors


AI-assisted analysis of chatboxai/chatbox@81571269ad (2026-08-12). Data as JSON: /api/errors/d04144e6dea8c035. Report an issue: GitHub.