{"record":{"id":"5147639edc8ced41","repo":"chatboxai/chatbox","slug":"knowledge-base-name-is-required","errorCode":null,"errorMessage":"Knowledge base name is required","messagePattern":"Knowledge base name is required","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/main/knowledge-base/ipc-handlers.ts","lineNumber":103,"sourceCode":"        documentParser,\n        providerMode,\n      }: {\n        name: string\n        embeddingModel: string\n        rerankModel: string\n        visionModel?: string\n        documentParser?: { type: string; mineru?: { apiToken: string } }\n        providerMode?: 'chatbox-ai' | 'custom'\n      }\n    ) => {\n      try {\n        log.info(\n          `ipcMain: kb:create, name=${name}, embeddingModel=${embeddingModel}, rerankModel=${rerankModel}, visionModel=${visionModel}, documentParser=${documentParser?.type || 'default'}, providerMode=${providerMode || 'not specified'}`\n        )\n\n        // Validate required fields\n        if (!name || !name.trim()) {\n          throw new Error('Knowledge base name is required')\n        }\n        if (!embeddingModel || !embeddingModel.trim()) {\n          throw new Error('Embedding model is required')\n        }\n\n        const db = getDatabase()\n        const documentParserJson = documentParser ? JSON.stringify(documentParser) : null\n        const rs = await db.execute({\n          sql: 'INSERT INTO knowledge_base (name, embedding_model, rerank_model, vision_model, document_parser, provider_mode) VALUES (?, ?, ?, ?, ?, ?)',\n          args: [\n            name.trim(),\n            embeddingModel,\n            rerankModel || null,\n            visionModel || null,\n            documentParserJson,\n            providerMode || null,\n          ],\n        })","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/chatboxai/chatbox/blob/81571269addb6bafb589a920b2883f1e1e084fd1/src/main/knowledge-base/ipc-handlers.ts#L85-L121","documentation":"Thrown by getProviderSettings() when `setting.provider` is falsy (empty string, null, undefined). This is a precondition check: a session must have a provider id before its settings can be resolved. It fires before any registry lookup, so it indicates an uninitialised or corrupted session settings object rather than a missing provider registration.","triggerScenarios":"A SessionSettings object constructed without setting `provider`; deserialised session whose `provider` field was renamed/removed across a schema migration; UI calls getModel-related code paths before the user has selected a provider; default session template lacks a provider default; programmatic call passes a partial settings object.","commonSituations":"First-run with no default provider configured; settings file from an older app version missing the `provider` key after an upgrade; a new chat session was created but the model picker was never interacted with; downstream code reads `settings.provider` off a draft/clone that lost the field.","solutions":["Ensure every SessionSettings instance is created with a non-empty `provider` — set a sensible default (e.g. the first builtin provider id from getBuiltinProviderIds()).","Validate the settings file after schema migrations and backfill a default `provider` for legacy sessions.","Guard UI entry points that call getProviderSettings/getModel so they no-op when no provider is selected.","If migrating settings, run a repair step that writes `provider` from `globalSettings.defaultModelProvider` when missing."],"exampleFix":"// before\nconst { providerSetting } = getProviderSettings(session, globals)  // throws if session.provider is ''\n\n// after\nif (!session.provider) session.provider = globals.defaultModelProvider || getBuiltinProviderIds()[0]\nconst { providerSetting } = getProviderSettings(session, globals)","handlingStrategy":"validation","validationCode":"function ensureProvider(session: SessionSettings, globals: Settings): string {\n  if (!session.provider) session.provider = (globals as any).defaultModelProvider || getBuiltinProviderIds()[0]\n  return session.provider\n}","typeGuard":"function hasProvider(s: { provider?: string }): s is { provider: string } {\n  return typeof s.provider === 'string' && s.provider.length > 0\n}","tryCatchPattern":"if (!hasProvider(session)) throw new UserFacingError('Select a provider before starting a chat')\nconst { providerSetting } = getProviderSettings(session, globals)","preventionTips":["Always create SessionSettings with a non-empty provider (use the global default).","Run a settings-repair pass on load that backfills missing provider ids.","Block UI actions that call getModel/getProviderSettings until a provider is chosen."],"tags":["configuration","session-settings","provider","precondition","validation"],"backgroundTag":null,"analyzedSha":"81571269addb6bafb589a920b2883f1e1e084fd1","analyzedAt":"2026-08-12T21:51:44.981Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}