chatboxai/chatbox · error · Error

Embedding model is required

Error message

Embedding model is required

What it means

Thrown by getProviderSettings() when `setting.provider` is non-empty but no matching provider base info is found in the combined list of system (builtin registry) providers plus user `customProviders`. This means the provider id refers to something that is neither registered as a builtin nor defined as a custom provider in global settings — an orphaned reference.

Source

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

        name: string
        embeddingModel: string
        rerankModel: string
        visionModel?: string
        documentParser?: { type: string; mineru?: { apiToken: string } }
        providerMode?: 'chatbox-ai' | 'custom'
      }
    ) => {
      try {
        log.info(
          `ipcMain: kb:create, name=${name}, embeddingModel=${embeddingModel}, rerankModel=${rerankModel}, visionModel=${visionModel}, documentParser=${documentParser?.type || 'default'}, providerMode=${providerMode || 'not specified'}`
        )

        // Validate required fields
        if (!name || !name.trim()) {
          throw new Error('Knowledge base name is required')
        }
        if (!embeddingModel || !embeddingModel.trim()) {
          throw new Error('Embedding model is required')
        }

        const db = getDatabase()
        const documentParserJson = documentParser ? JSON.stringify(documentParser) : null
        const rs = await db.execute({
          sql: 'INSERT INTO knowledge_base (name, embedding_model, rerank_model, vision_model, document_parser, provider_mode) VALUES (?, ?, ?, ?, ?, ?)',
          args: [
            name.trim(),
            embeddingModel,
            rerankModel || null,
            visionModel || null,
            documentParserJson,
            providerMode || null,
          ],
        })
        const id = rs.lastInsertRowid

        if (!id) {

View on GitHub (pinned to 81571269ad)

Solutions

  1. Check `getBuiltinProviderIds()` and `globalSettings.customProviders` for the exact id in `setting.provider` — a mismatch (whitespace, case, stale id) is the usual cause.
  2. If the provider was deleted, re-add it (recreate the custom provider or re-enable the builtin) or switch the session to a current provider.
  3. Add a settings-repair step on load that maps retired provider ids to their successors and resets orphaned sessions to the default provider.
  4. If importing sessions, also import the matching customProviders so the reference resolves.

Example fix

// before
const { providerSetting } = getProviderSettings(session, globals)
// throws 'Cannot find model with provider: old-provider'

// after: repair orphaned references before resolving
const known = new Set([...getBuiltinProviderIds(), ...(globals.customProviders||[]).map(p=>p.id)])
if (!known.has(session.provider)) session.provider = getBuiltinProviderIds()[0]
const { providerSetting } = getProviderSettings(session, globals)
Defensive patterns

Strategy: validation

Validate before calling

function knownProviderIds(globals: Settings): Set<string> {
  return new Set([...getBuiltinProviderIds(), ...(globals.customProviders || []).map(p => p.id)])
}
if (session.provider && !knownProviderIds(globals).has(session.provider)) session.provider = getBuiltinProviderIds()[0]

Type guard

function isKnownProvider(provider: string, globals: Settings): boolean {
  return getBuiltinProviderIds().includes(provider) || (globals.customProviders || []).some(p => p.id === provider)
}

Try / catch

try { return getProviderSettings(session, globals) }
catch (e) {
  if (e instanceof Error && e.message.startsWith('Cannot find model with provider')) {
    session.provider = getBuiltinProviderIds()[0]
    return getProviderSettings(session, globals)
  }
  throw e
}

Prevention

When it happens

Trigger: A saved session references a provider id that was removed in an app update (builtin deleted); a custom provider was deleted from globalSettings.customProviders but a session still references it; the provider id is misspelled or has trailing whitespace; settings imported from another installation that had different custom providers; provider id case mismatch (registry is case-sensitive).

Common situations: Downgrade or upgrade removed/renamed a builtin provider; user syncs sessions across devices without syncing customProviders; manually edited settings.json introduced a typo; a custom provider export/import lost the provider definitions; migration renamed a provider id without a back-compat alias.

Related errors


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